数据库备份脚本只会 dump 一把梭?这份定时备份方案能救命

来源:互联网 时间:2026-08-28

问过不少站长:有备份吗?答有,拷过一份。再问什么时候拷的?去年。这种备份等于没有。数据库备份要做到三条:自动化、异地存、定期演练恢复。三条都不难,一个脚本加一条 cron 全搞定。

先说 dump 命令怎么写才对。默认参数导出的文件恢复时容易出问题,这几个参数建议照抄:

mysqldump -uroot -p'密码' \
--single-transaction \ # InnoDB一致性快照,不锁表
--routines --triggers \ # 存储过程和触发器别落下
--default-character-set=utf8mb4 \
--hex-blob \ # 二进制字段安全导出
dbname | gzip > /backup/dbname_$(date +%F).sql.gz

--single-transaction 是 InnoDB 表的关键参数,用一致性快照代替锁表,备份期间网站照常跑。没加这个参数的话,dump 期间整库锁写,用户会体验一次全站卡死。

打包成完整脚本,带过期清理:

#!/bin/bash
# /var/www/tasks/db_backup.sh
BACKUP_DIR=/backup/mysql
KEEP_DAYS=14
mkdir -p $BACKUP_DIR

for db in site_db forum_db; do
mysqldump -uroot -p'密码' --single-transaction --routines --triggers \
--default-character-set=utf8mb4 "$db" | gzip > \
"$BACKUP_DIR/${db}_$(date +%F_%H%M).sql.gz"
done

# 删过期备份
find $BACKUP_DIR -name '*.sql.gz' -mtime +$KEEP_DAYS -delete

# 异地:推到另一台机器
rsync -az $BACKUP_DIR/ backup@备机IP:/backup/mysql/

crontab 每天凌晨 3 点跑一次,日志照旧落盘。至此自动化和异地都有了,但第三条演练才是灵魂——没恢复过的备份只是心理安慰:

# 找个测试库练恢复
gunzip < site_db_2026-08-25_0300.sql.gz | mysql -uroot -p'密码' site_db_test
# 抽查关键表的行数和最新数据

建议每季度做一次演练,顺便记录恢复耗时。真出事那天,你会感谢当时多花了这十分钟。库大的站点 dump 会越来越慢,后面可以上 XtraBackup 物理备份,但中小站点这套方案够用好几年。(数据来源:MySQL官方手册)

相关文章

标签:

A5创业网 版权所有