Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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;

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

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

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

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

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

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

Удачи

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

mysql --init-command = "УСТАНОВИТЬ СЕССИЮ FOREIGN_KEY_CHECKS = 0; УСТАНОВИТЬ UNIQUE_CHECKS = 0;" -u root -p <Backup_Database.mysql