mysql如何从备份恢复数据到新服务器_mysql迁移恢复方法

来源:这里教程网 时间:2026-02-28 20:52:29 作者:

确认备份文件类型再操作

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
快速验证表结构完整性,别只看服务是否启动成功。

相关推荐