web-dev-qa-db-fra.com

Comment changer la taille de max_allowed_packet

J'ai un problème avec les champs BLOB dans ma base de données MySQL - lors du téléchargement de fichiers d'une taille supérieure à 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=33554432 suivie de show variables like 'max_allowed_packet' - elle me donne 33554432 comme prévu.

Mais quand je redémarre le serveur MySQL, il retourne comme par magie à 1048576. Qu'est-ce que je fais mal ici?

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

281
Muleskinner

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

max_allowed_packet=500M

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

Voir le documentation pour plus d'informations.

366
Manuel

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

Toutefois, si vous ne le modifiez pas dans le fichier my.ini (comme suggéré par dragon112), la valeur sera réinitialisée au redémarrage du serveur, même si vous le définissez globalement.

Pour changer le paquet maximum autorisé pour tout le monde à 1 Go jusqu'à ce que le serveur redémarre:

SET GLOBAL max_allowed_packet=1073741824;
197
TehShrike

Un de mes développeurs juniors avait un problème pour modifier cela pour moi, alors j'ai pensé que je pourrais développer cela plus en détail pour les utilisateurs de Linux:

1) terminal ouvert

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 ceci d'abord ou essayez vi puis répétez: yum install nano)

5) ajoutez la ligne: max_allowed_packet = 256M (ajustez évidemment la taille en fonction de vos besoins) dans la section [MYSQLD]. Il a commis une erreur en le plaçant d'abord au bas du dossier pour que cela ne fonctionne pas.

enter image description here

6) Ctrl + O (enregistrer) puis ENTER (confirmer) puis Ctrl + X (fichier de sortie)

7) service mysqld restart

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

83
naw103

Je pense que certains voudraient également savoir comment trouver le fichier my.ini sur votre PC. Pour les utilisateurs de Windows, je pense que le meilleur moyen est le suivant:

  1. Win + R (raccourci pour 'exécuter'), tapez services.msc , Entrer
  2. Vous pouvez trouver une entrée comme 'MySQL56', cliquez dessus avec le bouton droit de la souris, sélectionnez propriétés
  3. Vous pouvez voir sth comme "D:/Fichiers de programme/MySQL/Serveur MySQL 5.6/bin\mysqld" --defaults-file = "D:\ProgramData\MySQL\Serveur MySQL 5.6\my.ini" MySQL56

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

40
fstang

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)

Comme on peut le constater, max_allowed_packet a été modifié en dehors de my.ini.

Laissons la session et vérifions encore:

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 indiqué précédemment.

19
zwitterion

Si vous obtenez cette erreur lors d'une sauvegarde, vous pouvez définir max_allowed_packet dans my.cnf, en particulier pour mysqldump.

[mysqldump]
max_allowed_packet=512M

Je continuais à avoir cette erreur en effectuant un mysqldump et je ne comprenais pas car je l'avais défini dans my.cnf sous la section [mysqld]. Une fois que j'ai compris que je pouvais le définir pour [mysqldump] et que je définissais la valeur, mes sauvegardes étaient terminées sans problème.

12
xpros

Pour ceux qui utilisent le serveur wamp mysql

Wamp tray Icon -> 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 packet_size entre les deux

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

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

Select @@global.max_allowed_packet;
10
Sayka

Un grand nombre des répondants ont décelé le problème et ont déjà donné la solution.

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

Vous venez de vous connecter à votre instance et allez dans le menu:

Serveur -> Fichier d'options -> Mise en réseau -> max_allowed_packed

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

5
cnom

Cette erreur vient parce que vos données contiennent une valeur supérieure à celle définie.

Il suffit de noter le max_allowed_packed=500M ou de calculer 500 * 1024k et de l’utiliser au lieu de 500M si vous le souhaitez.

Maintenant, redémarrez MySQL.

4
Suresh

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

Vous devez rechercher le paramètre max_allowed_packet, modifier sa valeur, puis appuyer sur enregistrer.

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

4
SebaGra

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

0
Vishal J