我正在尝试将 mysql 服务器迁移到新硬件。旧服务器在 RHEL 4 上运行 mysql 4.1.12;新服务器在 Ubuntu 10.04 上运行 mysql 5.1.41。我在尝试迁移其中一个数据库时遇到了一些奇怪的问题。我尝试使用 mysqldump,但文件无法正确导入到新服务器,因为它抱怨某个表上有重复的键,尽管我已经检查过并且非常确定实际上没有重复的键。
由于我花了好几天的时间与 mysqldump 方法作斗争却没有找到解决方案,我决定将整个 /var/lib/mysql 目录从旧服务器复制到新服务器。这似乎很有效,mysql 启动时没有出现任何抱怨,所有数据似乎都存在。但是,使用其中一个数据库的 Web 应用程序无法运行,并抱怨“表‘activities’的密钥文件不正确;请尝试修复它,第 194 行”(有趣的是,我遇到问题的表并不是 mysqldump 因重复密钥错误而无法导入的表,尽管它们都在同一个数据库中)。
我已经在 mysql shell 中对该表运行了 REPAIR TABLE,但是失败并显示消息“损坏”。
我还尝试使用 --recover 和 --safe-recover 标志对该表执行 myisamchk。在这两种情况下,它都说已修复错误,但 Web 应用程序仍然抱怨密钥文件不正确。
最让我困惑的是(当 mysqld 关闭时)我对相关表的 MYI 文件运行了 md5sum,结果发现旧服务器和新服务器上的表文件完全相同。如果两台机器上的表文件完全相同,那么我很奇怪为什么一台机器上的密钥文件不正确,而另一台机器上的密钥文件却正确。我几乎怀疑这是 mysql 的一个错误,但我不确定。
我将非常感谢任何帮助或建议,因为我不知道如何解决这个问题。我不是 mysql 专家,所以也许我忽略了一些显而易见的东西。
答案1
您无法在 MySQL 4.1 和 5.1 之间直接复制数据。无论如何,这通常都是一个坏主意,升级过程应遵循 MySQL 文档中的说明。
来自升级文档:
如果您执行二进制(就地)升级而不转储和重新加载表,则无法直接从 MySQL 4.1 升级到 5.1。这是由于 MySQL 5.0 中 MyISAM 表索引格式的不兼容更改造成的。
最好坚持转储和恢复。恢复时,请确保数据库为空,并且如果转储创建正确,则不应有任何 ID 冲突。