【问题标题】:MySQL lost connection -> operation completed?MySQL失去连接->操作完成?
【发布时间】:2021-02-06 15:37:48
【问题描述】:

我有一个 >19M 行的表,我想创建一个子表(我将表分成几个较小的表)。所以我正在做一个CREATE TABLE new_table (SELECT ... FROM big_table)。我在 MySQL Workbench 中运行查询。

查询需要很长时间才能执行,所以最终我收到“与 MySQL 服务器的连接丢失”消息。然而,几分钟后新表就在那里,它似乎包含了所有应该被复制的数据(我正在做一个GROUP BY,所以不能只检查两个表中的行相等)。

我的问题是:即使我失去与数据库的连接,我是否可以保证查询已完成?或者 MySQL 是否会在中途中断查询并仍然留下不完整数据的表?

【问题讨论】:

  • 我不知道你的问题的答案,但是stackoverflow.com/questions/15712512/…你可能想使用keepalive来解决这个问题
  • 是的,我知道我可以增加超时限制。但我感兴趣的主要问题是即使连接丢失,查询是否会完成。或者查询本身是否会超时或静默失败?
  • 超时!= keepalive。但是,是的,我有兴趣看到你的问题的答案。我怀疑的答案是“是的,因为 MySQL 与 DDL 不是事务性的,因此即使客户端不再连接以接收响应,CREATE TABLE 也无法回滚”。但我个人不会指望它。

标签: mysql database-connection create-table


【解决方案1】:

即使我失去与数据库的连接,我是否保证查询已完成?

否。除了连接超时之外,还有多种原因会导致连接丢失错误。服务器可能由于磁盘空间用完或硬件故障而崩溃。管理员可能已终止您的会话。

“保证”在数据库管理领域是一个强有力的词。因为别人的数据。您不应假设 任何 查询都正确运行到完成,除非它优雅地结束。

如果您询问是因为隔夜查询失败并且您不想重复它,您可以使用COUNT(*) 之类的内容检查表,以说服自己它已完成。但请不要在生产中依赖这种黑客行为来处理他人的数据。

【讨论】:

  • 谢谢!即使表已创建并包含行,您会说这也适用吗?
  • 我认识到不信任我没有看到成功的查询的一般智慧。但我仍然想知道 MySQL 在技术上是否有可能让 CREATE TABLE SELECT 处于未完成状态?比如,创建了表,但只添加了 90% 的行。
猜你喜欢
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 2015-09-22
  • 2013-09-22
  • 2015-09-20
  • 2013-05-07
相关资源
最近更新 更多