最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
MySQL如何跨操作系统恢复备份
时间:2026-08-28 09:42:49 编辑:袖梨 来源:一聚教程网
跨操作系统恢复必须用mysqldump导出SQL文本,禁用物理文件复制;需排除mysql系统库、适配认证插件、手动建库并指定collation,且须验证GTID、字符集等隐性兼容项。
跨操作系统恢复必须用 mysqldump,别碰物理文件
Windows → Linux 或 macOS → Linux 恢复时,直接复制 /var/lib/mysql 或 data/ 目录 100% 失败。错误如 Tablespace is missing for table 或 Can't find file: './db/t1.frm' 都是典型症状——NTFS 和 ext4 对文件权限、大小写敏感性、inode 结构处理完全不同,InnoDB 的 .ibd 文件根本不可移植。
唯一可行路径:只用 mysqldump 导出的 SQL 文本。它不依赖字节序、页格式或文件系统,只要目标 MySQL 实例能执行标准 SQL(5.7/8.0/甚至 MariaDB),就能还原。
- 导出端和导入端操作系统无关,关键看 MySQL 版本兼容性
- 不要用
--all-databases直接导出全部,尤其要排除mysql系统库(加--ignore-database=mysql) - 若源库是 MySQL 8.0,默认认证插件为
caching_sha2_password,导入到 5.7 会报错Unknown authentication plugin 'caching_sha2_password';需在导出时加--default-auth=mysql_native_password
恢复前必须手动建库并指定正确 collation
直接 mysql -u root -p mydb 很可能失败——因为 mysqldump --databases 生成的 SQL 里虽含 CREATE DATABASE,但默认用的是源库字符集和排序规则,而 8.0 和 5.7 默认 collation 不同:utf8mb4_0900_ai_ci vs utf8mb4_general_ci。目标库若没提前建好,或 collation 不匹配,后续表创建会乱码或报错。
安全做法是分两步:
- 先在目标 MySQL 中执行:
DROP DATABASE IF EXISTS mydb; CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;(注意:collation 必须与源库一致,查SHOW CREATE DATABASE mydb;确认) - 再导入:
mysql -u root -p mydb - 如果备份里含
DROP DATABASE,且你不想删旧库,导出时加--skip-dump-date --no-create-db,或手动删掉 SQL 文件开头的DROP DATABASE行
导入时关键参数:禁用唯一检查 + 显式设字符集
大库导入卡住、报 Duplicate entry 或 Incorrect string value?不是数据问题,而是默认行为没调对。
- 导入前执行:
SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;(可写进 SQL 文件头部,或用mysql -e "SET ..." -e "source backup.sql") - 导入命令必须显式指定字符集:
mysql -u root -p --default-character-set=utf8mb4 mydb ,否则客户端用 latin1 连接,utf8mb4 数据会变乱码 - 若备份含 GTID(MySQL 5.6+),且目标库未开启 GTID 或已存在事务,导入会失败;导出时加
--set-gtid-purged=OFF,或导入前执行SET @@GLOBAL.GTID_PURGED='';
Windows 导出 → Linux 导入时换行符要留意
mysqldump 在 Windows 上默认用 CRLF(rn),Linux 解析 SQL 一般没问题,但极少数情况(比如含特殊注释或长文本字段)会导致语法解析异常,表现为 ERROR 1064 卡在某一行。
稳妥做法:
- 导出后,在 Windows 上用
unix2dos / dos2unix转换(Linux 端运行:dos2unix backup.sql) - 或导出时加
--result-file=backup.sql(比重定向>更可靠,自动处理换行) - 检查 SQL 文件头是否含
/*!40101 SET @OLD_CHARACTER_SET_CLIENT= */——没有说明导出未识别版本,需补--set-gtid-purged=OFF或--skip-extended-insert再试
跨 OS 恢复真正难的不是命令本身,而是那些藏在字符集、collation、GTID、换行符里的隐性不一致。每一步都得验证,不能假设“导出能跑,导入就一定成”。