home icon contact icon rss icon last FM icon facebook icon LinkedIn icon Delicious icon twitter icon

max_allowed_packet dans ta face

Voilà : quand on a un gros dump d'une base de donnée, on est embêter.

Déjà, c'est lourd à trimballer partout : faut faire du scp entre le serveur mysql et la gateway, puis de la gateway à chez toi; et puis 200Mo c'est pas rien.
Ensuite quand il faut modifier un truc dedans, faut trouver un editeur de texte qui gère bien les fichier de 200Mo. Et autant vous dire que ni vim ni TextMate ne sont à la hauteur.

Et ensuite, quand tu veux l'importer sur ta machine pour y faire des teste, en plus de prendre des heures, ça te lève une exception du genre :

$ mysql -u root test_database < dump.sql
ERROR 1153 (08S01) at line 21786: Got a packet bigger than 'max_allowed_packet' bytes

Et là, la galère commence.

On regarde d'abord si on ne peut pas passer un paramètre au client mysql. Si ! la documentation de mysql propose un truc du genre :

$ mysql --max_allowed_packet=300M -u root test_database < dump.sql

Mais cela ne fonctionne pas.

La même documentation dit aussi qu'on peut mettre dans le fichier de configuration de mysqld un paramètre du même genre :

[mysqld]
max_allowed_packet=16M

On redémarre le serveur, et toujours la même exception.

Je dis ça, c'est pour un mysqld 5.051a tournant sous Mac OS X (PPC). Je ne sais pas pour les autres configurations, hein...

Plein de rage, j'ai trouvé une feinte. C'est du sale, du pas scriptable et pas répétable. Dites jamais que je vous ai dit ça, ou je mourrais de honte.
La feinte consiste à ouvrir un client mysql et à forcer les valeurs de max_allowed_packet et de net_buffer_length

$ mysql -u root
mysql> set global max_allowed_packet=1000000000;
mysql> set global net_buffer_length=1000000;

Puis tout en gardant le client mysql ouvert, dans un autre shell du coup, vous pouvez importez votre gros dump sans inquiétude.

C'est un peu étrange, le client mysql agit comme un singleton et le variables qui y sont paramètrées le sont pour l'ensemble des clients utilisés au même moment.

Je n'ai pas cherché plus loin, je n'avais pas le temps. Je le ferais peut être à l'occasion, ou alors une bonne âme parmi vous le fera à ma place. Et peut être que quelqu'un possède une réponse ?