Медленный импорт базы данных MySQL с помощью mysqldump и USE .. SOURCE

8

У меня в MySQL около 12 таблиц innoDB, в одной из них 11 миллионов записей.

Я использовал эту команду для резервного копирования:

mysqldump -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz

И эта команда для импорта вещей на новый сервер:

USE [DBNAME];
SOURCE [/path_to_file/DBNAME].sql;

Вот боль, с которой я страдаю (время идет с каждым запросом!):

введите описание изображения здесь

Что я могу сделать, чтобы ускорить процесс? Что-то не так с моей командой mysqldump?

Кирк Уймет
источник

Ответы:

5

Для вашей команды dump вы можете использовать следующее

mysqldump --single-transaction --extended-insert -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz

Расширенные вставки лучше.

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction Параметр «Одиночная транзакция» лучше подходит для дампа таблиц InnoDB.

В вашем файле my.cnf временно внесите следующие изменения

http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_doublewrite

innodb_doublewrite = 0

а также

http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

innodb_flush_log_at_trx_commit = 2

Перезапустите MySQL, а затем удалите эти параметры после импорта и перезапустите MySQL снова.

Таблицы памяти

Если вся ваша база данных может поместиться в память, вы можете изменить ENGINE = InnoDB на ENGINE = MEMORY в файле sql дампа для каждой таблицы или только таблиц, которые занимают больше всего времени на импорт, импортировать файл дампа обратно в базу данных. а затем измените двигатель обратно на innodb.

ALTER TABLE name_of_table ENGINE = InnoDB;

команда mysqlimport

http://linux.die.net/man/1/mysqlimport

Я использовал mysqlimport для импорта данных, зарезервированных с использованием опции формата вкладки в mysqldump. Это оказалось быстрее, чем импорт с помощью команды mysql.

Дамп базы данных с помощью mysqldump

mysqldump --tab = / some_directory / -u [ИМЯ ПОЛЬЗОВАТЕЛЯ] -p [DBNAME] [TABLENAME]

Импортируйте данные в свою базу данных.

mysqlimport -u [ИМЯ ПОЛЬЗОВАТЕЛЯ] -p [DBNAME] /some_directory/tablename.sql

Крейг Эфрейн
источник
5

Массовая загрузка InnoDB может быть очень сложной, если вы не настроили InnoDB должным образом.

Вот настройки, которые вам нужны:

До половины пула буферов можно использовать для массовых вставок. Это выталкивает кэшированные данные. Во время перезагрузки mysqldump в таблицы InnoDB буферный пул становится открытой зоной военных действий между вновь загруженными данными InnoDB и изменениями во вторичные индексы. В свете этого, растет innodb_buffer_pool_sizeи innodb_log_file_sizeжизненно важно и необходимо.

Также убедитесь, что они выключены. Для mysqldump эти переменные должны быть установлены в 0.

UNIQUE_CHECKS=0;
FOREIGN_KEY_CHECKS=0;

Вы можете проверить это с помощью простого head -20файла mysqldump.

Есть еще один аспект импорта: innodb_change_buffering

Согласно документации MySQL , вы можете определять, что буферизуется во время любых операций DML. Для получения полной информации об этом см. Управление буферизацией изменений InnoDB .

Я рекомендую следующие настройки:

[mysqld]
innodb_buffer_pool_size=2G
innodb_log_file_size=512M
innodb_read_io_threads=64
innodb_write_io_threads=64
innodb_io_capacity=5000
innodb_thread_concurrency=0
RolandoMySQLDBA
источник