Проблемы при импорте больших дампов
Импорт дампов размером 1 ГБ+ через стандартный mysql < dump.sql часто зависает или работает очень медленно. Причины: маленький max_allowed_packet, медленная запись InnoDB, огромное количество транзакций, таймауты.
Оптимизация MySQL перед импортом
mysql -u root -p -e "
SET GLOBAL max_allowed_packet = 1073741824; -- 1GB
SET GLOBAL net_buffer_length = 1048576; -- 1MB
SET GLOBAL innodb_buffer_pool_size = 2147483648; -- 2GB (если есть RAM)
SET GLOBAL innodb_log_buffer_size = 67108864; -- 64MB
SET GLOBAL innodb_flush_log_at_trx_commit = 2; -- быстрее, менее надёжно"Импорт со скоростными оптимизациями
# Стандартный импорт
mysql -u root -p mydb < dump.sql
# Сжатый дамп
gunzip < dump.sql.gz | mysql -u root -p mydb
# С прогресс-баром (pv)
apt install pv
pv dump.sql.gz | gunzip | mysql -u root -p mydbУскорение через отключение проверок
Добавьте в начало дампа (или используйте флаги):
mysql -u root -p mydb << 'EOF'
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;
SOURCE /path/to/dump.sql;
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
SET UNIQUE_CHECKS = 1;
SET AUTOCOMMIT = 1;
EOFmydumper / myloader — параллельный бэкап и импорт
# Установка
sudo apt install mydumper
# Создание параллельного дампа (4 потока)
mydumper -u root -p password -B mydb -t 4 -c -o /backup/mydb_dump/
# Параллельный импорт
myloader -u root -p password -B mydb -t 4 -d /backup/mydb_dump/mydumper/myloader в 4–8 раз быстрее обычного mysqldump для больших баз: использует параллельные потоки и покобъектный дамп.
Импорт частями (для очень больших файлов)
# Разбить дамп на части по 100MB
csplit dump.sql "/^-- Table structure/" {*}
# BigDump — веб-инструмент для импорта через browser
# Скачать: https://www.ozerov.de/bigdump/Мониторинг прогресса импорта
# В другом терминале - смотреть текущую операцию
mysql -u root -p -e "SHOW PROCESSLIST\G" | grep -i import
# Размер таблиц во время импорта
mysql -u root -p -e "
SELECT table_name,
ROUND(data_length/1024/1024, 2) AS 'Data MB',
ROUND(index_length/1024/1024, 2) AS 'Index MB'
FROM information_schema.tables
WHERE table_schema = 'mydb'
ORDER BY data_length DESC LIMIT 10;"