MySQL усечение зависает - PullRequest
       21

MySQL усечение зависает

1 голос
/ 14 января 2011

Я пытаюсь усечь таблицу с 300 000 строк. Когда другие запросы не выполняются, я запускаю усеченный запрос, и он просто зависает.

show processlist; говорит, что состояние "обновляется".

Версия сервера: 5.1.41-3ubuntu12.8 (Ubuntu)

Таблица InnoDB.

Есть идеи, почему это происходит, или как я могу исследовать проблему дальше?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 24 января 2011

Я думаю, что это проблема проверки внешнего ключа.

Я обнаружил, что следующее работает так быстро, как и ожидалось:

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table_name;
SET FOREIGN_KEY_CHECKS = 1;
1 голос
/ 13 ноября 2015

Хотя это и не самый технический ответ, я боролся с этой проблемой только сегодня.Я перепробовал все вышеперечисленное (блокировка таблиц, проверка внешних ключей, проверка состояния механизма innodb и т. Д.), Ни один из которых не был полезен (хотя в последнем случае я просто недостаточно понимал, что я читал).

У меня была таблица почтовых заданий, которая отказывалась быть заблокированной, усеченной, переименованной или удаленной (несмотря на то, что она была полностью пустой). Я наконец спрятал и перезапустил службу mysql, и в этот момент я смог внести необходимые изменения, без проблем..

0 голосов
/ 14 января 2011

У одного из наших клиентов был стол размером 450 ГБ . И мы попробовали все способы очистить эту таблицу, но никто не решил проблему.

Мы пытались усечь таблицу, но операция усечения заняла более 10 часов и не решила проблему. И когда мы использовали WHERE statement в любом запросе к этой таблице, SQL-сервер выполняет запрос без остановки.

Единственный способ, которым я мог очистить таблицу за 1 секунду , заключался в следующем:

set rowcount 1;

truncate table TABLE_NAME;

И, конечно же, после усечения таблицы просто уменьшите базу данных.

При таком подходе вы просто удаляете указатель на эту таблицу, и строки данных таблицы будут удаляться при сжатии

...