前言
数据库备份的重要性不言而喻,特别是在生产环境,任何数据的丢失都可能产生严重的后果。所以,无论什么环境,我们都应该有相应的备份策略来定时备份数据库。
比较常用的逻辑备份工具是 mysqldump。
数据库备份脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #!/bin/bash
# 设置数据库连接参数 DB_HOST="localhost" DB_PORT="3306" DB_USER="root" DB_PASS="password"
# 判断 DB_ID 是否为空 DB_ID="123456" # 这里假设 DB_ID 是通过某种方式获取的,如果未设置则为空
# 设置备份数据库名称 DB_NAME="name"
# 设置备份目录 BACKUP_DIR="/home/dbbackup"
# 设置备份文件名格式,例如按日期命名 BACKUP_FILE_NAME="backup_$DB_NAME_$(date +%Y-%m-%d).sql"
# 设置是否压缩备份文件 (1 为压缩,0 为不压缩) COMPRESS_BACKUP=1
# 设置日志文件路径 LOG_FILE="/home/dbbackup/log/backup.log"
BACKUP_MN="/home/dbbackup/log"
# 检查备份目录是否存在,如果不存在则创建 if [ ! -d "$BACKUP_MN" ]; then mkdir -p "$BACKUP_MN" echo "[INFO] 创建备份目录: $BACKUP_MN" >> $LOG_FILE fi
# 进入备份目录 cd $BACKUP_DIR
# 计算保留日期,保留一年的数据 RETAIN_DATE=$(date -d "-1 year" +%Y-%m-%d)
# 直接覆盖现有备份文件 if [ -f "$BACKUP_FILE_NAME.gz" ]; then echo "[INFO] 备份文件已存在: $BACKUP_FILE_NAME.gz,将直接覆盖" >> $LOG_FILE rm "$BACKUP_FILE_NAME.gz" else echo "[INFO] 开始备份数据库..." >> $LOG_FILE fi
if [ -z "$DB_ID" ]; then # 直接连接数据库备份 echo "[INFO] 直接连接数据库备份..." >> $LOG_FILE mysqldump -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS --default-character-set=utf8 $DB_NAME > $BACKUP_FILE_NAME 2>> $LOG_FILE else # 使用 Docker 容器进行备份 echo "[INFO] 连接docker容器中数据库备份..." >> $LOG_FILE docker exec $DB_ID sh -c "exec mysqldump -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS --default-character-set=utf8 $DB_NAME" > $BACKUP_FILE_NAME 2>> $LOG_FILE fi
if [ $? -eq 0 ]; then echo "[INFO] 备份成功,备份文件: $BACKUP_FILE_NAME" >> $LOG_FILE
if [ $COMPRESS_BACKUP -eq 1 ]; then # 压缩备份文件 gzip $BACKUP_FILE_NAME 2>> $LOG_FILE echo "[INFO] 压缩备份文件成功: $BACKUP_FILE_NAME.gz" >> $LOG_FILE fi
# 删除保留日期之前的所有备份文件 find $BACKUP_DIR -type f -name "*.sql" -mtime +"$RETAIN_DATE" -delete 2>> $LOG_FILE echo "[INFO] 删除过期备份文件成功" >> $LOG_FILE
else echo "[ERROR] 备份失败!" >> $LOG_FILE fi
|
Linux系统定时执行脚本
Linux可使用 crontab 定时任务来执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| crontab是一个命令,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。
格式: * * * * * command 分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示 第2列表示小时1~23(0表示0点) 第3列表示日期1~31 第4列表示月份1~12 第5列标识号星期0~6(0表示星期天) 第6列要运行的命令
crontab -e 编辑该用户下的定时任务设置 crontab -l 列出该用户下的所有定时任务
|
- 打开终端,输入 crontab -e 命令,选择编辑器(如 vi)
- 输入命令如下,设置了每天凌晨2点执行数据库备份脚本,并将输出和错误日志重定向到 /root/scripts/mysql_backup.log 文件
1 2 3
| # 注意脚本执行权限及修改脚本路径 00 02 * * * sh /root/scripts/mysql_backup.sh > /root/scripts/mysql_backup.log 2>&1
|
- 请将此脚本保存为 /root/scripts/mysql_backup.sh,并确保它具有执行权限(通过 chmod +x /root/scripts/mysql_backup.sh 命令设置)。同时,请确保您的 crontab 配置正确无误。