确认备份文件类型再操作
MySQL 恢复前必须分清备份是
mysqldump生成的 SQL 文本,还是
xtrabackup或
mysqlbackup做的物理备份。两者恢复路径完全不同:SQL 备份用
mysql客户端导入;物理备份需先
innobackupex --apply-log再拷贝到
datadir并改权限。混用会直接导致服务启动失败或数据不一致。
用 mysql 命令导入 SQL 备份时的常见坑
导入前确保目标 MySQL 实例已运行,且用户有对应库的
CREATE和
INSERT权限。执行命令时注意: 不要在 SQL 文件里带
CREATE DATABASE语句却忽略
-e "CREATE DATABASE IF NOT EXISTS db_name",否则库不存在会报错
ERROR 1049 (42000): Unknown database避免用
source backup.sql在 MySQL 客户端内执行大文件——容易因超时或内存溢出中断,应改用 shell 层:
mysql -u root -p db_name若备份含
SET FOREIGN_KEY_CHECKS=0,但目标表结构未提前创建,导入会卡在约束校验上;建议先
mysql -e "CREATE DATABASE db_name",再导入
跨版本恢复要注意 sql_mode 和字符集
从 MySQL 5.7 恢复到 8.0 时,
sql_mode默认值变化(如移除了
NO_AUTO_CREATE_USER),可能导致
INSERT报错;同样,备份中若含
utf8mb4_0900_as_cs排序规则,而目标实例未启用
collation_server=utf8mb4_0900_as_cs,建表会失败。
实操建议:
导入前在目标实例执行:SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';检查备份文件头是否有
SET NAMES utf8mb4,并确认目标
my.cnf中
character-set-server=utf8mb4已生效 对 5.7 → 8.0 迁移,优先用
mysqldump --skip-set-charset --default-character-set=utf8mb4重备一次
物理备份恢复后必须重做权限和日志路径
用
xtrabackup恢复到新服务器后,
datadir下的文件属主仍是原服务器的
mysql:mysql,但新机器可能用不同 UID/GID;同时
innodb_log_file_size若与原配置不一致,MySQL 启动会拒绝加载。
关键步骤:
执行chown -R mysql:mysql /var/lib/mysql(路径以实际
datadir为准) 删掉旧日志文件:
rm -f /var/lib/mysql/ib_logfile*,让 MySQL 启动时按
my.cnf里的
innodb_log_file_size重建 检查
server-id是否唯一——若用于主从,必须修改,否则复制线程起不来
物理恢复完成后,务必用
mysqlcheck -u root -p --all-databases --check快速验证表结构完整性,别只看服务是否启动成功。
