"Erreurs" des programmeurs : le serveur MySQL a disparu en hébergement. Guide de référence MySQL Package volumineux ou incorrect

SpoilerCible">Spoiler

A.2.2 Erreur du serveur MySQL disparu

Tout ce qui est indiqué dans cette section s'applique également à l'erreur associée Connexion perdue au serveur lors de la requête.
Le plus souvent, l'erreur du serveur MySQL a disparu se produit en raison de l'expiration du délai de connexion et de la fermeture du serveur. Par défaut, le serveur ferme la connexion après 8 heures d'inactivité. Vous pouvez modifier le délai en définissant la variable wait_timeout lors du démarrage de mysqld.
Une autre raison courante pour laquelle l'erreur du serveur MySQL a disparu est l'émission d'une commande "close" sur une connexion MySQL, puis la tentative d'exécution d'une requête sur la connexion fermée.
Si cela est reçu dans le script, répétez simplement la demande du client pour que la connexion soit automatiquement rétablie.
Généralement, les codes d'erreur suivants seront émis dans ce cas (celui que vous recevrez dépend du système d'exploitation)
Code d'erreur Description
CR_SERVER_GONE_ERROR Le client ne peut pas envoyer de requête au serveur.
CR_SERVER_LOST Le client n'a pas reçu d'erreur lors de l'envoi de la requête au serveur, mais il n'a pas non plus reçu de réponse complète (ou au moins aucune réponse) à la requête.
Une erreur sera également générée si quelqu'un tue un thread en cours d'exécution en utilisant kill threadnumber.
Vous pouvez vérifier que MySQL fonctionne en exécutant la version mysqladmin et en vérifiant la disponibilité. Si le problème est dû au crash de mysqld, vous devez alors vous concentrer sur la recherche de la cause du crash. Dans ce cas, vous devez d'abord vérifier si MySQL sera à nouveau tué lorsque vous relancerez la requête (voir section).
Ces erreurs seront également générées lorsqu'une requête invalide ou trop longue est envoyée au serveur. Si mysqld reçoit un paquet incorrect ou trop volumineux, le serveur suppose qu'il y a un problème avec le client et ferme la connexion. Si vous devez effectuer des requêtes volumineuses (par exemple, lorsque vous travaillez avec de grandes colonnes BLOB), vous pouvez augmenter la limite de taille des requêtes en exécutant mysqld avec l'option -O max_allowed_packet=# (par défaut 1 Mo). De la mémoire supplémentaire est allouée à la demande, donc mysqld n'utilisera plus de mémoire que lorsqu'une requête volumineuse est émise ou lorsque mysqld doit renvoyer une grande ligne de résultats !
Si vous souhaitez déposer un rapport de bug pour ce problème, assurez-vous d'inclure les informations suivantes :

  • Informations indiquant si MySQL a planté ou non (cela peut être déterminé par le fichier hostname.err (voir la section A.4.1 Que faire si MySQL plante constamment).
  • Si une requête particulière détruit mysqld et que les tables qu'elle utilise ont été vérifiées avec CHECK TABLE avant d'exécuter la requête, alors il est conseillé d'écrire un scénario de test (voir section E.1.6 Création d'un scénario de test pour la corruption de table).
  • La valeur de la variable wait_timeout sur le serveur (cette valeur est générée par les variables mysqladmin).
  • Informations indiquant si vous avez essayé d'exécuter mysqld avec --log et vérifié si la requête émise apparaît dans le journal.

Cet article peut être utile pour ceux qui importent de grandes bases de données vers Denwer(ou sur votre serveur dédié). Disons la taille de votre base 50 Mo. Simplement en insérant une requête dans phpMonAdmin dans la rubrique " SQL"rien ne fonctionnera - le navigateur se bloquera simplement. Par conséquent, la seule issue est d'utiliser importer un fichier SQL. Mais ici, il t'attendra erreur #2006 ou le serveur a disparu. Je parlerai de la solution à ce problème dans ce court article.

La toute première chose que vous devez faire est configurer PHP Pour . Sans cela, par défaut, vous ne pourrez pas télécharger des fichiers de taille par ex. 50 Mo.

Ensuite, vous devez accéder aux paramètres MySQL(sur Denwer c'est " usr\local\mysql-5.5\my.ini") et là changez la valeur du paramètre " max_allowed_packet"sur, par exemple, 100M, ce qui correspond à 100 Mo:

Max_allowed_packet = 100 M

Après tout cela, redémarrez MySQL(ou Denwer), et plus encore erreurs 2006 ou le serveur a disparu ne se posera pas. A moins bien sûr que vous souhaitiez importer une base de données de taille 150 Mo, vous devrez alors augmenter à nouveau les paramètres nécessaires dans Paramètres PHP et MySQL.

Tout ce qui est indiqué dans cette section s'applique également à l'erreur associée Connexion perdue au serveur lors de la requête.

Le plus souvent, l'erreur du serveur MySQL a disparu se produit en raison de l'expiration du délai de connexion et de la fermeture du serveur. Par défaut, le serveur ferme la connexion après 8 heures d'inactivité. Vous pouvez modifier le délai en définissant la variable wait_timeout lors du démarrage de mysqld.

Une autre raison courante pour laquelle l'erreur du serveur MySQL a disparu est l'émission d'une commande "close" sur une connexion MySQL, puis la tentative d'exécution d'une requête sur la connexion fermée.

Si cela est reçu dans le script, répétez simplement la demande du client pour que la connexion soit automatiquement rétablie.

Généralement, dans ce cas, les codes d'erreur suivants seront émis (celui que vous recevrez dépend du système d'exploitation) :

Une erreur sera également générée si quelqu'un tue un thread en cours d'exécution en utilisant kill threadnumber.

Vous pouvez vérifier que MySQL fonctionne en exécutant la version mysqladmin et en vérifiant la disponibilité. Si le problème est un crash de mysqld, vous devez alors vous concentrer sur la recherche de la cause du crash. Dans ce cas, vous devez d'abord vérifier si MySQL sera à nouveau détruit lorsque vous relancerez la requête (voir section).

Ces erreurs seront également générées lorsqu'une requête invalide ou trop longue est envoyée au serveur. Si mysqld reçoit un paquet incorrect ou trop volumineux, le serveur suppose qu'il y a un problème avec le client et ferme la connexion. Si vous devez effectuer des requêtes volumineuses (par exemple, lorsque vous travaillez avec de grandes colonnes BLOB), vous pouvez augmenter la limite de taille des requêtes en exécutant mysqld avec l'option -O max_allowed_packet=# (par défaut 1 Mo). De la mémoire supplémentaire est allouée à la demande, donc mysqld n'utilisera plus de mémoire que lorsqu'une requête volumineuse est émise ou lorsque mysqld doit renvoyer une grande ligne de résultats !

Si vous souhaitez déposer un rapport de bug pour ce problème, assurez-vous d'inclure les informations suivantes :

  • Informations indiquant si MySQL a planté ou non (cela peut être déterminé par le fichier hostname.err (voir la section A.4.1 Que faire si MySQL plante constamment).
  • Si une requête particulière détruit mysqld et que les tables qu'elle utilise ont été vérifiées avec CHECK TABLE avant l'exécution de la requête, il est conseillé d'écrire un scénario de test (voir section E.1.6 Création d'un scénario de test pour la corruption de table).
  • La valeur de la variable wait_timeout sur le serveur (cette valeur est générée par les variables mysqladmin).
  • Informations indiquant si vous avez essayé d'exécuter mysqld avec --log et vérifié si la requête émise apparaît dans le journal.

L'erreur MySQL Server Has Gone Away (erreur 2006) peut se produire dans deux cas.

Délai de connexion

Le problème le plus courant est que la connexion expire, ce qui entraîne la fermeture du serveur. La solution est très simple : augmentez le délai d'attente_timeout dans le fichier de configuration my.cnf. Pour ce faire dans Debian, vous devez exécuter :

Sudo nano /etc/mysql/my.cnf

# Ouverture du fichier de paramètres MySQL

Définissez ensuite le délai d'attente :

Wait_timeout = 600

# Temps d'attente en secondes, réglable jusqu'à 28 800 s (8 heures)

N'oubliez pas de recharger la base de données :

Sudo /etc/init.d/mysql redémarrage

Parfois, lors de l'exécution de tâches planifiées de longue durée, l'erreur MySQL Server Has Gone Away peut également apparaître, tout cela en raison du même délai d'expiration de connexion. Dans ce cas, le délai ne peut pas être augmenté de manière significative (jusqu'à un maximum de plusieurs heures), car cela pourrait conduire à remplir le tampon de connexions en attente.

Il est donc préférable de vérifier la connexion et, si nécessaire, de la reconnecter.

$link = mysql_connect("localhost","root","root"); # Voici les tâches cron if(!mysql_ping($link)) $link = mysql_connect("localhost","root","root", true);

# Connectez la base de données et reconnectez-vous si nécessaire

Colis volumineux ou incorrect

Le deuxième problème courant est que le serveur reçoit un paquet volumineux ou invalide et le rejette. Dans ce cas, le serveur suppose que le problème vient du côté client et ferme la connexion. Donc pour résoudre ce problème, vous devez augmenter la limite de taille maximale du paquet, le tout dans le même fichier de configuration :

Max_allowed_packet = 64 Mo...

# Augmentez la limite de taille des paquets entrants, en Mo

N'oubliez pas non plus de recharger la base de données.

Le plus important

Après avoir résolu l'erreur MySQL Server Has Gone Away, jouez avec les paramètres wait_timeout et max_allowed_packet pour obtenir les limites optimales.


Tout ce qui est indiqué dans cette section s'applique également à l'erreur associée Connexion perdue au serveur lors de la requête.

Le plus souvent, l'erreur du serveur MySQL a disparu se produit en raison de l'expiration du délai de connexion et de la fermeture du serveur. Par défaut, le serveur ferme la connexion après 8 heures d'inactivité. Vous pouvez modifier le délai en définissant la variable wait_timeout lors du démarrage de mysqld.

Une autre raison courante pour laquelle l'erreur du serveur MySQL a disparu est l'émission d'une commande "close" sur une connexion MySQL, puis la tentative d'exécution d'une requête sur la connexion fermée.

Si cela est reçu dans le script, répétez simplement la demande du client pour que la connexion soit automatiquement rétablie.

Généralement, dans ce cas, les codes d'erreur suivants seront émis (celui que vous recevrez dépend du système d'exploitation) :

Une erreur sera également générée si quelqu'un tue un thread en cours d'exécution en utilisant kill threadnumber.

Vous pouvez vérifier que MySQL fonctionne en exécutant la version mysqladmin et en vérifiant la disponibilité. Si le problème est un crash de mysqld, vous devez alors vous concentrer sur la recherche de la cause du crash. Dans ce cas, vous devez d’abord vérifier si MySQL sera à nouveau détruit lorsque vous relancerez query().

Ces erreurs seront également générées lorsqu'une requête invalide ou trop longue est envoyée au serveur. Si mysqld reçoit un paquet incorrect ou trop volumineux, le serveur suppose qu'il y a un problème avec le client et ferme la connexion. Si vous devez effectuer des requêtes volumineuses (par exemple, lorsque vous travaillez avec de grandes colonnes BLOB), vous pouvez augmenter la limite de taille des requêtes en exécutant mysqld avec l'option -O max_allowed_packet=# (par défaut 1 Mo). De la mémoire supplémentaire est allouée à la demande, donc mysqld n'allouera plus de mémoire que lorsqu'une requête volumineuse est émise ou lorsque mysqld doit renvoyer une grande ligne de résultats !

Vous pouvez également subir une interruption de connexion si vous avez envoyé un paquet de plus de 16 Mo, si votre client est plus ancien que 4.0.8 et que votre serveur est 4.0.8 ou plus récent.

Si vous souhaitez déposer un rapport de bug pour ce problème, assurez-vous d'inclure les informations suivantes :

    Informations indiquant si MySQL a planté ou non (cela peut être déterminé par le fichier hostname.err()).

    Si une certaine requête détruit mysqld et que les tables utilisées ont été vérifiées à l'aide de CHECK TABLE avant d'exécuter la requête, il est alors conseillé d'écrire un test de contrôle ().

    La valeur de la variable wait_timeout sur le serveur (cette valeur est générée par les variables mysqladmin).

    Informations indiquant si vous avez essayé d'exécuter mysqld avec --log et vérifié si la requête émise apparaît dans le journal.



Des questions ?

Signaler une faute de frappe

Texte qui sera envoyé à nos rédacteurs :