web-dev-qa-db-fra.com

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

Duplicate possible:
Erreur MySQL 1153 - Vous avez un paquet plus grand que ‘max_allowed_packet’

Salut je reçois l'erreur:

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

mais je n’ai apporté aucune modification à mon code source et l’hébergement indique qu’ils n’ont pas modifié les paramètres du serveur.

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

oui, comment vérifier max_allowed_packet la variable mysql par le script php?

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

97
John

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 l'hébergement partagé:

SET GLOBAL max_allowed_packet=16777216;

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

EDIT

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

Configurez récemment une instance sur AWS EC2 avec Drupal et le moteur de recherche Solr, qui ont requis 32 M max_allowed_packet. Si vous définissez la valeur sous [mysqld_safe] (ce qui correspond aux paramètres par défaut fournis avec l'installation de mysql) dans /etc/my.cnf, cela ne fonctionnera pas. Je n'ai pas creusé le problème. Mais après que je l'ai changé en [mysqld] et que j'ai redémarré mysqld, cela a fonctionné.

193
glebtv

Le PHP suivant a fonctionné pour moi (en utilisant l'extension mysqli mais les requêtes devraient être les mêmes pour les 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 prévoyez être assez longue, vous pouvez vous assurer que mysql l'acceptera avec quelque chose comme:

$sql = "some really long sql query...";
$db->query( 'SET @@global.max_allowed_packet = ' . strlen( $sql ) + 1024 );
$db->query( $sql );

Notez 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 le plus proche.

Cela devrait, espérons-le, définir une taille de max_allowed_packet suffisante pour traiter votre requête. Je n'ai pas essayé cela sur un hôte partagé, donc la même réserve que @Glebushka s'applique.

31
morphatic

allez à cpanel et connectez-vous en tant qu'administrateur principal ou super administrateur

  1. find SSH/Shell Access (vous le trouverez sous l'onglet sécurité de cpanel)

  2. donnez maintenant le nom d'utilisateur et le mot de passe du super administrateur sous la forme root ou whatyougave

    note: do not give any username, cos, it needs permissions
    
  3. une fois votre type en console

    tapez 'mysql' et appuyez sur Entrée maintenant vous vous trouvez dans

    mysql>/* et tapez ici comme * /

    mysql> set global net_buffer_length=1000000;

    Requête OK, 0 ligne affectée (0.00 sec)

    mysql> set global max_allowed_packet=1000000000;

    Requête OK, 0 ligne affectée (0.00 sec)

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

4
Rafee