Comment changer la taille max_allowed_packet

318

J'ai un problème avec les champs BLOB dans ma base de données MySQL - lors du téléchargement de fichiers supérieurs à environ 1 Mo, j'obtiens une erreur Packets larger than max_allowed_packet are not allowed.

Voici ce que j'ai essayé:

Dans le navigateur de requêtes MySQL, j'ai exécuté un show variables like 'max_allowed_packet'qui m'a donné 1048576.

Ensuite, j'exécute la requête set global max_allowed_packet=33554432suivie de show variables like 'max_allowed_packet'- cela me donne 33554432 comme prévu.

Mais quand je redémarre le serveur MySQL, cela revient par magie au 1048576. Que fais-je de mal ici?

Question bonus, est-il possible de compresser un champ BLOB?

Muleskinner
la source
1
Un champ BLOB est un grand objet binaire. Ce ne sont que des morceaux. Donc oui, vous pouvez compresser le contenu, et cela donne à la place d'autres bits (et, espérons-le, moins) que vous stockez dans le champ BLOB. Cela change simplement les données que vous y mettez. Vous devrez également décompresser le contenu BLOB lorsque vous en aurez besoin à nouveau.
Konerak
Ok merci, j'espérais qu'il existait une fonctionnalité de compression dans mysql
Muleskinner

Réponses:

407

Modifiez le fichier my.iniou ~/.my.cnfen incluant la ligne unique sous [mysqld]ou la [client]section dans votre fichier:

max_allowed_packet=500M

puis redémarrez le service MySQL et vous avez terminé.

Consultez la documentation pour plus d'informations.

Manuel
la source
1
Merci semble fonctionner même si j'avais espéré que ce serait possible sans avoir à modifier les fichiers ini manuellement.
Muleskinner
63
Pour les lecteurs de FYI, c'est aussi la solution à l'erreur "MySQL a disparu"
djb
1
@Konerak, Qui était le railleur?
Pacerier
14
Il semble plutôt inutile de donner une réponse à quelqu'un, puis de lui dire qu'il doit aller chercher une réponse sur Google. D'autant plus que le SO occupe invariablement plusieurs des meilleurs résultats pour toute question relative à la programmation décente. Parlez de la programmation d'une boucle infinie !!! Google> SO> Google> SO> Google> SO et ainsi de suite.
Phill Healey
5
Assurez-vous qu'il est sous [mysqld]et non[mysql] (très similaire). Ça m'a coûté quelques minutes de headcratching.
Halvor Holsten Strand
226

La variable max_allowed_packet peut être définie globalement en exécutant une requête.

Cependant, si vous ne le modifiez pas dans le my.inifichier (comme l'a suggéré dragon112), la valeur sera réinitialisée au redémarrage du serveur, même si vous la définissez globalement.

Pour changer le paquet maximum autorisé pour tout le monde à 1 Go jusqu'au redémarrage du serveur:

SET GLOBAL max_allowed_packet=1073741824;
TehShrike
la source
7
Pas utile :(. Il affiche "Requête OK, 0 lignes affectées (0,00 sec)"
artnikpro
15
@artnikpro Cela fonctionne, "Query OK, 0 lignes affectées (0,00 sec)" peut sembler trompeur mais c'est vrai.
AnnTea
10
ne fonctionne pas pour moi. SHOW VARIABLES WHERE variable_name = 'max_allowed_packet'montre toujours l'ancienne valeur
Poma
50
Il montre l'ancienne valeur car max_allowed_packet ne change pas pour les connexions existantes. Si vous vous déconnectez et reconnectez, vous verrez la valeur mise à jour.
Matt Crinklaw-Vogt
2
Matt Crinklaw-Vogt a raison. Il doit sortir et se reconnecter
makriria
89

Un de mes développeurs juniors a eu un problème de modification pour moi, alors j'ai pensé que je développerais cela plus en détail pour les utilisateurs de Linux:

1) borne ouverte

2) racine ssh @ YOURIP

3) Entrez le mot de passe root

4) nano /etc/mysql/my.cnf (si la commande n'est pas reconnue, faites-le d'abord ou essayez vi puis répétez: yum install nano)

5) ajoutez la ligne: max_allowed_packet = 256M (évidemment ajustez la taille pour tout ce dont vous avez besoin) sous la section [MYSQLD]. Il a fait une erreur en le plaçant au bas du dossier en premier afin que cela ne fonctionne pas.

entrez la description de l'image ici

6) Control + O (enregistrer) puis ENTER (confirmer) puis Control + X (quitter le fichier)

7) service mysqld restart

8) Vous pouvez vérifier le changement dans la section des variables sur phpmyadmin

naw103
la source
cela a été fait sur CentosOS6, je suis bien sûr d'accord pour ne pas utiliser l'accès root ssh
naw103
@tamasd Quelques distributions GNU / Linux que j'ai utilisées (comme Debian 8 et CentOS 6) produisent sudo: command not foundou this incident will be reportedparce que l'une ou l' autre sudon'a pas été installée et configurée. Serait-il préférable de joncher cette réponse avec des instructions sur la configuration sudopour la première fois?
Damian Yerrick
pas root ssh est le problème, mais la connexion par mot de passe l'est. Un compte utilisateur avec l'autorisation sudo n'est presque pas aussi sûr que root. Utilisez simplement l'authentification basée sur la clé SSH.
Martin Schneider
la question de savoir comment se connecter à la machine est OT, il a à juste titre signalé dans sa recette que vous devez vous connecter, d'une manière ou d'une autre.
devsmt
41

Je pense que certains voudraient également savoir comment trouver le fichier my.ini sur votre PC. Pour les utilisateurs de Windows, je pense que la meilleure façon est la suivante:

  1. Win + R (raccourci pour «exécuter»), tapez services.msc , entrez
  2. Vous pouvez trouver une entrée comme 'MySQL56', faites un clic droit dessus, sélectionnez les propriétés
  3. Vous pouvez voir quelque chose comme "D: / Program Files / MySQL / MySQL Server 5.6 / bin \ mysqld" --defaults-file = "D: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini" MySQL56

J'ai obtenu cette réponse de http://bugs.mysql.com/bug.php?id=68516

fstang
la source
2
C'est important sous Windows. Avait MySQL en tant que service et a édité my.ini dans Workbench et cette réponse m'a fait réaliser que MySQL en tant que service utilise un autre my.ini que celui que j'ai édité dans Workbench.
Robert Niestroj
20

En suivant toutes les instructions, voici ce que j'ai fait et travaillé:

mysql> SELECT CONNECTION_ID();//This is my ID for this session.
+-----------------+
| CONNECTION_ID() |
+-----------------+
|              20 |
+-----------------+
1 row in set (0.00 sec)

mysql> select @max_allowed_packet //Mysql do not found @max_allowed_packet
+---------------------+
| @max_allowed_packet |
+---------------------+
| NULL                |
+---------------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet; //That is better... I have max_allowed_packet=32M inside my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                    33554432 |
+-----------------------------+
1 row in set (0.00 sec)

mysql> **SET GLOBAL max_allowed_packet=1073741824**; //Now I'm changing the value.
Query OK, 0 rows affected (0.00 sec)

mysql> select @max_allowed_packet; //Mysql not found @max_allowed_packet
+---------------------+
| @max_allowed_packet |
+---------------------+
| NULL                |
+---------------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The new value. And I still have max_allowed_packet=32M inisde my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                  1073741824 |
+-----------------------------+
1 row in set (0.00 sec)

Donc, comme nous pouvons le voir, le max_allowed_packet a été modifié en dehors de my.ini.

Permet de quitter la session et de vérifier à nouveau:

mysql> exit
Bye

C:\Windows\System32>mysql -uroot -pPassword
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 5.6.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT CONNECTION_ID();//This is my ID for this session.
+-----------------+
| CONNECTION_ID() |
+-----------------+
|              21 |
+-----------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The new value still here and And I still have max_allowed_packet=32M inisde my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                  1073741824 |
+-----------------------------+
1 row in set (0.00 sec)

Now I will stop the server
2016-02-03 10:28:30 - Server is stopped

mysql> SELECT CONNECTION_ID();
ERROR 2013 (HY000): Lost connection to MySQL server during query


Now I will start the server
2016-02-03 10:31:54 - Server is running


C:\Windows\System32>mysql -uroot -pPassword
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.6.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT CONNECTION_ID();
+-----------------+
| CONNECTION_ID() |
+-----------------+
|               9 |
+-----------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The previous new value has gone. Now I see what I have inside my.ini again.
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                    33554432 |
+-----------------------------+
1 row in set (0.00 sec)

Conclusion, après SET GLOBAL max_allowed_packet = 1073741824, le serveur aura le nouveau max_allowed_packet jusqu'à ce qu'il soit redémarré, comme quelqu'un l'a dit précédemment.

zwitterion
la source
13

Si vous obtenez cette erreur lors d'une sauvegarde, vous max_allowed_packetpouvez la définir dans le my.cnfparticulièrement pour mysqldump.

[mysqldump]
max_allowed_packet=512M

J'ai continué à obtenir cette erreur lors de l'exécution d'un mysqldumpet je n'ai pas compris car j'avais cet ensemble dans my.cnfla [mysqld]section. Une fois que j'ai compris que je pouvais le définir [mysqldump]et que j'ai défini la valeur, mes sauvegardes se sont terminées sans problème.

xpros
la source
10

Pour ceux qui utilisent le serveur mysql de Wamp

Icône de bac à eau -> MySql -> my.ini

[wampmysqld]
port        = 3306
socket      = /tmp/mysql.sock
key_buffer_size = 16M
max_allowed_packet = 16M        // --> changing this wont solve
sort_buffer_size = 512K

Faites défiler jusqu'à la fin jusqu'à ce que vous trouviez

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE

Ajoutez la ligne de packet_size entre

[mysqld]
port=3306
max_allowed_packet = 16M
explicit_defaults_for_timestamp = TRUE

Vérifiez si cela a fonctionné avec cette requête

Select @@global.max_allowed_packet;
Sayka
la source
5

Cette erreur est due au fait que vos données contiennent une valeur plus grande que celle définie.

max_allowed_packed=500M Notez simplement le ou vous pouvez calculer ces 500 * 1024k et utilisez-les au lieu de 500M si vous le souhaitez.

Maintenant, redémarrez simplement MySQL.

Suresh
la source
2
à , /etc/my.cnfpar exemple , MySQL, ou /etc/my.cnf.d/server.cnfpour MariaDB
Evgeny Lebedev
5

Beaucoup de répondants ont repéré le problème et ont déjà donné la solution.

Je veux juste suggérer une autre solution, qui change la valeur de la variable Glogal à partir de l'outil Mysql Workbench . C'est bien sûr SI vous utilisez Workbench exécuté localement sur le serveur (ou via une connexion SSH)

Vous vous connectez simplement à votre instance et accédez au menu:

Serveur -> Fichier d'options -> Réseau -> max_allowed_packed

Vous définissez la valeur souhaitée, puis vous devez redémarrer le service MySql .

cnom
la source
4

Pour toute personne exécutant MySQL sur le service Amazon RDS, cette modification est effectuée via des groupes de paramètres . Vous devez créer une nouvelle PG ou utiliser une PG existante (autre que la valeur par défaut, qui est en lecture seule).

Vous devez rechercher le max_allowed_packetparamètre, modifier sa valeur, puis appuyer sur Enregistrer.

De retour dans votre instance MySQL, si vous avez créé une nouvelle PG, vous devez attacher la PG à votre instance (vous devrez peut-être un redémarrage). Si vous avez modifié une PG qui était déjà attachée à votre instance, les modifications seront appliquées sans redémarrage, à toutes vos instances auxquelles cette PG est attachée.

SebaGra
la source
0

Si vous souhaitez télécharger une image ou des données de grande taille dans la base de données. Changez simplement le type de données en 'BIG BLOB'.

Vishal J
la source
0

set global max_allowed_packet = 10000000000;

Vishal Sheth
la source