Из сценария я тысячи раз отправлял такой запрос в мою локальную базу данных:
update some_table set some_column = some_value
Я забыл добавить часть where, поэтому для одного и того же столбца было установлено одинаковое значение для всех строк в таблице, и это было сделано тысячи раз, и столбец был проиндексирован, поэтому соответствующий индекс, вероятно, обновлялся слишком много раз ,
Я заметил, что что-то не так, потому что это заняло слишком много времени, поэтому я убил сценарий. С тех пор я даже перезагрузил свой компьютер, но что-то застряло в таблице, потому что выполнение простых запросов занимает очень много времени, и когда я пытаюсь удалить соответствующий индекс, появляется следующее сообщение:
Lock wait timeout exceeded; try restarting transaction
Это таблица innodb, поэтому зависшая транзакция, вероятно, неявная. Как я могу исправить эту таблицу и удалить из нее зависшую транзакцию?
SHOW FULL PROCESSLIST
?Ответы:
У меня была аналогичная проблема, и я решил ее, проверив запущенные потоки. Чтобы увидеть запущенные потоки, используйте следующую команду в интерфейсе командной строки mysql:
Его также можно отправить из phpMyAdmin, если у вас нет доступа к интерфейсу командной строки mysql.
Это отобразит список потоков с соответствующими идентификаторами и временем выполнения, поэтому вы можете УБИТЬ потоки, выполнение которых занимает слишком много времени. В phpMyAdmin у вас будет кнопка для остановки потоков с помощью KILL, если вы используете интерфейс командной строки, просто используйте команду KILL, за которой следует идентификатор потока, как в следующем примере:
Это завершит соединение для соответствующего потока.
источник
Вы можете проверить текущие транзакции с помощью
Ваша транзакция должна быть одной из первых, потому что она самая старая в списке. Теперь просто возьмите значение
trx_mysql_thread_id
и отправьте емуKILL
команду:Если вы не уверены, какая транзакция принадлежит вам, очень часто повторяйте первый запрос и посмотрите, какие транзакции сохраняются.
источник
Проверить статус InnoDB на наличие блокировок
Проверить открытые таблицы MySQL
Проверить ожидающие транзакции InnoDB
Проверить зависимость блокировки - что что блокирует
Изучив приведенные выше результаты, вы сможете увидеть, что что блокирует.
Основная причина проблемы также может быть в вашем коде - пожалуйста, проверьте связанные функции, особенно на предмет аннотаций, если вы используете JPA, например Hibernate.
Например, как описано здесь , неправильное использование следующей аннотации может вызвать блокировки в базе данных:
источник
SELECT * FROM information_schema.innodb_trx t JOIN information_schema.processlist p ON t.trx_mysql_thread_id = p.id
выявил виновника: поток блокировки пришел с моего IP-адреса ... Я забыл закрыть консоль отладки, которую я оставил в середине транзакции ...Это начало происходить со мной, когда размер моей базы данных вырос и я выполнял с ней много транзакций.
Правда в том, что, вероятно, есть способ оптимизировать либо ваши запросы, либо вашу БД, но попробуйте эти 2 запроса для исправления работы.
Запустите это:
А потом это:
источник
Когда вы устанавливаете соединение для транзакции, вы получаете блокировку перед выполнением транзакции. Если не удается получить блокировку, попробуйте какое-то время. Если блокировка по-прежнему недоступна, возникает ошибка превышения времени ожидания блокировки. Причина, по которой вы не можете получить блокировку, заключается в том, что вы не закрываете соединение. Итак, когда вы пытаетесь получить блокировку второй раз, вы не сможете получить блокировку, поскольку ваше предыдущее соединение все еще не закрыто и удерживает блокировку.
Решение: закрыть соединение или
setAutoCommit(true)
(по вашему замыслу) снять блокировку.источник
Перезагрузите MySQL, все работает нормально.
НО будьте осторожны, если такой запрос завис, где-то есть проблема:
LIKE %...%
и т. д.)Как сказал @syedrakib, это работает, но это не долгоживущее решение для производства.
Остерегайтесь: перезапуск может повлиять на ваши данные с несогласованным состоянием.
Кроме того, вы можете проверить, как MySQL обрабатывает ваш запрос, с помощью ключевого слова EXPLAIN и посмотреть, возможно ли что-то для ускорения запроса (индексы, сложные тесты, ...).
источник
Перейти к процессам в mysql.
Итак, вы видите, что задача все еще работает.
Убейте конкретный процесс или дождитесь завершения процесса.
источник
Я столкнулся с той же проблемой с заявлением «обновить». Мое решение заключалось в том, чтобы просто выполнить операции, доступные в phpMyAdmin для таблицы. Я оптимизировал, очистил и дефрагментировал таблицу (не в таком порядке). Мне не нужно отбрасывать таблицу и восстанавливать ее из резервной копии. :)
источник
Я была такая же проблема. Я думаю, это была проблема с SQL. Вы можете просто принудительно закрыть процесс SQL из диспетчера задач. Если это не помогло, просто перезагрузите компьютер. Вам не нужно отбрасывать таблицу и перезагружать данные.
источник
У меня возникла эта проблема при попытке удалить определенную группу записей (с использованием MS Access 2007 с подключением ODBC к MySQL на веб-сервере). Обычно я удаляю определенные записи из MySQL, а затем заменяю их обновленными (каскадное удаление нескольких связанных записей, это упрощает удаление всех связанных записей для удаления одной записи).
Я попытался выполнить операции, доступные в phpMyAdmin для таблицы (оптимизация, очистка и т. Д.), Но при попытке сброса я получал необходимое разрешение на ошибку RELOAD. Поскольку моя база данных находится на веб-сервере, мне не удалось перезапустить базу данных. Восстановление из резервной копии было невозможно.
Я попытался запустить запрос на удаление для этой группы записей при доступе cPanel mySQL в Интернете. Получено такое же сообщение об ошибке.
Мое решение: я использовал бесплатный браузер запросов MySQL от Sun (Oracle) (который я ранее установил на свой компьютер) и выполнил там запрос на удаление. Сработало сразу, проблема решена. Затем я снова смог выполнить эту функцию, используя сценарий Access, используя соединение ODBC Access с MySQL.
источник
Починил это.
Убедитесь, что в запросе нет вставки несоответствующего типа данных. У меня была проблема, когда я пытался использовать "данные агента браузера пользователя"
VARCHAR(255)
и у меня возникла проблема с этой блокировкой, однако, когда я изменил ее,TEXT(255)
она исправила ее.Так что скорее всего это несоответствие типа данных.
источник
Я решил проблему, отбросив таблицу и восстановив ее из резервной копии.
источник