0

如果在另一个表中不再有子记录,我正在尝试记录特定成员的记录。当我提交 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 表。

4

2 回答 2

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;

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

于 2016-01-25T21:50:29.513 回答
0

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

一个相关的 SO 查询也讨论了相同的问题。

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

编辑基于 OP 的回复

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

于 2016-01-25T18:23:25.360 回答