【问题标题】:Lost connection on DELETE FROM, not on SELECT在 DELETE FROM 上失去连接,而不是在 SELECT 上
【发布时间】:2016-01-25 18:12:48
【问题描述】:

如果某个特定成员的记录在另一个表中不再有子记录,我正在尝试该记录。当我提交 DELETE FROM 时,我收到一个丢失的连接或 MySQL 服务器已经消失。如果我从数据库中选择相同的记录,我会得到一个有效的回报。我已经包含了以下交互:

SELECT m.* FROM Member m LEFT OUTER JOIN MemberAssociation ma ON m.memberID = ma.memberID WHERE m.scanCode = 12345 AND ma.associationCode IS NULL;
/* The expected Member records, which appear to be valid.  2 Rows */

DELETE m.* FROM Member m LEFT OUTER JOIN MemberAssociation ma ON m.memberID = ma.memberID WHERE m.scanCode = 12345 AND ma.associationCode IS NULL;
ERROR 2013 (HY000): Lost connection to MySQL server during query

DELETE m.* FROM Member m LEFT OUTER JOIN MemberAssociation ma ON m.memberID = ma.memberID WHERE m.scanCode = 12345 AND ma.associationCode IS NULL;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    2
Current database: my_database

ERROR 2013 (HY000): Lost connection to MySQL server during query

是否有可能我可以做些什么来解决这个问题,或者我更有可能偶然发现了一个软件错误?

我正在运行 innodb_version:5.6.19-67.0 和 MariaDB 版本:10.0.13-MariaDB。 Member 表是一个 InnoDB 表。

【问题讨论】:

  • 请为这两个表提供`SHOW CREATE TABLE。
  • 试试这个查询:DELETE FROM Member m WHERE m.scanCode = 12345 and m.memberID IN( select ma.memberID MemberAssociation ma where ma.associationCode IS NULL )

标签: mysql innodb mariadb mysql-error-2006 mysql-error-2013


【解决方案1】:

我已经自己解决了这个问题,并且对将来遇到这种情况的人提出了一些建议。

在我的例子中,MySQL 由于表损坏而失败。我使用CHECK TABLE 工具发现了错误。

CHECK TABLE Member;
+-------------------------+-------+----------+----------+
| Table                   | Op    | Msg_type | Msg_text |
+-------------------------+-------+----------+----------+
| my_database.Member | check | status   | OK       |
+-------------------------+-------+----------+----------+

CHECK TABLE MemberAssociation;
ERROR 2013 (HY000): Lost connection to MySQL server during query

然后我尝试将数据复制出来,但由于 PRIMARY KEY 问题而无法复制:

CREATE TABLE MemberAssociation_recover LIKE MemberAssociation

INSERT INTO MemberAssociation_recover SELECT * FROM MemberAssociation;
ERROR 1062 (23000): Duplicate entry 'XXXXX-YYYYY-ZZZZ' for key 'PRIMARY'

显然有些不对劲。

此时我执行了mysqldump 并发现MemberAssociation 表中的大多数行都存在重复。因为这是一个开发数据库,​​所以我通过以下过程恢复了数据:

CREATE TEMPORARY TABLE MemberAssociationIgnore LIKE MemberAssociation;
INSERT IGNORE INTO MemberAssociationIgnore SELECT * FROM MemberAssociation;
DELETE FROM MemberAssociation;
INSERT INTO MemberAssociation SELECT * FROM MemberAssociationIgnore;

注意:在生产系统上,我不会遵循上述程序。我建议将数据从损坏的表中复制到没有键的新表中,并在应用删除的键之前手动清除所有重复项,然后将数据复制回原始表中。

【讨论】:

    【解决方案2】:

    请参阅MySQL:MariaDB 了解有关何时发生这种情况的背景信息。

    related SO query 也讨论了同样的问题。

    基本上,您的 DELETE 查询可能花费的时间太长,并且 MySQL 服务器-客户端连接超时。

    编辑基于 OP 的回复

    根据this 链接,损坏的 Innodb 表也可能导致此问题。有关诊断和故障排除过程,请参阅以下 2 个链接:

    【讨论】:

    • 我已经引用了你链接的 SO 帖子,但不觉得它适用于此。我的 net_read_timeout 为 30,wait_timeout 为 28800,interactive_timeout 为 28800。此外,查询在我尝试运行后立即报告丢失的连接。据说这些超时会在几秒钟内发生,错误会在不到一秒的时间内返回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2014-01-03
    相关资源
    最近更新 更多