"Lost connection during query" при вставке записи insert delayed

kewluser

Новичок
"Lost connection during query" при вставке записи insert delayed

Господа!

Есть скрипт. Схема вкратце такая. После запуска скрипт пораждает несколько своих копий (не более 10) вызовом fork(). Далее каждая из копий собирает данные и формирует запросы на вставку в MySQL БД, при этом используется insert с модификатором delayed. Каждая копия использует одно и тоже соединение с MySQL, link_id общий у всех потомков.

Скрипт и сервер MySQL находятся в сети на разных машинах.

Проблема.

По истечении некоторого времени работы скрипта, минут 10-15, некоторые запросы на вставку записи проваливаются, MySQL возвращает (mysql_error()) "Lost connection during query". Соотвественно запись не вставляется.

Причем процент таких провалов невилик, как правило записи успешно вставляются.

В чем может быть проблема? Любые варианты?

Точно можно исключить:
1. Проблемы с сетью. Предположим, что среда передачи данных идеальна
2. Машинка, на которой работает MySQL работает стабильно, не зависает, перезагружается etc.
 

440hz

php.ru
установить по вкусу ...

Код:
dev(root):/usr/local/etc/apache2#>mysqladmin -p var | grep timeout
Enter password:
| connect_timeout                 | 5                                                          |
| delayed_insert_timeout          | 300                                                        |
| interactive_timeout             | 28800                                                      |
| net_read_timeout                | 30                                                         |
| net_write_timeout               | 60                                                         |
| slave_net_timeout               | 3600                                                       |
| sync_replication_timeout        | 0                                                          |
| wait_timeout                    | 28800                                                      |
 

kewluser

Новичок
Уточнение.

Все, и скрипт, и MySQL работает на Linux. Используется CGI вариант PHP.

-~{}~ 27.02.06 22:18:

Спасибо за совет, попробую увеличить таймауты.

Но в чем может быть причина превышения тамаутов?

-~{}~ 27.02.06 22:20:

И еще один вопрос в тему. В моей схеме все порожденные процессы, которых пока не более 10, но в перспективе будет порядка 40, использует одно и тоже соединение с MySQL БД, т.е. link_id у всех общий.

Будет ли лучше, если я сделаю отдельное соединение с MySQL для каждого порожденного процесса?

-~{}~ 01.03.06 10:14:

Попробовал увеличить тамауты не помогло.

Ситуация полностью повторяется если использовать обычный insert, без delayed. Куда копать?
 

Andreika

"PHP for nubies" reader
kewluser
а ни один вариант из мануала по MySQL не подходит? ( A.2.8 MySQL server has gone away )
 

kewluser

Новичок
Посмотрел, там описываются три причины возникновения ошибки:

1. Таймаут, 8 часов бездействия, явно не мой случай
2. Выдача команды серверу MySQL на закрытие соединения, и попытка выполнить запрос. Тоже не мой случай, соединение я не закрываю
3. Принудительно заверешение обрабатывающего запрос потока командой kill, тоже не мой случай
4. Пакет с данными превышает лимит max_allowed_packet, не мой случай, у меня текущее значение этой переменной больше одного мегабайта

Почему тогда у меня возникает эта ошибка?

В принципе, как решить проблему понятно - повторно установливать соедение при возникновении этой ошибки и отправлять запрос повторно, пока он успешно не выполнится. Но это полумера. Как понять и устранить суть проблемы?
 

Andreika

"PHP for nubies" reader
тамж ниже
You can get more information about the lost connections by starting mysqld with the --log-warnings=2 option. This logs some of the disconnected errors in the hostname.err file. See Section 5.11.1, “The Error Log”.
 

kewluser

Новичок
Да. Установил log-warnings=2, повторил ошибку, в errorlog НИЧЕГО не упало.
 

Andreika

"PHP for nubies" reader
(в целях повышения моей образованности) а каким образом получается одно и тоже соединение у 10 скриптов? а все 10 нормально работают на момент падения и потом все 10 выдают ошибку? а что будет с подключением, если один из скриптов завершится?
 

kewluser

Новичок
Скрипт один - во время работы он вызовом fork() пораждает свои копии эмулируя многопоточность.

Еще раз про работу с MySQL. При запуске скрипт сначала инициализирует подклчюение к MySQL вызовом mysql_connect(), получая некоторый link_id. Затем создаются копии процесса вызовом fork() каждый из которых делает то, что нужно. Но поскольку они являются копиями вся память, значения всех переменных в момент запуска копий совпадает со значениями переменных исходного процесса, в том числе и link_id.

-~{}~ 01.03.06 16:43:

Копии не завершаются раньше времени, это специально контроллируется. Завершения копий иницирует процесс, который их создавал по истечению заданного времени

-~{}~ 01.03.06 16:44:

Да и во время возникновения этой ошибки все созданные процессы работают стабильно
 

PartizaneN

I speak PHP
Черт... у меня похожая проблема... Раньше всё работало хорошо, а теперь - бравзишь страницы сайта и вдруг "Lost connection during query" причем сразу же... обновляешь - всё ок... :(
 
Сверху