MySQL Cluster - Lock wait timeout exceeded; try restarting transaction

svetasmirnova

маленький монстрик
ну да. выполняю запрос.
mysql_query();
ловлю от него ответ и если ошибка, то считываю processlist и вывожу в отчет об ошибке.
Таким образом ты ничего не узнаешь: ошибка случилась, thread отключился, SHOW PROCESSLIST ничего не покажет.

Когда я говорила про SHOW PROCESSLIST я имела в виду следующее:

- script #1 каждую минуту выполняет SHOW PROCESSLIST и сохраняет результат в файл вместе со временем.

- запущен general query log

Ищем в логе SHOW PROCESSLIST время лока, сравниваем с general query log

Получили проблемные запросы, анализируем, оптимизируем.

> блиииннн, ну хоть какие-нить идеи???? как словить что творится? никаких мыслей...

Если запрос просто медленно выполняется просто slow query log и даже ничего из того, что написано выше.

И потом:

> а скрипты валятся...

Раз валятся, ты должен знать на чём они валятся. В смысле не просто же так он валится, а типа запрос выполняет или что-то.
 

440hz

php.ru
В смысле не просто же так он валится, а типа запрос выполняет или что-то.
попытаюсь опять рассказа ь что происзодит.

1. работают 3 ноды. на каждой ноде стоит MySQLAPI для кластера.
2. каждая нода собирает стату и раз в минуту примерно (по рандому) выполняет сброс статы в таблицы в кластере.
3. при сбросе данных выполняется LOCK TABLES aaa WRITE. Сброс статы. UPDATE или INSERT. UNLOCK.
4. таблиц статы около 40.
5. если убрать LOCK, то все работает, но есть вероятность получть следующую ситуацию.

НОДА2 считала стату. НОДА1 сбросила стату. НОДА2 думает что статы еще нет и ВСТАВЛЯЕТ запись вместо uPDATE. Имеем две не уникальные записи.

за месяц работы поимел такую ситуацию единожды, но сам факт...

стоит вернуть LOCK - валятся...

а где увеличить в кластере LockTimeOut я не нашел
 

svetasmirnova

маленький монстрик
Эээ, не нужно этого делать.

Во-первых, LOCK будет работать только для одной ноды и коллизию ты не разрешишь.

Во-вторых, NDB - это транзакционная storage engine и правильный путь использовать обычные транзакции.
 

440hz

php.ru
правильный путь использовать обычные транзакции.
можно пример SQL?

-~{}~ 10.06.09 00:51:

только для одной ноды
это я уже понял когда более внимательно прочитал доки.

можно все конечно же пустить через 1 API, но...

-~{}~ 10.06.09 00:52:

это транзакционная storage engine
если с двух нод придет UPDATE, то они не пересеrуться? NDB разрулит очередь?
 

svetasmirnova

маленький монстрик
> можно пример SQL?

[sql]
BEGIN;
"сбросили стату";
UPDATE или INSERT;
COMMIT;
[/sql]

> если с двух нод придет UPDATE, то они не пересеrуться? NDB разрулит очередь?

Да, разрулит, если транзакции будешь использовать.
 

440hz

php.ru
Да, разрулит, если транзакции будешь использовать.
mysql_query('BEGIN');
mysql_query(INSERT OR UPDATE);
mysql_query('COMMIT');


сие я правильно понимаю?


и тогда при ошибке просто все откатиться и я просто потеряю собранные данные, я целостност ь данных в базе не нарушиться?

тогда это решит проблему.
 

Wicked

Новичок
при ошибке нужно делать rollback

-~{}~ 10.06.09 22:08:

но в целом да, правильно понимаешь
 
Сверху