У меня есть небольшая база данных MySQL с около 30 таблицами, некоторые из которых 10 миллионов записей, около 100 миллионов. Из mysqldump
всех таблиц (в отдельных файлах) довольно быстро, может быть, занимает 20 минут. Он генерирует около 15 ГБ данных. Самые большие выгруженные файлы находятся в диапазоне 2 ГБ.
Когда я загружаю данные в MySQL на другой компьютер с шестью ядрами, 8 ГБ, это занимает вечность. Легко 12 часов или более часов.
Я просто запускаю клиент mysql для загрузки файла, т.е.
mysql database < footable.sql
напрямую с файлом напрямую из mysqldump
mysqldump database foo > footable.sql
Очевидно, я делаю что-то не так. С чего начать, чтобы закончить в разумные сроки?
Я не использую никаких переключателей ни на дампе, ни на нагрузке.
Ответы:
Примите во внимание эти некоторые моменты, они могут помочь вам в случае создания дампа и его восстановления.
Extended inserts
в свалках.--tab
форматом, чтобы вы могли использоватьmysqlimport
, что быстрее, чемmysql < dumpfile
.innodb_flush_log_at_trx_commit = 2
временно вставить ваш my.cnf во время выполнения импорта. Вы можете вернуть его на 1, если вам нужна кислотаПопробуйте ...
источник
innodb_flush_log_at_trx_commit = 2
спас мой день. Для импорта дампа размером 600 МБ (как одной большой транзакции) потребовалось бы 6 часов, но с этой временной настройкой это было сделано за 30 минут!В дополнение к ответу Абдула я хотел бы подчеркнуть важность
--disable-keys
опции, которая отключает ключи до тех пор, пока все данные не будут загружены для таблицы. Эта опция включена как часть--opt
переключателя, который включен по умолчанию, но считает важным указать.Если вы не пропустите ключи во время вставки, то каждая вставленная строка будет перестраивать индекс. Чрезвычайно медленный процесс
источник
--opt
по умолчаниюThis option is effective only for nonunique indexes of MyISAM tables. It has no effect for other tables
Я много занимался этим в последнее время. Вы можете определенно улучшить производительность импорта, выполнив импорт параллельно. Большая часть замедления основана на вводе-выводе, но вы все равно можете получить улучшение на 40%, создавая дамп в таблицы, а затем импортируя их, скажем, 4 за раз.
Вы можете сделать это с помощью xargs следующим образом:
сжатие файлов перед их отправкой в mysql ничего не замедляет, главным образом из-за сниженного ввода-вывода. Мои таблицы были сжаты примерно до 10: 1, поэтому это экономит много места на диске.
Я обнаружил, что на 4-х ядерных машинах оптимально использовать 4 процесса, хотя только незначительно лучше, чем 3. Если у вас SSD или быстрый RAID, вы, вероятно, будете лучше масштабироваться.
Некоторые другие вещи, чтобы отметить. Если у вас есть 4k сектора дисков, убедитесь, что у вас есть
key_cache_block_size=4096
иmyisam_block_size=4K
.Если вы используете таблицы MyISAM, установите
myisam_repair_threads = 2
или выше. Это позволит вашим дополнительным ядрам помочь перестроить индексы.Убедитесь, что вы не обмениваетесь вообще. Если да, уменьшите размер
innodb_buffer_pool_size
.Я думаю, что я получил некоторое ускорение с помощью innnodb с помощью этих опций:
(Последние три я не тестировал всесторонне - я думаю, что нашел их в качестве предложений в интернете.) Обратите внимание, что это
innodb_flush_log_at_commit=0
может привести к повреждению из-за сбоя mysql или отключения питания.источник
*_block_size
иmyisam_repair_threads
? Кроме того, не уверен, что мы должны дать совет по настройке переменных на основе «предложений из интернета» :)Если у вас в основном таблицы MyISAM, вы должны увеличить буфер массовой вставки . Вот что говорит MySQL Documentation о настройке bulk_insert_buffer_size :
Есть две вещи, которые вам нужно сделать
1) Добавьте его в /etc/my.cnf
2) Установите глобальное значение для него
Если у вас нет прав на глобальную настройку bulk_insert_buffer_size, сделайте это
Конечно, это не для InnoDB.
С другой стороны, будь то таблицы InnoDB или MyISAM, если индексы больше, чем у таблицы, у вас может быть слишком много индексов. Я обычно предполагаю, что перезагрузка MyISAM mysqldump должна занять в 3 раза больше времени, чем потребовалось mysqldump. Я также предполагаю, что перезагрузка InnoDB mysqldump должна занять в 4 раза больше времени, чем потребовалось mysqldump.
Если вы превысили соотношение 4: 1 для перезагрузки mysqldump, у вас определенно есть одна из двух проблем:
Вы можете измерить размер ваших данных с помощью механизма хранения с помощью этого:
Посмотрите, являются ли индексы почти такими же большими, как данные или даже большими
Вы также можете отключить бинарное ведение журнала следующим образом:
перед перезагрузкой скрипта
источник
Если вы вообще обойдете файловую систему и просто перенаправите вывод mysqldump непосредственно в процесс MySQL, вы увидите заметное улучшение производительности. Сколько в конечном итоге зависит от типа используемого диска, но я редко использую файлы дампа, независимо от размера базы данных, по одной только этой причине.
источник
Согласно моему опыту, жесткий диск является узким местом. Забудьте о вращающихся дисках. SSD лучше, но, безусловно, лучше всего выполнять это в оперативной памяти - если у вас достаточно времени для хранения всей базы данных на короткое время. Грубо говоря:
Для меня дамп ~ 10G (/ var / lib / mysql, потребляющий ~ 20G) может быть импортирован за 35 минут (mydumper / myloader), 45 минут (mysqldump --tab / mysqlimport), 50 минут (mysqldump / mysql) , на 2x6-ядерном 3,2 ГГц Xeon.
Если у вас недостаточно ОЗУ на одной машине, но у вас есть несколько компьютеров рядом с быстрой сетью, было бы интересно посмотреть, можно ли объединить их ОЗУ с nbd (сетевым блочным устройством). Или, используя innodb_file_per_table, вы, вероятно, можете повторить описанный выше процесс для каждой таблицы.
источник