Configuration MySQL – quelques astuces

ParamĂštre Max Packet Size pour les grosses requĂȘtes

Il faut augmenter la valeur du paramĂštre max_allowed_packet dans le fichier de configuration de MySQL pour permettre de gĂ©rer les grosses requĂȘtes : principalement pour les tables qui contiennent des BLOB et CLOB qui peuvent ĂȘtre volumineux.

MĂ©thodes

Éditer le fichier my.ini

Ajouter ce qui suit dans la section [mysqld] du fichier de configuration

#Max packetlength to send/receive from to server.
max_allowed_packet=8M

Utiliser l’interface graphique MySQL Administrator

Modifier le paramĂštre dans l’interface graphique comme dans la capture d’Ă©cran suivant :

MySQL : modification du paramĂštre "max_packet_size"
MySQL : modification du paramĂštre "max_packet_size"

Importer une base de Windows Ă  Linux

La gestion des noms de tables est configurée différemment par défaut sous Windows ou Linux :

  • Sous Windows il ne tient pas compte de la casse,
  • Sous Linux il en tient compte.

Le passage du contenu d’une base de donnĂ©es d’un OS Ă  un autre peut donc ĂȘtre problĂ©matique, principalement dans le sens Windows -> Linux. En effet, faire le dump depuis Windows va minimiser tous les noms de tables. Et si jamais le code source de votre application rĂ©fĂ©rence les tables avec des majuscules, cela peut posser des soucis. Surtout qu’il n’est pas toujours possible de re-Ă©crire le code pour n’utiliser que des noms de tables en minuscules. Voici les solutions que j’utilise dans ces cas-lĂ .

Choix 1 : Modifier la configuration du MySQL sous Linux

Pour importer une base MySQL depuis une machine Windows vers une machine Linux, il est possible de configurer le serveur MySQL sous Linux avec le paramĂštre lower_case_table_names Ă  1. Pour cela, Ă©diter le fichier my.ini et placer dans la section [mysqld] la ligne suivante :

set-variable = lower_case_table_names=1

Voir la documentation MySQL pour plus de détails sur ce sujet.

Choix 2 : Transformer le fichier de dump

Si il n’est pas possible de modifier la configuration du serveur MySQL sous linux, il reste la solution – beaucoup plus sport – qui consiste Ă  modifier le fichier de dump. En fait, il va falloir diviser le dump en deux fichiers :

Le premier fichier qui ne contient que la structure de la base :  dump.struct.sql Il peut ĂȘtre crĂ©Ă© avec la commande suivante :

 mysqldump -hHOSTNAME -uUSER -p -d DBNAME > dump.struct.sql

Le deuxiĂšme fichier qui ne contient que les donnĂ©es de la base : dump.data.sql Il peut ĂȘtre crĂ©Ă© avec la commande suivante (–hex-blob pour exporter les binaires en hexadĂ©cimal et –extended-insert=false pour avoir une commande INSERT par enregistrement) :

 mysqldump -hHOSTNAME -uUSER -p --hex-blob --extended-insert=false -t DBNAME > dump.data.sql

Il va ensuite falloir transformer ces fichiers pour que les noms des tables soient en majuscules :

Pour le fichier dump.struct.sql

C’est l’opĂ©ration la plus simple. Utilisez la commande ‘tr‘ comme suit :

$ cat dump.struct.sql | tr '[:lower:]' '[:upper:]' > dump.struct.upper.sql

Et importer le fichier dump.struct.upper.sql résultant dans la base.

Pour le fichier dump.data.sql

LĂ  c’est un peu plus compliquĂ©, car on ne veut pas tout mettre en majuscules, car ce fichier contient aussi les donnĂ©es des diffĂ©rentes tables de notre base.

Note : il est Ă  rapeller que le fichier dump.data.sql ne contient qu’une ligne de donnĂ©es – ie un INSERT – par enregistrement de chaque table.

Utiliser la commande ‘awk‘ pour modifier les commandes ‘INSERT INTO‘ et ‘LOCK TABLE‘ comme suit – chaque commande awk doit ĂȘtre sur une seule ligne :

$ awk '$1 == "LOCK" || $1 == "INSERT" { $3 = toupper($3) ; print $0 };
 $1 != "INSERT" && $1 != "LOCK" {print $0}; ' dump.data.sql > dump.data.upper.sql

En fonction de la structure du fichier d’import des donnĂ©es, il se peut que le nom des tables soit utilisĂ© dans d’autres commandes, comme par exemple des commandes pour ignorer les intĂ©gritĂ©s rĂ©fĂ©rentielles : ALTER TABLE `une_table` DISABLE KEYS. Il faut dans ce cas se baser sur les scripts ci-dessus pour crĂ©er un nouveau qui corrigera ce problĂšme.

Il n’y a plus qu’Ă  importer le fichier dump.data.upper.sql dans la base MySQL.

HTTP et Telnet : pour tester rapidement un serveur HTTP

Voir rapidement les headers d’une reponse HTTP d’un serveur web peut s’avĂ©rer trĂšs pratique, pour cela, une rĂ©ponse rapide : telnet.

Le protocole HTTP répond à la RFC 2616 du W3C.

Telnet

Pour se connecter Ă  un serveur, faire la ligne de commande suivante :

> telnet serveur num_port

par exemple :

%> telnet www.voila.fr 80

Une fois connecté, on va demander un document. On va utiliser la méthode GET. Par exemple sur la racine du site (ie / ) :

GET / HTTP/1.0 <CRLF><CRLF>

Il est important de prĂ©ciser le protocole que l’on va utiliser aprĂšs le document demandĂ© (ici on demande du HTTP/1.0, ca aurait pu ĂȘtre du HTTP/1.1).

Il est primordial de placer 2 <CRLF> (ie des retours Ă  la ligne) aprĂšs la commande GET, pour signaler au serveur que la commande est complĂšte.

On peut construire des requĂȘtes plus compliquĂ©es, en enchainant les Headers, par exemple :

GET / index.html HTTP/1.0 <CRLF>Accept : text/html, image/gif <CRLF>

User-Agent : Mozilla/4.0 (compatible ; MSIE 4.0 ; Linux X11 2.2.17) <CRLF><CRLF>

Autorisation

Les mĂ©thodes d’autorisation pour accĂ©der Ă  certaines zone d’un serveur HTTP rĂ©pondent Ă  la RFC 2617 du W3C.

Lorsqu’une zone du serveur est protĂ©gĂ©e par cette mĂ©thode, la demande d’un document de cette zone renvoie une rĂ©ponse comme suit :

HTTP/1.0 401 Authorization RequiredDate: Wed, 23 Jan 2002 15:12:30 GMT

Server: Apache/1.3.20 (Unix)  (Red-Hat/Linux) ApacheJServ/1.1.1 mod_ssl/2.8.4 OpenSSL/0.9.6

WWW-Authenticate: BASIC realm="RealmName"

Content-Type: text/html

X-MTracker-Version: v4.0 build 49.5

Expires: Thu, 01 Jan 1970 00:00:00 GMT

Last-Modified: Wed, 23 Jan 2002 15:12:30 GMT

Cache-Control: no-cache must-revalidate

Pragma: no-cache

Le Header important est WWW-Authenticate. Si l’utilisateur n’est pas dĂ©jĂ  authentifiĂ© pour le RealmRealmName“, une fenĂȘtre pop-up apparaitra et demandera le login/password de l’utilisateur.

Autorisation et Telnet

Pour s’authentifier en utilisant Telnet sur un serveur HTTP avec l’autorisation ’Basic’, il faut ajouter un Header “Authorization”, suivi d’une chaine encodĂ©e BASE64 composĂ©e du login et du password. La structure de cette chaine est :

login:password

Si l’on veut s’identifier comme l’utilisateur marc qui a le password antoine, on obtient l’encodage BASE64 suivant : bWFyYzphbnRvaW5l [1].

La requĂȘte Ă  construire pourra donc ĂȘtre :

GET /servlet/protected/content/ HTTP/1.0 <CRLF>

Authorization: Basic bWFyYzphbnRvaW5l <CRLF><CRLF>

Note : Attention Ă  Ă©crire Basic et non BASIC !

[1] obtenu grĂące Ă  la commande perl suivante : %> perl -MMIME::Base64 -e ‘print encode_base64(“marc:antoine”)’