【问题标题】:MySQL database migration missing dataMySQL数据库迁移缺失数据
【发布时间】:2014-10-26 14:52:14
【问题描述】:

我不确定这是否应该在 SuperUser 中发布,因为我们在 Workbench 中使用内置的迁移向导,如果应该移动这个问题,请告诉我。

目标
我们目前正在将数据库从一台服务器迁移到另一台服务器,并且由于 MySQL Workbench 有一个名为迁移向导的内置功能,我们认为我们会继续愉快地迁移它。我们有 16 种不同的数据库架构需要迁移,它们的大小各不相同(最小的是 3 MB,最大的是 76 GB)。

问题
我们开始尝试将其中一个 14.7 GB 的中型到大型的迁移并开始正常,但是在它成功迁移了其中的一半表后,我们收到错误“MySQL 服务器已消失”。在确保连接稳定并用电缆连接(可能是无线信号掉线?)并确保完全权限并使用 root 用户进行迁移后,我们仍然收到“服务器已消失”错误。

然后我们尝试使用运行良好的小型数据库,因此我们认为这可能是一个超时问题。我们尝试删除超时设置,但对于较大的数据库,我们仍然得到相同的错误。真正的关键是我们目前正在经历的事情。

当我们在 150 MB 的数据库上尝试此操作时,迁移向导会正确完成迁移,而不会出现任何错误或警告。只是出于好奇,我运行了以下代码

SELECT table_name AS "Table", 
round(((data_length + index_length) / 1024 / 1024), 2) "Size in MB" 
FROM information_schema.TABLES 
WHERE table_schema = "TableName"
ORDER BY "Table";

确保表格大小正确。令我们惊讶的是,源数据库中表的总和为 150 MB,但目标数据库中的总和为 94 MB。

问题
除了超时和特权之外,我们为什么会收到“服务器已消失”错误的其他原因可能是什么?为什么迁移向导会说迁移成功而没有警告或错误,但实际上只迁移了大约 60% 的数据?迁移向导可以不被信任还是不应该被信任的表大小查询?我们这样做是不是完全错了,即,您是否推荐另一种更稳定的数据库迁移方式?

如果需要,我很乐意提供更多信息。

编辑:
MySQL 版本:5.1.41 (Ubuntu)

我们还检查了每个模式中每个表的行数,虽然大多数是正确的,但有些结果是错误的。这就是数据不一致发挥作用的地方。在 150 MB / 94 MB 示例中,有 25 个表。在这 25 个表中,有 23 个是正确的,2 个是错误的。在源中,其中一张表有 257 万行,但其中只有 150 万行最终出现在目标表中。

编辑 2:
再次运行相同的查询现在给了我 150 个中的 94 个、150 个中的 8 个、150 个中的 24 个,现在它是第四次迁移整个数据库。我猜这个问题出在其他地方,但我一生都无法弄清楚原因。迁移 150 MB 数据需要 92 分钟。推断这将给我大约 1 个月的时间来迁移 75 GB 的数据库——这显然是不对的。

【问题讨论】:

  • 这看起来像是一个计时问题,在该会话或 my.cnf 中交互式超时和等待超时的当前值是多少?您是否测试将两者都设置为 0(无限)?
  • 我们查看了 my.cnf 但找不到任何看起来像交互式或等待超时的参数。我们正在寻找哪些具体参数?感谢您抽出宝贵的时间。
  • interactive_timeout 默认为 28800,即 8 小时。
  • 这可能确实是由于发送客户端上的活动(首先卸载东西)和接收服务器上的不活动造成的。
  • 我建议在服务器上直接使用mysqldump,传输文件并使用mysql客户端直接在另一台服务器上导入文件——考虑到表的大小。

标签: mysql database mysql-workbench database-migration


【解决方案1】:
  1. 数据库中的大小可能会有所不同,即使它包含相同的数据。迁移时,您还会对数据进行碎片整理
  2. 我不会相信有这么多数据的迁移向导。 MySQL 不能很好地处理大数据,插入和其他内容可能会静默失败,或者仅在 MySQL 未在严格模式下运行时出现警告。
  3. 如果您要迁移所有内容(包括用户和元数据),只需在两个数据库都关闭时复制/rsync 整个 mysql_data 文件夹。

【讨论】:

  • 很抱歉没有回复您,因为它在工作中的优先级较低:S 但现在我回来了! :) 我将数据作为行数进行了检查,似乎在 312 万行上我在 mysqldump 迁移期间丢失了 20 000 行,所以我肯定会丢失一些数据。你知道这可能是什么原因吗?
【解决方案2】:

我知道这是一篇旧帖子,但为了其他人的利益,您可以使用HeidiSQL,它通过将您的数据库导出到您选择的另一个数据库来完美地完成工作:

  • 转到您的数据库(右键单击它)-> 将数据库导出为 SQL。
  • 选择输出目标 -> 要将数据库导出到的服务器(您需要已将数据库服务器添加到列表中)。

【讨论】:

  • 感谢您甚至在这个旧帖子上发帖 :) 我不再是组织的一部分或使用 MySQL,但它看起来是最好的解决方案,特别是考虑到它看起来就像 SQL Server Management Studio 以及如何在那里导出/导入数据库。谢谢!
  • @MagneTism 我明白了。我自己刚刚遇到这个问题,并在找到解决方案后发现了你的问题。我想把它包括在这里,因为没有提到它。不客气。
猜你喜欢
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2015-09-21
  • 2012-11-16
  • 2016-08-22
相关资源
最近更新 更多