不能直接 rsync /var/lib/mysql 跨机房迁移,因lsn不一致、文件系统差异、selinux上下文丢失及innodb日志与数据页逻辑不一致,易致启动报错innodb: database page corruption或卡在recovery阶段。

为什么不能直接 rsync /var/lib/mysql 跨机房迁移
直接拷贝 /var/lib/mysql 目录在同机、同版本下偶尔能跑起来,但跨机房几乎必挂。根本问题不在文件是否复制完整,而在 InnoDB 内部状态不一致:每个 .ibd 和 ibdata1 里都存有 LSN(Log Sequence Number),它必须严格递增且与 ib_logfile* 中的 redo 日志逻辑对齐。手动 rsync 不会重放日志、不回滚未提交事务、不校验页校验和,启动时大概率报错 InnoDB: Database page corruption 或卡死在 recovery 阶段。
常见连带问题还包括:SELinux 上下文丢失、ext4 vs xfs 文件系统差异、MySQL 进程残留的 mysql.sock 或 aria_log_control 锁文件、以及目标机 my.cnf 中 innodb_log_group_home_dir 指向错误路径。
xtrabackup --backup 必须加哪些参数才安全
生产环境跨机房迁移,备份命令绝不能只写 xtrabackup --backup。关键参数缺一不可:
-
--no-lock:跳过FLUSH TABLES WITH READ LOCK,避免主库写入阻塞 —— 跨机房网络延迟高,锁表几秒就可能触发应用超时 -
--slave-info:生成xtrabackup_slave_info,记录当前MASTER_LOG_FILE和MASTER_LOG_POS,后续搭建从库可直接CHANGE MASTER TO -
--user和--password必须显式指定,且该用户需具备BACKUP_ADMIN权限(root最省事) -
--parallel=4(或更高):加速备份,尤其对大库;但别超过 CPU 核数 × 2 - 务必加
--defaults-file=/etc/my.cnf(或实际配置路径),否则 xtrabackup 可能读错datadir或innodb_page_size
绝对不要加 --safe-slave-backup:它会停 SQL 线程,导致主从延迟突增,且仍要执行 FTWRL,违背低影响初衷。
--prepare 必须分两步,漏掉 --apply-log-only 就丢数据
备份传到新服务器后,不能直接 --copy-back。InnoDB 必须先重放 redo log、再回滚未提交事务,这个过程必须拆成两步:
- 对全量备份执行:
xtrabackup --prepare --apply-log-only --target-dir=/backup/full/(只重放日志,不回滚) - 若用了增量备份,按时间顺序对每个增量集执行:
xtrabackup --prepare --apply-log-only --target-dir=/backup/full/ --incremental-dir=/backup/inc1/ - 最后对全量备份执行一次不带
--apply-log-only的--prepare:xtrabackup --prepare --target-dir=/backup/full/(完成回滚,生成一致性快照)
如果跳过第一步,直接最终 --prepare,xtrabackup 会错误地把增量日志也回滚掉,恢复后数据比原库少——这种缺失往往只有业务查账时才发现,无法靠 COUNT(*) 发现。
恢复后启动失败,90% 出在权限和配置细节
执行 xtrabackup --copy-back 后,chown -R mysql:mysql /var/lib/mysql 只是基础操作,真正容易翻车的是这些:
- 确认目标机
my.cnf中innodb_log_group_home_dir指向正确路径(默认是datadir,但如果自定义了 redo log 路径,这里必须同步) - 检查
lower_case_table_names值是否与源库一致(Linux 默认 0,Windows 默认 1,不一致会导致表找不到) -
innodb_page_size必须完全相同,否则mysqld启动直接拒绝加载ibdata1 - 清空目标
datadir下所有残留文件(包括auto.cnf、server-uuid、mysql.sock),否则可能被误认为已有实例在运行 - 首次启动建议加
--skip-grant-tables --skip-networking,等初始化完成再补授权
LSN 对齐、权限还原、配置镜像这三件事没做扎实,备份再完美也白搭。物理迁移不是“拷过去就能用”,而是把源库的状态原子化地重建出来。











