mysqldump: шпаргалка по бэкапу и восстановлению MySQL
Бэкапы баз данных — одна из тех вещей, про которые все знают но многие делают кое-как. Либо не делают вовсе, либо делают дамп раз в месяц вручную. Потом случается инцидент, и оказывается что последний рабочий бэкап был три недели назад.
Ниже — команды, которые я держу под рукой. mysqldump покрывает большинство задач.
Полный дамп базы
mysqldump -u USER -pPASSWORD DATABASE > /path/to/dump.sql
Пароль сразу после -p без пробела — это намеренно, иначе mysqldump спросит его интерактивно.
Только структура, без данных
mysqldump --no-data -u USER -pPASSWORD DATABASE > /path/to/schema.sql
Удобно когда нужно перенести схему на другой сервер или зафиксировать структуру в git.
Конкретные таблицы
mysqldump -u USER -pPASSWORD DATABASE TABLE1 TABLE2 TABLE3 > /path/to/dump_table.sql
Дамп со сжатием на лету
mysqldump -u USER -pPASSWORD DATABASE | gzip > /path/to/dump.sql.gz
Экономит место — особенно заметно на больших базах. Разница может быть в 5–10 раз.
Дамп с датой в имени файла
mysqldump -u USER -pPASSWORD DATABASE | gzip > `date +/path/to/dump.sql.%Y%m%d.%H%M%S.gz`
Полезно для ротации: запускаешь по крону, каждый файл с уникальным именем, старые удаляешь скриптом.
Восстановление
Из обычного дампа:
mysql -u USER -pPASSWORD DATABASE < /path/to/dump.sql
Из сжатого:
gunzip < /path/to/dump.sql.gz | mysql -u USER -pPASSWORD DATABASE
# или
zcat /path/to/dump.sql.gz | mysql -u USER -pPASSWORD DATABASE
Управление базами из командной строки
mysqladmin -u USER -pPASSWORD create NEWDATABASE # создать базу
mysqlshow -u USER -pPASSWORD # список баз
mysqlshow -u USER -pPASSWORD DATABASE # таблицы в базе
Работа с MySQL в Docker
Дамп из контейнера:
docker exec -it CONTAINER_ID mysqldump -u root --password=pass DB > /dump.sql
CONTAINER_ID узнаёшь через docker ps -a. Файл сохраняется на хост-машине по указанному пути.
Восстановление в контейнер:
cat /dump.sql | docker exec -i CONTAINER_ID /usr/bin/mysql -u root --password=pass DB
Обрати внимание: для exec при восстановлении нужен флаг -i (без -t), иначе mysql не получит данные из stdin.
Если нужно выстроить нормальный процесс резервного копирования баз данных — пиши на [email protected] или заходи на 1it.pro.