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

五、生产环境建议

  1. 密码安全:使用环境变量或配置文件存储密码,不要硬编码在脚本中

    # 从文件读取密码
    MYSQL_PASSWORD=$(cat /path/to/mysql_password.txt)
  2. 备份加密:对敏感数据备份进行加密

    # 使用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
  3. 远程备份:将备份文件同步到远程存储

    # 使用rsync同步到远程服务器
    rsync -avz /docker/mysql/backup/ user@remote-server:/remote/backup/path/
    
    # 或者上传到云存储
    aws s3 sync /docker/mysql/backup/ s3://your-bucket/mysql-backups/
  4. 监控备份:设置监控检查备份是否成功执行

    # 在备份脚本最后添加
    if [ $? -eq 0 ]; then
      echo "Backup successful"
    else
      echo "Backup failed" | mail -s "MySQL Backup Failed" admin@example.com
    fi

通过以上方案,你可以灵活地备份 Docker 中的 MySQL 数据,无论是完整备份、特定数据库/表备份,还是仅备份表结构,并能实现自动化定期备份。

posted @ 2025-07-04 15:27  郭慕荣  阅读(229)  评论(0)    收藏  举报