SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 19.08.2010 12:44:39

snakemw
Участник
Зарегистрирован: 19.08.2010
Сообщений: 5

Виснет процедура в цикле по 200таблицам на удаление дублей

У меня виснет процедура в цикле по таблицам на удаление дублей из ~200 таблиц по ~300 тыс записей каждая
Суть процедуры:
1. Получаем список нужных мне таблиц.
2. Запускаем цикл по таблицам на удаление дублей.

Собственно на этапе 2 процедура пробегает в среднем 20-40 таблиц за 15-20 минут и зависает, всего надо пробежать около 200 таблиц.

Код процедуры:


CREATE PROCEDURE offers_delete_doubles()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE tblname, tblrows VARCHAR(100);
#DECLARE @SQL varchar(8000), @table_name varchar(10);

#Get offers tables list
DECLARE rCursor CURSOR FOR SELECT `table_name`, `table_rows` FROM `information_schema`.`tables` WHERE `table_name` LIKE "t_offers_%" AND `table_name`<>"t_offers_updated";
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

OPEN rCursor;
FETCH rCursor INTO tblname, tblrows;

WHILE done = 0 DO

#Delete double records except for the first record
SET @SQL2=CONCAT('DELETE t1 FROM ',tblname,' t1, ',tblname,' t2 WHERE t1.lhash = t2.lhash AND t1.id > t2.id');
SET @SQL1 = CONCAT('INSERT i_offers_log SET `action`="del_doubles", `description`="',tblname,'", `qsql`="',@SQL2,'", `stamp`=NOW()');
PREPARE psql1 FROM @SQL1;
EXECUTE psql1;
PREPARE psql2 FROM @SQL2;
EXECUTE psql2;
#SET @SQL2=CONCAT('OPTIMIZE TABLE ',tblname);
#PREPARE psql2 FROM @SQL2;
#EXECUTE psql2;

FETCH rCursor INTO tblname, tblrows;
END WHILE;

CLOSE rCursor;
END;

Отредактированно snakemw (19.08.2010 12:47:10)

Неактивен

 

#2 19.08.2010 12:56:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Виснет процедура в цикле по 200таблицам на удаление дублей

А в списке процессов что? Может, ждет какой-то блокировки?

Неактивен

 

#3 19.08.2010 14:28:23

snakemw
Участник
Зарегистрирован: 19.08.2010
Сообщений: 5

Re: Виснет процедура в цикле по 200таблицам на удаление дублей

Процедуру запускаю из 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

Неактивен

 

#4 19.08.2010 15:19:14

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Виснет процедура в цикле по 200таблицам на удаление дублей

Ну, значит, удаляет? Вручную запустите этот запрос — будет то же самое?

Неактивен

 

#5 19.08.2010 16:00:49

snakemw
Участник
Зарегистрирован: 19.08.2010
Сообщений: 5

Re: Виснет процедура в цикле по 200таблицам на удаление дублей

Опа... а виснет-то постоянно на одной и той же таблице... проверил ее

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)

Неактивен

 

#6 19.08.2010 16:08:35

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Виснет процедура в цикле по 200таблицам на удаление дублей

Смотрите в журнал ошибок MySQL. Может быть что угодно. Например, место
закончилось в разделе со временными таблицами. Может, индексов нету
каких-то для объединения. Имеет смысл посмотреть EXPLAIN аналогичного
SELECT.

Неактивен

 

#7 19.08.2010 16:53:04

snakemw
Участник
Зарегистрирован: 19.08.2010
Сообщений: 5

Re: Виснет процедура в цикле по 200таблицам на удаление дублей


EXPLAIN SELECT * FROM t_offers_1000_76_21 t1, t_offers_1000_76_21 t2 WHERE t1.lhash = t2.lhash AND t1.id > t2.id

id    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra
1    SIMPLE    t1    ALL    PRIMARY    NULL    NULL    NULL    323605    
1    SIMPLE    t2    ALL    PRIMARY    NULL    NULL    NULL    323605    Using where
 

Отредактированно snakemw (19.08.2010 16:54:07)

Неактивен

 

#8 19.08.2010 17:06:12

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Виснет процедура в цикле по 200таблицам на удаление дублей

Ну вот, он пытается прочитать 323605 × 323605 = 104720196025 строк. Ну и это
тяжело smile Нужен индекс на (lhash, id).

Неактивен

 

#9 19.08.2010 17:22:52

snakemw
Участник
Зарегистрирован: 19.08.2010
Сообщений: 5

Re: Виснет процедура в цикле по 200таблицам на удаление дублей

Ваша правда... одного не пойму, почему он не поставился. Дело в том, что индексы проставлялись той же процедурой, по тем же 200 таблицам, а эта таблица оказалась пропущенной..

эх, сколько ж головной боли, из-за пропущенного индекса.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson