До основного вмісту

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 і ручний метод» — там враховано ще й файли, а не лише базу.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці