General error: 2006 MySQL server has gone away – vždy na konci skriptu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
maral
Člen | 25
+
0
-

Ahoj, řešíme u nás na projektu už delší dobu podobné errory:

SQLSTATE[HY000]: General error: 2006 MySQL server has gone away

Typicky jde o cron skripty, které se vykonávají delší dobu. Největší zvláštností ale je, že vždycky tyto dlouhé skripty spadnou až úplně na konci, na posledním SQL dotazu, například při ukládání výsledku cronu do DB. Před tím se ale provede třeba 3000 dotazů bez problémů. Náhoda? Nemyslím si :D

Samozřejmě jsem problém researchoval, ovšem zatím žádný fix nepomohl – např:

ini_set('mysql.connect_timeout', 3600);
ini_set('default_socket_timeout', 3600);

I přesto se error vyplivne třeba po 2 minutách.

Nejtypičtější příčinou této chyby byla přílišná velikost přenášených dat (ale to u toho posledního pidi dotazu nepřichází v úvahu), a tak předpokládám, že dojde k timeoutu spojení, což je druhá nejčastější příčina. Napadá mě, že jelikož předchozí dotazy jsou všechny podobné, tak by se mohly lazy-loadovat všechny najednou, což by trvalo dlouho a před posledním dotazem na ukládání do DB by tak spojení timeoutovalo. Je to dobrá úvaha?

Nějaké nápady, návrhy na řešení?

maral
Člen | 25
+
+1
-

Díky za drobnou nápovědu. Ten link sice nepomohl, ale přes něj jsem se už ke správnému řešení dobral. Bylo třeba přenastavit MySQL proměnnou wait_timeout (která je u nás na serveru nastavená na 120 sekund), což lze změnit snadno:

$dbContext->query("SET wait_timeout = 3600");

Nastavená hodnota vydrží až do konce spojení. Pokud správně chápu, tak problém spočíval v tom, že na své straně PHP jsem měl timeouty nastavené správně, ale MySQL samo aktivně spojení přeruší, pokud s ním server nekomunikuje déle než je hodnota proměnné wait_timeout.