Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
У меня виснет процедура в цикле по таблицам на удаление дублей из ~200 таблиц по ~300 тыс записей каждая
Суть процедуры:
1. Получаем список нужных мне таблиц.
2. Запускаем цикл по таблицам на удаление дублей.
Собственно на этапе 2 процедура пробегает в среднем 20-40 таблиц за 15-20 минут и зависает, всего надо пробежать около 200 таблиц.
Код процедуры:
Отредактированно snakemw (19.08.2010 12:47:10)
Неактивен
А в списке процессов что? Может, ждет какой-то блокировки?
Неактивен
Процедуру запускаю из mysql консоли.
При зависании процедуры mysql работает как и раньше, без тормозов и сбоев и в консоли ничего не пишется, т.е. процедура и дальше работает, но уже ничего не делает.
Mysql при этом жрет 100%CPU:
Tasks: 135 total, 1 running, 134 sleeping, 0 stopped, 0 zombie
Cpu(s): 15.9%us, 9.4%sy, 0.0%ni, 74.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 4151192k total, 3964840k used, 186352k free, 69460k buffers
Swap: 3908632k total, 14260k used, 3894372k free, 3521552k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4507 mysql 20 0 266m 185m 3784 S 101 4.6 103:33.70 mysqld
31818 apache 20 0 8100 1636 812 S 0 0.0 15:32.06 nginx
Процессы mysql:
Команда Время Состояние SQL-запрос
Sleep 2 --- ---
Query 4548 Sending data DELETE t1 FROM t_offers_1000_76_21 t1, t_offers_1000_76_21 t2 WHERE t1.lhash = t2.lhash AND t1.id >
Sleep 10 --- ---
Когда в консоли жму Ctrl+C получаю следующее:
mysql> call gerni.offers_delete_doubles();
^CQuery aborted by Ctrl+C
ERROR 1317 (70100): Query execution was interrupted
Неактивен
Ну, значит, удаляет? Вручную запустите этот запрос — будет то же самое?
Неактивен
Опа... а виснет-то постоянно на одной и той же таблице... проверил ее
t_offers_1000_76_21 check status OK
оптимизация по этой таблице тоже проходит на ура... таблица содержит всего 323 тыс записей.
t_offers_1000_76_21 323,605 MyISAM utf8_general_ci 115.4 МБ
Что может быть с ней не так?
А я как нидь могу узнать на какой записи в таблице виснет?
Виснет все таки не процедура, а запрос на удаление, дело все таки в таблице.
Собственно что еще может помочь этой таблице, кроме дампа и последующего пересоздания?
Отредактированно snakemw (19.08.2010 16:07:46)
Неактивен
Смотрите в журнал ошибок MySQL. Может быть что угодно. Например, место
закончилось в разделе со временными таблицами. Может, индексов нету
каких-то для объединения. Имеет смысл посмотреть EXPLAIN аналогичного
SELECT.
Неактивен
Отредактированно snakemw (19.08.2010 16:54:07)
Неактивен
Ну вот, он пытается прочитать 323605 × 323605 = 104720196025 строк. Ну и это
тяжело Нужен индекс на (lhash, id).
Неактивен
Ваша правда... одного не пойму, почему он не поставился. Дело в том, что индексы проставлялись той же процедурой, по тем же 200 таблицам, а эта таблица оказалась пропущенной..
эх, сколько ж головной боли, из-за пропущенного индекса.
Неактивен
Страниц: 1