插件窝 干货文章 docker MySQL实现每天定时自动备份!

docker MySQL实现每天定时自动备份!

BACKUP MySQL 备份 PASSWORD 776    来源:    2025-05-02

Docker MySQL 每日自动备份方案

方案一:使用 crontab 和 docker exec 命令

1. 创建备份脚本

#!/bin/bash

# 定义变量
BACKUP_DIR="/path/to/backup/folder"
MYSQL_CONTAINER="your_mysql_container_name"
MYSQL_USER="root"
MYSQL_PASSWORD="your_password"
DATABASE_NAME="your_database_name"

# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR

# 生成备份文件名
BACKUP_FILE="$BACKUP_DIR/backup_$(date +\%Y\%m\%d_\%H\%M\%S).sql.gz"

# 执行备份
docker exec $MYSQL_CONTAINER mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD $DATABASE_NAME | gzip > $BACKUP_FILE

# 删除超过30天的备份
find $BACKUP_DIR -name "backup_*.sql.gz" -type f -mtime +30 -delete

echo "Backup completed: $BACKUP_FILE"

将上述脚本保存为 /path/to/backup_script.sh,并赋予执行权限:

chmod +x /path/to/backup_script.sh

2. 设置 crontab 定时任务

crontab -e

添加以下内容(每天凌晨2点执行备份):

0 2 * * * /path/to/backup_script.sh

方案二:使用 Docker 容器内部 cron

1. 创建自定义 MySQL 镜像

创建一个 Dockerfile

FROM mysql:latest

# 安装 cron
RUN apt-get update && apt-get install -y cron

# 创建备份脚本
RUN mkdir -p /backups
COPY backup_script.sh /backup_script.sh
RUN chmod +x /backup_script.sh

# 设置 cron 任务
RUN echo "0 2 * * * root /backup_script.sh" > /etc/cron.d/mysql-backup
RUN chmod 0644 /etc/cron.d/mysql-backup

# 启动 cron 服务
CMD ["sh", "-c", "cron && docker-entrypoint.sh mysqld"]

2. 创建备份脚本 backup_script.sh

#!/bin/bash

# MySQL 备份脚本
BACKUP_DIR="/backups"
MYSQL_USER="root"
MYSQL_PASSWORD="$MYSQL_ROOT_PASSWORD"
DATABASE_NAME="$MYSQL_DATABASE"

mkdir -p $BACKUP_DIR
BACKUP_FILE="$BACKUP_DIR/backup_$(date +\%Y\%m\%d_\%H\%M\%S).sql.gz"

mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD $DATABASE_NAME | gzip > $BACKUP_FILE

# 删除超过30天的备份
find $BACKUP_DIR -name "backup_*.sql.gz" -type f -mtime +30 -delete

3. 构建并运行容器

docker build -t mysql-with-backup .
docker run -d \
  --name mysql-container \
  -e MYSQL_ROOT_PASSWORD=yourpassword \
  -e MYSQL_DATABASE=yourdb \
  -v /host/backups:/backups \
  mysql-with-backup

方案三:使用第三方备份工具

使用 schickling/mysql-backup-s3 镜像(支持备份到 S3)

docker run -d \
  --name mysql-backup \
  --link your_mysql_container:mysql \
  -e MYSQL_USER=root \
  -e MYSQL_PASSWORD=yourpassword \
  -e MYSQL_DATABASE=yourdb \
  -e S3_ACCESS_KEY_ID=yourkey \
  -e S3_SECRET_ACCESS_KEY=yoursecret \
  -e S3_BUCKET=yourbucket \
  -e S3_PREFIX=backup \
  -e SCHEDULE='@daily' \
  schickling/mysql-backup-s3

注意事项

  1. 确保备份目录有足够的磁盘空间
  2. 定期测试备份文件的恢复流程
  3. 对于生产环境,建议将备份文件存储在不同的物理位置或云存储中
  4. 考虑加密敏感数据的备份
  5. 监控备份任务的执行情况

恢复备份

要恢复备份,可以使用以下命令:

gunzip < /path/to/backup_file.sql.gz | docker exec -i your_mysql_container mysql -uroot -pyourpassword yourdatabase

选择最适合您环境的方案,并根据实际需求调整参数。