必须在mysqld完全停止后执行xtrabackup --copy-back,否则因文件被占用导致恢复失败;需确认服务已停、pid/socket无残留、datadir为空、指定--defaults-file路径、并完整chown权限。

恢复前 MySQL 服务没停,mysqld 还在跑
这是最常踩的坑——xtrabackup --copy-back 或 --move-back 必须在 mysqld 完全停止后执行。如果进程还在,它会持续写入 ib_logfile* 和 ibdata1,导致文件被占用或状态不一致。
典型现象:xtrabackup 报错类似 Failed to open file 'ibdata1': Device or resource busy,或者恢复后启动失败,日志里反复出现 InnoDB: Unable to lock ./ibdata1。
- 确认服务已停:
systemctl is-active mysql或ps aux | grep mysqld,确保无残留进程 - 检查 socket 和 pid 文件是否残留:
ls -l /var/lib/mysql/*.pid /var/run/mysqld/mysqld.sock,有就手动删掉(但别删数据文件) -
datadir目录必须为空:恢复前rm -rf /var/lib/mysql/*(先备份原目录!)
--copy-back 后启动失败,错误日志里报 Event Scheduler 相关错误
MySQL 5.6+ 默认启用事件调度器(event_scheduler),但 XtraBackup 恢复时不会自动重建 mysql.event 表结构。若备份时该表损坏或缺失,恢复后 mysqld 启动直接 abort。
常见日志片段:[ERROR] Event Scheduler: Failed to open table mysql.event、[ERROR] Aborting。
- 临时绕过:在
/etc/my.cnf的[mysqld]段加一行event_scheduler=DISABLED,再启动 - 根本修复:启动后执行
mysql_upgrade -u root -p(MySQL 5.7 及以前),或对 MySQL 8.0+ 执行mysqld --upgrade - 注意:别跳过
mysql_upgrade,否则后续可能无法创建事件、触发器异常
恢复命令漏了 --defaults-file,xtrabackup 读错配置路径
xtrabackup 不会自动加载 /etc/my.cnf,必须显式指定。一旦缺失,它按默认路径(如 /var/lib/mysql)去找数据文件,而你的实际 datadir 在 /data/mysql/3306,结果就是复制错地方、权限混乱、启动时报 Table 'mysql.plugin' doesn't exist。
验证方式:grep datadir /etc/my.cnf 确认真实路径,再看恢复命令是否带了 --defaults-file=/etc/my.cnf。
- 必须加:
xtrabackup --defaults-file=/etc/my.cnf --copy-back --target-dir=/backup/full - 如果配置分散在多个文件(如
/etc/my.cnf.d/server.cnf),合并到主配置或用--defaults-extra-file补充 - 别信“本地备份不用指定”——只要
my.cnf里改过datadir、socket、log_error,就必须传
恢复后 chown 没做全,mysqld 启动卡在权限拒绝
恢复只是把文件复制过去,所有权还是 root 或备份用户。MySQL 启动时以 mysql 用户运行,若 /var/lib/mysql/ibdata1 或 mysql/ 子目录属主不是 mysql,就会静默失败,日志里只有一行 mysqld_safe mysqld from pidfile ended。
重点不止是 chown -R mysql:mysql /var/lib/mysql,还要检查:
-
ls -ld /var/lib/mysql:目录本身权限至少是750,不能是700(其他用户进不去) -
ls -l /var/lib/mysql/ib*:确保ibdata1、ib_logfile*属主是mysql - 如果用了 SELinux,
restorecon -Rv /var/lib/mysql重置上下文,否则mysqld被拦在门外
真正麻烦的不是哪一步做错,而是错误日志里没直接说“你少 chown 了”,它只报抽象的 Aborting 或 PID file not updated。每次恢复前,盯住三件事:服务停干净、--defaults-file 写对、chown 覆盖所有层级——漏一个,就得重来一遍。











