Импорт большой базы данных MySQL: оптимизация и ускорение

MySQL / MariaDB · 19.04.2026
Импорт большой базы данных MySQL: оптимизация и ускорение

Проблемы при импорте больших дампов

Импорт дампов размером 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;
EOF

mydumper / 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;"
← Назад в базу знаний Задать вопрос поддержке