web-dev-qa-db-fra.com

Erreur SQL (2027): paquet mal formé

J'ai une base de données mysql (Version 5.6.23-log running on windows) configuré pour être utilisé avec Teamcity. Lors de l'exécution d'une commande contre elle en utilisant HeidiSQL, j'obtiens une erreur:

Erreur SQL (2027): paquet mal formé

Cette erreur se produit uniquement si le jeu de résultats est supérieur à un certain nombre de lignes (l'utilisation de LIMIT 14561 fonctionne, 14562 donne cette erreur).

Je crois que cette erreur n'est pas due à Heidi car TeamCity ne démarre pas lors de l'exécution de la même commande.

Je suppose que cela a quelque chose à voir avec la taille des données qui devient trop grande et quelque chose qui échoue, mais je ne trouve aucun moyen d'identifier plus précisément quel est le problème et donc comment le résoudre.

Si quelqu'un peut me dire ce que je peux faire pour prévenir ce problème ou à tout le moins comment je pourrais mieux diagnostiquer ce problème, je serais très reconnaissant.

3
Chris

Je suppose que vous avez des données TEXT/BLOB et que les données de ligne dans la ligne 14562 sont plus grandes que votre --- MySQL Packet , qui est dimensionné par max_allowed_packet .

Perspective MySQL

Vous devez réserver plus d'espace pour max_allowed_packet

Vos journaux de rétablissement InnoDB (dimensionnés par innodb_log_file_size ) doivent également être augmentés. je l'ai appris pour la première fois (par rapport au paquet MySQL) de ServerFault . Je fais référence à ce message ServerFault dans certains de mes messages:

Je maximiserais le max_allowed_packet à 1G et redimensionner vos journaux de rétablissement à 1,5G

[mysqld]
max_allowed_packet = 1G
innodb_log_file_size = 1536M

Ensuite, exécutez ceci pour purger toutes les transactions des journaux de rétablissement:

mysql> SET GLOBAL innodb_fast_shutdown = 0;

Ensuite, redémarrez mysql (ce qui est requis).

Remarque pour tous ceux qui utilisent MySQL 5.5 et versions antérieures

MySQL 5.6 gérera le redimensionnement des journaux pour vous lors du redémarrage. Les versions précédentes de MySQL nécessitent que vous le fassiez manuellement. Vos étapes après avoir changé my.cnf et réglage innodb_fast_shutdown à 0, vous feriez ce qui suit

service mysql stop
mv ib_logfile0 ib_logfile0.bak
mv ib_logfile1 ib_logfile1.bak
service mysql start

Perspective HeidiSQL

Une erreur très courante est l'erreur 2027, en particulier avec l'utilisation de LOAD DATA INFILE

Certains ont suggéré d'utiliser d'anciennes versions de libmysql.dll

Certains soupçonnent un problème de jeu de caractères: Code d'erreur: 2027 paquet mal formé

ESSAIE !!!

4
RolandoMySQLDBA

Aucun des conseils ci-dessus n'a été utile dans mon cas. Il s'avère que c'était un bug dans MySQL et pas une mauvaise configuration comme suggéré dans les autres réponses. En changeant max_allowed_packet etc n'a eu aucun effet.

Ensuite, j'ai trouvé ceci: https://bugs.mysql.com/bug.php?id=77298

"Il s'agit du double du bogue interne 20895852 qui est corrigé. Noté dans les changelogs de 5.6.25, 5.7.8, 5.8.0."

Pour les petites valeurs de la variable système read_rnd_buffer_size, la mise en cache interne des résultats temporaires peut échouer et entraîner l'échec de l'exécution de la requête.

Je suis passé de 5.6.22 à 5.6.26 et le problème a disparu sans aucun changement de configuration.

Tout ce que j'ai fait, c'est

brew upgrade mysql

et redémarrez le serveur dans un nouvel onglet de terminal à l'aide

mysql.server restart

C'était tout.

1
Sakuraba

En fin de compte, j'ai découvert que si je vidais les données d'une base de données vers une autre sur une machine différente, les choses semblaient fonctionner. J'ai donc décidé de comparer les deux fichiers de configuration et de mettre à jour des valeurs différentes. Ce faisant, j'ai mis à jour les éléments suivants:

  • tmp_table_size de 5M à 19M
  • myisam_sort_buffer_size de 8M à 30M
  • read_buffer_size de 0 à 59K
  • read_rnd_buffer_size de 0 à 256K
  • sort_buffer_size de 0 à 256K
  • query_cache_type de 1 à 0

Faire cela a résolu mes problèmes. Je suis sûr que tous ne sont pas nécessaires, donc je serais heureux que quelqu'un explique pourquoi cela a résolu mon problème dans une meilleure réponse (et je me ferai un plaisir de leur accepter dans ce cas).

0
Chris