我已经将 InnoDB mysql 服务器的数据目录从 Linux 计算机迁移到 Windows 计算机。我启动了服务器,选择了数据库,然后尝试查询表。出现错误“表不存在”,但它显示在“显示表”命令中。
我检查了我的服务器错误日志并发现:
“[错误] 无法从 InnoDB 的内部数据字典中找到或打开表 [dbname/tablename],尽管该表的 .frm 文件存在。InnoDB 的数据字典中,尽管该表的 .frm 文件存在。也许您删除并重新创建了 InnoDB 数据文件,但忘记删除 InnoDB 表的相应 .frm 文件,或者您已将 .frm 文件移动到另一个数据库?或者,该表包含此版本的引擎不支持的索引。请参阅http://dev.mysql.com/doc/refman/5.5/en/innodb-troubleshooting.html 如何解决该问题?”
我认为这可能与区分大小写有关?我尝试将 lower_case_table_names 设置为 0、1 和 2,但没有成功。
有人有什么想法吗?非常感谢!
答案1
您需要对所有内容进行 mysqldump !!!
关于错误消息,我称之为“鸽子洞”。它本质上是 ibdata1 中损坏的表元数据。没有办法删除它。您无法删除元数据所查找的表,因为无法通过其 inode 引用 ibdata1 之外的相应数据。有时,即使 mysqldumps 通过 .frm 命中表条目时也无法工作。
从另一个角度来看,ibdata1 中包含的元数据是 Lunix 式的并以 inode 为中心,这些概念对于基于 FAT 的 Windows 来说是陌生的。我不会信任以这种方式构建的 InnoDB 元数据。执行 mysqldump 会通过 SQL 为您提供逻辑数据表示,这与操作系统和硬件无关。
如果数据转储太大,你需要这样做数据库或表的并行转储并将这些 mysqldump 加载到 MySQL Windows 中。
如果你不确定或对编写脚本持谨慎态度,请获取MAATKIT 并使用 mk-parallel-dump(已弃用的工具,但适用于临时转储)将数据导出为 CSV 文件。然后,使用“mysqldump --no-data --routines --triggers”并生成表结构文件。在 MySQL Windows 中运行表结构文件。最后,使用 LOAD DATA INFILE 将 CSV 加载到 MySQL Windows 中。