【发布时间】: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