这个脚本解决什么问题?

对数据库来说,没有备份就像开车不系安全带——平时没感觉,真出事(误删、磁盘坏、被攻击)就是血本无归。手动备份又容易忘、还常常因为偷懒跳过。

自动备份脚本要解决两件事:每天坚持备份、别把旧备份堆满磁盘。前者保证数据安全,后者保证”备份”本身不会变成新的麻烦。

脚本全文

用途: 每天自动把指定数据库导出为 SQL 备份文件,并只保留最近 7 天,防止数据丢失又避免磁盘被旧备份占满。

#!/bin/bash

DB="wpdb"                       # 要备份的数据库名
BACKUP_DIR="/backup/mysql"      # 备份存放目录
KEEP=7                          # 只保留最近 7 天的备份
DATE=$(date +%F)                # 今天的日期,用于给备份文件命名

mkdir -p "$BACKUP_DIR"          # 目录不存在就创建(-p 不报错)

# 执行备份:--single-transaction 保证备份时数据一致、不锁表
mysqldump --single-transaction --quick "$DB" > "$BACKUP_DIR/${DB}-${DATE}.sql"

# 删除 7 天前的旧备份,避免磁盘被越堆越满
find "$BACKUP_DIR" -name "*.sql" -mtime +"$KEEP" -exec rm -f {} \;

echo "[$(date '+%F %T')] 备份完成:$BACKUP_DIR/${DB}-${DATE}.sql"

怎么用(含安全传密码)

# 方式一:临时用环境变量传密码(不推荐生产)
MYSQL_PWD='你的密码' ./backup_mysql.sh

# 方式二(生产推荐):把密码写进 ~/.my.cnf 并设权限 600
vim ~/.my.cnf
# [client]
# user=root
# password=你的密码
chmod 600 ~/.my.cnf

# 配定时,每天凌晨 3 点自动备份
crontab -e
0 3 * * * /root/scripts/backup_mysql.sh

常见坑

现象原因解决
报 Access denied密码没传对用 ~/.my.cnf 正确配置并给 600 权限
备份文件是 0 字节导出失败但没报错拦截加了 set -e 一般能拦截;确认库名拼写
磁盘被备份堆满没清理旧备份确认清理行的 KEEP 和 crontab 正常

小结

自动备份脚本做好三件事:mysqldump 正确导出、文件名带日期方便追溯、find -mtime 只留近 N 天。配上 crontab 和 ~/.my.cnf,你就能做到”每天自动备份、自动清理”,给数据库上了个不用人管的安全带。