一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

MySQL如何跨操作系统恢复备份

时间:2026-08-28 09:42:49 编辑:袖梨 来源:一聚教程网

跨操作系统恢复必须用mysqldump导出SQL文本,禁用物理文件复制;需排除mysql系统库、适配认证插件、手动建库并指定collation,且须验证GTID、字符集等隐性兼容项。

跨操作系统恢复必须用 mysqldump,别碰物理文件

Windows → Linux 或 macOS → Linux 恢复时,直接复制 /var/lib/mysqldata/ 目录 100% 失败。错误如 Tablespace is missing for tableCan't find file: './db/t1.frm' 都是典型症状——NTFS 和 ext4 对文件权限、大小写敏感性、inode 结构处理完全不同,InnoDB 的 .ibd 文件根本不可移植。

唯一可行路径:只用 mysqldump 导出的 SQL 文本。它不依赖字节序、页格式或文件系统,只要目标 MySQL 实例能执行标准 SQL(5.7/8.0/甚至 MariaDB),就能还原。

  1. 导出端和导入端操作系统无关,关键看 MySQL 版本兼容性
  2. 不要用 --all-databases 直接导出全部,尤其要排除 mysql 系统库(加 --ignore-database=mysql
  3. 若源库是 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 不匹配,后续表创建会乱码或报错。

安全做法是分两步:

  1. 先在目标 MySQL 中执行:DROP DATABASE IF EXISTS mydb; CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;(注意:collation 必须与源库一致,查 SHOW CREATE DATABASE mydb; 确认)
  2. 再导入:mysql -u root -p mydb
  3. 如果备份里含 DROP DATABASE,且你不想删旧库,导出时加 --skip-dump-date --no-create-db,或手动删掉 SQL 文件开头的 DROP DATABASE

导入时关键参数:禁用唯一检查 + 显式设字符集

大库导入卡住、报 Duplicate entryIncorrect string value?不是数据问题,而是默认行为没调对。

  1. 导入前执行:SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;(可写进 SQL 文件头部,或用 mysql -e "SET ..." -e "source backup.sql"
  2. 导入命令必须显式指定字符集:mysql -u root -p --default-character-set=utf8mb4 mydb ,否则客户端用 latin1 连接,utf8mb4 数据会变乱码
  3. 若备份含 GTID(MySQL 5.6+),且目标库未开启 GTID 或已存在事务,导入会失败;导出时加 --set-gtid-purged=OFF,或导入前执行 SET @@GLOBAL.GTID_PURGED='';

Windows 导出 → Linux 导入时换行符要留意

mysqldump 在 Windows 上默认用 CRLF(rn),Linux 解析 SQL 一般没问题,但极少数情况(比如含特殊注释或长文本字段)会导致语法解析异常,表现为 ERROR 1064 卡在某一行。

稳妥做法:

  1. 导出后,在 Windows 上用 unix2dos / dos2unix 转换(Linux 端运行:dos2unix backup.sql
  2. 或导出时加 --result-file=backup.sql(比重定向 > 更可靠,自动处理换行)
  3. 检查 SQL 文件头是否含 /*!40101 SET @OLD_CHARACTER_SET_CLIENT= */ ——没有说明导出未识别版本,需补 --set-gtid-purged=OFF--skip-extended-insert 再试

跨 OS 恢复真正难的不是命令本身,而是那些藏在字符集、collation、GTID、换行符里的隐性不一致。每一步都得验证,不能假设“导出能跑,导入就一定成”。

热门栏目