MySQL любой способ импортировать огромный (32 ГБ) дамп sql быстрее?


67

У меня есть огромный дамп памяти объемом 32 ГБ, который мне нужно импортировать в MySQL. Раньше мне не приходилось импортировать такой огромный дамп SQL. Я сделал обычное:

mysql -uroot dbname < dbname.sql

Это занимает слишком много времени. Есть таблица с примерно 300 миллионами строк, которая за 3 часа достигла 1,5 миллиона. Таким образом, кажется, что все это займет 600 часов (это 24 дня) и нецелесообразно. Итак, мой вопрос, есть ли более быстрый способ сделать это?

Дополнительная информация / выводы

  1. Все таблицы InnoDB, и внешние ключи не определены. Есть, однако, много индексов.
  2. У меня нет доступа к исходному серверу и БД, поэтому я не могу создать новую резервную копию или сделать «горячую» копию и т. Д.
  3. Настройка, innodb_flush_log_at_trx_commit = 2предложенная здесь, кажется, не дает (явно видимого / экспоненциального) улучшения.
  4. Статистика сервера во время импорта (из MySQL Workbench): https://imgflip.com/gif/ed0c8 .
  5. MySQL версия 5.6.20 сообщества.
  6. innodb_buffer_pool_size = 16M и innodb_log_buffer_size = 8M. Нужно ли увеличить это?

Можете ли вы добавить более быстрые компоненты на сервер, а именно больше оперативной памяти и накопителя SSD?

@Bert сервер имеет 8 ГБ оперативной памяти, большая часть которой просто не используется. Также нельзя добавить больше памяти. Как это поможет? Действительно ли операции записи выполняются так медленно?

Что за узкое место? Процессорное ядро ​​привязано?
Крис С

@ChrisS нет, загрузка процессора составляет от 3 до 4%. Я не уверен, что является узким местом. Я думаю, что это индексы. Как найти / подтвердить узкое место?

1
Если у вас есть sql, можете ли вы отредактировать операторы создания индекса и посмотреть, пойдет ли он быстрее? как только у вас есть импортированные данные, вам нужно будет воссоздать их

Ответы:


84

Вадим Ткаченко из Percona сделал это прекрасное наглядное представление InnoDB

InnoDB Архитектура

Вам обязательно нужно изменить следующее

innodb_buffer_pool_size = 4G
innodb_log_buffer_size = 256M
innodb_log_file_size = 1G
innodb_write_io_threads = 16
innodb_flush_log_at_trx_commit = 0

Почему эти настройки?

Перезапустите MySQL, как это

service mysql restart --innodb-doublewrite=0

Это отключает буфер двойной записи InnoDB

Импортируйте ваши данные. Когда закончите, перезапустите MySQL нормально

service mysql restart

Это снова включает буфер двойной записи InnoDB

Попробуйте!

ПОБОЧНОЕ ПРИМЕЧАНИЕ: вам следует обновить систему до 5.6.21 для получения последних обновлений безопасности .


1
Я сделал для него скрипт bash для linux, опустил некоторые значения для работы внутри vagrant
OZZIE

9

Вам действительно нужно восстановить всю базу данных? Если нет, мой 2с:

Вы можете извлечь конкретные таблицы, чтобы сделать ваше восстановление на «чанках». Что-то вроде этого:

zcat your-dump.gz.sql | sed -n -e '/DROP TABLE.*`TABLE_NAME`/,/UNLOCK TABLES/p' > table_name-dump.sql

Я сделал это один раз, и мне понадобилось около 10 минут, чтобы извлечь нужную таблицу - мое полное восстановление заняло 13 ~ 14 часов, с дампом 35 ГБ (gziped).

Параметр /pattern/,/pattern/pwith -nделает срез «между шаблонами» - включая их.

В любом случае, чтобы восстановить 35 ГБ, я использовал машину AWS EC2 (c3.8xlarge), установил Percona через yum (Centos) и просто добавил / изменил следующие строки my.cnf:

max_allowed_packet=256M
wait_timeout=30000

Я думаю, что цифры слишком высоки, но сработало для моей настройки.


5

Самый быстрый способ импортировать вашу базу данных - это скопировать файлы (.frm, .MYD, .MYI), если это MyISAM, прямо в / var / lib / mysql / «имя базы данных».

В противном случае вы можете попробовать: mysql > use database_name; \. /path/to/file.sql

Это еще один способ импортировать ваши данные.


1

Одним из способов ускорить импорт является блокировка таблицы во время импорта. используйте параметр --add-locks для mysqldump.

mysqldump --add-drop-table --add-locks --database db > db.sql

или вы можете включить некоторые полезные параметры с опцией --opt, которая включает кучу полезных вещей для дампа.

mysqldump --opt --database db > db.sql

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

Вы также можете отфильтровать таблицы, которые не требуются с --ignore-table

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