К основному содержимому

mysqldump: резервное копирование и восстановление MySQL

MySQL / MariaDB · 19.04.2026 · 4 мин чтения
Иллюстрация к статье «mysqldump: резервное копирование и восстановление баз данных MySQL»

Основные команды mysqldump

mysqldump — стандартная утилита для создания логических резервных копий MySQL и MariaDB. Она создаёт SQL-файл с командами для воссоздания структуры и данных базы.

Бэкап одной базы данных

# Базовый бэкап
mysqldump -u root -p mydb > mydb_backup.sql

# С сжатием (рекомендуется)
mysqldump -u root -p mydb | gzip > mydb_$(date +%Y%m%d_%H%M%S).sql.gz

# Без блокировки таблиц (для InnoDB)
mysqldump -u root -p --single-transaction --quick mydb | gzip > mydb.sql.gz
Всегда используйте --single-transaction для баз данных InnoDB — это создаёт консистентный снапшот без блокировки таблиц. Без этого флага сайт может "зависнуть" во время бэкапа.

Полезные флаги mysqldump

ФлагОписание
--single-transactionКонсистентный бэкап InnoDB без блокировок
--quickЧитать строки по одной (экономит RAM)
--no-dataТолько структура, без данных
--no-create-infoТолько данные, без CREATE TABLE
--all-databasesБэкап всех баз данных
--routinesВключить хранимые процедуры
--triggersВключить триггеры (по умолчанию ON)

Бэкап всех баз данных

mysqldump -u root -p --all-databases --single-transaction \
    --routines --triggers | gzip > all_databases_$(date +%Y%m%d).sql.gz

Восстановление из дампа

# Восстановление обычного дампа
mysql -u root -p mydb < mydb_backup.sql

# Восстановление сжатого дампа
gunzip < mydb_backup.sql.gz | mysql -u root -p mydb

# Или через zcat
zcat mydb_backup.sql.gz | mysql -u root -p mydb

Автоматизация через cron

sudo nano /etc/cron.d/mysql-backup
# Бэкап каждый день в 2:00, хранить 7 дней
0 2 * * * root mysqldump -u backup_user -pPassword --single-transaction \
    --all-databases | gzip > /backups/mysql/all_$(date +\%Y\%m\%d).sql.gz && \
    find /backups/mysql/ -name "*.sql.gz" -mtime +7 -delete

Создание пользователя только для бэкапов

mysql -u root -p -e "
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'StrongBackupPass';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON *.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;"
Не используйте root для автоматических бэкапов — создайте отдельного пользователя с минимальными привилегиями. Пароль храните в ~/.my.cnf, а не в скриптах.

Пароль в ~/.my.cnf (без ввода пароля)

cat ~/.my.cnf
[mysqldump]
user=backup_user
password=StrongBackupPass

chmod 600 ~/.my.cnf
# Теперь можно без -p:
mysqldump mydb > backup.sql

Типичные ошибки mysqldump

ОшибкаПричинаЧто делать
Got error: 1044: Access denied for user to databaseУ пользователя нет привилегии SELECT на конкретную базу, хотя GRANT выдан не на все схемыВыдайте права явно: GRANT SELECT, LOCK TABLES ON mydb.* TO 'backup_user'@'localhost';
Error 2013: Lost connection to MySQL server during queryДамп большой таблицы превысил wait_timeout, либо не использован флаг --quickДобавьте --quick и увеличьте wait_timeout в my.cnf для сессии бэкапа
Warning: A partial dump from a server that has GTIDs...На сервере включён GTID, и дамп без явного указания режима может сломать репликацию при восстановлении на другом сервереДобавьте флаг --set-gtid-purged=OFF, если дамп переносится не на реплику того же кластера
ERROR 1146 (42S02): Table doesn't exist при восстановленииДамп был снят с флагом --no-data или процесс дампа прервался на серединеПроверьте полноту дампа и пересоздайте его без --no-data, если нужны и структура, и данные

Сравнение способов бэкапа MySQL

СпособТип бэкапаБлокировка таблицПодходит для
mysqldumpЛогический (SQL-файл)Нет при --single-transaction для InnoDBМалых и средних баз, переносимости между версиями
Percona XtraBackupФизический (файлы данных)Нет, полностью горячий бэкапБольших баз, где важна скорость восстановления
Binlog + периодический снапшотИнкрементальный, point-in-timeНетВосстановления состояния на точную секунду перед сбоем

Когда mysqldump не подходит

  • База весит сотни гигабайт — логический дамп и его восстановление могут занимать часы, физический бэкап (XtraBackup) в разы быстрее
  • Нужно восстановление на произвольную секунду перед инцидентом — для этого нужны бинарные логи, а не дамп раз в сутки
  • Таблицы в движке MyISAM с постоянной активной записью — даже с флагами блокировка на момент снятия дампа заметна пользователям
  • Дамп снимается с master-сервера под высокой нагрузкой репликации — предпочтительнее снимать с реплики, чтобы не создавать лишнюю нагрузку

Для баз, где логический дамп уже не справляется по времени, есть статья «Горячий бэкап MySQL с Percona XtraBackup», а для восстановления на точное время — «Binlog MySQL: восстановление базы на точку во времени».

Проверка результата

Не доверяйте бэкапу, который никогда не проверялся на восстановление:

# Дамп не должен быть пустым или обрываться на середине
tail -5 mydb_backup.sql
# Последняя строка обычно "-- Dump completed on ..."

# Количество таблиц в дампе должно совпадать с базой-источником
grep -c "^CREATE TABLE" mydb_backup.sql
mysql -u root -p -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='mydb';"

# Пробное восстановление во временную базу
mysql -u root -p -e "CREATE DATABASE mydb_restore_test;"
mysql -u root -p mydb_restore_test < mydb_backup.sql
mysql -u root -p -e "DROP DATABASE mydb_restore_test;"

Если бэкапится сайт на WordPress, стоит свериться с отдельным чеклистом в статье «WordPress бэкап: UpdraftPlus и ручной метод» — там учтены ещё и файлы, а не только база.

Статья помогла?
← Назад в базу знаний Задать вопрос поддержке