Я восстанавливаю базу данных размером 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.
если у вас есть несколько столов, скорее всего, вы можете извлечь выгоду из мк-параллельное восстановление.
Единственная причина, по которой я могу представить, почему восстановление будет постепенно замедляться, - это индексация. Рассмотрите возможность отключения индексирования до конца, а затем позвольте ему сделать все сразу.
Я предложил тебе,
AUTOCOMMIT=0
, UNIQUE_CHECKS=0
, FOREIGN_KEY_CHECKS=0
(И НЕ ЗАБУДЬТЕ ОТКАТИТЬ ЭТИ ИЗМЕНЕНИЯ)mysql -u root -pPasss requests < mydb.sql
Удачи
Это будет делать:
mysql --init-command = "УСТАНОВИТЬ СЕССИЮ FOREIGN_KEY_CHECKS = 0; УСТАНОВИТЬ UNIQUE_CHECKS = 0;" -u root -p <Backup_Database.mysql