Потерянное соединение при УДАЛЕНИИ ОТ, а не при ВЫБОРЕ

Я пытаюсь записать конкретного участника, если у него больше нет дочерних записей в другой таблице. Когда я фиксирую DELETE FROM, я получаю Lost Connection или сервер 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.

2 ответа

Решение

Я решил проблему сам и у меня есть некоторые рекомендации о том, кто испытывает что-то подобное в будущем.

В моем случае 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;

Примечание. В производственной системе я бы не стал выполнять вышеуказанную процедуру. Я бы рекомендовал скопировать данные из поврежденной таблицы в новую таблицу, в которой нет ключей, и вручную удалить все дубликаты перед применением удаленных ключей, а затем скопировать данные обратно в исходную таблицу.

Пожалуйста, обратитесь к MySQL:MariaDB за информацией о том, когда это произойдет.

Соответствующий запрос SO также обсуждает ту же проблему.

По сути, кажется, что ваш запрос DELETE может занять слишком много времени, и время соединения MySQL с сервером-клиентом истекло.

РЕДАКТИРОВАТЬ На основе ответа от ОП

По этой ссылке поврежденная таблица Innodb также может вызвать эту проблему. Обратитесь к нижеприведенным 2 ссылкам для процесса диагностики и устранения неисправностей:

Другие вопросы по тегам