冷备份前必须确认三件事:mysqld进程完全退出、所有表已刷新到磁盘、innodb_fast_shutdown设为0或1;需备份关键文件如ibdata1、ib_logfile*、数据库目录及my.cnf;恢复时注意权限、日志文件大小匹配及加密密钥。

停机前必须确认的三件事
冷备份本质是复制文件,但 MySQL 进程若仍在写数据,ibdata1、ib_logfile0 等文件可能处于不一致状态,直接拷贝会导致恢复失败。所以不是“只要关了 mysqld 就能备份”,而是必须确认:
- mysqld 进程已完全退出(用 ps aux | grep mysqld 检查,不能只信 systemctl stop mysql 的返回)
- 所有表已刷新到磁盘(FLUSH TABLES WITH READ LOCK 在停机前其实无效,真正起作用的是关机时的正常 shutdown 流程)
- innodb_fast_shutdown 设置为 0 或 1(默认是 1,够用;设为 2 会跳过崩溃恢复预处理,反而增加恢复风险)
备份时该拷哪些文件
不是整个 /var/lib/mysql 都要无脑复制。关键看存储引擎和配置:
- 必须包含:每个数据库对应的子目录(如 myapp)、mysql 系统库、performance_schema(可选,但建议保留)、ibdata1(InnoDB 共享表空间)、ib_logfile*(重做日志,恢复时需匹配原始大小)
- 可以排除:mysql.sock、mysqld.pid、auto.cnf(除非你打算复用同一 server UUID,否则恢复时会自动生成)
- 特别注意:my.cnf 或 mysqld.cnf 配置文件必须一并备份——innodb_page_size、innodb_log_file_size 等参数不匹配会导致启动失败
恢复时最常卡住的两个点
冷备份恢复快,但出问题往往就在最后几步:
- chown -R mysql:mysql /var/lib/mysql/ 忘了改权限,mysqld 启动报错 Can't open the mysql.plugin table 或直接静默退出
- ib_logfile* 文件存在但大小与配置中 innodb_log_file_size 不符,MySQL 会拒绝启动,并在错误日志里写 InnoDB: Error: log file ./ib_logfile0 is of different size —— 此时必须删掉旧日志文件,让 InnoDB 重建(前提是 innodb_fast_shutdown = 0 且 shutdown 干净)
- 如果原库启用了加密(innodb_encrypt_tables=ON),还要确保恢复环境有相同的 keyring_file_data 路径和密钥文件,否则表空间无法加载
比 mysqldump 冷备份更值得警惕的细节
很多人以为冷备份“没逻辑层转换,肯定比 dump 安全”,其实隐患更隐蔽:
- 时间点不可控:冷备只能回到停机那一刻,没法像 mysqlbinlog 那样追到秒级
- 插件/UDF 丢失:mysql.plugins 表里的记录虽在文件里,但若插件 SO 文件没同步过去,SHOW PLUGINS 会显示 DISABLED
- SELinux 或 AppArmor 策略可能阻止新路径上的文件被读取,恢复后启动失败但错误日志未必明说,得看 ausearch -m avc -ts recent
- 如果用 LVM 快照替代停机(即“伪冷备”),必须确保 FLUSH TABLES WITH READ LOCK + SHOW MASTER STATUS + 快照创建是原子连贯的,否则 binlog 位点和文件状态对不上










