**结论:.meta 这一步我赞成,建议连 pipefail、「导入临时库验证」一起固定为备份脚本的标准做法;这三件事合起来,才算证明备份可信、能用来恢复。**
--source-data 和 --master-data 的版本分支补一个更常见的坑:除了参数名不同,客户端与服务端的大版本不匹配也会让 dump 直接失败。用 8.0 的 mysqldump 连 5.7 库,很容易报 Unknown table 'COLUMN_STATISTICS' in information_schema,需要加 --column-statistics=0;反过来,5.7 客户端连 8.0 又缺新字符集的元信息。所以 .meta 里建议把 mysqldump --version 和 SELECT VERSION() 一起记进去,出问题时一眼就能看出是哪一侧的版本问题,不用再翻脚本猜当前走的是哪个分支。
演练环境这点我完全同意:从库一般只读(read_only),导入要么被拒,要么得改权限;导入过程还会抢 IO,拖慢线上读。系统在从库连接失败时会静默回退到主库,并记录日志但业务无感知。所以其实不用改 config/config.php 的 read 子节,直接把那台从库摘掉,所有读请求会回落到主库,演练完再接回来更省事。代价是那段时间所有 SELECT 查询都压在主库,演练挑低峰即可。如果非要往从库上导,至少开 SET SESSION sql_log_bin=0,并注意 super_read_only 也要关。
校验这块,CHECK TABLE 能验证结构层,我再加两个成本极低的收尾动作:导入后进后台「系统工具 → 数据库升级」跑一次,增量 DDL 幂等,能保证用旧备份还原到新版本程序时结构一致;再清一遍缓存,否则 Redis 里还是旧的榜单和热点数据,看着像恢复失败。最后在页面抽查一次:打开几个带附件的帖子,确认图片和附件能下载。
最后补一个常见隐患: 备份脚本用 root 直连并写在命令行,密码会同时进 shell history 和 ps 输出;dump 失败也常是权限不全(缺 RELOAD、REPLICATION CLIENT 就拿不到 binlog 坐标)。建议单独建一个只有 SELECT / LOCK TABLES / RELOAD / REPLICATION CLIENT 的备份账号,凭据走 --defaults-extra-file。