Как я могу ускорить восстановление MySQL из файла дампа?


28

Я восстанавливаю базу данных объемом 30 ГБ из файла mysqldump в пустую базу данных на новом сервере. При запуске SQL из файла дампа восстановление начинается очень быстро, а затем начинает все медленнее и медленнее. Отдельные вставки теперь занимают более 15 секунд. Таблицы в основном MyISAM с одним небольшим InnoDB. Сервер не имеет других активных подключений. SHOW PROCESSLIST;показывает только вставку из восстановления (и сам список процессов show).

У кого-нибудь есть идеи, что может вызвать резкое замедление?

Существуют ли какие-либо переменные MySQL, которые я могу изменить, чтобы ускорить восстановление во время его выполнения?


Отредактировано для исправления типов таблиц
Дейв Форгак

Ответы:


26

Одной вещью, которая может замедлить процесс, является key_buffer_size , который является размером буфера, используемого для индексных блоков. Настройте это как минимум на 30% вашей оперативной памяти, иначе процесс переиндексации будет, вероятно, слишком медленным.

Для справки, если вы использовали InnoDB и внешние ключи, вы также можете отключить проверку внешних ключей и снова включить ее в конце (используя SET FOREIGN_KEY_CHECKS=0и SET FOREIGN_KEY_CHECKS=1).


1
Я обнаружил две вещи: key_buffer_size был установлен на 8 МБ, и была одна таблица InnoDB в смеси с внешними ключами. Увеличено значение key_buffer_size до 1 ГБ и временно отключены проверки внешних ключей. Восстановление закончено через 5 минут. Благодарность!
Дейв Форгак

Вот Это Да! Рад, что это помогло :)
Марко Рамос

2
Я просто заметил, что набрал «5» минут. Я почти уверен, что это было больше похоже на 50 минут, но все же более разумно ;-)
Дейв Форгак

5
key_buffer_size для MYISAM.
Фернандо Фабрети

@FernandoFabreti - это важный момент для многих читателей, но ОП указала, что у них в основном был MyISAM
mc0e

22

Эта ссылка показывает, что можно сделать, чтобы ускорить процесс восстановления.

http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

Можно поставить команды в верхней части файла дампа

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;

И поместите эти утверждения в конец файла дампа

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;

Это сработало для меня. Счастливого восстановления :-)


8
Это помогло совсем немного. Вместо того, чтобы редактировать файл, я создал pre.sql и post.sql из приведенных выше фрагментов и использовал их для восстановления БД:cat pre.sql dump.sql post.sql | mysql ...
Джейсон Р. Кумбс

1

Единственная причина, по которой я могу представить, почему восстановление будет постепенно замедляться, - это индексирование. Изучите отключение индексации до конца, а затем дайте ему сделать все сразу.


1

Если у вас есть физическая копия файла дампа (каталог DB), вы можете просто скопировать его на новый сервер, если у нового сервера та же версия MySQL, и он будет работать нормально. Это прекрасно работает с MyISAM, и я думаю, что это лучше, чем восстановление данных на основе файла логического дампа SQL.


0

Если у вас есть несколько таблиц, вы можете воспользоваться mk-parallel-restore .


Теперь это устарело и должно использоваться только для восстановления тестовых данных, а не для восстановления фактических резервных копий.
Свандрагт

0

Это будет делать:

mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;" -u root -p <Backup_Database.mysql


-1

Я предложил тебе,

  1. Проверьте свои таблицы: есть ли у него триггеры? Очистить все триггеры
  2. SET: AUTOCOMMIT=0, UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0( И НЕ ЗАБУДЬТЕ откатить ЭТО ИЗМЕНЕНИЯ )
  3. USE COMMAND LINE LIKE mysql -u root -pPasss requests < mydb.sql
  4. Проверьте размер файла вашей базы данных

Удачи

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.