101 votes

Comment vérifier et définir la variable mysql max_allowed_packet

Doublon possible :
Erreur MySQL 1153 - Got a packet bigger than ‘max_allowed_packet’ bytes

Salut je reçois l'erreur :

[1153] Got a packet bigger than 'max_allowed_packet'bytes

mais je n'ai apporté aucun changement dans mon code source et l'hébergeur affirme qu'ils n'ont apporté aucun changement dans les paramètres du serveur.

Je ne sais pas ce qui s'est passé. Mais j'essaie de trouver la raison.

donc, comment vérifier la variable mysql max_allowed_packet par un script php ?

et est-il possible de la définir dans le code source ?

199voto

glebtv Points 1366

max_allowed_packet est défini dans la configuration mysql, pas du côté php

[mysqld]
max_allowed_packet=16M 

Vous pouvez voir sa valeur actuelle dans mysql comme ceci:

SHOW VARIABLES LIKE 'max_allowed_packet';

Vous pouvez essayer de le changer comme ceci, mais il est peu probable que cela fonctionne sur un hébergement mutualisé:

SET GLOBAL max_allowed_packet=16777216;

Vous pouvez en savoir plus à ce sujet ici http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html

EDIT

Le [mysqld] est nécessaire pour que max_allowed_packet fonctionne depuis au moins la version 5.5 de mysql.

Récemment, j'ai configuré une instance sur AWS EC2 avec Drupal et le moteur de recherche Solr, qui nécessitait 32M max_allowed_packet. Si vous définissez la valeur sous [mysqld_safe] (qui sont les paramètres par défaut fournis avec l'installation de mysql) dans /etc/my.cnf, cela ne fonctionne pas. Je n'ai pas creusé le problème. Mais une fois que je l'ai changé en [mysqld] et redémarré le mysqld, ça a fonctionné.

31voto

morphatic Points 320

Le PHP suivant a fonctionné pour moi (en utilisant l'extension mysqli mais les requêtes devraient être les mêmes pour d'autres extensions) :

$db = new mysqli( 'localhost', 'user', 'pass', 'dbname' );
// to get the max_allowed_packet
$maxp = $db->query( 'SELECT @@global.max_allowed_packet' )->fetch_array();
echo $maxp[ 0 ];
// to set the max_allowed_packet to 500MB
$db->query( 'SET @@global.max_allowed_packet = ' . 500 * 1024 * 1024 );

Donc, si vous avez une requête que vous attendez être très longue, vous pouvez vous assurer que MySQL l'acceptera avec quelque chose comme ceci :

$sql = "une requête SQL vraiment longue...";
$db->query( 'SET @@global.max_allowed_packet = ' . strlen( $sql ) + 1024 );
$db->query( $sql );

Remarquez que j'ai ajouté 1024 octets supplémentaires à la longueur de la chaîne car selon le manuel,

La valeur doit être un multiple de 1024; les non-multiples sont arrondis au multiple inférieur.

Ça devrait normalement définir la taille max_allowed_packet assez grande pour gérer votre requête. Je n'ai pas testé cela sur un hébergeur partagé, donc la même mise en garde que @Glebushka s'applique.

4voto

Rafee Points 1380

Allez sur cpanel et connectez-vous en tant qu'administrateur principal ou super administrateur

  1. trouvez SSH/accès Shell (vous le trouverez sous l'onglet sécurité de cpanel)

  2. maintenant donnez le nom d'utilisateur et le mot de passe du super administrateur comme root ou cequetuasdonné

    Remarque : ne donnez pas de nom d'utilisateur, car cela nécessite des autorisations
  3. une fois dans la console, tapez

    tapez ' mysql ' et appuyez sur entrée maintenant vous vous retrouvez dans

    mysql> /* et tapez ici comme */

    mysql> set global net_buffer_length=1000000;

    Query OK, 0 lignes affectées (0,00 sec)

    mysql> set global max_allowed_packet=1000000000;

    Query OK, 0 lignes affectées (0,00 sec)

Maintenant, téléchargez et profitez !!!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X