Бэкапы MySQL

Дмитрий Корнев
11 января 2021

Команды для создания и развёртывания бэкапов баз.

Создание бэкапа базы db_name сразу в архив base_backup.sql.gz:

mysqldump -u root db_name | gzip > base_backup.sql.gz

То же самое, только отключаем любой сдвиг времени для данных типа TIMESTAMP, в дампе будут именно те значения времени, которые записаны в базе:

mysqldump -u root --skip-tz-utc db_name | gzip > base_backup.sql.gz

Удаление и создание базы db_name:

mysql -u root -D db_name -e "DROP DATABASE db_name"
mysql -u root -e "CREATE DATABASE db_name"

Обратный процесс, распаковка и восстановление бэкапа в базу:

zcat base_backup.sql.gz | mysql -u 'root' db_name

Чтобы не вводить каждый раз пароль следует создать файл .my.cnf в каталоге пользователя:

[mysql]
user = root
password = пароль

[mysqldump]
user = root
password = пароль

У файла должны быть ограниченные права:

chmod 0600 ~/.my.cnf

Docker

При использовании образа MySQL создание бэкапа:

docker exec контейнер_mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" название_базы' > бэкап.sql
docker exec контейнер_mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" название_базы | gzip' > бэкап.sql.gz
docker exec контейнер_mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --skip-tz-utc название_базы | gzip' > бэкап.sql.gz

Удаление и создание базы:

docker exec -i контейнер_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -D название_базы -e "DROP DATABASE название_базы"'
docker exec -i контейнер_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "CREATE DATABASE название_базы"'

Восстановление бэкапа:

docker exec -i контейнер_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" название_базы' < бэкап.sql
zcat < бэкап.sql.gz | docker exec -i контейнер_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" название_базы'

Комментарии