Docker MySQL 数据备份详解
下面我将详细介绍在 Docker 环境中如何备份 MySQL 的特定数据库、特定表、仅表结构,以及如何设置定期自动备份。
一、特定备份命令
1. 备份整个 MySQL 实例(所有数据库)
docker exec mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > all-databases-$(date +%Y%m%d).sql
2. 备份单个数据库
docker exec mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" database_name' > db_database_name-$(date +%Y%m%d).sql
3. 备份单个数据表
docker exec mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" database_name table_name' > db_database_name-table_table_name-$(date +%Y%m%d).sql
4. 仅备份表结构(不包含数据)
# 整个数据库的表结构
docker exec mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --no-data database_name' > db_database_name-schema-$(date +%Y%m%d).sql
# 单个表的表结构
docker exec mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --no-data database_name table_name' > db_database_name-table_table_name-schema-$(date +%Y%m%d).sql
5. 仅备份数据(不包含表结构)
docker exec mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --no-create-info database_name' > db_database_name-data-$(date +%Y%m%d).sql
二、高级备份选项
1. 压缩备份文件(节省空间)
docker exec mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" database_name' | gzip > db_database_name-$(date +%Y%m%d).sql.gz
2. 备份时忽略某些表
docker exec mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" database_name --ignore-table=database_name.table1 --ignore-table=database_name.table2' > db_database_name-$(date +%Y%m%d).sql
三、定期自动备份方案
1. 创建备份脚本
创建 /docker/mysql/backup/mysql_backup.sh 脚本:
#!/bin/bash
# MySQL容器名称
CONTAINER_NAME=mysql
# MySQL连接参数
MYSQL_USER=root
MYSQL_PASSWORD=yourpassword
# 备份目录
BACKUP_DIR=/docker/mysql/backup
# 要备份的数据库列表(空格分隔)
DATABASES="db1 db2 db3"
# 保留天数
DAYS_TO_KEEP=7
# 当前日期
DATE=$(date +%Y%m%d)
# 创建备份目录
mkdir -p $BACKUP_DIR/$DATE
# 备份每个数据库
for DB in $DATABASES; do
# 完整备份(数据+结构)
docker exec $CONTAINER_NAME sh -c "exec mysqldump -u$MYSQL_USER -p'$MYSQL_PASSWORD' --single-transaction --routines --triggers $DB" | gzip > $BACKUP_DIR/$DATE/$DB-full-$DATE.sql.gz
# 仅备份表结构
docker exec $CONTAINER_NAME sh -c "exec mysqldump -u$MYSQL_USER -p'$MYSQL_PASSWORD' --no-data $DB" > $BACKUP_DIR/$DATE/$DB-schema-$DATE.sql
echo "Backup completed for database: $DB"
done
# 备份特定表(示例备份db1的users表)
docker exec $CONTAINER_NAME sh -c "exec mysqldump -u$MYSQL_USER -p'$MYSQL_PASSWORD' db1 users" | gzip > $BACKUP_DIR/$DATE/db1-table-users-$DATE.sql.gz
# 删除旧备份
find $BACKUP_DIR -type d -mtime +$DAYS_TO_KEEP -exec rm -rf {} \;
# 记录日志
echo "$(date +'%Y-%m-%d %H:%M:%S') - Backup completed" >> $BACKUP_DIR/backup.log
赋予执行权限:
chmod +x /docker/mysql/backup/mysql_backup.sh
2. 设置定时任务(Cron)
编辑 crontab:
crontab -e
添加以下内容(每天凌晨2点执行备份):
0 2 * * * /docker/mysql/backup/mysql_backup.sh > /docker/mysql/backup/cron.log 2>&1
3. 备份验证脚本
创建 /docker/mysql/backup/verify_backup.sh 用于验证备份:
#!/bin/bash
# 验证最新备份是否完整
BACKUP_DIR=/docker/mysql/backup
LATEST_BACKUP=$(ls -td $BACKUP_DIR/*/ | head -1)
for FILE in $LATEST_BACKUP/*.gz; do
if gzip -t "$FILE"; then
echo "$FILE is valid"
else
echo "ERROR: $FILE is corrupt!" | mail -s "MySQL Backup Verification Failed" admin@example.com
fi
done
四、恢复数据方法
1. 恢复整个数据库
gunzip < db_database_name-20230101.sql.gz | docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" database_name'
2. 恢复单个表
gunzip < db_database_name-table_table_name-20230101.sql.gz | docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" database_name'
3. 仅恢复表结构
docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" database_name' < db_database_name-schema-20230101.sql
五、生产环境建议
-
密码安全:使用环境变量或配置文件存储密码,不要硬编码在脚本中
# 从文件读取密码 MYSQL_PASSWORD=$(cat /path/to/mysql_password.txt) -
备份加密:对敏感数据备份进行加密
# 使用openssl加密备份 docker exec mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" db1' | openssl enc -aes-256-cbc -salt -out db1-$(date +%Y%m%d).sql.enc -k encryption_password -
远程备份:将备份文件同步到远程存储
# 使用rsync同步到远程服务器 rsync -avz /docker/mysql/backup/ user@remote-server:/remote/backup/path/ # 或者上传到云存储 aws s3 sync /docker/mysql/backup/ s3://your-bucket/mysql-backups/ -
监控备份:设置监控检查备份是否成功执行
# 在备份脚本最后添加 if [ $? -eq 0 ]; then echo "Backup successful" else echo "Backup failed" | mail -s "MySQL Backup Failed" admin@example.com fi
通过以上方案,你可以灵活地备份 Docker 中的 MySQL 数据,无论是完整备份、特定数据库/表备份,还是仅备份表结构,并能实现自动化定期备份。
郭慕荣博客园

浙公网安备 33010602011771号