前言
1.Docker、本地部署的MySQL数据定时备份,定时清理
2.支持命令行指定数据库备份(逗号分隔),未指定时自动备份所有非系统库
3.按时间分目录存储压缩备份,
4.设置Linux定时任务执行备份
一、本地备份
1.创建Shell备份脚本
#!/bin/bash
# 定义参数
BACKUP_DIR="/home/backup/" # 宿主机备份目录
DATE=$(date +"%Y%m%d%H%M")
DOCKER_NAME="yth_admin_mysql" # 容器名称
DB_USER="root"
DB_PASSWORD="ytHMsql#6068"
DB_NAMES=("yth_admin" "yth_wflow_prod") # 需要备份的数据库
# 创建备份目录(宿主机目录)
mkdir -p $BACKUP_DIR
# 循环备份数据库
for DB_NAME in "${DB_NAMES[@]}"; do
docker exec $DOCKER_NAME sh -c \
"exec mysqldump -u$DB_USER -p$DB_PASSWORD --databases $DB_NAME" \
> $BACKUP_DIR/${DB_NAME}-${DATE}.sql
# 检查退出状态
if [ $? -eq 0 ]; then
echo "[SUCCESS] Backup of $DB_NAME completed at $(date)"
else
echo "[ERROR] Backup failed for $DB_NAME" >&2
exit 1
fi
done
# 清理旧备份(保留60天)
find $BACKUP_DIR -type f -name "*.sql" -mtime +60 -exec rm {} \;
# 打印最终完成信息
echo "All databases backup completed at $(date +'%Y-%m-%d %H:%M:%S')"
文件名称:backup.sh (直接部署的mysql需要用此脚本)
#!/bin/bash
# 定义备份参数
BACKUP_DIR="/data/backup/database/mysql/" # 备份存储目录
DATE=$(date +"%Y%m%d%H%M") # 备份文件名中的时间戳
DB_USER="root" # MySQL 用户
DB_PASSWORD="root" # MySQL 密码
DB_NAME="db1" # 要备份的数据库名
# 创建备份目录(宿主机目录)
mkdir -p $BACKUP_DIR
# 创建备份 这里需要用绝对路径,不然定时任务执行时会调用不到该命令
/usr/bin/mysqldump -u $DB_USER -p$DB_PASSWORD $DB_NAME > $BACKUP_DIR/$DB_NAME-$DATE.sql
# 可选:删除旧备份文件,保留最近7天的备份
find $BACKUP_DIR -type f -name "*.sql" -mtime +7 -exec rm {} \;
# 打印备份完成信息
echo "Backup of database '$DB_NAME' completed on $DATE."
2.修改文件权限
chmod +x /home/backup/database/backup.sh
3.运行
# sh 你的脚本文件路径
sh /home/backup/backup.sh
4.添加定时任务进行
创建log日志目录
mkdir -p /home/backup/log
进入定时任务编辑器
crontab -e
编辑定时任务
# 添加一个定时任务,定期执行备份脚本(例如每天凌晨 2 点执行备份)
# 添加日志文件,将正确执行日志输出到 backup.log 将执行失败的日志输出到error.log
0 2 * * * /home/backup/database/backup.sh >> /home/backup/log/backup.log 2>> /home/backup/log/error.log
查看定时任务是否写入
crontab -l
二、远程备份(备份到另一台服务器)
要实现SSH免密登录,需确保本地机器的公钥已添加到远程服务器的authorized_keys中。
1.在本地机器生成SSH密钥对(如果不存在)
# 在本地服务器上执行
ssh-keygen -t rsa
连续回车使用默认路径(~/.ssh/id_rsa)和空密码。
2.将公钥复制到远程服务器
# 在本地服务器上执行
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.11.0.211
输入远程服务器的root密码,完成后将自动添加公钥到211的~/.ssh/authorized_keys。
也可以在远程服务器上手动创建/root/.ssh/authorized_keys,然后复制本地服务器id_rsa.pub文件中的内容
3.验证免密登录
ssh root@172.11.0.211
应无需密码直接登录。
4.修复权限问题(如需要)
在远程服务器(211)上检查权限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
5.修改备份脚本
#!/bin/bash
# 定义参数
REMOTE_HOST="172.11.0.211" # 远程服务器IP
REMOTE_USER="root" # 远程服务器SSH用户(建议使用专用账户)
DOCKER_NAME="mysql" # 容器名称
BACKUP_DIR="/home/backup/database/mysql/${REMOTE_HOST}" # 按IP区分备份目录
DATE=$(date +"%Y%m%d%H%M")
DB_USER="root" # 专用备份用户
DB_PASSWORD="root"
DB_NAMES=("db1" "db2") # 需要备份的数据库
# 自动将远程主机密钥添加到本地信任列表(首次执行一次即可)
# ssh-keyscan -H ${REMOTE_HOST} >> ~/.ssh/known_hosts 2>/dev/null
# 创建备份目录
mkdir -p $BACKUP_DIR
# 循环备份数据库
for DB_NAME in "${DB_NAMES[@]}"; do
# 通过 SSH 在远程服务器执行 Docker 命令备份
ssh ${REMOTE_USER}@${REMOTE_HOST} \
"docker exec ${DOCKER_NAME} mysqldump \
-u${DB_USER} \
--password='${DB_PASSWORD}' \
--databases ${DB_NAME} \
--single-transaction \
--routines \
--triggers \
--hex-blob" > "${BACKUP_DIR}/${DB_NAME}-${DATE}.sql" 2>> "${BACKUP_DIR}/error.log"
# 检查退出状态
if [ $? -eq 0 ]; then
echo "[SUCCESS] Backup of $DB_NAME completed at $(date)"
else
echo "[ERROR] Backup failed for $DB_NAME. Check error.log for details." >&2
# 可选:继续备份其他数据库而不是退出
# exit 1
fi
done
# 清理旧备份(保留7天)
find $BACKUP_DIR -type f -name "*.sql" -mtime +7 -exec rm {} \;
# 打印最终完成信息
echo "All databases backup completed at $(date +'%Y-%m-%d %H:%M:%S')"
注:出现 Host key verification failed 错误的原因是本地计算机尚未将远程服务器的 SSH 公钥添加到信任列表中。
# 在本地终端运行以下命令,手动完成首次 SSH 连接认证:
ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} "echo '首次连接成功'"
# 系统会提示是否信任远程服务器,输入 yes 确认即可。之后脚本将不再报错。