0%

Docker安装的Mysql数据库定时备份脚本

功能说明:

    1. 使用 docker exec 调用 mysqldump,生成 .sql 备份文件;
    1. 文件名中包含当前时间,保存在 mysql_backup/ 目录;
    1. 自动清理:
    • 删除 超过 7 天的备份文件;
    • 保留每月 1 号的备份文件,不管时间多久。

脚本 mysql_backup.sh

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
#!/bin/bash

# ========== 配置 ==========
CONTAINER_NAME="mysql"
MYSQL_USER="dbuser"
MYSQL_PASSWORD="dbpassword"
BACKUP_DIR="/home/ubuntu/mysql_backup"

# ========== 创建备份目录 ==========
mkdir -p "$BACKUP_DIR"

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

# ========== 执行备份 ==========
echo "开始备份:$BACKUP_FILE"
docker exec "$CONTAINER_NAME" mysqldump -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" --all-databases > "$BACKUP_FILE"

# ========== 清理逻辑 ==========
echo "清理旧备份..."

# 找出所有 .sql 文件
find "$BACKUP_DIR" -type f -name "*.sql" | while read file; do
# 提取文件名中的日期
filename=$(basename "$file")
date_str=$(echo "$filename" | grep -oP '\d{4}-\d{2}-\d{2}')

# 如果提取不到日期,跳过
if [[ -z "$date_str" ]]; then
continue
fi

# 获取今天日期和文件日期的时间戳
file_ts=$(date -d "$date_str" +%s)
today_ts=$(date +%s)

# 计算文件和今天的天数差
age_days=$(( (today_ts - file_ts) / 86400 ))

# 如果超过 7 天且不是每月 1 号
if [[ $age_days -gt 7 ]]; then
day_of_month=$(date -d "$date_str" +%d)
if [[ "$day_of_month" != "01" ]]; then
echo "删除过期备份:$file"
rm -f "$file"
fi
fi
done

echo "备份完成。"

设置定时任务

设置每天 12:00 和 20:00 备份一次,并将日志写入文件。

1
0 12,20 * * * /home/ubuntu/mysql_backup.sh >> /home/ubuntu/mysql_backup.log 2>&1