rssLink RSS dla wszystkich kategorii
 
icon_orange
icon_red
icon_red
icon_blue
icon_blue
icon_blue
icon_green
icon_red
icon_blue
icon_blue
icon_blue
icon_blue
icon_blue
icon_blue
icon_blue
icon_blue
icon_red
icon_blue
icon_orange
icon_red
icon_blue
icon_blue
icon_blue
icon_blue
icon_green
icon_blue
icon_blue
 

FS#360 — MySQL server has gone away

Przydzielony do projektu— Serwery wirtualne
Modernizacja
dowolne (usługi Plan)
ZAMKNIĘTE
100%
Klienci zgłaszali nam problemy z bazą danych: "MySQL
server has gone away".
Problem był związany ze skryptami, które nie zamykają systematycznie połączeń SQL.
Jeżeli skrypt nie wykorzystuje
mysql_close(), serwer po 120 sekundach zrywa nieaktywne połączenie.
Należy zmodyfikować skrypty dodając mysql_close(), kiedy połączenie SQL nie jest już konieczne.

Schemat, który nie powoduje błędu:

mysql_connect()
mysql_select_db()
query()
mysql_close()

Schemat, który powoduje błąd:

mysql_connect()
mysql_select_db()
query()
// skrypt wykonuje czynności, które nie mają nic wspólnego z serwerem SQL

mysql_select_db()
query()
mysql_close()

należy zastąpić przez:

mysql_connect()
mysql_select_db()
query()
mysql_close()

Najgorszy schemat:

mysql_connect()
mysql_select_db()
query()
// brak mysql_close()!

Należy zastąpić przez:

mysql_connect()
mysql_select_db()
query()
mysql_close()

Wyjaśnienie:

Należy zalogować się na serwer SQL i wykonać zapytania SQL:

# mysql -u Twojabaza -p -h serwersql Twojabaza
mysql> show tables;
...
mysql>

- następnie należy poczekać 120 sekund, nie rozłączając się z serwera SQL. Można sprawdzić połączenie z serwerem, które pozostaje w stanie sleep od 25 sekund:

+---------+--------------+------------------+--------------+---------+------+-------+------------------+
| Id | User | Host | db | Command |
Time | State | Info |
+---------+--------------+------------------+--------------+---------+------+-------+------------------+
| 1932777 | Twojabaza | ipserwer:36034 | Twojabaza | Sleep |
25 | | |
+---------+--------------+------------------+--------------+---------+------+-------+------------------+

+---------+--------------+------------------+--------------+---------+------+-------+------------------+
| Id | User | Host | db | Command |
Time | State | Info |
+---------+--------------+------------------+--------------+---------+------+-------+------------------+
| 1932777 | twojabaza | ipserwera:36034 | twojabaza | Sleep |
119 | | |
+---------+--------------+------------------+--------------+---------+------+-------+------------------+


Po 120 sekundach serwer uznaje, że skrypt już dawno został zakończony i nie będzie używał tego połączenia. Zamyka połączenie. Każda baza danych posiada limit jeczesnych połączeń, dzięki temu Twoje skrypty mogą nieustannie łączyć się z serwerem i nie pojawia się problem typu: "User Twojabaza
already has more than 'max_user_connections'"

Jeżeli skrypt jest zle napisany, będzie próbował wykonać zapytanie SQL dla połączenia, którego już nie ma. W konsekwencji pojawi się błąd: "MySQL server has gone away".

mysql> show tables;
ERROR 2006 (HY000): MySQL server has gone away

Jest to normalne zachowanie serwera SQL na serwerze wirtualnym, gdzie zasoby nie są oddzielone dla każdego klienta a wspólne wszystkim klientom kont wirtualnych. Taki system zapewnia stabilność usług i eliminuje ryzyko wystąpienia awarii serwera SQL w przypadku zle napisanych skryptów.

Skrypty, które generują takie błędy powinny zostać zmodyfikowane.
mysql_close() i mysql_connect() powinny być systematyczne. Połączenia SQL powinny być krótkie.


Data:  poniedziałek, 23 kwiecień 2007, 14:25
Powód zamknięcia:  Done