学完这篇,你能给自己的论坛搭一套「出事真能救回来」的 MySQL 备份方案,并知道全量、增量、逻辑、物理四种备份各自解决什么问题、什么时候用哪一种。
第一步:先分清四种备份到底是什么
- 逻辑备份:把数据和表结构导出成 SQL 文本(
mysqldump)。文件小、可读、能跨版本迁移,恢复靠重新执行 SQL。缺点是数据量大时慢。
- 物理备份:直接复制 MySQL 的数据文件目录(或 XtraBackup)。快,但基本只能恢复到同版本同环境。
- 全量备份:每次都备完整一份。最省心,占空间。
- 增量备份:只备上次之后变化的部分。省空间,但恢复要「全量 + 一串增量」按顺序重放,链条断一环就废。
实际生产里不会四选一,常见组合是:每周一次全量逻辑备份 + binlog 做增量 + 站点目录单独打包。
第二步:做一次全量逻辑备份
在服务器上执行(数据库名按你安装时填的替换):
mysqldump -u root -p \
--single-transaction --quick \
--default-character-set=utf8mb4 \
--routines --triggers --events \
--databases 你的库名 | gzip > /backup/db_$(date +%F).sql.gz
几个参数别省:
--single-transaction:InnoDB 下不锁表导出,论坛正常访问不受影响(Clara BBS 的表默认都是 InnoDB)。
--default-character-set=utf8mb4:不加容易在中文字段上出乱码。
--routines --triggers --events:插件可能自建表、加触发器,一起带走。
--databases:会把 CREATE DATABASE 语句一起写进去,恢复时不用先建库。
注意:mysqldump 只备数据库。论坛的图片、附件、头像都存在服务器目录里,不在表中。备份时把整个站点目录一起打包,否则恢复完帖子还在、图全裂了。
第三步:物理备份怎么做
最稳的物理备份是冷备:停 MySQL,整目录复制,再启回来。
systemctl stop mysql
cp -a /var/lib/mysql /backup/mysql_cold_$(date +%F)
systemctl start mysql
不停机就用 XtraBackup,但对新手来说,逻辑备份 + binlog 已经够用,物理备份更适合数据库几十 G 以上的场景。如果你用的是宝塔这类面板,面板自带的数据库备份就是逻辑备份的可视化版本,可以直接用。
第四步:用 binlog 做增量恢复
增量备份的核心不是文件,而是 MySQL 的二进制日志。确认 my.cnf 里开了:
[mysqld]
log-bin=mysql-bin
binlog_format=ROW
binlog_expire_logs_seconds=604800 # 保留 7 天
备份 binlog 本身就是备份文件:
mysqlbinlog --read-from-remote-server --host=127.0.0.1 -u root -p \
--raw --stop-never mysql-bin.000001 &
恢复时先在临时库上验证,再用 --stop-datetime 重放到误操作前一刻,避免把「误删帖」也一起重放回去。
注意:不要用论坛自带的站内计划任务去跑 mysqldump。那套 Cron::register 机制是给系统内部任务用的,靠前台访问懒触发,没流量就不跑,备份会莫名其妙断档。数据库备份一律交给系统级 crontab:
0 3 * * * /root/backup.sh >> /var/log/dbbackup.log 2>&1
第五步:恢复演练,别等出事才第一次跑
gunzip < /backup/db_2025-01-01.sql.gz | mysql -u root -p
恢复完按这个顺序自检:能登录后台 → 首页版块正常 → 打开一个带图的帖子 → 上传一张图 → 发一条回复。四项都过,才算恢复成功。
注意:如果开了 Redis 缓存,恢复数据库后旧缓存键可能残留。Redis 里存的只是缓存不是数据,清掉会按需重建,不用把 Redis 当备份对象。真正的数据只有 MySQL 库 + 站点文件目录。
小结
- 逻辑备份用
mysqldump --single-transaction,不锁表、带 routines/triggers、显式指定 utf8mb4。
- 物理备份快但绑定环境,冷备要停库,热备上 XtraBackup。
- 增量靠 binlog,前提是全量备份和 binlog 都连续不断档。
- 数据库 + 站点文件目录必须一起备份,只备库等于没备图。
- 用系统 crontab 定时跑,别用站内懒触发的计划任务。
- 每季度真跑一次恢复演练,备份不验证等于没有备份。