rssLink RSS for all categories
 
icon_red
icon_green
icon_orange
icon_orange
icon_red
icon_green
icon_green
icon_orange
icon_green
icon_orange
icon_green
icon_green
icon_green
icon_blue
icon_orange
icon_red
icon_green
icon_red
icon_orange
icon_red
icon_green
icon_green
icon_red
icon_orange
icon_orange
icon_green
icon_green
icon_green
icon_green
icon_green
icon_red
 

FS#1469 — MySQL server has gone away

Attached to Project— Web Hosting / CloudDB
Amélioration
All web clusters
CLOSED
100%
Certains clients se plaignent d'avoir un message d'erreur "MySQL server has gone away".
Il s'agit d'un probleme sur les scripts qui ne ferment pas systematiquement les
connexions SQL et n'est pas un probleme sur les installations d'Ovh. En effet, si le
scripts n'utilise pas mysql_close() pour liberer la connexion SQL, le serveur se
protege au bout de 120 secondes et coupe la connexion inactive lui-même. Il faut
donc reecrire les scripts pour ajouter systematique mysql_close() lorsque la connexion
SQL n'est plus necessaire.

Le shema qui ne provoque pas l'erreur:
>mysql_connect()
>mysql_select_db()
>query()
>mysql_close()

Le shema qui provoque l'erreur:
>mysql_connect()
>mysql_select_db()
>query()
>// ici le script fait des choses qui n'ont rien à avoir avec le serveur SQL
>mysql_select_db()
>query()
>mysql_close()

doit être reecrit en:
>mysql_connect()
>mysql_select_db()
>query()
>mysql_close()
>// ici le script fait des choses qui n'ont rien à avoir avec le serveur SQL
>mysql_connect()
>mysql_select_db()
>query()
>mysql_close()

Le pire shema (à eviter)
>mysql_connect()
>mysql_select_db()
>query()
>// pas de mysql_close() du tout !

doit être reecrit en:
>mysql_connect()
>mysql_select_db()
>query()
>mysql_close()

Explication:

Pour reproduire le message d'erreur il suffit:
- de se connecter sur le serveur SQL et d'effectuer une requete SQL:
# mysql -u votrebase -p -h serveursql votrebase
mysql> show tables;
...
mysql>

- d'attendre 120 secondes sans se deconnecter du serveur SQL. On voit
la connexion sur le serveur qui reste en etat sleep depuis 25 secondes:
+---------+--------------+------------------+--------------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+---------+--------------+------------------+--------------+---------+------+-------+------------------+
| 1932777 | votrebase | ipserveur:36034 | votrebase | Sleep | 25 | | |
+---------+--------------+------------------+--------------+---------+------+-------+------------------+

Si on attend encore on voit que la connexion reste en place jusqu'à 120 secondes
en pensant que le script va la reutiliser.

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

A 120 secondes le serveur SQL estime que le script a fini son execution depuis longtemps
et qu'il ne va plus utiliser cette connexion. Il prend la décision de la couper et de
permettre d'autres connexion à la place. En effet, chaque base de données possede un
nombre limité de connexion simultanées. Grâce à cette gestion, vos scripts peuvent toujours
se connecter sur le serveur et vous evitez l'erreur "User votrebase already has more
than 'max_user_connections'"

Si le script est mal écrit, il va essayer d'effectuer une requete SQL sur une connexion
qui n'existe plus et va avoir l'erreur "MySQL server has gone away".

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

Il s'agit donc d'un comportement normal du serveur SQL dans un environement
mutualisé où les resources ne sont pas dédiées à un seul client mais sont
disponibles pour l'ensemble des clients du serveur. C'est une mesure qui
permet maintenir la qualité de service et eviter la panne du serveur SQL
à cause de scripts qui sont mal écrits.

Les scripts qui font ce genre d'erreurs doivent être reecrit. mysql_close()
et mysql_connect() doivent être systematiques. Les connexions SQL doivent
être brefs et dés qu'il n'est plus necessaire d'avoir la connexion SQL
la connexion doit être liberée pour permettre à d'autres scripts d'utiliser
le serveur SQL.

Date:  Sunday, 22 April 2007, 02:46AM
Reason for closing:  Done