У меня есть огромный дамп памяти объемом 32 ГБ, который мне нужно импортировать в MySQL. Раньше мне не приходилось импортировать такой огромный дамп SQL. Я сделал обычное:
mysql -uroot dbname < dbname.sql
Это занимает слишком много времени. Есть таблица с примерно 300 миллионами строк, которая за 3 часа достигла 1,5 миллиона. Таким образом, кажется, что все это займет 600 часов (это 24 дня) и нецелесообразно. Итак, мой вопрос, есть ли более быстрый способ сделать это?
Дополнительная информация / выводы
- Все таблицы InnoDB, и внешние ключи не определены. Есть, однако, много индексов.
- У меня нет доступа к исходному серверу и БД, поэтому я не могу создать новую резервную копию или сделать «горячую» копию и т. Д.
- Настройка,
innodb_flush_log_at_trx_commit = 2
предложенная здесь, кажется, не дает (явно видимого / экспоненциального) улучшения. - Статистика сервера во время импорта (из MySQL Workbench): https://imgflip.com/gif/ed0c8 .
- MySQL версия 5.6.20 сообщества.
- innodb_buffer_pool_size = 16M и innodb_log_buffer_size = 8M. Нужно ли увеличить это?
Ответы:
Вадим Ткаченко из Percona сделал это прекрасное наглядное представление InnoDB
Вам обязательно нужно изменить следующее
Почему эти настройки?
.ibd
файлы. Согласно документации MySQLConfiguring the Number of Background InnoDB I/O Threads
, каждый поток может обрабатывать до 256 ожидающих запросов ввода-вывода. По умолчанию для MySQL 4, 8 для Percona Server. Макс 64Перезапустите MySQL, как это
Это отключает буфер двойной записи InnoDB
Импортируйте ваши данные. Когда закончите, перезапустите MySQL нормально
Это снова включает буфер двойной записи InnoDB
Попробуйте!
ПОБОЧНОЕ ПРИМЕЧАНИЕ: вам следует обновить систему до 5.6.21 для получения последних обновлений безопасности .
источник
Вам действительно нужно восстановить всю базу данных? Если нет, мой 2с:
Вы можете извлечь конкретные таблицы, чтобы сделать ваше восстановление на «чанках». Что-то вроде этого:
Я сделал это один раз, и мне понадобилось около 10 минут, чтобы извлечь нужную таблицу - мое полное восстановление заняло 13 ~ 14 часов, с дампом 35 ГБ (gziped).
Параметр
/pattern/,/pattern/p
with-n
делает срез «между шаблонами» - включая их.В любом случае, чтобы восстановить 35 ГБ, я использовал машину AWS EC2 (c3.8xlarge), установил Percona через yum (Centos) и просто добавил / изменил следующие строки
my.cnf
:Я думаю, что цифры слишком высоки, но сработало для моей настройки.
источник
Самый быстрый способ импортировать вашу базу данных - это скопировать файлы (.frm, .MYD, .MYI), если это MyISAM, прямо в / var / lib / mysql / «имя базы данных».
В противном случае вы можете попробовать:
mysql > use database_name; \. /path/to/file.sql
Это еще один способ импортировать ваши данные.
источник
Одним из способов ускорить импорт является блокировка таблицы во время импорта. используйте параметр --add-locks для mysqldump.
или вы можете включить некоторые полезные параметры с опцией --opt, которая включает кучу полезных вещей для дампа.
Если у вас есть другое устройство хранения на сервере, используйте его - копирование с одного устройства на другое - это способ ускорить передачу.
Вы также можете отфильтровать таблицы, которые не требуются с --ignore-table
источник