MySQL数据库备份并定时清理脚本

前言

数据库备份的重要性不言而喻,特别是在生产环境,任何数据的丢失都可能产生严重的后果。所以,无论什么环境,我们都应该有相应的备份策略来定时备份数据库。
比较常用的逻辑备份工具是 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 列出该用户下的所有定时任务

  1. 打开终端,输入 crontab -e 命令,选择编辑器(如 vi)
  2. 输入命令如下,设置了每天凌晨2点执行数据库备份脚本,并将输出和错误日志重定向到 /root/scripts/mysql_backup.log 文件
    1
    2
    3
    # 注意脚本执行权限及修改脚本路径
    00 02 * * * sh /root/scripts/mysql_backup.sh > /root/scripts/mysql_backup.log 2>&1

  3. 请将此脚本保存为 /root/scripts/mysql_backup.sh,并确保它具有执行权限(通过 chmod +x /root/scripts/mysql_backup.sh 命令设置)。同时,请确保您的 crontab 配置正确无误。