MySQL каким-либо образом быстрее импортирует огромный (32 ГБ) sql-dump?

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

  mysql -uroot dbname <dbname.sql
 

Это слишком долго. Существует таблица, насчитывающая около 300 миллионов строк, она достигает 1,5 миллиона за 3 часа. Таким образом, кажется, что все это займет 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. Должен ли я увеличить их?
48 голосов | спросил SBhojani 19 32014vEurope/Moscow11bEurope/MoscowWed, 19 Nov 2014 23:36:46 +0300 2014, 23:36:46

3 ответа


57

Вадим Ткаченко Перкона сделал это прекрасное живописное представление 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, как этот

  сервис mysql restart --innodb-doublewrite = 0
 

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

Импортируйте свои данные. По завершении перезапустите mysql обычно

  служба mysql restart
 

Это повторяет двойной буфер записи InnoDB

Дайте ему попробовать !!!

Примечание: Вы должны обновить до 5.6.21 для последних исправлений безопасности .

ответил RolandoMySQLDBA 23 72014vEurope/Moscow11bEurope/MoscowSun, 23 Nov 2014 06:04:48 +0300 2014, 06:04:48
5

Вам действительно нужна вся база данных, которая будет восстановлена? Если вы этого не сделаете, мой 2c:

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

  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 /p с параметром -n делает срез между шаблонами - включая их.

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

  max_allowed_packet = 256M
WAIT_TIMEOUT = 30000
 

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

ответил Bruno J. Araujo 5 J000000Tuesday16 2016, 23:29:41
4

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

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

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

ответил Alex 20 42014vEurope/Moscow11bEurope/MoscowThu, 20 Nov 2014 20:01:12 +0300 2014, 20:01:12

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132