这个脚本解决什么问题?
对数据库来说,没有备份就像开车不系安全带——平时没感觉,真出事(误删、磁盘坏、被攻击)就是血本无归。手动备份又容易忘、还常常因为偷懒跳过。
自动备份脚本要解决两件事:每天坚持备份、别把旧备份堆满磁盘。前者保证数据安全,后者保证”备份”本身不会变成新的麻烦。
脚本全文
用途: 每天自动把指定数据库导出为 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,你就能做到”每天自动备份、自动清理”,给数据库上了个不用人管的安全带。