Manuel complet sur les bases d’utilisation de MySQL


Télécharger Manuel complet sur les bases d’utilisation de MySQL

★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Télécharger aussi :


Manuel MySQL 4.1.x ? Version Française
Copyright (c) 2002?2003 MySQL AB

Manuel MySQL 4.1.x ? Version Française
Sommaire
 1.1 A propos du manuel..........................................................................................................1
 1.1.1 Conventions utilisées dans ce manuel.....................................................................2
 1.2 Qu'est ce que MySQL?.....................................................................................................3
 1.2.5 Compatibilité an 2000..............................................................................................8
 1.3 Qui est MySQL AB ?.......................................................................................................10
 1.3.1 Les services et le modèle d'affaire de MySQL AB.................................................10
 1.3.1.6 Publicité.........................................................................................................12
 1.3.2 Contacts.................................................................................................................13
 1.4 Support MySQL et licences............................................................................................13
 1.4.3 Licences MySQL....................................................................................................15
 1.4.3.2 Utiliser MySQL sous licence GPL libre.........................................................15
 1.4.4 Logos MySQL AB et marque déposée...................................................................16
 1.4.4.2 Logos MySQL qui peuvent être utilisés dans autorisation préalable............17
 1.4.4.5 Utiliser le nom MySQL sur des documents imprimés ou des
 présentations.................................................................................................18
 1.4.4.6 Utilisation du nom MySQL dans un nom de société ou de produit...............18
 1.5 MySQL 4.x In A Nutshell.................................................................................................18
 1.5.6 MySQL 4.1 : Les nouvelles fonctionnalités............................................................20
 1.6 Sources d'informations MySQL.......................................................................................20
 1.6.2 Listes de diffusion MySQL.....................................................................................21
 1.6.2.4 Conseils pour répondre sur la liste de diffusion............................................27
 1.7 Quels standards respecte MySQL?................................................................................27
 1.7.4 Différences de MySQL avec ANSI SQL92.............................................................30
 1.7.4.1 Sous sélections (Sub SELECT s).................................................................31
i

Manuel MySQL 4.1.x ? Version Française
Sommaire
 1.7.4.7 '??' comme début de commentaire...............................................................36
 1.7.5 Erreurs connues et problèmes de conceptions de MySQL....................................37
 1.8 Les évolutions de MySQL (la liste des tâches)...............................................................40
 1.8.5 Ce qui n'est pas prévu...........................................................................................45
 1.9 Comparatif de MySQL avec les autres serveurs SQL....................................................45
 1.9.1 MySQL face à mSQL.............................................................................................45
 1.9.1.2 Différences entre les protocoles de communication de mSQL et de
 MySQL..........................................................................................................48
 1.9.1.3 Comparatif des syntaxes SQL de mSQL 2.0 et MySQL...............................48
 1.9.2 Comparatif de MySQL avec PostgreSQL..............................................................51
 1.9.2.3 Performances comparées de MySQL et PostgreSQL..................................55
 2.1 Installation standard rapide de MySQL...........................................................................59
 2.1.2 Installer MySQL sous Windows.............................................................................60
 2.1.2.3 Démarrer le serveur pour la première fois....................................................62
 2.2 Notes générales à propos de l'installation......................................................................63
 2.2.7 Installer MySQL à partir d'une distribution binaire.................................................70
 2.3 Installer MySQL à partir des sources..............................................................................72
 2.3.7 La distribution source Windows.............................................................................82
 2.4 Configuration après l'installation, et tests........................................................................83
 2.4.3 Lancer et arrêter MySQL automatiquement...........................................................89
ii

Manuel MySQL 4.1.x ? Version Française
Sommaire
 2.5 Changer de version de MySQL.......................................................................................90
 2.5.5 Migrer depuis une autre architecture.....................................................................96
 2.6 Notes spécifiques aux systèmes d'exploitation...............................................................97
 2.6.1 Notes relatives à Linux (toutes versions)...............................................................97
 2.6.1.7 Notes relatives à Linux IA64.......................................................................104
 2.6.2 Notes relatives à Windows...................................................................................104
 2.6.2.4 Connexion à un serveur MySQL distants, sous Windows avec SSH.........108
 2.6.2.7 MySQL pour Windows face à MySQL pour Unix........................................109
 2.6.3 Remarques pour Solaris......................................................................................111
 2.6.3.2 Remarques pour Solaris x86.......................................................................114
 2.6.4 Notes relatives à BSD..........................................................................................115
 2.6.4.7 Notes relatives aux versions 4.x de BSD/OS..............................................118
 2.6.5 Notes relatives à Mac OS X.................................................................................118
 2.6.5.2 Mac OS X Server........................................................................................118
 2.6.6 Notes sur les autres Unix.....................................................................................118
 2.6.6.8 Notes relatives à SGI Irix............................................................................125
 2.6.6.10 Notes relatives à la version 7.0 fr Caldera (SCO) Unixware.....................127
 2.6.9 Notes relatives à Novell NetWare........................................................................128
iii

Manuel MySQL 4.1.x ? Version Française
Sommaire
 2.7 Commentaires sur l'installation de Perl.........................................................................129
 2.7.4 Problèmes lors de l'utilisation des interfaces Perl DBI et DBD............................130
 3.3 Création et utilisation d'une base de données..............................................................136
 3.3.4 Récupérer des informations à partir d'une table..................................................140
 3.3.4.4 Trier les enregistrements............................................................................143
 3.3.4.9 Utiliser plus d'une table...............................................................................151
 3.5 Exemples de requêtes usuelles....................................................................................154
 3.5.4 La ligne contenant la plus grande valeur d'un certain champ par rapport à un
 groupe.....................................................................................................................156
 3.5.9 Utiliser AUTO_INCREMENT................................................................................159
 3.7 Requêtes du projet Twin...............................................................................................161
 3.7.2 Afficher une table avec l'état des paires de jumeaux...........................................164
 3.8 Utilisation de MySQL avec Apache...............................................................................164
 4.1 Configuration de MySQL...............................................................................................165
 4.1.4 Faire fonctionner plusieurs serveurs MySQL sur la même machine....................173
 4.2 Règles de sécurité et droits d'accès au serveur MySQL..............................................175
 4.2.3 Options de démarrage qui concernent la sécurité...............................................178
iv

Manuel MySQL 4.1.x ? Version Française
Sommaire
 4.2.11 Causes des erreurs Access denied...................................................................191
 4.3 Gestion des comptes utilisateurs de MySQL................................................................195
 4.3.9 Utilisation des connexions sécurisées.................................................................207
 4.3.9.3 Options de GRANT.....................................................................................208
 4.4 Prévention des désastres et restauration.....................................................................209
 4.4.6 Utilisation de myisamchk pour la maintenance des tables et leur
 4.4.6.10 Optimisation de tables...............................................................................223
 4.4.8 Obtenir des informations sur une table................................................................224
 4.5 Référence de langage d'administration de la base de données...................................228
 4.5.6 Syntaxe de SHOW...............................................................................................231
 4.5.6.2 SHOW TABLE STATUS.............................................................................233
 4.5.6.3 Syntaxe de SHOW STATUS.......................................................................234
v

Manuel MySQL 4.1.x ? Version Française
Sommaire
 4.5.6.8 Syntaxe de SHOW CREATE TABLE..........................................................247
 4.6 Localisation de MySQL et utilisation internationale......................................................247
 4.6.1 Le jeu de caractères utilisé pour les données et le stockage...............................247
 4.6.1.1 Jeu de caractères allemand........................................................................248
 4.6.7 Problèmes avec les jeux de caractères...............................................................252
 4.7 Scripts serveur MySQL et utilitaires..............................................................................252
 4.7.5 mysqld?max , la version étendue du serveur mysqld..........................................262
 4.8 MySQL Scripts clients et utilitaires................................................................................263
 4.8.10 Comment exécuter des commandes SQL depuis un fichier texte.....................281
 4.9 Les fichiers de log de MySQL.......................................................................................282
 4.9.6 Entretien des fichiers de log.................................................................................286
 4.10 Réplication de MySQL................................................................................................286
 4.10.8 Correction de problèmes courants.....................................................................303
 5.1 Vue d'ensemble de l'optimisation..................................................................................306
 5.1.1 Limitations et inconvénients des choix conceptuels de MySQL...........................306
vi

Manuel MySQL 4.1.x ? Version Française
Sommaire
 5.1.5 Utiliser vos propres tests de performance............................................................310
 5.2 Optimisation des SELECT s et autres requêtes...........................................................311
 5.2.2 Mesurer les performances d'une requête............................................................317
 5.2.12 Autres conseils d'optimisation............................................................................324
 5.3 Verrouillage de tables...................................................................................................326
 5.3.2 Problème de verrouillage de tables......................................................................327
 5.4 Optimisation de la structure de la base de données.....................................................328
 5.4.8 Inconvénients de la création d'un grand nombre de tables dans la même
 base de données.....................................................................................................335
 5.5 Optimisation du serveur MySQL...................................................................................335
 5.5.1 Réglage du système, au moment de la compilation, et paramètres du
 démarrage...............................................................................................................335
 5.5.6 Syntaxe de SET...................................................................................................341
 5.6 Problèmes avec les disques.........................................................................................344
 5.6.1 Utiliser des liens symboliques..............................................................................345
 5.6.1.2 Utiliser des liens symboliques avec les tables............................................345
 6.1 Structure du langage.....................................................................................................347
 6.1.1 Literals: Comment écrire les chaînes et les nombres..........................................347
 6.1.1.4 Valeurs NULL..............................................................................................349
 6.1.2 Noms de bases, tables, index, colonnes et alias.................................................350
vii

Manuel MySQL 4.1.x ? Version Française
Sommaire
 6.1.7 Est?ce que MySQL est sensible aux mots réservés ?.........................................356
 6.2 Types de colonnes........................................................................................................357
 6.2.2 Les types date et heure........................................................................................363
 6.2.2.4 Le type YEAR..............................................................................................368
 6.2.3 Les types chaînes................................................................................................369
 6.2.3.4 Le type SET................................................................................................372
 6.2.6 Capacités des colonnes.......................................................................................374
 6.3 Fonctions à utiliser dans les clauses SELECT et WHERE...........................................375
 6.3.1 Opérateurs et fonctions tout?types......................................................................376
 6.3.1.4 Les fonctions de contrôle............................................................................380
 6.3.2 Fonctions de chaînes de caractères....................................................................381
 6.3.2.2 Sensibilité à la casse...................................................................................390
 6.3.3 Fonctions numériques..........................................................................................390
 6.3.3.2 Fonctions mathématiques...........................................................................391
 6.3.6 Autres fonctions...................................................................................................404
 6.3.6.2 Fonctions diverses......................................................................................405
 6.3.7 Fonctions avec la clause GROUP BY..................................................................410
 6.4 Manipulation de données : SELECT , INSERT , UPDATE , DELETE..........................412
 6.4.1 Syntaxe de SELECT............................................................................................412
 6.4.1.2 Syntaxe de UNION......................................................................................417
 6.4.3 Syntaxe de INSERT.............................................................................................418
 6.4.3.1 Syntaxe de INSERT ... SELECT.................................................................420
 6.4.9 Syntaxe de LOAD DATA INFILE..........................................................................425
viii

Manuel MySQL 4.1.x ? Version Française
Sommaire
 6.4.10 Syntaxe de DO...................................................................................................431
 6.5 Définition de données : CREATE , DROP , ALTER......................................................431
 6.5.3 Syntaxe de CREATE TABLE...............................................................................432
 6.5.3.1 Modification automatique du type de colonnes...........................................439
 6.5.8 Syntaxe de DROP INDEX....................................................................................444
 6.6 Commandes de bases de l'utilisateur de MySQL.........................................................444
 6.6.2 Syntaxe de DESCRIBE (obtenir des informations sur les colonnes)...................444
 6.7 Commandes relatives aux verrous et aux transactions................................................445
 6.7.3 Syntaxe de SET TRANSACTION........................................................................447
 6.8 Recherche en Texte?entier (Full?text) dans MySQL....................................................448
 6.8.3 A faire dans la recherche Full?text......................................................................452
 6.9 Cache de requêtes MySQL...........................................................................................452
 6.9.4 Status du cache de requêtes et maintenance......................................................455
 7.1 Tables MyISAM.............................................................................................................456
 7.1.2 Formats de table MyISAM....................................................................................459
 7.1.2.3 Caractéristiques des tables compressées..................................................461
 7.1.3 Problèmes avec les tables MyISAM.....................................................................462
 7.1.3.2 Clients is using or hasn't closed the table properly.....................................462
 7.2 Tables assemblées MERGE.........................................................................................463
 7.2.1 Problèmes avec les tables MERGE.....................................................................465
 7.3 Tables ISAM.................................................................................................................466
 7.4 Tables HEAP................................................................................................................466
 7.5 Tables InnoDB..............................................................................................................467
 7.5.3 Créer des bases InnoDB......................................................................................473
 7.5.3.1 Si quelque chose se passe mal à la création de la base de données........474
 7.5.6 Sauver et restaurer une base InnoDB..................................................................477
 7.5.6.1 Points de contrôle.......................................................................................479
ix

Manuel MySQL 4.1.x ? Version Française
Sommaire
 7.5.8 Modèle transactionnel de InnoDB........................................................................479
 7.5.8.9 Le moniteur InnoDB....................................................................................487
 7.5.10 Structures de tables et d'index...........................................................................489
 7.5.10.4 Structure physique d'une ligne..................................................................491
 7.5.11 Gestion de l'espace fichiers et des entrées/sorties disque................................491
 7.5.11.3 Défragmentation des tables......................................................................493
 7.5.15 Informations de contact InnoDB.........................................................................502
 7.6 Tables BDB ou BerkeleyDB..........................................................................................503
 7.6.8 Erreurs pouvant survenir lors de l'utilisation des tables BDB...............................506
 8.1 API PHP pour MySQL...................................................................................................508
 8.1.1 Problèmes fréquents avec MySQL et PHP..........................................................508
 8.2 API Perl pour MySQL....................................................................................................508
 8.2.3 Plus d'informations relatives à DBI / DBD............................................................514
 8.3 Support ODBC avec MySQL........................................................................................514
 8.3.2 Comment remplir les différents champs dans le programme d'administrateur
 ODBC......................................................................................................................515
 8.3.7 Rapporter des problèmes avec MyODBC............................................................522
x

Manuel MySQL 4.1.x ? Version Française
Sommaire
 8.4 Interface C pour MySQL...............................................................................................523
 8.4.3 Description des fonctions de l'API C....................................................................529
 8.4.3.11 mysql_eof()...............................................................................................535
 8.4.3.26 mysql_get_proto_info().............................................................................543
 8.4.3.47 mysql_select_db().....................................................................................558
xi

Manuel MySQL 4.1.x ? Version Française
Sommaire
 8.4.3.52 mysql_use_result()....................................................................................561
 8.4.4 Description des fonctions threadées de C...........................................................562
 8.4.4.4 mysql_thread_safe()...................................................................................563
 8.4.5 Description des fonctions C du serveur embarqué..............................................563
 8.4.5.2 mysql_server_end()....................................................................................564
 8.4.6 Questions courantes sur la librairie C..................................................................564
 8.4.6.1 Pourquoi est ce qu'après mysql_query() ait indiqué un résultat positif,
 mysql_store_result() retourne parfois NULL ?............................................564
 8.4.6.4 Problèmes lors de la liaison avec l'API C....................................................566
 8.4.9 libmysqld, la librairie du serveur embarqué MySQL.............................................568
 8.4.9.7 Licence du serveur embarqué.....................................................................573
 8.5 Interfaces MySQL pour C++.........................................................................................573
 8.5.1 Borland C++.........................................................................................................573
 8.9 Couche MySQL pour Eiffel...........................................................................................574
 9.1 Rouages de MySQL......................................................................................................575
 9.1.2 Suite de test de MySQL.......................................................................................575
 9.1.2.3 Rapporter des bugs dans la suite de tests MySQL.....................................577
 9.2 Ajouter des fonctions à MySQL....................................................................................578
 9.2.2 Ajouter une nouvelle fonction définie par l'utilisateur (UDF)................................579
 9.2.2.5 Compiler et installer des fonctions utilisateurs............................................586
xii

Manuel MySQL 4.1.x ? Version Française
Sommaire
 9.2.3 Ajouter de nouvelles fonctions natives.................................................................587
 9.3 Ajouter une nouvelle procédure à MySQL....................................................................588
 9.3.2 Ecrire une procédure............................................................................................589
 10.2 Erreurs communes rencontrées avec MySQL............................................................591
 10.2.16 Fichier non trouvé............................................................................................600
 10.3 Notes relatives à l'installation......................................................................................601
 10.3.3 Problèmes avec les permissions sur fichiers.....................................................603
 10.4 Notes relatives à l'administration................................................................................604
 10.4.6 Problèmes de fuseaux horaires.........................................................................609
 10.5 Problèmes relatifs aux requêtes.................................................................................609
 10.5.7 Problèmes de comparaisons avec nombres à virgule flottante..........................614
 10.6 Questions relatives aux définitions de tables..............................................................616
 10.6.3 Problèmes avec les tables temporaires.............................................................617
xiii

Manuel MySQL 4.1.x ? Version Française
Sommaire
 12.3 Supporters de MySQL................................................................................................630
 13.1 Changes in release 4.1.x (Alpha)................................................................................632
 13.1.1 Changes in release 4.1.0...................................................................................632
 13.2 Changes in release 4.0.x (Beta).................................................................................633
 13.2.7 Changes in release 4.0.0 (Oct 2001: Alpha)......................................................643
 13.3 Changes in release 3.23.x (Stable).............................................................................644
 13.3.35 Changes in release 3.23.21.............................................................................667
xiv

Manuel MySQL 4.1.x ? Version Française
Sommaire
 13.3.56 Changes in release 3.23.0 (05 Aug 1999: Alpha)............................................677
 13.4 Changes in release 3.22.x (Older; still supported)......................................................679
 13.4.29 Changes in release 3.22.7 (Sep 1998: Beta)...................................................687
xv

Manuel MySQL 4.1.x ? Version Française
Sommaire
 13.4.36 Changes in release 3.22.0...............................................................................691
 13.5 Changes in release 3.21.x..........................................................................................692
 13.5.35 Changes in release 3.21.0...............................................................................704
 13.6 Changes in release 3.20.x..........................................................................................705
 13.6.7 Changes in release 3.20.11...............................................................................708
xvi

Manuel MySQL 4.1.x ? Version Française
Sommaire
 13.6.14 Changes in release 3.20.0...............................................................................711
 13.7 Changes in release 3.19.x..........................................................................................712
 13.7.3 Changes in release 3.19.3.................................................................................712
 14.1 Déboguer un serveur MySQL.....................................................................................714
 14.1.5 Utilisation des fichiers de log pour trouver d'où viennent les erreurs de
 mysqld.....................................................................................................................718
 14.1.6 Faire une batterie de tests lorsque vous faites face à un problème de table
 corrompue...............................................................................................................719
 14.6 Différences entre les différents packages de threads.................................................725
xvii

1 Informations générales
Le logiciel MySQL (TM) est un serveur de base de données SQL très rapide, multi?threadé,
multi?utilisateur et robuste. Le serveur MySQL est destiné aux missions stratégiques et aux
systèmes de production à forte charge, ainsi qu'à l'intégration dans des logiciels déployés à grande
échelle. MySQL est une marque déposée de MySQL AB . Le logiciel MySQL dispose de deux
licenses . Les utilisateurs peuvent choisir entre utiliser MySQL comme un logiciel Open Source /
Logiciel libre , sous les termes de la licence GNU General Public License (
MySQL AB . MySQL Support and Licensing . Le site web de MySQLfournit les dernières informations sur le serveur MySQL .
La liste suivante décrit les sections particulières de ce manuel :
Pour plus d'informations sur la société derrière le 
• 
serveur de base de données
MySQLPour une présentation des capacités de 
• 
serveur de base de données MySQL , voyez
Pour les instructions d'installation, voyez Installation de MySQL .
• 
Pour des conseils sur le port du 
• 
serveur de base de données MySQL sur de
Pour des informations sur la mise à jour vers la version 3.23, voyez Passer de la version
• 
Pour des informations sur la mise à jour vers la version 3.22, voyez Passer de la version
• 
Pour une introduction au 
• 
serveur de base de données MySQL , voyez Tutoriel
Pour des exemples de 
• 
SQL et des tests de performances, voyez le dossier de tests (
sql?bench de la distribution.
Pour connaître l'historique des fonctionnalités et bogues, voyez Historique des versions de
• 
Pour une liste des bogues connus et des limitations, voyez Erreurs connues et manques de
• 
Pour les plans de développement, voyez MySQL and the future (The TODO) .
• 
Pour une liste de tous les contributeurs à ce projet, voyez Contributeurs .
• 
Important : Les rapports d'erreurs (aussi appelés bogues), ainsi que les questions et
rapporter des bogues ou problèmes .Le script mysqlbug doit être utilisé pour générer le rapport de
bogues. Pour les distributions sources, le script mysqlbug est accessible dans le dossier scripts
. Pour les distributions binaires, mysqlbug est installé dans le dossier bin . Si vous avez trouvé un
problème de sécurité critique dans le code du serveur MySQL , vous devez envoyez un email à
.
1.1 A propos du manuel
Ceci est le manuel de référence de MySQL ; il documente MySQL jusqu'à la version 4.0.5a. Les
évolutions fonctionnelles sont toujours indiquées avec une référence à la version d'évolution, de
manière à ce que ce manuel soit toujours valable, même si vous utilisez une ancienne version de
MySQL . Etant un manuel de référence, il ne fournit aucune description générale sur le langage SQL
ou les concepts de bases de données relationnelles.Comme le logiciel de base de données
MySQL est en développement constant, ce manuel es mis à jour fréquemment. La version la plus
 1 Informations générales
1

Manuel MySQL 4.1.x ? Version Française
HTML, PDF et Windows HLP.
L'original du document est un fichier au format Texinfo. La version HTML est produite
automatiquement avec une version modifiée de texi2html . La version en texte plein et version
Info sont produites par makeinfo . La version PostScript est produite avec texi2dvi et dvips .
La version PDF est produite avec pdftex .
Si vous avez du mal à trouver des informations dans ce manuel, vous pouvez essayer notre version
suggestions concernant des ajouts ou des corrections à ce manuel, vous pouvez les envoyez à
Axmark et Michael (Monty) Widenius. Il est actuellement entretenu par Michael (Monty) Widenius,
Arjen Lentz et Paul DuBois. Pour les autres contributeurs, voyez les Contributeurs .
La traduction de ce manuel a été faite sous la direction de Damien Seguy, et organisée par Mehdi
Achour. David Manusset, Guillaume Plessis, Patrick Haond, Sylvain Maugiron et Yannick Torres ont
contribué largement à cette traduction et son entretien.
Le copyright (2002) de ce manuel est la propriété de la société suédoise MySQL ABlicenses utilisées par MySQL .
1.1.1 Conventions utilisées dans ce manuel
Ce manuel utilise certaines conventions typographiques :
constant
La police à largeur fixe est utilisée pour les noms de commandes et les options, les
requêtes SQL, les noms de bases de données, de tables et de colonnes, le code C
et Perl, les variables d'environnement. Par exemple, ``Pour voir comment
mysqladmin fonctionne, exécutez?le avec l'option ??help .''
filename
La police à largeur fixe avec des guillemets d'encadrement indique des noms de
fichiers et de chemins de dossiers. Par exemple : ``La distribution est installée dans
le dossier /usr/local/ .''
'c'
La police à largeur fixe avec des guillemets d'encadrement est aussi utilisée pour
indiquer des séquences de caractères. Par exemple : ``Pour spécifier un caractère
joker, utilisez le caractère '%' .''
italic
Les polices en italique sont utilisées pour attirer l'attention, comme ceci .
boldface
Le gras est utilisé pour les entêtes de tables, et aussi pour attirer fortement votre
attention
 .
Lorsque les commandes qui sont affichées sont destinées à être exécutées par un programme
particulier, le nom du programme est indiqué dans l'invite de la commande. Par exemple, shell>
indique une commande que vous exécutez depuis votre console shell, et mysql> indique une
commande que vous exécutez depuis le client mysql :
shell> tapez une commande shell ici
mysql> tapez une requête SQL ici
Les commandes shell sont affichées en utilisant la syntaxe du Bourne. Si vous utilisez le style csh
 1.1.1 Conventions utilisées dans ce manuel
2

Manuel MySQL 4.1.x ? Version Française
?shell, vous aurez peut être a adapter légèrement les commandes. Par exemple, la syntaxe de
modification d'une variable et d'exécution d'une commande ressemble à ceci en Bourne shell :
shell> NOMVAR=valeur une_commande
En csh , vous auriez a exécuter la commande suivante :
shell> setenv NOMVAR valeur
shell> une_commande
Souvent, les noms de bases de données, tables ou colonnes doivent être remplacés dans les
commandes. Pour indiquer qu'une telle substitution est nécessaire, ce manuel utilise les noms de
nom_de_base , nom_de_table et nom_colonne . Par exemple, vous pourriez avoir une requête
comme ceci :
mysql> SELECT nom_colonne FROM nom_de_base.nom_de_table;
Cela signifie que si vous devez saisir une requête semblable, vous devriez utiliser votre propre nom
de colonne, table et base de données, ce qui pourrait se traduire par ceci :
mysql> SELECT author_name FROM biblio_db.author_list;
Les mot réservés SQL ne sont pas sensibles à la casse, et peuvent être écrits en majuscules ou
minuscules. Ce manuel utilise les les illustrations de syntaxe, les crochets ( '['
et ']' ) sont utilisés pour indiquer des clauses ou mots optionnels. Par exemple, dans la requête
suivante, IF EXISTS est optionnel :
DROP TABLE [IF EXISTS] nom_de_table
Lorsqu'un élément de syntaxe est constitué d'un certain nombre d'alternatives, les alternatives sont
séparées par des barres verticales ( '|' ). Lorsqu'un membre d'un tel jeu de possibilités peut être
choisi, les alternatives sont listées entre crochets ( '[' et ']' ):
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
Lorsqu'un élément d'un jeu de possibilités doit être choisi, les alternatives sont placées entre
accolades ( '{' et '' }):
{DESCRIBE | DESC} nom_de_table {nom_colonne | wild}
1.2 Qu'est ce que MySQL?
MySQL , le plus populaire des serveurs de bases de données SQL Open Source , est développé,
distribué et supporté par MySQL AB . MySQL AB est une société commerciale, fondée par les
développeurs de MySQL, qui développent leur activité en fournissant des services autour de MySQL
. Qu'est ce que MySQL AB ? Le site web de MySQLdernières actualités sur le logiciel MySQL et sur la société MySQL AB .
MySQL est un système de gestion de bases de données.
Une base de données est un ensemble organisé de données. Cela peut aller d'une
simple liste de courses au supermarché à une galerie de photos, ou encore les
grands systèmes d'informations des multi?nationales. Pour ajouter, lire et traiter des
données dans une base de données, vous avez besoin d'un système de gestion de
bases de données tel que le serveur MySQL . Comme les ordinateurs sont très bons
à manipuler de grandes quantités de données, le système de gestion de bases de
données joue un rôle central en informatique, aussi bien en tant qu'application à part
entière, qu'intégré dans d'autres logiciels.
MySQL est un serveur de bases de données relationnel.
Un serveur de bases de données stocke les données dans des tables séparées
plutôt que de tout rassembler dans une seule table. Cela améliore la rapidité et la
souplesse de l'ensemble. Les tables sont reliées par des relations définies, qui
rendent possible la combinaison de données entre plusieurs tables durant une
requête. Le SQL dans `` MySQL '' signifie `` Structured Query Language '' : le
langage standard pour les traitements de bases de données.
MySQL est Open Source .
Open Source (Standard Ouvert) signifie qu'il est possible à chacun d'utiliser et de
modifier le logiciel. Tout le monde peut télécharger MySQL sur Internet, et l'utiliser
 1.2 Qu'est ce que MySQL?
3

Manuel MySQL 4.1.x ? Version Française
sans payer aucun droit. Toute personne en ayant la volonté peut étudier et modifier
le code source pour l'adapter à ses besoins propres. Le logiciel MySQL utilise la
licence GPL ( GNU General Public Licensepour définir ce que vous pouvez et ne pouvez pas faire avec ce logiciel, dans
différentes situations. Si vous ne vous sentez pas confortable avec la licence GPL ou
bien que vous devez intégrer MySQL dans une application commerciale, vous pouvez
acheter une licence commercial auprès de MySQL AB. Licences MySQL .
Pourquoi utiliser le serveur de bases de données MySQL ?
Le serveur de bases de données MySQL est très rapide, fiable et facile à
utiliser. Si c'est ce que vous recherchez, vous devriez faire un essai. Le serveur de
bases de données MySQL dispose aussi de fonctionnalités pratiques, développées
en coopération avec nos utilisateurs. Vous pouvez trouver une comparaison des
performances du serveur MySQL avec d'autres systèmes de bases de données
dans nos pages de tests de performances. La suite de tests comparatifs de MySQL .
Le serveur MySQL a été développé à l'origine pour gérer de grandes bases de
données plus rapidement que les solutions existantes, et a été utilisé avec succès
dans des environnements de production très contraints et très exigeants, depuis
plusieurs années. Bien que toujours en développement, le Le serveur MySQL offre
des fonctions nombreuses et puissantes. Ses possibilités de connexions, sa rapidité
et sa sécurité font du serveur MySQL une serveur hautement adapté à Internet.
Les caractéristiques techniques du serveur MySQL .
logiciel de bases de données MySQL est un système client/serveur,
constitué d'un serveur SQL multi?threadé qui supporte différents systèmes de
stockage, plusieurs logiciels clients et librairies, outils d'administration, ainsi que de
nombreuses interfaces de programmation (des API ).
Nous fournissons aussi le serveur MySQL sous la forme d'une librairie
multi?threadé que vous pouvez inclure dans vos applications, pour obtenir un produit
plus compact, plus rapide et plus facile à gérer.
Il existe un grand nombre de contributions à MySQL .
Il est très probable que vous pourrez trouver votre éditeur préféré ou que votre
environnement de programmation supporte déjà le serveur de base de
données MySQL .
La prononciation officielle de MySQL est ``My Ess Que Ell'' (en anglais), ce qui donne ``Maille Esse
Cu Elle'' en phonétique française. Evitez d'utiliser la prononciation ``my sequel'', mais nous ne nous
formaliserons pas que vous utilisiez ``my sequel'' ou une autre prononciation adaptée.
1.2.1 Histoire de MySQL
Nous avons débuté avec l'intention d'utiliser mSQL pour se connecter à nos tables en utilisant nos
propres routines bas niveau ISAM. Cependant, après quelques tests, nous sommes arrivés à la
conclusion que mSQL n'était pas assez rapide et flexible pour nos besoins. Cela nous a conduit à
créer une nouvelle interface SQL pour notre base de données, mais en gardant la même API que
mSQL . Cette API a été choisie pour la facilité de port des programmes de tiers.
Les liens avec le nom MySQL ne sont pas parfaitement établis. Notre dossier de base et un grand
nombre de librairies et outils étaient préfixés par ``my'' depuis plus de 10 ans. Mais la fille de Monty,
plus jeune que lui, était aussi appelée My. Lequel des deux a conduit au nom de MySQL est toujours
un mystère, même pour nous.
 1.2.1 Histoire de MySQL
4

Manuel MySQL 4.1.x ? Version Française
1.2.2 Les fonctionnalités principales de MySQL
La liste suivante décrit les caractéristiques principales du logiciel de bases de données
MySQL . MySQL 4.x In A Nutshell .
Interne et portabilité
Ecrit en C et C++. Testé sur un large éventail de compilateurs différents.
Utilise GNU Automake, Autoconf et Libtool pour une meilleure portabilité.
Dispose d'API pour C, C++, Eiffel, Java, Perl, PHP, Python, Ruby et Tcl.
Complètement multi?threadé, grâce aux threads du noyau. Cela signifie que
vous pouvez l'utiliser facilement sur un serveur avec plusieurs processeurs.
Tables B?tree très rapide, avec compression d'index.
Système l'allocation mémoire très rapide, exploitant les threads.
Jointures très rapides, exploitant un système de jointures multiples en une
seule passe optimisé.
Tables en mémoire, pour réaliser des tables temporaires.
Les fonctions SQL sont implémentées grâce à une librairie de classes
optimisées, qui sont aussi rapides que possible! Généralement, il n'y a
aucune allocation mémoire une fois que la requête a été initialisée.
Le code de MySQL est vérifié avec Purify (un utilitaire de détection des fuites
mémoires commercial) ainsi qu'avec Valgrind, un outil GPL (
).
Column Types
Nombreux types de colonnes : entiers signés ou non, de 1, 2, 3, 4, et 8
octets, FLOAT , DOUBLE , CHAR , VARCHAR , TEXT , BLOB , DATE , TIME ,
DATETIME , TIMESTAMP , YEAR , SET et ENUMEnregistrements de taille fixe ou variable.
Toutes les colonnes ont des valeurs par défaut. Vous pouvez utiliser la
commande INSERT pour insérer un sous ensemble de colonnes : les
colonnes qui ne sont pas explicitement cités prennent alors leur valeur par
défaut.
Commandes et fonctions
Support complet des opérateurs et fonctions dans la commande SELECT et la
clause WHERE . Par exemple :
mysql> SELECT CONCAT(first_name, " ", last_name)
    ?> FROM tbl_name
    ?> WHERE income/dependents > 10000 AND age > 30;
Support complet des clauses SQL GROUP BY et ORDER BY . Support des
fonctions de groupages ( COUNT() , COUNT(DISTINCT ...) , AVG() ,
STD() , SUM() , MAX() et MIN() ).
Support des clauses LEFT OUTER JOIN et RIGHT OUTER JOIN avec les
syntaxes ANSI SQL et ODBC.
Les alias de tables et colonnes sont compatibles avec le standard SQL92.
DELETE , INSERT , REPLACE et UPDATE retourne le nombre de lignes
affectées. Il est possible d'obtenir le nombre de lignes trouvées en modifiant
une option lors de la connexion au serveur.
La commande spécifique à MySQL SHOW est utilisée pour obtenir des
informations sur les bases, tables et index. La commande EXPLAIN sert à
optimiser les requêtes.
Les noms de fonctions ne sont jamis en conflit avec les noms de tables ou
colonnes. Par exemple, ABS est un nom de colonne valide. La seule
restriction est que, lors d'un appel de fonction, aucun espace n'est toléré
 1.2.2 Les fonctionnalités principales de MySQL
5

Manuel MySQL 4.1.x ? Version Française
entre le nom de la fonction et la parenthèse ouvrante '('Vous pouvez utiliser simultanément des tables de différentes bases (depuis
la version 3.22).
Securité
Un système de droits et de mots de passe très souple et sécuritaire, qui
vérifie aussi les hôtes se connectant. Les mots de passe sont bien protégés,
car tout les échanges de mot de passe sont chiffrés, même lors des
connexions.
Charges supportées et limites
Gère les très grandes bases de données. Nous utilisons le serveur MySQL
avec des bases qui contiennent 50 millions de lignes et nous connaissons
des utilisateurs qui utilisent le serveur MySQL avec plus de 60 000 tables
and et 5 000 000 000 (milliards) de lignes.
Jusqu'à 32 index sont permis par table. Chaque index est constitué de 1 à 16
colonnes ou parties de colonnes. La taille maximale d'un index est de 500
octets (ce qui peut être configuré à la compilation du serveur MySQL . Un
index peut utiliser un préfixe issu d'un champs CHAR ou VARCHAR .
Connectivité
Les clients peuvent se connecter au serveur MySQL en utilisant les sockets
TCP/IP, les sockets Unix (Unix) ou les Named Pipes (NT).
Support de ODBC (Open?DataBase?Connectivity) pour Win32 (avec les
sources). Toutes les fonctions ODBC 2.5 et de nombreuses autres. Par
exemple, vous pouvez utiliser MS Access pour vous connecter au serveur
MySQL . Support ODBC pour MySQL .
Traductions
Le serveur fournit des messages d'erreurs au client dans de nombreuses
Support complet de plusieurs jeux de caractères, comprenant ISO?8859?1
(Latin1), german, big5, ujis, and more. Par exemple, les caractères nordiques
'Â', 'ä' et 'ö' sont autorisés dans les noms de tables et colonnes.
Toutes les données sont sauvées dans le jeu de caractères choisi. Les
comparaisons normales de chaînes sont insensibles à la casse.
Le tri est fait en fonction du jeu de caractères choisi (par défaut, le jeu
suédois). Il est possible de le changer lorsque le serveur MySQL est démarré.
Pour voir un exemple très avancé de tri, voyez le code de tri pour le Tchèque.
Le serveur MySQL supporte de nombreux jeux de caractères qui peuvent
être spécifié à la compilation et durant l'exécution.
Clients et utilitaires
Inclut myisamchk , un utilitaire rapide pour vérifier les tables, les optimiser et
les réparer. Toutes les fonctionnalités de myisamchk sont aussi disponibles
Tous les programmes MySQL peuvent être appelés avec l'option ??help ou
?? pour obtenir de l'aide en ligne.
1.2.3 Jusqu'à quel point MySQL est il stable ?
Cette section répond aux questions `` Jusqu'à quel point MySQL est il stable ? '' et `` Puis?je
faire confiance à MySQL pour mon projet ?
 '' Nous allons tenter d'apporter des réponses claires
à ces questions importantes qui concernent tous les utilisateurs potentiels. Les informations de
cette section sont fournies par les listes de diffusions, qui sont très actives et promptes à identifier
les problèmes et les rapporter.
 1.2.3 Jusqu'à quel point MySQL est il stable ?
6

Manuel MySQL 4.1.x ? Version Française
Le code original date du début des années 80 et fournit une base de code stable, tout en assurant
une compatibilité ascendante avec le format ISAM. A TcX, le prédécesseur de MySQL AB , le code
de MySQL a fonctionné sur des projets depuis la mi 1996, sans aucun problème. Lorsque le
Serveur MySQL a été livré à un public plus large, nous avons réalisé qu'il contenait du code
``jamais testé'' qui a été rapidement identifié par les utilisateurs, qui effectuait des requêtes
différentes des nôtres. Chaque nouvelle version avait moins de problèmes de portabilité, même si
chaque nouvelle version avait de nombreuses nouvelles fonctionnalités.
Chaque version du Serveur MySQL était parfaitement fonctionnelle. Les seuls problèmes étaient
rencontrés par les utilisateurs de code de ces ``zone d'ombres''. Naturellement, les nouveaux
utilisateurs ne connaissent pas ces zones : cette section tente de les présenter, dans la mesure de
nos connaissances. Les descriptions correspondent surtout aux versions 3.23 du Serveur MySQL
. Tous les bogues connus et rapportés ont été corrigés dans la dernière version, à l'exception de
et manques de MySQL .
La conception du serveur MySQL est faite en plusieurs couches, avec des modules
indépendants. Certains des modules les plus récents sont listés ici, avec leur niveau de test :
Réplication ?? Gamma
De grands serveurs en grappe utilisant la réplication sont en production, avec de
bons résultats. L'amélioration de la réplication continue avec MySQL 4.x.
Tables InnoDB ?? Stable (en 3.23 depuis 3.23.49)
Le gestionnaire transactionnel de tables InnoDB a été déclaré stable en MySQL
version 3.23, à partir de la version 3.23.49. InnoDB est utilisé dans de grands
systèmes complexes, avec forte charge.
Tables BDB ?? Gamma
Le code de Berkeley DB est très stable, mais nous sommes encore en train
d'améliorer l'interface du gestionnaire transactionnel de table BDB du serveur
MySQL . Cela demande encore du temps pour qu'il soit aussi bien testé que les
autres types de tables.
FULLTEXT ?? Beta
La recherche en texte plein fonctionne mais n'est pas encore largement adoptée.
Des améliorations importantes sont prévues pour MySQL 4.0.
MyODBC 2.50 (utilise ODBC SDK 2.5) ?? Gamma
En utilisation croissante. Certains problèmes sont apparus avec des applications
tierces, et indépendemment du pilote ODBC ou du serveur utilisé.
Tables à restauration automatique MyISAM ?? Gamma
Ce statut ne concerne que le nouveau code du gestionnaire de tables MyISAM qui
vérifie si la table a été correctement fermée lors de l'ouverture, et qui exécute
automatiquement la vérification et réparation éventuelles de la table.
Insertions de masse ?? Alpha
Nouvelle fonctionnalité des tables MyISAM pour MySQL 4.0 qui permet des insertions
plus rapides.
Verrouillage ?? Gamma
Cette fonctionnalité est très dépendante du système. Sur certains systèmes, il y a de
gros problèmes lors de l'utilisation du verrouillage système (avec la fonction
fcntl() ). Dans ces cas, il faut utiliser mysqld avec l'option
??skip?external?locking . Les problèmes sont connus sur certaines
distributions Linux, et sur SunOS lorsqu'il est utilisé avec des disques en mode NFS.
MySQL AB fournit un support de première qualité pour les clients payant, mais les listes de
diffusions de MySQL sont généralement rapides à donner des réponses aux questions les plus
communes. Les bogues sont généralement corrigés aussitôt avec un patch. Pour les bogues
 1.2.3 Jusqu'à quel point MySQL est il stable ?
7

Manuel MySQL 4.1.x ? Version Française
sérieux, il y a presque toujours une nouvelle version.
1.2.4 Quelles tailles de tables supporte MySQL ?
MySQL version 3.22 a une limite de 4Go par table. Avec le nouveau format de table MyISAM ,
disponible avec MySQL version 3.23, la taille maximale des tables a été poussée à 8 millions de
teraoctets (2 ^ 63 octets).
Notez, toutefois, que les systèmes d'exploitation ont leur propres limites. Voici quelques exemples :
Système d'exploitation
Limite
Linux?Intel 32 bit
2Go, 4Go ou plus, suivant la version de Linux
Linux?Alpha
8To (?)
Solaris 2.5.1
2Go (4Go possibles avec un patch)
Solaris 2.6
4Go (peut être modifié avec une option)
Solaris 2.7 Intel
4Go
Solaris 2.7 UltraSPARC
512Go
En Linux 2.2, vous pouvez avoir des tables plus grandes que 2Go en utilisant le patch LFS pour les
systèmes de fichiers ext2. En Linux 2.4, le patche existe aussi pour ReiserFS.
Cela signifie que les tables MySQL sont généralement limitées par le système d'exploitation.
Par défaut, les tables MySQL peuvent atteindre une taille de 4Go. Vous pouvez vérifier la taille des
tables avec la commande SHOW TABLE STATUS ou la commande en ligne myisamchk ?dv
nom_de_table . Syntaxe de SHOW .
Si vous avez besoin de tables plus grandes que 4Go (et que votre système d'exploitation le
supporte, modifiez les paramètres AVG_ROW_LENGTH et MAX_ROWS lorsque vous créez votre table.
Syntaxe de CREATE TABLE . Vous pouvez aussi les modifier ultérieurement avec ALTER TABLE .
Syntaxe de ALTER TABLE .
Si vos tables sont accessibles uniquement en lecture, vous pouvez aussi utiliser l'utilitaire
myisampack pour rassembler et compresser plusieurs tables en une seule. myisampack
compresse généralement la table de près de 50%, ce qui vous augmente d'autant la taille maximale
de la table. myisampack , le générateur de tables MySQL compressées en lecture seule .
Vous pouvez aussi contourner les limites du système d'exploitation avec les tables MyISAM , en
utilisant l'option RAID . Syntaxe de CREATE TABLE .
Une autre solution est d'utiliser la librairie MERGE , qui permet de gérer plusieurs tables comme une
seule. Tables MERGE .
1.2.5 Compatibilité an 2000
Le serveur MySQL lui même n'a aucun problème de compatibilité avec l'an 2000 (Y2K) :
Le 
• 
serveur MySQL utilise les fonctions de date Unix, et n'a aucun problème avec les dates
jusqu'en 2069 ; toutes les années écrites en deux chiffres sont supposées faire partie de
l'intervalle allant de 1970 à 2069 , ce qui signifie que si vous stockez la date 01 dans une
colonne de type year , le serveur MySQL la traitera comme 2001 .
 1.2.4 Quelles tailles de tables supporte MySQL ?
8

Manuel MySQL 4.1.x ? Version Française
Toutes les fonctions de dates de 
• 
MySQL sont stockées dans un fichier  , et
sont codées très soigneusement pour être compatibles avec l'an 2000.
En 
• 
MySQL version 3.22 et plus récent, le type de colonne YEAR peut stocker les valeurs 0 et
de 1901 à 2155 sur un seul octet, tout en affichant 2 ou 4 chiffres.
Vous pouvez rencontrer des problèmes avec les applications qui utilisent le serveur MySQL sans
être compatible avec l'an 2000. Par exemple, les vieilles applications utilisent des valeurs d'années
sur deux chiffres (ce qui est ambigu), plutôt qu'avec 4 chiffres. Ce problème peut être complété par
des applications qui utilisent des valeurs telles que 00 ou 99 comme indicateur de données
``manquante''.
Malheureusement, ces problèmes peuvent se révéler difficiles à corriger car différentes applications
peuvent être écrites par différents programmeurs, et chacun utilise un jeu différent de conventions
et de fonctions de gestion des dates.
Voici une illustration simple qui montre que le serveur MySQL n'a aucun problème avec les dates
jusqu'en 2030 :
mysql> DROP TABLE IF EXISTS y2k;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE y2k (date DATE,
    ?>                   date_time DATETIME,
    ?>                   time_stamp TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO y2k VALUES
    ?> ("1998?12?31","1998?12?31 23:59:59",19981231235959),
    ?> ("1999?01?01","1999?01?01 00:00:00",19990101000000),
    ?> ("1999?09?09","1999?09?09 23:59:59",19990909235959),
    ?> ("2000?01?01","2000?01?01 00:00:00",20000101000000),
    ?> ("2000?02?28","2000?02?28 00:00:00",20000228000000),
    ?> ("2000?02?29","2000?02?29 00:00:00",20000229000000),
    ?> ("2000?03?01","2000?03?01 00:00:00",20000301000000),
    ?> ("2000?12?31","2000?12?31 23:59:59",20001231235959),
    ?> ("2001?01?01","2001?01?01 00:00:00",20010101000000),
    ?> ("2004?12?31","2004?12?31 23:59:59",20041231235959),
    ?> ("2005?01?01","2005?01?01 00:00:00",20050101000000),
    ?> ("2030?01?01","2030?01?01 00:00:00",20300101000000),
    ?> ("2050?01?01","2050?01?01 00:00:00",20500101000000);
Query OK, 13 rows affected (0.01 sec)
Records: 13  Duplicates: 0  Warnings: 0
mysql> SELECT * FROM y2k;
+????????????+?????????????????????+????????????????+
| date       | date_time           | time_stamp     |
+????????????+?????????????????????+????????????????+
| 1998?12?31 | 1998?12?31 23:59:59 | 19981231235959 |
| 1999?01?01 | 1999?01?01 00:00:00 | 19990101000000 |
| 1999?09?09 | 1999?09?09 23:59:59 | 19990909235959 |
| 2000?01?01 | 2000?01?01 00:00:00 | 20000101000000 |
| 2000?02?28 | 2000?02?28 00:00:00 | 20000228000000 |
| 2000?02?29 | 2000?02?29 00:00:00 | 20000229000000 |
| 2000?03?01 | 2000?03?01 00:00:00 | 20000301000000 |
| 2000?12?31 | 2000?12?31 23:59:59 | 20001231235959 |
| 2001?01?01 | 2001?01?01 00:00:00 | 20010101000000 |
| 2004?12?31 | 2004?12?31 23:59:59 | 20041231235959 |
| 2005?01?01 | 2005?01?01 00:00:00 | 20050101000000 |
| 2030?01?01 | 2030?01?01 00:00:00 | 20300101000000 |
| 2050?01?01 | 2050?01?01 00:00:00 | 00000000000000 |
+????????????+?????????????????????+????????????????+
13 rows in set (0.00 sec)
 1.2.4 Quelles tailles de tables supporte MySQL ?
9

Manuel MySQL 4.1.x ? Version Française
Cet exemple montre que les types DATE et DATETIME ne poseront aucun problème avec les dates
futures (ils gèrent les dates jusqu'en 9999).Le type TIMESTAMP , qui est utilisé pour stocker la date
courante, est valide jusqu'en 2030?01?01 . TIMESTAMP va de 1970 en 2030 sur les machines 32
bits (valeur signée). Sur les machines 64 bits, il gère les dates jusqu'en 2106 (valeur non
signée).Même si le serveur MySQL est compatible an 2000, il est de votre responsabilité de
fournir des données non ambiguës. Voyez Y2K issues and date types pour les règles du serveur
MySQL pour traiter les dates ambiguës (les données contenant des années exprimées sur deux
chiffres).
1.3 Qui est MySQL AB ?
MySQL AB est l'entreprise des fondateurs de MySQL et les principaux développeurs. A l'origine,
MySQL AB a été établie en Suède, par David Axmark, Allan Larsson et Michael Monty Widenius.
Tous les développeurs du serveur MySQL sont employés par l'entreprise. Nous sommes une
organisation virtuelle, avec des employés répartis dans une douzaine de pays à travers le monde.
Nous communiquons intensivement entre nous sur l'Internet tous les jours, et avec nos utilisateurs,
fans et partenaires.
Nous nous consacrons au développement du logiciel MySQL et à la diffusion de notre base de
données auprès des nouveaux utilisateurs. MySQL AB est propriétaire des droits du code source de
MySQL , du logo MySQL? .
Les valeurs fondamentales de MySQL témoignent de notre implication auprès de MySQL et des
Logiciels libres .Nous souhaitons que la base de données MySQL soit :
Le meilleur serveur de bases de données dans le monde et le plus répandu.
• 
Le rendre accessible à tous.
• 
Facile à utiliser.
• 
En amélioration constante, tout en restant rapide et sécuritaire.
• 
Plaisant à utiliser et améliorer.
• 
Sans aucun bogue.
• 
MySQL AB et les collaborateurs de MySQL AB :
Font la promotion des 
• 
logiciels libres et supportent la communauté des Logiciels
libres .
Sont de bons citoyens.
• 
Préfèrent les partenaires qui partagent nos valeurs et notre état d'esprit.
• 
Répondent aux emails et fournissent de l'aide.
• 
Sont une entreprise virtuelle, qui travaille en réseau avec les autres.
• 
Militent contre les brevets logiciels.
• 
Le site web de MySQLMySQL et MySQL AB .
1.3.1 Les services et le modèle d'affaire de MySQL AB
Une des questions les plus fréquentes que nous rencontrons est : `` Comment arrivez?vous à
vivre en développant un produit gratuit ?
 '' Voici comment.
 1.3 Qui est MySQL AB ?
10

Manuel MySQL 4.1.x ? Version Française
MySQL AB fait des affaires en vendant du support, des services, des licences commerciales et en
percevant des royalties. Nous utilisons ces fonds pour le développement des produits et des
affaires de MySQL .
La compagnie est profitable depuis sa conception. En octobre 2001, nous avons accepté un
financement de la part d'un groupe d'investisseurs scandivanes important et de quelques business
angels. Cet investissement est utilisé pour consolider notre modèle d'affaires et assurer les bases
de notre croissance à long terme.
1.3.1.1 Support
MySQL AB est dirigé par ses propriétaires, qui sont les fondateurs et les principaux développeurs
de la base de données MySQL . Les développeurs se consacrent au support des utilisateurs et des
autres utilisateurs, afin de rester au courant de leurs besoins et leurs problèmes. Tout notre support
est donné par des développeurs qualifiés. Les questions vraiment épineuses sont étudiées par
Michael Monty Widenius, auteur principal du code du serveur ou contactez notre équipe de vente à .
1.3.1.2 Formation et certification
MySQL AB organise des formations MySQL à travers le monde entier. Nous offrons des cours inter
et intra entreprise, adaptés aux besoins spécifiques de chaque société. La formation MySQL est
aussi disponible auprès de nos partenaires, les centres de formation certifiés MySQL .
Nos documents de formation utilisent les mêmes exemples de bases de données que notre
documentation et nos applications d'exemple, et ils sont toujours mis à jour pour prendre en compte
les dernières versions de MySQL . Nos formateurs sont épaulés par notre équipe de développement
pour garantir la qualité de la formation et le développement continu des documents de cours. Cela
vous assure aussi qu'il n'y aura pas de questions laissées ouvertes durant les cours.
Suivre nos formations vous permettra d'atteindre tous vos buts avec votre application MySQL . Vous
allez aussi :
Gagner du temps.
• 
Améliorer les performances de vos applications.
• 
Réduire ou éliminer les besoins en matériels supplémentaires, ce qui réduira vos coûts.
• 
Améliorer la sécurité.
• 
Améliorer la satisfaction de vos clients et collaborateurs.
• 
Vous préparer à la 
• 
certification MySQL .
Si vous êtes intéressé par nos formations, en tant que participant potentiel, ou comme partenaire de
.Le programme de certification MySQL est publié dans le second
semestre 2002. Pour plus de détails, voyez .
1.3.1.3 Conseil
MySQL AB et ses partenaires accrédités offrent des services de conseil aux utilisateurs du
serveur MySQL et à ceux qui intègrent le serveur MySQL dans leurs logiciels, à travers le
monde.
 1.3.1.1 Support
11

Manuel MySQL 4.1.x ? Version Française
Nos consultants peuvent vous aider à concevoir et paramétrer vos bases, construire des requêtes
efficaces, optimiser votre plate?forme, résoudre les problèmes de migration, installer la réplication,
bâtir des applications transactionnelles robustes et bien plus encore. Nous aidons aussi les clients à
intégrer le serveur MySQL dans leurs produits et applications, pour un déploiement d'envergure.
Nos consultants travaillent en collaboration étroite avec notre équipe de développement pour
assurer la qualité technique de nos services professionnels. Les missions de conseil peuvent aller
de sessions de démarrage de deux jours à des projets de plusieurs semaines ou mois. Notre
expertise couvre non seulement le serveur MySQL , mais s'étend aussi aux langages de
programmation tels que PHP, Perl et d'autres vous êtes interessé par nos services de
conseil ou si vous souhaitez devenir un partenaire conseil, visitez la section conseil de notre site
.
1.3.1.4 Licences commerciales
La base de données MySQL est publiée sous la licence GNU General Public License ( GPL ).
Cela signifie que le logiciel MySQL peut être utilisé gratuitement, en acceptant les termes de la
licence GPL . Si vous ne voulez pas être lié par les termes de la licence GPL (comme le fait que
votre application aussi doit être GPL ), vous pouvez acheter une licence du même produit auprès de
MySQL AB . Voyez . Comme MySQL AB est
propriétaire du copyright du code source de MySQL , nous pouvons utiliser une double licence ,
qui fait que le même produit est disponible sous la licence GPL et sous une licence commerciale.
Cela ne change en rien l'implication de MySQL AB dans le mouvement des logiciels libres .
.Nous vendons aussi des licences commerciales aux logiciels Open Source GPL qui ajoutent à la
valeur du serveur serveur MySQL . Un bon exemple est le gestionnaire de table transactionnel
InnoDB qui offre le support ACID , le verrouillage de ligne, la restauration après crash, le multi
versionnage, le support des clés étrangères, etc. Tables InnoDB .
1.3.1.5 Partenariats
MySQL AB a un programme de partenariat mondial qui couvre la formation, le conseil et le support,
les publications, la revente et la distribution des produits MySQL . Les partenaires MySQL AB
spéciales des marques de commerce MySQL pour identifier leurs produits et promouvoir leur
vous êtes intéressé à devenir un partenaire MySQL AB , envoyez un email à
.
Le mot MySQL et le logo MySQL avec le dauphin sont des marques commerciales de MySQL AB .
les fondateurs de MySQL ont placé depuis plusieurs années.
1.3.1.6 Publicité
Le site web MySQLutilisateurs. En Octobre 2001, nous avons eu 10 millions de pages vues. Nos visiteurs représentent
un groupe effectuant des décisions d'achat et des recommandations pour le matériel et les logiciels.
Douze pour cents de nos visiteurs émettent des décisions d'achat, et seulement 9 % n'en prennent
pas du tout. Plus de 65 % d'entre eux ont effectué un ou plusieurs achats sur internet ces six
derniers mois, et 70 % prévoient d'en faire un dans le mois à venir.
 1.3.1.4 Licences commerciales
12

Manuel MySQL 4.1.x ? Version Française
1.3.2 Contacts
Le site web de MySQLMySQL et MySQL AB .Pour les contacts presse et les questions qui ne sont pas couvertes par les
vous avez un contrat de support valide avec MySQL AB , vous obtiendrez des réponses rapides et
précises de notre équipe technique sur le logiciel MySQLemail à .Pour des informations sur les formations MySQL , visitez la section
l'équipe de formation de MySQL des informations sur le programme de certification MySQL , voyez la section
restreint à Internet, contactez l'équip de conseil de MySQL ABMySQL AB . Plus d'informations sur les licences sont disponibles à
les licences ou que vous souhaitez un devis pour un achat de nombreuses licences, remplissez le
MySQL ABpolitique de marque de commerce de MySQL , reportez?vous à
Logos MySQL AB et marques déposées .Si vous êtes interessé par un des emplois à MySQL AB
la fin de votre des discussions générales entre utilisateurs, dirigez vos questions sur
bogues), ainsi que les questions et suggestions doivent être envoyés à la liste de diffusion
. Si vous avez trouvé un trou de sécurité critique dans le serveur MySQL ,
vous avez un résultat de test que nous pouvons publier, contactez?nous à
remarques spécifiques à la version française, vous pouvez aussi contacter directement Damien
fonctionnement ou du contenu du site web  .Pour les questions à propos des portails MySQL (
), envoyez un email à . MySQL AB a une politique
.Pour toutes les autres questions, envoyez un email à .
1.4 Support MySQL et licences
Cette section décrit le support MySQL et les accords de licence.
 1.3.2 Contacts
13

Manuel MySQL 4.1.x ? Version Française
1.4.1 Support proposé par MySQL AB
Le support technique de MySQL AB est la réponse individualisée à vos problèmes particuliers, en
direct, de l'équipe d'ingénieurs qui programme la base de données MySQL .
Nous tâchons d'avoir un support technique exhaustif et global. Presque tous les problèmes qui
impliquent MySQL sont importants pour nous, s'ils sont importants pour vous. Typiquement, les
clients qui recherchent de l'aide sur les différentes commandes, qui souhaitent résoudre des
problèmes de performance, réparer des systèmes corrompus, comprendre les impacts des
systèmes d'exploitation ou des réseaux sur les performances de MySQL , mettre en place des
bonnes pratiques pour la sauvegarde et l'entretien, utiliser les API s, etc. Notre support couvre
uniquement le seveur MySQL et nos propres utilitaires, pas les produits tiers d'entreprises qui
accèdent au serveur MySQL , même si nous pouvons parfois informations détaillées sur
de support peuvent aussi être commandés en ligne. Si vous avez un accès restreint à Internet, vous
identique à l'assurance vie. Vous pouvez vivre très heureux sans pendant plusieurs années, mais
lorsque vous rencontrerez une catastrophe, il sera trop tard pour l'acheter. Si vous utilisez MySQL
pour des applications importantes et que vous rencontrez des problèmes, cela peut vous prendre
très longtemps pour comprendre par vous? même. Vous pourriez alors avoir besoin de
communiquer avec les techniciens les plus expérimentés de MySQL , ceux qui sont employés par
MySQL AB .
1.4.2 Copyrights et licences utilisées par MySQL
MySQL AB est propriétaire du copyright du code source de MySQL , des logos MySQL , de la
sont disponibles pour la diffusion de MySQL :
Toutes les sources spécifiques de 
• 
MySQL pour le serveur, le client mysqlclient et la
librairie, ainsi que la librairie GNU readline sont couverts par la licence GNU General
Public Licensedisponible dans le fichier intitulé COPYING dans les distributions.
La librairie 
• 
GNU getopt est sous la licence GNU Lesser General Public License .
Certaines parties du code source (la librairie 
• 
regexp ) sont placées sous un copyright de
type Berkeley.
Les anciennes versions de 
• 
MySQL (3.22 et plus récentes) sont sujettes à des licences plus
spécifique de chaque version pour plus de détails.
La manuel n'est actuellement
• 
 PAS distribué sous la licence GPL . L'utilisation du manuel est
sujette à ces conditions :
Les conversions en d'autres formats sont autorisées, mais le contenu ne doit pas

être modifié ou édité de quelque manière que ce soit.
Vous pouvez créer une version imprimée pour votre utilisation personnelle.

Pour toutes les autres utilisations, telles que la vente de versions imprimées, ou

l'utilisation (en partie ou en totalité) du manuel dans d'autres publications, un accord
doit être conclu au préalable avec MySQL AB .
interessé par la traduction du manuel.
Pour plus de détails sur comment les licences MySQLaussi Logos MySQL AB et marques déposées .
 1.4.1 Support proposé par MySQL AB
14

Manuel MySQL 4.1.x ? Version Française
1.4.3 Licences MySQL
Le logiciel MySQL est publié sous la licence GNU General Public License ( GPL ), qui est
probablement mieux connue sous le nom de Open Source . Les termes exacts de la licence GPL
.Comme le logiciel MySQL est publié sous la licence GPL , il est souvent utilisé gratuitement, mais
pour certains usages vous souhaiterez peut?être acheter une licence commerciale auprès de
MySQL ABplus d' anciennes versions de MySQL (3.22 et plus anciennes) sont sujettes à une
documentation spécifique de chaque version pour information.
Notez bien que l'utilisation du logiciel MySQL sous une licence commerciale. GPL , ou toute autre
ancienne licence MySQL ne vous donne pas automatiquement le droit d'utiliser les marques
commerciales de MySQL AB . Logos MySQL AB et marques déposées .
1.4.3.1 Utiliser MySQL avec la licence commerciale
La licence GPL est contagieuse, dans le sens où lorsqu'un programme est lié à la licence GPL ,
toutes les sources de toutes les parties du produit final doivent aussi être publiée sous la licence
GPL . Sinon, vous violez la licence, et annulez vos droits d'utiliser le programme GPL .
Vous avez besoin d'une licence commerciale pour :
Lorsque vous reliez un programme à un logiciel 
• 
GPL issu de MySQL et que vous ne voulez
pas que le produit final soit publié sous la licence GPL , peut être parce que vous souhaitez
publier un produit commercial ou conserver du code non? GPL pour d'autres raisons.
Lorsque vous achetez une licence commerciale vous n'utilisez plus MySQL sous la licence
GPL , même si c'est le même code.
Lorsque vous distribuez une application non? 
• 
GPL qui fonctionne uniquement avec MySQL ,
et que vous distribuez cette application avec MySQL . Ce type de solution est considéré
comme un lien, même si c'est fait via le réseau.
Lorsque vous distribuez des copies de 
• 
MySQL sans fournir le code source original, comme
requis par la licence GPL .
Lorsque vous voulez supporter le développement de 
• 
MySQL même si vous n'avez pas
besoin formellement de la licence commerciale. Acheter du support auprès de MySQL AB
est une autre bonne solution pour contribuer au développement de MySQL , avec des
avantages directs pour vous. Support offert par MySQL AB .
Si vous avez besoin d'une licence, vous en aurez besoin d'une pour chaque installation de MySQL .
Cela est valable quelque soit le nombre de processeurs de la machine, et il n'y a pas de limite
artificielle de nombre de connexion simultané les licences commerciales, voyez notre site
restreint à internet, contactez notre équipe de vente à .
1.4.3.2 Utiliser MySQL sous licence GPL libre
Vous pouvez utiliser le logiciel MySQL sous la licence gratuite GPL si vous acceptez les termes et
conditions de la licence GPL . Pour une liste exhaustive des questions courantes à propos de la
licence GPL , voyez la FAQ générale de la Free Software Foundation à
 1.4.3 Licences MySQL
15

Manuel MySQL 4.1.x ? Version Française
? . Quelques cas courants :
Lorsque vous distribuez votre application et le code source 
• 
MySQL , ensemble avec la
licence GPL .
Lorsque vous distribuez le code source 
• 
MySQL avec d'autres programmes qui ne sont pas
liés ou dépendant de MySQL pour leur fonctionnalités, même si vous vendez la distribution
commercialement. Ceci s'appelle une agrégation simple en termes GPL .
Si vous ne distribuez
• 
 aucune partie de MySQL , vous pouvez l'utiliser gratuitement.
Lorsque vous êtes un fournisseur de services Internet (ISP), qui offre un hébergement web
• 
avec le MySQL . Cependant, nous vous encourageons à faire affaires avec un ISP qui
dispose du support MySQL, car cela vous donne l'assurance que si votre hébergeur a des
problèmes avec l'installation de MySQL , votre hébergeur aura les ressources pour résoudre
votre problème. Notez que si votre ISP n'a pas de licence commerciale pour le le MySQL ,
il devrait au moins fournir l'accès en lecture aux sources aux clients pour qu'ils vérifient que
l'installation de MySQL est correctement patchée.
Lorsque vous utilisez le serveur de bases de données 
• 
MySQL en conjonction avec un
serveur web, vous n'avez pas besoin de licence commerciale (aussi longtemps que ce n'est
pas un produit que vous distribuez). Ceci est même vrai si vous avec un serveur web qui
utilise le serveur MySQL , car vous ne distribuez pas de partie de MySQL . Cependant,
dans ce cas, nous vous demandons d'acheter du support MySQL car MySQL aide votre
entreprise
Si vous utilisez le serveur de bases de données MySQL sans avoir besoin de licence commerciale,
nous vous encourageons à acheter le support auprès de MySQL AB malgré tout. De cette façon,
vous contribuez au développement de MySQL et en obtenez des avantages immédiats vous?même.
Support offert par MySQL AB .
Si vous utilisez MySQL dans un contexte commercial tel que vous en tirez profit, nous vous
demandons de participer au développement de MySQL en achetant du support. Nous pensons que
comme MySQL aide votre entreprise, il est raisonnable de vous demander d'aider à votre tour
MySQL AB . (Sinon, lorsque vous nous posez des questions de support, non seulement vous
utilisez gratuitement un système dans lequel nous avons investi beaucoup de temps, mais en plus,
vous nous demandez du support gratuit, en plus !)
1.4.4 Logos MySQL AB et marque déposée
Beaucoup d'utilisateurs de MySQL souhaitent afficher le logo du dauphin MySQL AB sur leur sites
web, leur livres ou leurs produits. Nous encourageons ces actes, tant qu'on part du principe que le
mot MySQL et le logo du dauphin MySQL sont des marques déposées par MySQL AB et ne doivent
être utilisés que dans les conditions décrites à la page suivante :
.
1.4.4.1 Le logo original de MySQL
Le dauphin MySQL a été conçu par l'agence de publicité finlandaise Priority, en 2001. Le dauphin a
été choisi en tant que symbole représentatif de MySQL , car c'est un animal intelligent, rapide et
élancé, qui parcourt sans effort l'océan des données. Nous aimons aussi les dauphins.
Le logo original de MySQL ne peut être utilisé que par les représentants de MySQL AB et par ceux
qui ont un accord signé leur permettant de le faire.
 1.4.4 Logos MySQL AB et marque déposée
16

Manuel MySQL 4.1.x ? Version Française
1.4.4.2 Logos MySQL qui peuvent être utilisés dans autorisation préalable
Nous avons conçu un jeu de logos qui peuvent être utilisés sous conditions , et qui peuvent être
web tiers sans autorisation écrite de MySQL AB . L'utilisation de ces logos n'est pas
inconditionnelle, mais, comme leur nom l'implique, sujette à notre politique de marque de commerce
qui est aussi disponible sur notre site web. Il est recommandé de lire ce document avant d'utiliser
les logos sur votre site web. En bref, les pré?requis sont :
Utilisez le logo que vous souhaitez tel que présenté sur le site web .
• 
Vous pouvez l'étendre ou le réduire suivant vos besoins, mais ne modifier ni les couleurs, ni
le design, ni le graphisme en aucune façon.
Faîtes en sorte qu'il soit évident que vous, et non pas 
• 
MySQL AB , êtes le créateur de ce
site, qui arbore les couleurs de MySQL .
N'utilisez pas le logo d'une façon qui porte préjudice à 
• 
MySQL AB ou aux valeurs de MySQL
AB . Nous nous réservons le droit de retirer notre autorisation d'utiliser le logo de MySQL AB
.
Si vous utilisez le logo sur un site web, rendez?le clickable, avec un lien sur le site
• 
Si vous utilisez le serveur web 
• 
MySQL sous licence GPL dans votre application, votre
application doit porter la mention Open Source et être capable de se connecter à un
serveur MySQL .
vous conviendraient.
1.4.4.3 Quand avez vous besoin d'autorisation pour utiliser le logo MySQL?
Dans les cas suivants vous devez obtenir une permission écrite de MySQL AB avant d'utiliser les
logos MySQL :
Lorsque vous affichez un des logos 
• 
MySQL AB n'importe où, en dehors de votre site web.
Lorsque vous affichez l'un des logos 
• 
MySQL AB hormis les logos à utilisation
conditionnée mentionnés auparavant sur le site web, ou ailleurs
En dehors des raisons commerciales et légales, nous nous devons de suivre l'utilisation du logo
MySQL sur les produits, livres, etc. Nous demanderons une compensation pour l'affichage des
logos MySQL AB sur les produits, car nous pensons qu'il est raisonnable qu'une partie des revenus
ainsi générés servent à poursuivre le développement de la base de données MySQL .
1.4.4.4 Logos de partenariat MySQL AB
Le logo partenariat MySQL ne doit être utilisé que par les compagnies et les personnes ayant un
partenariat écrit avec MySQL AB Le partenariat inclut une certification en tant que consultant ou
professeur MySQL .
Merci de visiter Partnering .
 1.4.4.2 Logos MySQL qui peuvent être utilisés dans autorisation préalable
17

Manuel MySQL 4.1.x ? Version Française
1.4.4.5 Utiliser le nom MySQL sur des documents imprimés ou des présentations
MySQL AB apprécie les références à la base MySQL . Il faut toutefois garder à l'esprit que MySQL
est une marque commerciale, propriété de MySQL AB . A cause de cela, il faut ajouter au logo le
symbole de marque de commerce ( TM ) lors de la première ou de la plus visible utilisation du mot
MySQL dans le texte et, là où approprié, établir clairement que MySQL est une marque commerciale
de MySQL AB . Reportez?vous à notre politique de marque commerciale à
pour plus de détails.
1.4.4.6 Utilisation du nom MySQL dans un nom de société ou de produit
L'utilisation du mot MySQL dans le nom d'une compagnie, d'un produit ou d'un nom de domaine
Internet est interdite sans une permission écrite de MySQL AB .
1.5 MySQL 4.x In A Nutshell
Longtemps promis par MySQL AB et longtemps attendu par nos utilisateurs, le serveur MySQL 4.0
et de nos plus part des nouvelles fonctionnalités du serveur MySQL 4.0 sont adaptées à
nos affaires courantes et utilisateurs développant le logiciel de bases de données MySQL en tant
que solution pour les tâches critiques et les bases de données à lourdes charges. Les autres
nouveautés ciblent les utilisateurs de bases de données intégrées.
1.5.1 Phases de publication
La publication du serveur MySQL 4.x se déroule en plusieurs étapes, en commencant par la
première version, nommée 4.0.0?alpha, qui contient déjà la plupart des nouvelles fonctionnalités.
Des fonctionnalités supplémentaires ont été ajoutées en MySQL 4.0.1, 4.0.2, et ainsi de suite ;
MySQL 4.0.3 a été déclarée beta. D'autres fonctionnalités seront ajoutées en MySQL 4.1, destinée
à la publication en phase alpha à la fin de 2002.
1.5.2 Utilisation immédiate en production
Il est recommandé aux utilisateurs de ne pas passer leurs systèmes en production sous le serveur
MySQL 4.x, jusqu'à ce qu'elle soit publiée en phase béta (telle que la 4.0.3 beta). Toutefois, même
la version initiale a passé avec succès notre batterie de tests, sans aucune erreur sur aucune
plate?forme que nous avons utilisé. Etant donné le grand nombre de fonctionalités
supplémentaires, nous recommandons le serveur MySQL, même en version alpha, pour les phases
de développement. L'agenda de publication du serveur MySQL 4.x est tel qu'il atteindra un état
stable avant les applications qui sont aujourd'hui en phase de développement.
1.5.3 MySQL intégré
libmysqld rend le serveur MySQL parfaitement utilisable pour une vaste gamme d'applications.
En utilisant la librairie intégrée MySQL, vous pouvez intégrer le serveur MySQL dans diverses
applications et appareils électroniques, où l'utilisateur final n'aura aucune visibilité sur les systèmes
sous?jacents. Intégrer MySQL est idéal pour les applications de back office dans les systèmes
Internet, les bornes publiques, les serveurs web hautes performances, les bases de données
 1.4.4.5 Utiliser le nom MySQL sur des documents imprimés ou des présentations
18

Manuel MySQL 4.1.x ? Version Française
distribuées sur CD ROM, etc.
De nombreux utilisateurs de libmysqld profitent de la double licence de MySQL. Pour ceux qui
ne souhaitent pas être liés par la licence GPL, le logiciel est aussi disponible avec une licence
commerciale. La librairie intégrée MySQL utilise la même interface que le client normal, ce qui la
rend pratique et facile à utiliser. libmysqld, la librairie du serveur MySQL embarqué .
1.5.4 Autres nouveautés de MySQL 4.0
La version 4.0 améliore la
• 
 vitesse du serveur MySQL dans de nombreuses situations,
comme les INSERT de masse, les recherches sur les index compactés, la création d'index
en texte plein, ainsi que sur les dénombrements de lignes distinctes.
Le gestionnaire de table 
• 
InnoDB est proposé comme gestionnaire standard du serveur
MySQL, incluant le support complet des transactions et le verrouillage des
lignes .
Nos utilisateurs allemands, autrichiens et suisses noteront que leur jeu de caractères, le
• 
latin1_de , gère correctement les tri en allemand , plaçant les umlauts allemands dans le
même ordre que celui de l'annuaire.
La migration depuis les autres systèmes de bases de données vers MySQL ont été
• 
simplifiés pour inclure TRUNCATE TABLE (comme sous Oracle) et IDENTITY comme
synonymes pour les clés automatiquement incrémentés (comme sous Sybase). De
nombreux utilisateurs apprécieront que MySQL supporte désormais la commande UNION ,
une fonctionnalité longtemps attendue.
En mettant en place de nouvelles fonctionnalités pour les utilisateurs, nous n'avons pas
• 
oublié la communauté de nos utilisateurs fidèles. Nous avons désormais des commandes
DELETE et UPDATE multi tables. En ajoutant le support des liens symboliques à
MyISAM au niveau des tables (et non pas au niveau des bases, comme avant), ainsi qu'en
supportant les liens symboliques par défaut sous Windows, nous espérons montrer que
nous prenons à coeur les demandes d'améliorations. Les fonctions comme
SQL_CALC_FOUND_ROWS et FOUND_ROWS() permettent de savoir combien de lignes une
requête sans clause LIMIT aurait retourné.
1.5.5 Fonctionnalités à venir de MySQL 4.x
Vous pouvez anticiper les fonctionnalités suivantes dans les prochaines versions de MySQL Server
4.x :
Les utilisateurs exigeants du serveur MySQL apprécieront les nouveautés de notre système
• 
de réplication et des sauvegardes en ligne, à chaud. Les versions suivantes incluront aussi
la replication garantie ; déjà en place dans la version 4.0, la commande LOAD DATA
FROM MASTER évoluera rapidement vers une configuration automatique. Les sauvegardes
en ligne rendront simples les réplications, sans interrompre le serveur principal, et auront
peu d'impact sur les performances des systèmes sous forte charge.
Une fonctionnalité pratique pour les administrateurs de bases données sera la possibilité de
• 
modifier les paramètres de démarrage de mysqld sans interrompre le serveur.
Les nouvelles fonctionnalités de recherche en texte plein ( 
• 
FULLTEXT ) du serveur MySQL
4.0 permettent l'indexation de grandes quantités de texte avec des logiques binaires ou
humaines de recherche. Les utilisateurs peuvent paramétrer la taille de mot minimale et
définir leur propre liste de mots ignorés. C'est tout une nouvelle gamme d'applications qui
seront possibles avec le serveur MySQL.
De nombreuses applications exploitant la base en lecture bénéficieront d'une augmentation
• 
de vitesse grâce à la réécriture du cache des clés.
 1.5.4 Autres nouveautés de MySQL 4.0
19

Manuel MySQL 4.1.x ? Version Française
De nombreux développeurs apprécieront la nouvelle commande 
• 
d'aide MySQL dans le
client.
1.5.6 MySQL 4.1 : Les nouvelles fonctionnalités
Le serveur MySQL 4.0 définit les bases des nouvelles fonctionnalités des versions 4.1 et plus de
MySQL, comme les requêtes imbriquées (4.1), les procédures stockées (5.0), et les
règles d'intégrité des clefs étrangères pour les tables au format MyISAM (5.0), ce qui
forme la partie haute de la liste de souhaits de plusieurs de nos utilisateurs.
Après ces additions, la critique devra être plus imaginative pour trouver les déficiences du système
de gestion de bases de données MySQL. Déjà connu depuis longtemps pour sa stabilité, sa rapidité
et sa facilité de prise en main, MySQL remplira pleinement les attentes de tous les acheteurs
exigeants.
1.6 Sources d'informations MySQL
1.6.1 Portails MySQL
Les portails MySQLtrouver des partenaires MySQL AB , ainsi que des livres ou des solutions MySQL . Les solutions
sont classées et rangées en ordre d'importance, pour que vous puissiez facilement trouver les
vous enregistrant en tant qu'utilisateur, vous gagnez la possibilité de commenter et
noter les solutions du portail. Vous recevrez aussi des lettres d'actualité suivant votre profil
d'utilisateur, qui est modifiable à tout moment.
Les catégories actuelles du portail MySQL incluent :
Partenaires
Trouver des partenaires MySQL AB dans le monde.
Livres
Commenter, voter et acheter des livres concernant MySQL .
Développement
Différents liens vers des sites web qui utilisent le serveur MySQL dans différentes
situations, avec une description pour chaque site. Ces informations vous donneront
une idée de qui utilise MySQL et comment le serveur MySQL peut vous satisfaire.
Parlez?nous de votre site ou de vos réussites ! Visitez
.
Logiciels
Trouver, acheter et télécharger différentes applications et compléments à utiliser
avec le serveur MySQL .
Distributions
Depuis ce site, vous pouvez trouver les différentes distributions Linux et d'autres
logiciels qui contiennent MySQL .
Fournisseurs de services
Les entreprises qui proposent des services autour de MySQL .
 1.5.6 MySQL 4.1 : Les nouvelles fonctionnalités
20

Manuel MySQL 4.1.x ? Version Française
1.6.2 Listes de diffusion MySQL
Cette section vous présente les listes de diffusions MySQL, et donne des conseils quand à leur
utilisation. En vous inscrivant à une des listes de diffusion, vous recevrez les messages que les
autres auront envoyé, et vous pourrez envoyer vos propres questions et réponses.
1.6.2.1 Les listes de diffusions de MySQL
Pour vous inscrire à la liste de diffusion principale de MySQL, envoyez un courrier électronique à
d'où vous envoyez votre message est importante. La ligne de sujet et le corps sont ignorés.
Si votre adresse de réponse n'est pas valide, vous pouvez spécifier votre adresse explicitement, en
ajoutant un tiret après le mot subscribe ou unsubscribe, suivi de votre adresse dans laquelle vous
aurez remplacé le caractère '@' par '=' . Par exemple, pour inscrire l'adresse
[email protected] , envoyez un message à
mysql?subscribe? .
sont géré automatiquement par le robot ezmlm. Des informations sur ezmlm sont disponibles à
 . Toutefois, n'envoyez pas de mail d'inscription ou de désinscription à
à des milliers d'utilisateurs.Votre site local peut avoir beaucoup d'inscrits à la liste
ce que les messages envoyés par  à votre site local soit propagés par votre
serveur local. Dans ce cas, contactez votre administrateur local pour être ajouté ou retiré de la liste.
Si vous voulez que le trafic de cette liste soit envoyé à une autre boîte aux lettres de votre client
mail, installez un filtre basé sur les entêtes du message. Vous pouvez utiliser notamment les
entêtes List?ID: et Delivered?To: pour identifier les messages de la liste. Les listes de
diffusion MySQL suivantes existent :
Ceci est la liste de diffusion d'annonces des versions de MySQL et des programmes
compagnons. C'est une liste à faible volume, et tout utilisateur doit y être inscrit.
La liste de diffusion principale pour les discussions générales sur MySQL. Notez que
certains sujets sont à diriger sur les listes spécialisées. Si vous postez sur la
mauvaise liste, vous pourriez ne pas avoir avoir de réponse.
La liste mysql en format journalier. Cela signifie que vous recevrez tous les
messages de la journée en un seul gros email.
Sur cette liste, vous ne devriez envoyez que des bogues complets, reproductibles
ainsi que le rapport qui va avec, en utilisant le script mysqlbug (si vous utilisez
Windows, il faut aussi inclure la description du système d'exploitation et la version de
MySQL MySQL). De préférence, vous devriez tester le problème avec la dernière
version stable ou de développement du serveur MySQL avant de l'envoyer. Tout le
monde doit être capable de reproduire le bogue simplement avec la ligne de
commande mysql test < script avec le cas de test inclus. Tous les bogues
doivent être posté sur la liste, et seront corrigés ou documentés dans la prochaine
 1.6.2 Listes de diffusion MySQL
21

Manuel MySQL 4.1.x ? Version Française
version de MySQL!. Si les modifications sont trop petites, nous publierons aussi un
patch qui résout le problème.
La liste bugs en format journalier.
Une liste pour ceux qui travaillent sur le code MySQL. Sur cette liste, vous pouvez
discuter du développement de MySQL et envoyer des patchs.
La liste internals en format journalier.
Une liste pour ceux qui utilisent MySQL et java. Elle concerne majoritairement les
pilotes JDBC.
La liste java en format journalier.
Une liste pour ceux qui utilisent MySQL sur les systèmes d'exploitation de Microsoft,
tels que Windows 9x/Me/NT/2000/XP.
La liste win32 en format journalier.
Une liste pour tout ce qui concerne la connexion à MySQL avec le pilote ODBC.
La liste myodbc en format journalier.
Une liste pour tout ce qui concerne le client graphique MySQL Control Center .
La liste mysqlcc en format journalier.
Une liste pour tout ce qui concerne la programmation avec les API C++ de MySQL.
La liste plusplus en format journalier.
Une liste pour tout ce qui concerne Perl et le support du module
msql?mysql?modules.
La liste msql?mysql?modules en format journalier.
Vous pouvez vous inscrire ou vous désinscrire de toutes les listes en même temps de la même
façon que nous l'avons décrit au début. Dans votre message d'inscription, utilisez simplement le
nom de liste approprié. Par exemple, pour vous inscrire à la liste myodbc , envoyez un message à
pas obtenir d'informations sur la liste de diffusion, une de vos options est de prendre un contrat de
support auprès de MySQL AB, qui vous donnera un contact direct avec les développeurs MySQL.
Support offert par MySQL AB .
Le tableau suivant présente diverses autres listes de diffusions consacrée à MySQL, dans d'autres
langues que l'anglais. Notez que ces ressources ne sont pas gérées par MySQL AB, ce qui fait que
nous ne pouvons pas garantir leur qualité.
Envoyez un message à subscribe mysql [email protected]?mail.address .
Envoyez un message à subscribe mysql?de [email protected]?mail.address . Vous
 1.6.2 Listes de diffusion MySQL
22

Manuel MySQL 4.1.x ? Version Française
aurez plus d'informations sur cette liste à .
Envoyez un message à subscribe mysql?br [email protected]?mail.address .
Envoyez un message à subscribe mysql [email protected]?mail.address .
1.6.2.2 Poser des questions ou rapporter un bogue
Avant de soumettre un rapport de bogue ou une question, commencez par ces étapes simples :
Etudiez le manuel MySQL et faites y une recherche à : Nous
• 
nous efforçons de mettre à jour le manuel fréquemment, en y ajoutant les solutions aux
) est particulièrement pratique car il est possible qu'une nouvelle version de MySQL propose
déjà la solution à votre problème.
Recherchez dans les archives des listes de diffusion de MySQL :
• 
Vous pouvez aussi utiliser l'URL pour rechercher dans toutes
• 
les pages web (y compris le manuel) qui sont situés à .
Si vous n'arrivez pas à trouver une réponse à votre question dans le manuel ou dans les archives,
vérifiez auprès de votre expert MySQL local. Si vous ne trouvez toujours pas la réponse, vous
pouvez lire la section suivante et envoyer un mail bien préparé à .
1.6.2.3 Comment rapporter un bogue ou un problème
Ecrire un bon rapport de bogue requiert de la patience, et le faire dès le début épargnera votre
temps et le notre. Un bon rapport de bogue qui contient un cas de test complet améliorera vos
chances de voir le bogue corrigé à la prochaine version. Cette section vous aidera à écrire
correctement un rapport de bogue, de manière à ce que vous ne gaspillez pas votre temps à faire
des textes qui ne nous aideront que peu ou pas.
Nous vous recommandons d'utiliser le script mysqlbug pour générer un rapport de bogue (ou
rapporter un problème), dans la mesure du possible. mysqlbug est situé dans le dossier scripts
de la distribution, ou, pour les distributions binaire, dans le dossier bin du dossier d'installation de
MySQL. Si vous êtes dans l'incapacité d'utiliser mysqlbug , vous devez tout de même inclure
toutes les informations nécessaires listées dans cette section.
Le script mysqlbug vous aide à générer un rapport en déterminant automatiquement les
informations suivantes, mais si quelque chose d'important lui échappe, ajoutez le dans votre
message! Lisez cette section avec attention, et assurez vous que toutes les informations décrites ici
sont présentes dans votre message. Pour rapporter un bogue ou un problème, il faut le soumettre à
poster qu'un rapport complet de bogue regénérable, avec le script mysqlbug . Si vous travaillez
sous Windows, vous devez ajouter une description de votre système d'exploitation et de votre
version de MySQL. De préférence, il vaut mieux utiliser la dernière version de MySQL, version
stable ou de développement, avant d'envoyer un message. Tout le monde doit être capable de
reproduire le bogue en utilisant simplement la ligne de commande `` mysql test < script '',
avec le cas de bogue fourni, ou bien d'exécuter un script shell ou Perl qui est inclut dans le rapport
de bogue. Tous les bogues postés sur la liste bogues seront corrigés ou documentés dans la
prochaine version de MySQL. Si seul de petits changements sont nécessaires, nous publierons
aussi un vous avez découvert un problème de sécurité sensible dans MySQL, il faut
 1.6.2.2 Poser des questions ou rapporter un bogue
23

Manuel MySQL 4.1.x ? Version Française
envoyer un email à .
Sachez qu'il est toujours possible de répondre à un message qui contient trop d'informations, alors
qu'il est impossible de répondre à um message qui contient trop peu d'informations. Souvent, il est
facile d'omettre des faits parce que vous pensez connaître la cause du problème et supposez que
ces détails ne sont pas importants. Un bon principe à suivre est : si vous avez un doute à propos de
quelque chose, faites nous en part. Il est bien plus rapide et bien moins frustrant d'écrire quelques
lignes de plus dans un rapport plutôt que d'être obligé de demander une nouvelle fois et d'attendre
une réponse parce que vous avez oublié une partie des informations la première fois.
L'erreur la plus commune est de ne pas indiquer le numéro de la version de MySQL qui est utilisé,
ou de ne pas indiquer le système d'exploitation que vous utilisez (y compris le numéro de version
de ce système d'exploitation). Ce sont des informations de première importance, et dans 99% d4es
cas, le rapport de bogue est inutilisable sans ces informations. Souvent, nous recevons des
questions telles que ``Pourquoi est ce que cela ne fonctionne pas pour moi?''. Puis nous nous
aperçevons que la fonctionnalités en question n'est même pas programmée dans la version de
MySQL utilisée, ou que le bogue décrit est déjà corrigé dans une nouvelle version de MySQL.
Parfois aussi, les erreurs sont dépendantes des plate?formes. Dans ce cas, il est presque
impossible de les corriger sans savoir quel système d'exploitation et quelle version exacte est
utilisée.
Pensez aussi à fournir des informations concernant votre compilateur, si c'est pertinent. Souvent,
les développeurs trouvent des bogues dans les compilateurs, et pensent que c'est liés à MySQL. La
plupart des compilateurs sont en constant développement, et s'améliorent de version en version.
Pour déterminer si votre problèe dépend de votre compilateur, nous avons besoin de savoir quel
compilateur est utilisé. Notez que les problèmes de compilations sont des bogues, et doivent être
traités avec un rapport de bogues.
Il est particulièrement utile de fournir une bonne description du bogue dans le rapport de bogue.
Cela peut être un exemple de ce que vous avez fait qui a conduit au problème, ou une description
précise. Les meilleurs rapports sont ceux qui incluent un exemple complet permettant de reproduire
le bogue. Faire une batterie de tests lorsque vous faites face à un problème de table corrompue .
Si un programme produit un message d'erreur, il est très important d'inclure ce message dans votre
rapport. Il est préférable que le message soit le message exact, car il est alors possible de le
retrouver en utilisant les archives : même la casse doit être respectée. N'essayez jamais de vous
rappeler d'un message d'erreur, mais faites plutôt un copier/coller du message complet dans votre
rapport.
Si vous avez un problème avec MyODBC, essayez de générer un fichier de trace MyODBC.
Reporter les problèmes rencontrés avec MyODBC .
Pensez aussi que de nombreux personnes qui liront votre rapport utilisent un formatage de 80
colonnes. Lorsque vous générez votre rapport et vos exemples avec l'outil de ligne de commande,
utilisez une largeur de 80 colonnes. Utilisez l'option ??vertical (ou la fin de commande \G ) pour
les affichages qui excèdent une telle largeur (par exemple, avec la commande EXPLAIN SELECT ;
voyez l'exemple un peu plus tard dans cette section.
Voici un pense?bête des informations à fournir dans votre rapport :
Le numéro de version de la distribution de MySQL que vous utilisez (par exemple MySQL
• 
Version 3.22.22). Vous pouvez connaitre cette version en excutant la commande
mysqladmin version . mysqladmin est situé dans le dossier bin de votre distribution
MySQL.
 1.6.2.2 Poser des questions ou rapporter un bogue
24

Manuel MySQL 4.1.x ? Version Française
Le fabricant et le modèle de votre serveur.
• 
Le système d'exploitation et la version que vous utilisez. Pour la plupart des systèmes
• 
d'exploitation, vous pouvez obtenir cette information en utilisant la commande Unix
command uname ?a .
Parfois, la quantité de mémoire (physique et virtuelle) est important. Si vous hésitez, ajoutez
• 
la.
Si vous utilisez une version de MySQL sous forme de source, le nom et le numéro de
• 
version du compilateur sont nécessaires. Si vous utilisez une version exécutable, le nom de
la distribution est important.
Si le problème intervient lors de la compilation, incluez le message d'erreur exact et les
• 
quelques lignes de contexte autour du code en question dans le fichier où il est situé.
Si 
•  mysqld s'est arrété, il est recommandé d'inclure la requête qui a mené à cet arrêt de
mysqld . Vous pouvez généralement la trouver en exécutant mysqld en ayant activé les
Si une table ou une base sont liés au problème ajoutez le résultat de la commande
• 
mysqldump ??no?data db_name tbl_name1 tbl_name2 ... . C'est très simple à
faire, et c'est un moyen efficace d'obtenir un descriptif de table, qui nous permettra de
recrééer une situation comparable à la votre.
Pour les problèmes liés à la vitesse, ou des problèmes liés à la commande 
• 
SELECT ,
pensez à inclure le résultat de la commande EXPLAIN SELECT ... , et au moins le
nombre de ligne que la commande SELECT doit produire. Vous devriez aussi inclure le
résultat de la commande SHOW CREATE TABLE table_name pour chaque table
impliquée. Plus vous nous fournirez d'informations, plus nous aurons de chance de vous
aider efficacement. Par exemple, voici un excellent rapport de bogue (posté avec le script
mysqlbug , et effectivement rédigé en ANGLAIS) :Exemple réalisé avec mysql en ligne de
commande (notez l'utilisation de la fin de commande \G , pour les résultats qui pourraient
dépasser les 80 colonnes de large) :
mysql> SHOW VARIABLES;
mysql> SHOW COLUMNS FROM ...\G
       <output from SHOW COLUMNS>
mysql> EXPLAIN SELECT ...\G
       <output from EXPLAIN>
mysql> FLUSH STATUS;
mysql> SELECT ...;
       <A short version of the output from SELECT,
       including the time taken to run the query>
mysql> SHOW STATUS;
       <output from SHOW STATUS>
Si un bogue ou un problème survient lors de l'exécution de 
• 
mysqld , essayez de fournir un
script qui reproduit l'anomalie. Ce script doit inclure tous les fichiers sources nécessaires.
Plus votre script reproduira fidèlement votre situation, le mieux ce sera. Si vous pouvez
priorité!Si vous ne pouvez pas fournir de script, fournissez tout au moins le résultat de la
commande mysqladmin variables extended?status processlist dans votre
mail pour fournir des informations sur les performances de votre système.
Si vous ne pouvez pas reproduire votre situation en quelques lignes, ou si une table de test
• 
est trop grosse à être envoyée par mail (plus de 10 lignes), exportez vos tables sous forme
de fichier avec la commande mysqldump et créez un fichier README qui décrit votre
problèéez une archive compressée de votre fichier en utilisant tar et gzip ou zip ,
et placez le via ftpSi vous pensez que le serveur MySQL fournit des résultats étranges pour une requête,
• 
incluez non seulement le résultat, mais aussi votre propre explication sur ce que le résultat
devrait être, et un diagnostic de la situation.
Lorsque vous donnez un exemple du problème, il est mieux d'utiliser des noms de variables
• 
et de tables qui existent dans votre situation, plutôt que d'inventer de nouveaux noms. Le
 1.6.2.2 Poser des questions ou rapporter un bogue
25

Manuel MySQL 4.1.x ? Version Française
problème peut être lié au noms des variables ou tables que vous utilisez! Ces cas sont
rares, mais il vaut mieux éviter les ambiguités. Après tout, il est plus facile pour vous de
fournir un exemple qui utilise votre situation réelle, et c'est bien mieux pour nous aussi. Si
vous avez des données que vous ne souhaitez pas divulguer, vous pouvez utiliser le site
ftples données sont vraiment ultra secrètes et que vous ne souhaitez même pas nous les
montrer, alors utilisez d'autres noms et données pour votre rapport, mais considérez cela
comme un dernier recours.
Incluez toutes les options utilisées, si possible. Par exemple, indiquez les options que vous
• 
utilisez lors du démarrage de mysqld , et celle que vous utilisez avec les programmes
comme mysqld et mysql , et le script configure , qui sont souvent primordiaux et
pertinents. Ce n'est jamais une mauvaise idée que de les inclure. Si vous utilisez des
modules, comme Perl ou PHP, incluez aussi les versions de ces logiciels.
Si votre question porte sur le système de droits, incluez le résultat de l'utilitaire
• 
mysqlaccess , celui de mysqladmin reload et tous les messages d'erreurs que vous
obtenez lors de la connexion. Lorsque vous testez votre système de droits, il faut
commencer par utiliser la commande mysqladmin reload version et de vous
connecter avec le proramme qui vous pose problème. mysqlaccess est situé dans le
dossier bin de votre installation de MySQL.
Si vous avez un patch pour un bogue, c'est une excellente chose. Mais ne supposez pas
• 
que nous n'avons besoin que du patch, ou même que nous allons l'utiliser, si vous ne
fournissez pas les informations nécessaires pour le tester. Nous pourrions trouver des
problèmes générés par votre patch, ou bien nous pourrions ne pas le comprendre du tout. Si
tel est le cas, nous ne l'utiliserons nous ne pouvons pas vérifier exactement ce
pourquoi est fait le patch, nous ne l'utiliserons pas. Les cas de tests seront utiles ici. Montrez
nous que votre patch va générer toutes les situations qui pourraient arriver. Si nous trouvons
un cas limite dans lequel votre patche ne fonctionne pas, même si il est rare, il risque d'être
inutile.
Les diagnostics sur la nature du bogue, la raison de son déclenchement ou les effets de
• 
bords sont généralement faux. Même l'équipe MySQL ne peut diagnostiquer sans
commencer par utiliser un débogueur pour déterminer la cause véritable.
Indiquez dans votre mail que vous avez vérifié le manuel de référence et les archives de
• 
courrier, de façon à avoir épuiser les solutions que d'autres avant vous auraient pu trouver.
Si vous obtenez un message 
• 
parse error , vérifiez votre syntaxe avec attention. Si vous
ne pouvez rien y trouvez à redire, il est très probable que votre version de MySQL ne
supporte pas encore cette fonctionnalité que vous essayez d'utiliser. Si vous utilisez la
syntaxe que vous utilisez, c'est que MySQL ne supporte pas votre syntaxe. Dans ce cas,
vos seules options sont d'implémenter vous même la syntaxe ou d'envoyez un message à
vous utilisez, mais que vous avez une ancienne version du serveur MySQL, il est
recommandé de vérifier l'historique d'évolution de MySQL pour savoir quand la syntaxe a
été supportée. Dans ce cas, vous avez l'option de mettre à jour votre MySQL avec une
Si vous avez un problème tel que vos données semblent corrompues, ou que vous recevez
• 
constamment des errors lors d'accès à une table, vous devriez commener par essayer de
réparer votre table avec l'utilitaire de ligne de commande myisamchk ou les syntaxes SQL
CHECK TABLE et REPAIR TABLESi vous avez des tables qui se corrompent facilement, il vous faut essayer de trouver quand
• 
et pourquoi cela arrive. Dans ce cas, le fichier
mysql?data?directory/'hostname'.err peut contenir des informations pertinentes
qu'il est bon d'inclure dans votre rapport de bogues. Normalement, mysqld ne doit jamais
corrompre une table si il a été interrompu au milieur d'une mise à jour. Si vous pouvez
trouvez la cause de l'arrêt de mysqld , il est bien plus facile pour nous de fournir un
 1.6.2.2 Poser des questions ou rapporter un bogue
26

Manuel MySQL 4.1.x ? Version Française
Si possible, téléchargez et installez la version la plus récente du serveur MySQL, et vérifiez
• 
si cela résoud votre problème. Toutes les versions de MySQL sont testées à fond, et doivent
fonctionner sans problème. Nous croyons à la compatibilité ascendante, et vous devriez
pouvoir passer d'une version à l'autre facilement. Quelle version de MySQL utiliser ? .
Si vous disposez de l'accès au support client, contactez aussi le support client à
Pour des informations sur les rapports de bogues avec MyODBCproblèmes rencontrés avec MySQL ODBC .
Pour des solutions aux problèmes les plus courants, voyez Problèmes .
Lorsque des solutions vous sont envoyées individuellement et non pas à la liste, il est considéré
comme bien vu de rassembler ces réponses et d'en envoyer un résumé sur le liste, de manière à ce
que les autres en profitent aussi.
1.6.2.4 Conseils pour répondre sur la liste de diffusion
Si vous pensez que votre réponse peut avoir un intérêt général, vous pouvez envisager de l'envoyer
sur la liste de diffusion, plutôt que de faire une réponse personnelle aux demandeurs. Essayez de
rendre votre réponse aussi générale que possible, pour que suffisamment d'autres personnes
puissent en profiter. Lorsque vous envoyez une réponse sur la liste, assurez vous qu'elle ne
représente pas un doublon d'une réponse précédente.
Essayez de résumer l'essentiel de la question dans votre réponse. Ne vous croyez pas obligé de
citer tout le message original.
Attention : n'envoyez pas de message avec le mode HTML activé ! De nombreux utilisateurs ne
lisent pas leurs emails avec un navigateur.
1.7 Quels standards respecte MySQL?
Cette section présente comment MySQL interprète les standards SQL ANSI. Le serveur MySQL
dispose de nombreuses extensions au standard ANSI et vous trouverez ici comment les exploiter.
Vous trouvrez aussi des informations sur les fonctionnalités manquantes de MySQL et comment y
trouver des palliatifs.
Notre but n'est pas, sans une bonne raison, de restreindre les capacités de MySQL à un usage
unique. Même si nous n'avons pas les ressources de développement à consacrer à toutes les
opportunités, nous sommes toujours interessés et prêts à aider ceux qui utilisent MySQL dans de
nouveaux domaines.
Un de nos objectifs avec ce produit est de tendre à la compatibilité ANSI 99, mais sans sacrifier la
vitesse ou la robustesse. Nous ne reculons pas devant l'ajout de nouvelle fonctionnalités au
langage SQL, ou le support de fonctionnalités hors SQL, qui améliorent le confort d'utilisation de
MySQL. La nouvelle interface de gestionnaires HANDLER de MySQL 4.0 est un exemple de cette
stratégie. Syntaxe des HANDLER .)
Nous continuons de supporter les bases transactionnelles et non transactionnelles pour combler les
besoins des sites web ou des applications à fort besoin d'archivage, ainsi que les applications
critiques à très haute disponibilité.
 1.6.2.4 Conseils pour répondre sur la liste de diffusion
27

Manuel MySQL 4.1.x ? Version Française
Le serveur MySQL a été conçu pour travailler avec des bases de taille moyenne (de 10 à 100
millions de lignes, ou des tables de 100 Mo) sur des systèmes de petite taille. Nous continuons
d'améliorer MySQL pour qu'il fonctionne avec des bases gigantesques (tera octets), tout en
conservant la possibilité de compiler une version réduite de MySQL pour qu'il fonctionne sur des
appareils embarqués ou nomades. L'architecture compacte de MySQL rend possible le support de
ces applications si différentes, sans aucun conflit dans les sources.
Nous n'étudions pas le support du temps réel ou des bases de données en grappe (même si vous
pouvez dores et déjà réaliser de nombreuses applications avec les services de réplication).
Nous ne croyons pas au support natif du XML en base, mais nous allons faire en sorte d'ajouter le
support XML que réclame nos clients du coté client. Nous pensons qu'il est préférable de conserver
le serveur central aussi ``simple et efficace'' que possible, et développer les librairies qui gèrent la
complexité du coté client. Cela fait partie de la stratégie que nous avons mentionné plus tôt, pour ne
sacrifier ni la vitesse, ni la robustesse du serveur.
1.7.1 Quels standards suit MySQL ?
SQL92, niveau de base. ODBC niveau 0?3.51.
Nous nous dirigeons vers le support complet du standard ANSI SQL99, mais sans aucune
concession sur la vitesse ou la qualité du code.
1.7.2 Exécuter MySQL en mode ANSI
Si vous démarrez mysqld avec l'option ??ansi , les comportements suivants du serveurs MySQL
changent :
||
•   devient l'opérateur de concaténation de chaîne, et non pas l'opérateur binaire OR .
Vous pouvez ajouter des espaces entre le nom d'une fonction et la parenthèse ouvrante sur
• 
les arguments : '(' . Cela impose le traitement des noms de fonctions comme des mots
réservés.
'"'
• 
 devient le caractère de protection des identifiants (comme le caractère '`' de MySQL)
et n'est plus un caractère de limite de chaîne.
REAL
• 
 est synonyme de FLOAT au lieu d'être synonyme de DOUBLE .
Le niveau d'isolation par défaut des transactions est 
• 
SERIALIZABLE . Syntaxe de SET
TRANSACTION .
Ceci revient à utiliser les options suivantes :
??sql?mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,
IGNORE_SPACE,SERIALIZE,ONLY_FULL_GROUP_BY .
1.7.3 Extensions de MySQL à la norme ANSI SQL92
Le serveur MySQL inclut des extensions que vous ne trouverez probablement pas dans les autres
bases de données. Soyez prévenus que si vous les utilisez, votre code ne sera probablement pas
portable sur d'autres serveurs SQL. Dans certains cas, vous pouvez écrire du code qui inclut des
spécificités de MySQL, mais qui restent portables, en les incluant dans des commentaires de la
forme /*! ... */ . Dans ce cas, le serveur MySQL va analyser la chaîne et exécuter le code à
l'intérieur de ces commentaires comme une commande normale, mais d'autres serveurs ignoreront
ces commentaires. Par exemple :
 1.7.1 Quels standards suit MySQL ?
28

Manuel MySQL 4.1.x ? Version Française
SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...
Si vous ajoutez le numéro de version après le point d'exclamation '!' , la syntaxe sera exécutée
uniquement si la version du serveur MySQL est égale ou plus récente que le numéro de version
utilisé.
CREATE /*!32302 TEMPORARY */ TABLE t (a int);
Cela signifie que si vous avez la version 3.23.02 ou plus récente, le serveur MySQL va utiliser le
mot réservé TEMPORARY .Voici une liste des apports spécifiques de MySQL :
Les types de colonnes 
• 
MEDIUMINT , SET , ENUM et les types BLOB et TEXT .
Les attributs de champs 
• 
AUTO_INCREMENT , BINARY , NULL , UNSIGNED et ZEROFILL .
Toutes les comparaisons de chaînes sont insensibles à la casse par défaut, et l'ordre de tri
• 
est déterminé par le jeu de caractères courant (ISO?8859?1 Latin1 par défaut). Si vous en
souhaitez un autre, il faut déclarer les colonnes avec l'attribut BINARY ou utiliser l'opérateur
BINARY pour forcer les comparaisons à prendre en compte la casse, en fonction du jeu de
caractères utilisé sur l'hôte du serveur MySQL.
le serveur MySQL fait correspondre à chaque base un dossier dans le système de fichiers,
• 
et à chaque table, il fait correspondre un fichier, placé dans le dossier de base.
Ceci a quelques conséquences :
Les noms des bases de données et des tables sont sensibles à la casse sur les

systèmes d'exploitation qui ont des systèmes de fichiers sensibles à la casse
Les bases de données, les tables, les index, les colonnes et les alias peuvent

commencer par un chiffre (mais ne peuvent pas être constitués uniquement de
chiffres).
Vous pouvez utiliser les commandes systèmes standard pour sauver, renommer,

déplacer, effacer et copier des tables. Par exemple, pour renommer une table, il
suffit de renommer les fichiers .MYD , .MYI et .frm et de leur donner un nouveau
nom.
Dans une requête SQL, vous pouvez accéder à des tables situées dans différentes bases
• 
de données, avec la syntaxe db_name.tbl_name . Certains serveurs SQL fournissent la
même fonctionnalité, mais l'appellent un User space . Le serveur MySQL ne supporte par
les espaces de nom de tables, comme dans : create table
my_tablespace .
LIKE
• 
 est possible avec des colonnes numériques.
Utilisez 
• 
INTO OUTFILE et STRAIGHT_JOIN dans les requêtes SELECT . Syntaxe des
L'option 
• 
SQL_SMALL_RESULT de la commande SELECT .
La commande 
• 
EXPLAIN SELECT pour avoir le détail des jointures de tables.
L'utilisation de noms d'index, de préfixes d'index, et l'utilisation des mots?clés 
• 
INDEX or KEY
dans une commande de création de table CREATE TABLE . Syntaxe de CREATE TABLE .
L'utilisation des clauses 
• 
TEMPORARY et IF NOT EXISTS avec CREATE TABLE .
L'utilisation de 
• 
COUNT(DISTINCT list) où list contient plus d'un élément.
L'utilisation de 
• 
CHANGE col_name , DROP col_name ou DROP INDEX , IGNORE ou
RENAME dans une commande ALTER TABLEL'utilisation de 
• 
RENAME TABLE . Syntaxe de RENAME TABLE .
L'utilisation de multiple 
• 
ADD , ALTER , DROP et CHANGE dans les clauses de la commande
ALTER TABLE .
L'utilisation de 
• 
DROP TABLE avec les mots?clés IF EXISTS .
Vous pouvez effacer plusieurs tables avec une seule commande 
• 
DROP TABLE .
La clause 
• 
LIMIT de la commande DELETE .
 1.7.1 Quels standards suit MySQL ?
29

Manuel MySQL 4.1.x ? Version Française
La clause 
• 
DELAYED des commandes INSERT et REPLACE .
La clause 
• 
LOW_PRIORITY des commandes INSERT , REPLACE , DELETE et UPDATE .
L'utilisation de la commande 
• 
LOAD DATA INFILE . Dans de nombreuses situations, cette
syntaxe est compatible avec la commande d'Oracle LOAD DATA INFILELes commandes 
• 
ANALYZE TABLE , CHECK TABLE , OPTIMIZE TABLE et REPAIR TABLE
.
La commande 
• 
SHOW . Syntaxe de SHOW .
Les chaînes de caractères peuvent être soit délimitées par 
• 
'"' , soit par ''' . Pas
seulement par ''' .
L'utilisation du caractère de protection 
• 
'\' .
La commande 
• 
SET . Syntaxe de SET .
Vous n'êtes pas obligé de nommer toutes les colonnes que vous sélectionnez dans la
• 
clause GROUP BY . Cela donne de meilleures performances pour certaines situations
spécifiques, mais classiques. Fonctions à utiliser dans les définitions GROUP BY .
Vous pouvez spécifier 
• 
ASC ou DESC dans la clause GROUP BY .
Pour aider les utilisateurs qui viennent d'autres environnements SQL, le serveur MySQL
• 
supporte des alias de nombreuses fonctions. Par exemple, toutes les fonctions de chaînes
de caractères supportent simultanément les syntaxes ANSI SQL et ODBC.
Le serveur MySQL comprend les opérateurs 
• 
|| et  comme opérateurs logiques OR
et AND, comme en langage C. Pour le serveur MySQL, les opérateurs ||
et OR sont synonymes, ainsi que  et AND . En conséquence, MySQL ne
supporte pas l'opérateur de concaténation de chaînes ANSI SQL || .
Utilisez plutôt la fonction CONCAT() . Comme CONCAT() prend un
nombre illimité d'arguments, il est facile de convertir des
expressions utilisant || , pour qu'elles fonctionnent sur le serveur
MySQL.
CREATE DATABASE
• 
 et DROP DATABASE . Syntaxe de CREATE DATABASE .
L'opérateur 
• 
% est synonyme de MOD() . C'est à dire que N % M est équivalent à MOD(N,M)
. % est supporté pour les programmeurs C, et pour la compatibilité avec PostgreSQL.
Les opérateurs 
• 
= , <> , <= , < , >= , > , << , >> , <=> , AND , OR ou LIKE peuvent être
utilisés pour les comparaisons de colonnes à gauche de la clause FROM dans les
commandes SELECT . Par exemple :
mysql> SELECT col1=1 AND col2=2 FROM tbl_name;
La fonction 
• 
LAST_INSERT_ID() . mysql_insert_id() .
Les opérateurs d'expressions régulières étendus 
• 
REGEXP et NOT REGEXP .
CONCAT()
• 
 et CHAR() avec un argument ou plus de deux arguments. Avec le serveur
MySQL, ces fonctions peuvent prendre n'importe quel nombre d'arguments.
Les fonctions 
• 
BIT_COUNT() , CASE , ELT() , FROM_DAYS() , FORMAT() , IF() ,
PASSWORD() , ENCRYPT() , MD5() , ENCODE() , DECODE() , PERIOD_ADD() ,
PERIOD_DIFF() , TO_DAYS() et WEEKDAY() .
L'utilisation de la fonction 
• 
TRIM() pour réduire les chaînes. L'ANSI SQL ne supporte que
les suppressions de caractères uniques.
• Les fonctions de groupe de la clause GROUP BY STD() , BIT_OR() et BIT_AND() .
L'utilisation de 
• 
REPLACE à la place de DELETE + INSERT . Syntaxe des REPLACE .
Les commandes 
• 
FLUSH , RESET et DO .
La possibilité de modifier les variables dans les commandes avec l'opérateur 
• 
:= :
SELECT &#64;a:=SUM(total),&#64;b=COUNT(*),&#64;a/&#64;b AS avg FROM test_table;
SELECT &#64;t1:=(&#64;t2:=1)+&#64;t3:=4,&#64;t1,&#64;t2,&#64;t3;
1.7.4 Différences de MySQL avec ANSI SQL92
Nous tâchons de rendre le serveur MySQL compatible avec le standard ANSI SQL, et le standard
 1.7.4 Différences de MySQL avec ANSI SQL92
30

Manuel MySQL 4.1.x ? Version Française
ODBC SQL, mais dans certains cas, MySQL se comporte différemment.
Pour les colonnes de type 
• 
VARCHAR , les espaces terminaux sont supprimés lors du
Dans certains cas, les colonnes 
• 
CHAR sont transformées automatiquement en colonnes
VARCHARLes droits d'un utilisateur sur une table ne sont pas supprimés si la table est détruite. Vous
• 
devez explicitement utiliser la commande REVOKE pour supprimer les droits d'un utilisateur
NULL AND FALSE
• 
 donnera la valeur NULL et non pas FALSE . Nous pensons que dans
cette situation, il n'est pas bon d'évaluer de nombreuses conditions supplémentaires.
Pour voir la liste des priorités de développement des nouvelles extensions de MySQL, consultez la
de ce manuel. MySQL and the future (The TODO) .
1.7.4.1 Sous sélections (Sub SELECT s)
Jusqu'à la version 4.0, le serveur MySQL ne prenait en charge que les requêtes imbriquées de la
forme INSERT ... SELECT ... et REPLACE ... SELECT ... . Vous pouvez néanmoins
utiliser la fonction IN() dans d'autres contextes. Les sous?requêtes sont implémentées dans
l'arborescence de développement 4.1.
En attendant, vous pourrez dans la plupart des cas réécrire la requête sans sous?requêtes :
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
Ceci peut être réécrit de la façon suivante :
SELECT table1.* FROM table1,table2 WHERE ;
Les requêtes :
SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2
                                       WHERE );
peuvent être réécrites ainsi :
SELECT table1.* FROM table1 LEFT JOIN table2 ON
                                       WHERE IS NULL;
Pour des requêtes plus complexes, vous pouvez généralement créer des tables temporaires
contenant les sous?requêtes. Cependant, dans certains cas cette option ne fonctionnera pas. Le
cas le plus fréquent se produit avec les instructions DELETE , pour lesquelles le SQL standard ne
prend pas en charge les jointures (sauf dans les sous Select). Dans une telle situation, en attendant
que les sous?requêtes soient prises en charge par MySQL Server, vous disposez de deux
première option consiste à utiliser un langage de programmation procédural (tel que Perl
ou PHP) afin de soumettre une requête SELECT pour obtenir les clés primaires des enregistrements
à supprimer. On utilise ensuite ces valeurs pour construire l'instruction DELETE ( DELETE FROM
... WHERE ... IN (key1,key2, ...) ).
La seconde option consiste à utiliser le SQL interactif pour construire automatiquement un
ensemble d'instructions DELETE , grâce à l'extension MySQL CONCAT() (à la place de l'opérateur
standard || ).
Par exemple :
SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', "'", , "'", ';')
  FROM tab1, tab2
 WHERE tab1.col1 = tab2.col2;
 1.7.4.1 Sous sélections (Sub SELECT s)
31

Manuel MySQL 4.1.x ? Version Française
Vous pouvez placer cette requête dans un fichier script et rediriger son entrée vers l'interpréteur de
ligne de commande mysql , tout en ouvrant un canal de communication (pipe) pour diriger sa sortie
vers une seconde instance de l'interpréteur :
shell> mysql ??skip?column?names mydb < | mysql mydb
La version 4.0 de MySQL prend en charge les instructions DELETE sur plusieurs tables pouvant
être utilisées afin de supprimer efficacement des lignes à partir d'informations issues d'une table,
voire de plusieurs tables en même temps.
1.7.4.2 SELECT INTO TABLE
Le serveur MySQL ne supporte pas encore l'extension Oracle SQL : SELECT ... INTO TABLE
... . A la place, le serveur MySQL supporte la syntaxe ANSI SQL INSERT INTO ... SELECT
... , qui revient au même. Syntaxe de INSERT ... SELECT .
INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID
       FROM tblTemp1 WHERE tblTemp1.fldOrder_ID > 100;
Vous pouvez aussi utiliser SELECT INTO OUTFILE... ou CREATE TABLE ... SELECT .
1.7.4.3 Transactions et opérations atomiques
Le serveur MySQL support les transactions avec les gestionnaires de tables InnoDB et BDB .
Types de tables MySQL . InnoDB dispose aussi de la compatibilité ACID .
Toutefois, les tables non transactionnelles de MySQL telles que MyISAM exploitent un autre
concept pour assurer l'intégrité des données, appelé `` opérations atomiques ''. Les opérations
atomiques disposent d'une bien meilleure protection des données pour des performances
également accrues. Comme MySQL supporte les deux méthodes, l'utilisateur est capable de choisir
celle qui correspond à ses besoins, suivant qu'il a besoin de vitesse ou de sécurité. Ce choix peut
être fait table par table.
Comment exploiter les capacités de MySQL pour protéger l'intégrité des données, et comment ces
fonctionnalités se comparent?elles avec les méthodes transactionnelles ?
En mode transactionnel, si votre application a été écrite en dépendant de l'appel de
• 
ROLLBACK au lieu de COMMIT dans les situations critiques, les transactions sont plus plus
pratiques. Les transactions s'assurent que les modifications non achevées ou les activités
corrosives ne sont pas archivées dans la base. Le serveur a l'opportunité d'annuler
automatiquement l'opération, et votre base de données est serveur MySQL, dans
la plupart des cas, vous permet de résoudre les problèmes potentiels en incluant de simples
vérifications avant les modifications, et en exécutant des scripts simples pour vérifier
l'intégrité de vos bases de données, ainsi que les incohérences, et pour réparer
automatiquement les problèmes, ou encore vous alerter si une erreur est identifiée. Notez
qu'en utilisant simplement le log de MySQL, ou en utilisant un log supplémentaire, vous
pouvez normalement réparer à la perfection toutes les tables, sans aucune perte de
données.
Souvent, les modifications de données transactionnelles fatales peuvent être réécrites de
• 
manière atomique. En général, tous les problèmes d'intégrité que les transactions résolvent
peuvent être corrigés avec la commande LOCK TABLES ou des modifications atomiques,
qui assurent que vous n'aurez jamais d'annulation automatique de la base, ce qui est un
problème commun des bases transactionnelles.
Même un système transactionnel peut perdre des données si le serveur s'arrête. La
• 
différence entre les systèmes repose alors dans ce petit laps de temps où ils peuvent perdre
des données. Aucun système n'est sécurisé à 100 %, mais simplement ``suffisament
 1.7.4.2 SELECT INTO TABLE
32

Manuel MySQL 4.1.x ? Version Française
sécurisé''. Même Oracle, réputé pour être la plus sûre des bases de données
transactionnelles, est montré du doigt pour perdre des données dans ces
être tranquille avec MySQL, que vous utilisiez les tables transactionnelles ou pas, vous
n'avez besoin que de sauvegardes et de logs de modifications. Avec ces deux outils, vous
pourrez vous protéger de toutes les situations que vous pourriez rencontrer avec d'autres
bases de données transactionnelles. De toute manière, il est bon d'avoir des sauvegardes,
indépendamment de la base que vous utilisez.
La méthode transactionnelle a ses avantages et ses inconvénients. De nombreux utilisateurs et
développeurs d'applications dépendent de la facilité de pallier un problème lorsqu'une annulation
semble nécessaire ou presque. Cependant, même si vous êtes néophyte des opérations
atomiques, ou plus familier avec les transactions, prenez en considération le gain de vitesse que les
tables non transactionnelles offrent. Ces gains vont de 3 a 5 fois la vitesse des tables
transactionnelles les plus rapides et les mieux optimisées.
Dans des situations où l'intégrité est de la plus grande importance, le serveur MySQL assure une
intégrité du niveau des transactions, ou encore mieux avec les tables non transactionnelles. Si vous
verrouillez les tables avec LOCK TABLES , toutes les modifications seront bloquées jusqu'à ce que
la vérification d'intégrité soit faite (à comparer avec un verrou en écriture), les lectures et insertions
sont toujours possibles. Les nouvelles lignes ne seront pas accessibles en lecture tant que le verrou
n'aura pas été levé. Avec INSERT DELAYED , vous pouvez faire attendre les insertions dans une
pile, jusqu'à ce que les verrous soit levés, sans que le client n'attende cette levée de verrou.
Syntaxe des INSERT DELAYED .
``Atomique'', avec le sens que nous lui donnons, n'a rien de magique. Ce terme signifie simplement
que vous pouvez être certain que lorsque vous modifiez des données dans une table, aucun autre
utilisateur ne peut interférer avec votre opération, et qu'il n'y aura pas d'annulation automatique (ce
qui pourrait arriver avec des tables transactionnelles si nous ne sommes pas trop soigneux). Le
serveur MySQL garantit aussi qu'il n'y aura pas de lectures erronées.
Voici quelques techniques pour travailler avec des tables non transactionnelles :
Les boucles qui requièrent les transactions peuvent normalement être implémentées avec la
• 
commande LOCK TABLES , et vous n'avez nul besoin de curseur lorsque vous modifiez des
lignes à la volée.
Pour éviter d'utiliser l'annulation 
• 
ROLLBACK , vous pouvez adopter la stratégie suivante :
Utilisez la commande 

LOCK TABLES ... pour verrouiller toutes les tables que vous
voulez utiliser.
Testez vos conditions.

Modifiez si tout est correct.

Utilisez 

UNLOCK TABLES pour libérer vos tables.
Ceci est probablement une méthode bien plus rapide que ne le proposent les transactions,
avec des annulations ROLLBACK possibles mais pas certaines. La seule situation que ce cas
ne prend pas en compte est l'interruption du processus au milieu d'une mise à jour. Dans ce
cas, tous les verrous seront levés, mais certaines modifications peuvent ne pas avoir été
exécutées.
Vous pouvez aussi utiliser des fonctions pour modifier des lignes en une seule opération.
• 
Vous pouvez créer une application très efficace en utilisant cette technique :
Modifiez les champs par rapport à leur valeur actuelle.

Modifiez uniquement les champs que vous avez réellement changé.

Par exemple, lorsque nous modifions les données d'un client, nous ne modifions que les
données du client qui ont changé et nous vérifions uniquement si les données modifiées ou
les données qui en dépendent ont changé comparativement aux données originales. Les
tests sur les données modifiées sont faits avec la clause WHERE dans la commande UPDATE
 1.7.4.2 SELECT INTO TABLE
33

Manuel MySQL 4.1.x ? Version Française
. Si la ligne a été modifiée, nous indiquons au client : "Some of the data you have changed
has been changed by another user". En français : "certaines données que vous voulez
modifier ont été modifiées par un autre utilisateur". Puis nous affichons l'ancienne ligne et la
nouvelle ligne, pour laisser l'utilisateur décider quelle version il veut nous
conduit à un résultat proche du verrouillage de ligne, mais en fait, c'est bien mieux, car nous
ne modifions que les colonnes qui en ont besoin, en utilisant des valeurs relatives. Cela
signifie qu'une commande UPDATE typique ressemble à ceci :
UPDATE tablename SET pay_back=pay_back+'relative change';
UPDATE customer
  SET
    customer_date='current_date',
    address='new address',
    phone='new phone',
    dette=dette+'emprunt'
  WHERE
    customer_id=id AND address='old address' AND phone='old phone';
Comme vous pouvez le voir, c'est très efficace, et fonctionne même si un autre client a
modifié la valeur pay_back ou dette .
Dans de nombreuses situations, les utilisateurs ont souhaité les commandes 
• 
ROLLBACK
et/ou LOCK TABLES afin de gérer des identifiant uniques pour certaines tables. Ils peuvent
être gérés bien plus efficacement en utilisant une colonne de type AUTO_INCREMENT , en
corrélation avec la fonction LAST_INSERT_ID() ou la fonction C mysql_insert_id() .
mysql_insert_id() .
Vous pouvez éviter le verrouillage de ligne. Certaines situations le requièrent vraiment, mais
elles sont rares. Les tables InnoDB supportent le verrouillage de ligne. Avec les tables
MyISAM, vous pouvez utiliser une colonne de type flag, et faire ceci :
UPDATE tbl_name SET row_flag=1 WHERE id=ID;
MySQL retournera 1 pour le nombre de lignes affectées si la ligne a été trouvée, car
row_flag ne vaut pas déjà 1 dans la ligne originale.
Vous pouvez comprendre la requête ci?dessus comme si le serveur MySQL avait utilisé la
commande suivante :
UPDATE tbl_name SET row_flag=1 WHERE id=ID AND row_flag <> 1;
1.7.4.4 Procédures stockées et triggers
Une procédure stockée est une liste de commandes SQL qui peuvent être compilées et stockées
sur le serveurs. Une fois que cela est fait, les clients n'ont pas besoin de soumettre à nouveau toute
la commande, mais font simplement référence à la procédure stockée. Cela conduit à des
performances bien meilleures, car les commandes n'ont pas à être analysées plusieurs fois, et que
bien moins d'informations transitent sur le réseau. Vous pouvez aussi élevez le niveau conceptuel
de votre application en mettant en place des librairies de fonctions sur le serveur.
Un trigger est une procédure stockée qui est activée lorsqu'un événement particulier survient. Par
exemple, vous pouvez installer une procédure stockée qui est déclenchée dès qu'une ligne est
effacée dans une table d'achat, pour que le client soit automatiquement effacé si tous ses achats
sont effacés.
La future version du langage sera capable de supporter les procédures stockées. Notre objectif est
d'impolémenter les procédures stockées pour la version 5.0 du serveur MySQL. Nous nous
 1.7.4.4 Procédures stockées et triggers
34

Manuel MySQL 4.1.x ? Version Française
pencherons aussi sur les triggers.
1.7.4.5 Les clés étrangères
Notez que les clés en SQL ne sont pas utilisées pour joindre des tables, mais pour assurer
l'intégrité référentielle (contraintes de clés étrangères). Si vous voulez obtenir des résultats issus de
tables multiples avec une commande SELECT , vous allez joindre les tables comme ceci :
SELECT * FROM table1,table2 WHERE = ;
tables InnoDBtypes de tables, le serveur mySQL accepte la syntaxe FOREIGN KEY dans la commande CREATE
TABLE , mais ne la prend pas en compte.
La syntaxe FOREIGN KEY dans la clause ON DELETE ... est principalement utilisée pour des
raisons de documentation. Certaines applications ODBC peuvent utiliser cette clause pour produire
des conditions WHERE automatiques, mais c'est généralement simple à éviter. FOREIGN KEY est
parfois utilisé pour vérifier une contrainte, mais cette vérification n'est pas nécessaire en pratique, si
les lignes sont insérées dans la table dans le bon ordre.
Avec le serveur MySQL, vous pouvez contourner le problème de l'absence de la clause ON
DELETE ... en ajoutant la commande DELETE appropriée dans l'application, lorsque vous effacez
une ligne dans une table qui a une clé étrangère. En pratique, cette technique est aussi rapide (et
même parfois plus rapide), et bien plus portable que l'utilisation des clés étrangères.
Avec le serveur MySQL 4.0, vous pouvez utiliser les commandes d'effacement multi?tables pour
effacer des lignes dans plusieurs tables en une seule commande. Syntaxe des DELETE .
Dans un futur proche, nous allons étendre l'implémentation de la clause FOREIGN KEY pour que
cette information soit stockée dans le fichier de spécification des tables et puisse être lu par
mysqldump et ODBC. Dans une étape ultérieure, nous allons implémenter les contraintes de clé
étrangère pour les applications qui ne peuvent pas être codées sans.
Gardez bien en tête que les clés étrangères sont souvent méconnues, ce qui peut causer de graves
problèmes. Même lorsqu'elles sont utilisées correctement, ce n'est pas une solution magique pour
les problèmes d'intégrité référentielle, même si cela simplifie parfois les choses.
Voici des avantages aux contraintes de clés étrangères :
En supposant que les relations soient proprement conçues, les clés étrangères rendent plus
• 
difficile pour un programmeur d'insérer des valeurs incohérentes dans la base.
L'utilisation des modifications et effacement en cascade simplifie le code du client.
• 
Les règles de clés étrangères proprement conçues aident à la documentation des relations
• 
entre les tables.
Inconvénients :
Les erreurs, qui sont faciles à faire durant la conception des relations, peuvent causer des
• 
problèmes graves : par exemple, des règles de contrainte circulaires, ou des combinaisons
erronées d'effacement.
Une application correctement écrite s'assure d'elle?même de l'intégrité référentielle des
• 
données avant d'exécuter une requête. De ce fait, les vérifications supplémentaires de la
base sont inutiles et réduisent les performances de l'application.
 1.7.4.5 Les clés étrangères
35

Manuel MySQL 4.1.x ? Version Française
Il n'est pas rare pour un administrateur de bases de données de faire une topologie
• 
complexe des relations entre tables qui rendent très complexe, voire impossible de restaurer
des tables.
1.7.4.6 Les vues
Il est prévu d'implémenter les vues dans la version 5.0 du serveur MySQL.
Les vues sont la plupart du temps utiles pour donner accès aux utilisateurs à un ensemble de
relations représentées par une table (en mode inaltérable). Beaucoup de bases de données SQL
ne permettent pas de mettre à jour les lignes dans une vue, vous devez alors faire les mises à jour
dans les tables séparées.
Vu que le serveur MySQL est la plupart du temps utilisé dans des applications où le développeur à
un contrôle total sur l'utilisation de la base de données, la plupart de nos utilisateurs n'ont pas
considéré les vues comme très importantes (du moins, personne n'a été assez intéressé à ce sujet
pour être prêt à financer l'implémentation des vues).
On n'a pas forcément besoin des vues pour restreindre l'accès aux colonnes, et ce, parce que
MySQL a un système de droits très sophistiqué. Sécurité générale et accès à MySQL .
1.7.4.7 '??' comme début de commentaire
Certaines bases de données SQL utilisent '??' comme début de commentaire. Le serveur MySQL
utilise '#' . Vous pouvez aussi utiliser la syntaxe du langage C /* ceci est un commentaire
*/ . Syntaxe des commentaires .
MySQL version 3.23.3 et plus récent supporte les commentaires de type '??' , si ce commentaire
est suivi d'un espace. Ceci est dû au fait que ce type de commentaire a causé beaucoup de
problèmes avec les requêtes générées automatiquement, qui contiennent du code tel que celui?ci,
où nous insérons automatiquement la valeur du paiement dans la table !payment! :
UPDATE tbl_name SET credit=credit?!payment!
Pensez à ce qui se passe lorsque la valeur de payment est négative. Comme 1??1 est valide en
SQL, la conséquence est de commencer un commentaire '??' .En utilisant notre implémentation
des commentaires avec le serveur MySQL version 3.23.3 et plus récent, 1?? ceci est un
commentaire ne pose pas ce type de problème.
Une autre fonctionnalité supplémentaire est que le client en ligne de commande mysql supprime
toutes les lignes qui commencent par '??' .
Les informations suivantes sont destinées aux utilisateurs de MySQL avec des versions antérieures
à la version 3.23.3 :
Si vous avez un programme SQL dans un fichier texte qui contient des commentaires au format
'??' , il est recommandé d'utiliser :
shell> replace " ??" " #" < text?file?with?funny? \
         | mysql database
au lieu du classique :
 1.7.4.6 Les vues
36

Manuel MySQL 4.1.x ? Version Française
shell> mysql database < text?file?with?funny?
Vous pouvez aussi éditer le fichier de commande ``lui?même'' pour remplacer les commentaires
'??' par des commentaires '#' :
shell> replace " ??" " #" ?? text?file?with?funny?
Puis, rétablissez?les avec :
shell> replace " #" " ??" ?? text?file?with?funny?
1.7.5 Erreurs connues et problèmes de conceptions de MySQL
Les problèmes suivants sont connus, et sont en tête de liste pour être corrigés :
ANALYZE TABLE
• 
 , sur une table de type BDB, peut rendre la table inutilisable, dans certains
cas, jusqu'au prochain redémarrage de mysqld . Lorsque cela survient, vous rencontrez les
erreurs suivantes dans le fichier d'erreur MySQL :
001207 22:07:56  bdb:  log_flush: LSN past current end?of?log
N'exécutez pas de commande 
• 
ALTER TABLE sur une table BDB sur laquelle vous avez
exécuté des transactions à plusieurs commandes, jusqu'à ce que ces transactions soient
achevées : la transaction sera probablement ignorée.
ANALYZE TABLE
• 
 , OPTIMIZE TABLE et REPAIR TABLE peuvent causer des problèmes
sur les tables avec lesquelles vous utilisez la commande INSERT DELAYED .
Faire un 
• 
LOCK TABLE ... et FLUSH TABLES ... ne vous garantit pas qu'il n'y a pas une
transaction en court sur la table.
Les tables BDB sont lentes à ouvrir. Si vous avez de nombreuses tables BDB dans une
• 
base, cela prendra du temps au client mysql pour accéder à la base si vous n'utilisez pas
l'option ?A , ou si vous utilisez la commande rehash . C'est particulièrement vrai si vous
n'avez pas de cache de table important.
Les problèmes suivants sont connus et seront corrigés en leur temps :
Lorsque vous utilisez la commande 
• 
SET CHARACTER SET , il n'est pas possible d'utiliser
les caractères traduits dans les noms de bases, de tables ou de colonnes.
Il n'est pas possible d'utiliser 
• 
_ ou % avec la commande ESCAPE dans la clause LIKE...
ESCAPE .
Si vous avez une colonne de type 
• 
DECIMAL avec un nombre stocké dans un autre format
(+01.00, 1.00, 01.00), GROUP BY peut considérer ces valeurs comme différentes.
Lorsque 
• 
DELETE FROM merge_table est utilisé sans la clause WHERE , elle va
simplement effacer le fichier de la table, et ne pas effacer les tables associées.
Vous ne pouvez pas compiler le serveur dans un autre dossier lorsque vous utilisez les
• 
MIT?pthreads. Comme cela requiert une modification des MIT?pthreads, nous ne
Les valeurs de type 
• 
BLOB ne peuvent pas être utilisées ``correctement'' dans les clauses
GROUP BY ou ORDER BY ou DISTINCT . Seuls, les max_sort_length premiers octets
(par défaut, 1024) seront utilisés pour les comparaisons de BLOB . Ceci peut être modifié
avec l'option ?O max_sort_length de mysqld . Un palliatif à ce problème est d'utiliser
une sous partie de chaîne : SELECT DISTINCT LEFT(blob,2048) FROM tbl_name .
Les calculs sont faits avec des 
• 
BIGINT ou DOUBLE (les deux sont normalement de 64 bits).
La précision dépend alors de la fonction utilisée. La règle générale est que les fonctions de
bits utilisent la précision des BIGINT , IF et ELT() utilisent la précision des BIGINT ou
DOUBLE , et les autres utilisent la précision des DOUBLE . Il faut donc éviter d'utiliser les
entiers non signés de grande taille, surtout s'ils dépassent la taille de 63 bits
(9223372036854775807) pour toute autre fonction que les champs de bits ! La version 4.0
gère bien mieux les BIGINT que la 3.23.
Toutes les colonnes de type chaînes, hormis les 
• 
BLOB et TEXT , voient automatiquement
leurs caractères blancs finaux supprimés. Pour le type CHAR c'est correct, et c'est considéré
 1.7.5 Erreurs connues et problèmes de conceptions de MySQL
37

Manuel MySQL 4.1.x ? Version Française
comme une fonctionnalité par la norme ANSI SQL92. Le hic est que pour le serveur MySQL
les colonnes VARCHAR sont traitées de la même façon.
Vous ne pouvez avoir que des colonnes de taille 255 pour les 
• 
ENUM et SET .
Avec les fonctions d'agrégation 
• 
MIN() , MAX() et compagnie, MySQL compare
actuellement les colonnes de type ENUM et SET par leur valeur de chaîne, plutôt que par leur
position relative dans l'ensemble.
safe_mysqld
• 
 redirige tous les messages de mysqld vers le log mysqld . Le problème est
que si vous exécutez mysqladmin refresh pour fermer et ouvrir à nouveau l'historique,
stdout et stderr sont toujours redirigés vers l'ancien log. Si vous utilisez ??log
extensivement, vous devriez éditer safe_mysqld pour loger vers 'hostname'.err au
lieu de 'hostname'.log , de façon à pouvoir facilement récupérer la place de l'ancien log,
en effaçant les vieux, et en exécutant mysqladmin refresh .
Dans la commande 
• 
UPDATE , les colonnes sont modifiées de gauche à droite. Si vous faite
référence à une colonne modifiée, vous obtiendrez sa valeur modifiée, plutôt que sa valeur
originale. Par exemple :
mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1;
Cette commande va modifier la colonne KEY avec 2 au lieu de 1 .
Vous ne pouvez pas utiliser les tables temporaires plus d'une fois dans la même requête.
• 
Par exemple, cette commande ne fonctionne pas :
mysql> SELECT * FROM temporary_table, temporary_table AS t2;
RENAME
• 
 ne fonctionne pas avec les tables TEMPORARY , ou les tables utilisées dans un
rassemblement ( MERGE ).
L'optimiseur peut gérer la clause 
• 
DISTINCT différemment si vous utilisez des colonnes
cachées dans une jointure. Dans une jointure, les colonnes cachées sont comptées comme
une partie du résultat (même si elles ne sont pas montrées), tandis que dans les requêtes
normales, les colonnes cachées ne participent pas aux DISTINCT . Nous allons
probablement modifier ceci dans le futur, pour ne jamais exploiter les colonnes cachées
avec DISTINCT .
Voici un exemple :
SELECT DISTINCT mp3id FROM band_downloads
       WHERE userid = 9 ORDER BY id DESC;
et
SELECT DISTINCT band_downloads.mp3id
       FROM band_downloads,band_mp3
       WHERE band_downloads.userid = 9
       AND = band_downloads.mp3id
       ORDER BY DESC;
Dans le second cas, MySQL 3.23.x pourrait vous donner deux lignes identiques dans le
résultat (car les lignes cachées id diffèrent).Notez que cela n'arrive que pour les requêtes
où vous n'avez pas de colonnes de la clause ORDER BY dans le résultat, ce que vous ne
pourriez pas faire en ANSI SQL.
Comme le serveur MySQL vous permet de travailler avec des tables qui ne supportent pas
• 
les transactions, et donc, l'annulation rollback , certains comportements sont différents
avec MySQL d'avec d'autres serveurs SQL. C'est nécessaire pour s'assurer que MySQL n'a
jamais besoin d'annuler une commande SQL. Cela peut sembler un peu étrange au moment
ou les colonnes doivent être vérifiées par l'application, mais cela vous fournit une
accélération notable, à cause d'optimisations qui ne pourraient pas avoir lieu vous
donnez une valeur incorrecte à une colonne, MySQL va stocker le meilleur code
possible dans la colonne, au lieu d'annuler la transaction :
Si vous essayez de stocker une valeur qui est hors de l'intervalle de validité dans

une colonne numérique, MySQL va stocker la plus petite ou la plus grande valeur
 1.7.5 Erreurs connues et problèmes de conceptions de MySQL
38

Manuel MySQL 4.1.x ? Version Française
qu'il connaisse dans cette colonne.
Si vous essayez de stocker une chaîne qui ne commence pas pas un chiffre dans

une colonne numérique, MySQL va stocker 0.
Si vous essayez de stocker la valeur 

NULL dans une colonne qui n'accepte pas la
valeur NULL , le serveur MySQL va stocker 0 ou '' (chaîne vide) à la place : ce
comportement peut être modifié avec l'option de compilation
?DDONT_USE_DEFAULT_FIELDS).
MySQL vous autorise le stockage de dates erronées dans les colonnes de type

DATE et DATETIME (comme 2000?02?31 ou 2000?02?00). L'idée est que ce n'est
pas au serveur SQL de faire le travail de validation. Si MySQL peut stocker une date,
et relire exactement cette date, alors MySQL va stocker cette date. Si la date est
totalement fausse (hors de l'intervalle de validité du serveur), la valeur spéciale
0000?00?00 sera utilisée.
Si vous utilisez une valeur non supportée avec une colonne de type 

ENUM , la valeur
stockée sera la chaîne vide, de valeur numérique 0.
Si vous utilisez une valeur invalide dans une colonne de type 

SET , la valeur sera
ignorée.
Si vous exécutez une 
• 
PROCEDURE sur une requête qui retourne un résultat vide, dans
certains cas, PROCEDURE ne transformera pas les colonnes.
La création de table de type 
• 
MERGE ne vérifie pas si les tables sous?jacentes sont de type
compatible.
Le serveur MySQL ne supporte pas encore les valeurs Server 
• 
NaN , ?Inf et Inf pour les
doubles. Utiliser ces valeurs générera des problèmes lorsque vous essayerez d'exporter et
d'importer des données. Comme solution temporaire, vous pouvez remplacer NaN par NULL
(si possible) et ?Inf et Inf par les valeurs maximales possibles des colonnes double .
Les valeurs négatives passées à 
• 
LIMIT sont traitées comme des valeurs positives.
Si vous utilisez la commande 
• 
ALTER TABLE pour ajouter un index de type UNIQUE à un
table utilisée dans un rassemblement de tables MERGE , puis que vous utilisez ALTER
TABLE pour ajouter un index normal à la table MERGE , l'ordre des clés sera différent pour
les tables s'il y avait déjà une ancienne clé qui n'était pas unique. Ceci est dû au fait que
ALTER TABLE place les clés UNIQUE avant les clés normales, pour être capable de
détecter les clés doublons plus vite.
Les bogues suivants sont connus dans les anciennes versions de MySQL :
Vous pouvez obtenir un thread gelé si vous utilisez la commande 
• 
DROP TABLE sur une
table qui fait partie des tables verrouillées par LOCK TABLES .
Dans les cas suivants, vous pouvez obtenir un crash :
• 
Le gestionnaire d'insertions retardées a déjà des insertions en attente pour une

table.
LOCK table

 avec WRITE .
FLUSH TABLES

 .
Pour les versions de MySQL avant la 3.23.2, une commande 
• 
UPDATE qui modifiait une clé
avec la clause WHERE sur la même clé, pouvait échouer car la même clé était utilisée pour
rechercher les lignes et la même ligne pouvait être trouvée plusieurs fois :
UPDATE tbl_name SET KEY=KEY+1 WHERE KEY > 100;
Un palliatif est :
mysql> UPDATE tbl_name SET KEY=KEY+1 WHERE KEY+0 > 100;
Cela fonctionnera, car MySQL ne va pas utiliser d'index sur une expression dans la clause
WHERE .
Avant la version 3.23 de MySQL, tous les types numériques étaient traités comme des
• 
champs à virgule fixe. Cela signifie que vous deviez spécifier le nombre de décimales que le
champ devait avoir. Tous les résultats étaient retournés avec le nombre correct de
décimales.
 1.7.5 Erreurs connues et problèmes de conceptions de MySQL
39

Manuel MySQL 4.1.x ? Version Française
Pour les bogues spécifiques aux systèmes d'exploitation, voyez la section sur la compilation et le
port.
1.8 Les évolutions de MySQL (la liste des tâches)
Cette section liste les fonctionnalités que nous prévoyons d'ajouter à MySQL.
La liste est grossièrement réalisée dans l'ordre de priorité. Si vous voulez modifier cet ordre,
Support and Licensing .
L'objectif est de supporter complètement la norme ANSI SQL99, tout en lui ajoutant de nombreuses
améliorations. Le défi est de faire tout cela sans sacrifier la vitesse d'exécution, ni la qualité du
code.
1.8.1 Ce que devrait inclure la version 4.0
Tout est fait. Nous ne fournissons plus que des corrections de bogues pour MySQL 4.0.
Changements dans la publication 4.0.x (Beta) . Le développement est passé à la version 4.1
1.8.2 Ce qui est prévu pour la version 4.1
Les fonctionnalités suivantes sont prévues pour être ajoutées dès la version 4.1. Notez que comme
nous avons de nombreux développeurs qui travaillent sur différents projets, il y aura aussi de
nombreuses améliorations. Il y a aussi de faibles chances pour que ces fonctionnalités soient
ajoutées à la version 4.0. Certaines fonctionnalités sont déjà installées dans la version MySQL 4.1.
Sous?sélections.
• 
SELECT id FROM t WHERE grp IN (SELECT grp FROM g WHERE u > 100);
Un nouveau format de définition de table (fichiers 
• 
.frm ). Il nous permettra de ne pas être à
court de place lors de l'ajout de nouvelles options. Les anciens fichiers sont toujours
compatibles avec la version 4.0. Toutes les nouvelles tables utiliseront ce nouveau
nouveau format de fichier nous permettra d'ajouter de nouveaux types de
colonnes, plus d'options pour les clés, et alloueront de la place pour les définitions des
FOREIGN KEY .
SHOW COLUMNS FROM table_name
• 
 (utilisé par le client mysql pour afficher le détail des
colonnes) ne devrait pas ouvrir la table, mais uniquement le fichier de définition. Cela
consommera moins de mémoire, et sera plus rapide.
Le support des clés étrangères pour les tables 
• 
MyISAM , incluant les effacement en
cascade.
La réplication infaillible.
• 
La réplication devrait fonctionner avec la fonction 
• 
RAND() et la variable utilisateur @var .
Sauvegarde à chaud, avec faible réduction des performances. La sauvegarde en ligne
• 
rendra simple le nouveau système de réplication, sans éteindre le serveur maître.
Tables dérivées :
• 
SELECT a.col1, b.col2
       FROM (SELECT MAX(col1) AS col1 FROM root_table) a,
       other_table b
       WHERE a.col1=b.col1;
Cela peut se faire automatiquement, en créant des tables temporaires pour les tables
dérivées, pour la durée de la requête.
 1.8 Les évolutions de MySQL (la liste des tâches)
40

Manuel MySQL 4.1.x ? Version Française
Fonction de groupement 
• 
ROLLUP et CUBE OLAP (Online Analytical Processing) pour les
applications de dépôts de données.
Permettre que la commande 
• 
DELETE , sur les tables MyISAM , utilise le cache de lignes.
Pour cela, nous devons modifier les threads de cache de ligne lorsque nous modifions le
fichier .MYD .
Lors de l'utilisation de 
• 
SET CHARACTER SET , il faudrait traduire toute la requête, et non
pas seulement les chaînes. Cela permettra aux utilisateurs d'utiliser les caractères traduits
dans les noms de tables, bases et colonnes.
Ajouter la méthode 
• 
record_in_range() à la commande MERGE pour être capable de
choisir le bon index lorsqu'il y a trop de choix. Nous devrions aussi étendre l'interface
d'informations pour lire la distribution des clés de chaque index, si analyze est exécuté sur
toutes les tables.
Résoudre le problème avec la commande 
• 
RENAME TABLE lorsqu'elle est utilisée sur une
table active MERGE , ce qui conduit actuellement à la corruption de la table.
Une librairie MySQL intégrée plus rapide est plus compacte (compatible avec l'ancienne).
• 
Support OpenSSL stable (MySQL 4.0 supporte OpenSSL mais cela reste rudimentaire et
• 
pas totalement testé).
Ajout du support en fonction de l' 
• 
UNICODE .
Transtypage de jeux de caractères et des syntaxes pour gérer simultanément plusieurs jeux
• 
de caractères.
Aide pour toutes les commandes du client.
• 
Nouveau protocole client/serveur plus rapide qui supportera les commandes préparées, les
• 
paramètres liés, et les résultats liés, les transferts binaires de données, les alertes...
Ajout des vrais noms de tables et de bases (dans le cas d'un alias) à la structure
• 
MYSQL_FIELD.
Ajout d'options au protocole client/serveur pour obtenir des informations sur la progression
• 
des requêtes lentes.
L'implémentation de 
• 
RENAME DATABASE . Pour que cela soit sécuritaire pour tous les
gestionnaires de table, cela doit fonctionner comme ceci :
Créer la nouvelle base de données.

Pour chaque table, renommer la table dans la nouvelle base de données, en utilisant

l'équivalent de la commande RENAME .
Effacer l'ancienne base de données.

Ajouter le vrai support des 
• 
VARCHAR (Il y a déjà ce support avec les tables MyISAM ).
Optimiser le type 
• 
BIT pour qu'il prenne un bit (actuellement, BIT prend un caractère).
Nouvelle interface interne avec les fichiers. Cela rendra plus générique la gestion des
• 
fichiers, et rendra plus simple des extensions du type RAID. (L'implémentation actuelle est
un hack.)
Améliorer les tables en mémoire ( 
• 
HEAP ) :
Support des index B?tree

Lignes de taille dynamique

Accélération de la gestion des lignes (moins de copie)

1.8.3 Ce qui doit être fait dans un futur proche
Limiter le nombre de threads qui travaillent à la restauration d'une table MyISAM en même
• 
temps.
Changer le code de la commande 
• 
INSERT ... SELECT pour supporter les insertions
concurrentes, en option.
Retourner le type original des champs avec la commande 
• 
SELECT MIN(column) ...
GROUP BY .
Support des résultats multiples.
• 
Rendre possible la spécification de 
• 
long_query_time avec une granularité en
 1.8.3 Ce qui doit être fait dans un futur proche
41

Manuel MySQL 4.1.x ? Version Française
microsecondes.
Lier le code de 
• 
myisampack dans le serveur.
Porter le code de MySQL sur QNX.
• 
Porter le code de MySQL sur BeOS.
• 
Porter le code du client MySQL sur LynxOS.
• 
Ajouter un buffer de clés temporaires durant les commandes 
• 
INSERT/DELETE/UPDATE de
manière a le restaurer proprement si le fichier d'index se remplit.
Si vous exécutez une commande 
• 
ALTER TABLE sur une table qui est liée symboliquement
sur un autre disque, les tables temporaires devraient être créées dans ce disque.
Implémenter un type 
• 
DATE/DATETIME qui gère les données de fuseaux horaires
correctement, afin de simplifier la gestion de ces derniers.
FreeBSD et MIT?pthreads; est?ce que les threads en veille consomment du temps
• 
processeur ?
Vérifier si les threads verrouillés consomment du temps processeur.
• 
Corriger le script de configure pour que l'on puisse compiler toutes les librairies (comme
• 
MyISAM ) sans les threads.
Ajouter une option pour vider périodiquement les pages de clés, avec des clés retardées si
• 
on ne les a pas utilisées depuis un bon moment.
Permettre les jointures sur des parties de clés (problème d'optimisation).
• 
INSERT SQL_CONCURRENT
• 
 et mysqld ??concurrent?insert pourraient réaliser des
insertions concurrentes à la fin du fichier, si le fichier est verrouillé en lecture.
Les curseurs coté serveur.
• 
Vérifier si 
• 
lockd fonctionne avec les noyaux moderne. Si ce n'est pas le cas, nous devons
corriger lockd ! Pour tester cela, démarrez mysqld avec l'option ??enable?locking et
lancez différents tests de fork*. Si cela fonctionne, il ne doit y avoir aucune erreur.
Permettre des variables SQL dans la clause 
• 
LIMIT , comme LIMIT @a,@b .
Permettre les modifications de variables dans les commandes 
• 
UPDATE . Par exemple :
UPDATE TABLE foo SET @a=a+b,[email protected], [email protected]+c .
Changer les modifications de variables utilisateur pour que l'on puisse les utiliser avec la
• 
clause GROUP BY , comme ceci : SELECT id, @a:=COUNT(*), SUM(sum_col)/@a
FROM nom_de_table GROUP BY id .
Ne pas utiliser de valeur par défaut 
• 
DEFAULT automatiquement. Générer une erreur lorsque
la commande INSERT ne contient pas la valeur d'une colonne qui n'a pas de valeur par
DEFAULT .
Corriger 
• 
libmysql.c pour permettre les commandes mysql_query() dans une ligne
sans lire les résultats, ou afficher une erreur lorsque l'on tente de le faire.
Vérifier pourquoi MIT?pthreads 
• 
ctime() ne fonctionne pas sur certains systèmes
FreeBSD.
Ajouter une option 
• 
IMAGE à la commande LOAD DATA INFILE pour ne pas modifier les
colonnes de type TIMESTAMP et AUTO_INCREMENT .
Ajouter la syntaxe 
• 
LOAD DATE INFILE ... UPDATE .
Pour les tables avec clés primaires, si les données ne contiennent pas de clé

primaire, les entrées qui correspondent à cette clé primaire sont modifiées avec le
reste des colonnes. Cependant, les colonnes qui manquent dans les données
entrantes sont ignorées.
Pour les tables avec des clés primaires à qui il manque une partie de la clé dans les

données entrantes, ou si il n'y a pas la clé primaire, les données sont traitées comme
pour LOAD DATA INFILE ... REPLACE INTO .
Faire que la commande 
• 
LOAD DATA INFILE comprenne ceci :
LOAD DATA INFILE '' INTO TABLE tbl_name
     TEXT_FIELDS (text_field1, text_field2, text_field3)
     SET table_field1=CONCAT(text_field1, text_field2),
         table_field3=23
     IGNORE text_field3
Ceci peut être utilisé pour sauter les colonnes de texte supplémentaire dans le fichier, ou
 1.8.3 Ce qui doit être fait dans un futur proche
42

Manuel MySQL 4.1.x ? Version Française
pour modifier des colonnes en se basant sur les données lues.
LOAD DATA INFILE 'file_name' INTO TABLE 'nom_de_table' ERRORS TO
• 
err_nom_de_table . Cette commande enregistrera les erreurs et les alertes dans la table
err_nom_de_table . Cette table aura la structure suivante :
line_number    ? numéro de ligne dans le fichier de données
error_message  ? Le message d'erreur ou d'alerte
Ou peut être
data_line      ? La ligne du fichier de données
Affichage automatique de 
• 
mysql vers Netscape.
LOCK DATABASES
• 
 (avec différentes options).
Fonctions : ADD_TO_SET(value,set) et REMOVE_FROM_SET(value,set).
• 
Ajouter les syntaxes 
• 
t1 JOIN t2 ON ... et t1 JOIN t2 USING ... Actuellement,
vous ne pouvez utiliser cette syntaxe qu'avec LEFT JOIN .
Bien plus de valeurs dans la commande 
• 
show status . Les lignes lues et modifiées. Les
sélections sur une table et les jointures. Le nombre moyen de table dans une sélection. Le
nombre de clause ORDER BY et GROUP BY dans les requêtes.
Si vous interrompez 
• 
mysql au beau milieu d'une requête, vous devriez ouvrir une autre
connexion, et tuer l'ancienne requête. Alternativement, une tentative de détection doit avoir
lieu sur le serveur.
Ajouter un gestionnaire d'interface pour les informations de tables, de manière à pouvoir
• 
l'utiliser comme une table système. Cela serait un peu lent si vous demandez toutes les
informations sur toutes les tables, mais c'est très souple. SHOW INFO FROM tbl_name
pour les informations simples de tables devrait être implémenté.
NATURAL JOIN
• 
 .
Permettre la commande 
• 
SELECT a FROM crash_me LEFT JOIN crash_me2 USING
(a) ; dans ce cas, a est supposé provenir de la table crash_me .
Corriger le code pour que 
• 
ON et USING fonctionne avec les jointures de type JOIN .
Commande Oracle 
• 
CONNECT BY PRIOR ... pour rechercher les hiérarchies.
mysqladmin copy database new?database
• 
 ; requiert la commande COPY dans
mysqld .
La liste des processus devrait afficher le nombre de requêtes et de threads.
• 
SHOW HOSTS
• 
 doit afficher les informations sur les noms d'hôte en cache.
Options de 
• 
DELETE et REPLACE dans la commande UPDATE (cela effacerait des lignes
lorsque une clé voit un doublon surgir durant la mise à jour).
Modifier le format de 
• 
DATETIME pour stocker les fractions de secondes.
Ajout de tous les types de données qui manquent de ANSI92 et ODBC 3.0.
• 
Changer les noms des tables de chaîne vide en 
• 
NULL pour les colonnes calculées.
Ne pas utiliser 
• 
Item_copy_string sur les valeurs numériques pour éviter la conversion
nombre ?> chaîne ?> nombre dans le cas de : SELECT COUNT(*)*(id+0) FROM
nom_de_table GROUP BY id
Rendre possible l'utilisation de la nouvelle librairie d'expression régulière GNU en lieu et
• 
place de celle qui a actuellement cours (la librairie GNU devrait être bien plus rapide).
Modifier la commande 
• 
ALTER TABLE pour qu'elle n'interrompe pas les clients qui exécutent
des commandes INSERT DELAYED .
Corriger le code pour que lorsque les colonnes sont référencées dans une commande
• 
UPDATE , elle contiennent les anciennes valeurs, et non pas les nouvelles.
Ajouter la simulation de 
• 
pread() / pwrite() sous Windows pour permettre les insertions
concurrentes.
Un analyseur de fichiers de log, qui pourrait traiter les données et indiquer quelles tables
• 
sont les plus souvent utilisées, combien de jointures sont faites, etc. Cela aidera les
utilisateurs à identifier les points sensibles dans leur conception de bases de données.
Ajouter 
• 
SUM(DISTINCT) .
Ajouter les fonctions de groupement 
• 
ANY() , EVERY() et SOME() . En ANSI SQL, elles ne
fonctionnent que sur les colonnes de type booléen, mais nous pouvons les étendre pour
qu'elles fonctionnent sur n'importe quelle type de colonne ou d'expression en appliquant la
 1.8.3 Ce qui doit être fait dans un futur proche
43

Manuel MySQL 4.1.x ? Version Française
conversion valeur == 0 ?> FALSE et valeur <> 0 ?> TRUE.
Faire que le type de 
• 
MAX(column) soit le même que le type de la colonne utilisé. Par
exemple :
mysql> CREATE TABLE t1 (a DATE);
mysql> INSERT INTO t1 VALUES (NOW());
mysql> CREATE TABLE t2 SELECT MAX(a) FROM t1;
mysql> SHOW COLUMNS FROM t2;
Inventer une syntaxe pratique pour une commande qui va modifier avec 
• 
UPDATE une ligne
si elle existe, et sinon, faire un insertion INSERT si cette ligne n'existe pas. (Comme
REPLACE le fait avec INSERT / DELETE ).
1.8.4 Ce qui est prévu pour plus tard
Implémenter la fonction : 
• 
get_changed_tables(timeout,table1,table2,...) .
Remplacer la lecture dans les tables par une zone mémoire aussi souvent que possible.
• 
Actuellement, seules les tables compressées utilisent des memmap.
Rendre le code des timestamp automatiques bien plus pratique. Ajouter les timestamps
• 
dans le log avec SET TIMESTAMP=#; .
Utiliser un mutex de lecture/écriture pour gagner de la vitesse.
• 
Ajouter le support complet des clés étrangères pour les tables 
• 
MyISAM , probablement
après l'implémentation des procédures stockées et des triggers.
Des vues simples (sur une table, puis sur une expression).
• 
Fermer automatiquement des tables si une table, une table temporaire ou un fichier
• 
temporaire reçoit une erreur 23 (plus assez de fichiers ouverts).
Lors de la rencontre de field=#, changez toutes les occurrences du champ en #.
• 
Actuellement, cela n'est fait que pour les cas simples.
Changer toutes les expressions constantes par des expressions calculées, si possible.
• 
Optimiser la relation clé = expression. Actuellement, seul les relations clé = champ et clé =
• 
constante sont optimisées.
Fusionner les fonctions de copie pour améliorer le code.
• 
Changez 
• 
 pour le remplacer par un analyseur de ligne de commande plus
petit, et qui gère mieux les messages.
Changer l'analyseur pour utiliser uniquement une règle pour tous les nombres d'arguments
• 
possibles dans une fonction.
Utiliser les calculs de noms complets dans la clause ORDER (pour ACCESS97).
• 
MINUS
• 
 , INTERSECT et FULL OUTER JOIN . (actuellement, UNION [en 4.0] et LEFT
OUTER JOIN fonctionnent).
SQL_OPTION MAX_SELECT_TIME=#
• 
 pour donner une limite de temps à une requête.
Diriger le log d'historique vers une base.
• 
Améliorer 
• 
LIMIT pour permettre la lecture de données à la fin du résultat.
Alertes lors des connexion/écriture/lecture du client.
• 
Notez ces modifications de 
• 
safe_mysqld : selon la FSSTND (que Debian essaie de suivre)
les fichiers PID devraient être placés dans /var/run/<progname>.pid et les fichiers de
logs dans /var/log . Il serait bien si vous pouviez mettre le "DATADIR" dans la première
déclaration de "pidfile" et "log", de façon à ce que l'emplacement de ces fichiers puisse être
modifié en une seule ligne.
Permettre au client de commander le log des actions.
• 
Ajouter l'utilisation de 
• 
zlib() pour les fichiers gzip , avec la commande LOAD DATA
INFILE .
Corriger le tri et le groupage avec les colonnes 
• 
BLOB (en partie résolu).
Procédures stockées. Les triggers sont aussi au programme.
• 
Un langage de modification simple et atomique, qui peut être utilisé pour écrire des boucles
• 
dans le serveur MySQL.
 1.8.4 Ce qui est prévu pour plus tard
44

Manuel MySQL 4.1.x ? Version Française
Utiliser des sémaphores pour compter les threads. Il faut commencer par implémenter des
• 
sémaphores pour MIT?pthreads.
Ne pas assigner de nouvelle valeur 
• 
AUTO_INCREMENT lorsque l'on utilise la valeur 0.
Utilisez NULL à la place.
Ajouter le support complet pour les 
• 
JOIN avec parenthèses.
Comme alternative à la relation un thread, une connexion, gérer un groupe de threads pour
• 
répondre aux requêtes.
Permettre la pose de plusieurs verrous avec 
• 
GET_LOCK . Lors de ces verrous multiples,
gérer le cas des blocages par verrous qui pourrait être introduit.
Le temps est indiqué en temps de travail et non pas en temps normal.
1.8.5 Ce qui n'est pas prévu
Rien. Nous nous dirigeons vers la compatibilité complète avec ANSI 92/ANSI 99.
• 
1.9 Comparatif de MySQL avec les autres serveurs SQL
Nos utilisateurs ont réussi à exécuter nos tests avec un grand nombre de serveurs SQL Open
Source ou non. Nous connaissons des tests exécutés avec Oracle , DB/2 , Microsoft SQL
Server et d'autres produits commerciaux. Pour des raisons légales, nous ne pouvons pas les
publier dans notre manuel de référence.Cette section inclut la comparaison de MySQL avec mSQL
pour des raisons historiques, et avec PostgreSQL car c'est aussi une base Open Source . Si
vous avez des résultats de tests que nous pouvons publier, contactez?nous à
page web de l'utilitaire crash?me à l'adresse ? .
1.9.1 MySQL face à mSQL
Performance
tests comparatifs de MySQL .
Comme il n'y a pas de création de threads, que l'analyseur est plus petit, et que les
fonctionnalités sont moins nombreuses, mSQL devrait être plus rapide avec :
les tests qui réalisent des connexions répétées et qui n'exécutent qu'une
simple requête à chaque fois.
les opérations d' INSERT dans des tables très simples, avec peu de colonnes
et d'index.
les commandes de CREATE TABLE et DROP TABLE .
les commandes SELECT sur tout ce qui n'est pas indexé (un scan de table
est très facile).
Comme ces opérations sont très simples, il est difficile d'être meilleur lorsque les
coûts d'administration sont bien plus forts. Une fois la connexion établie, le serveur
MySQL devrait être bien plus rapide.D'un autre coté, le serveur MySQL est plus
rapide que mSQL (et que les autres serveurs SQL) avec :
les opérations SELECT complexes.
les lectures de grands résultats (le serveur MySQL a un protocole plus
rapide, plus sûr et bien meilleur).
 1.8.5 Ce qui n'est pas prévu
45

Manuel MySQL 4.1.x ? Version Française
les tables à taille de chaînes variable, car le serveur MySQL a une gestion
plus efficace et utilise les colonnes VARCHAR indexées.
la gestion des tables avec de nombreuses colonnes.
la gestion des tables ayant des grandes lignes.
les commandes SELECT avec de nombreuses expressions.
les commandes SELECT sur de grandes tables.
la gestion de nombreuses connexions simultanées. Le serveur MySQL est
complètement multi?threadé. Chaque connexion possède son propre thread,
ce qui signifie qu'il y a pas d'attente entre les threads (à moins que l'un
d'entre eux modifie une table que l'autre veut utiliser). En mSQL , une fois que
la connexion a été établie, les autres doivent attendre que la première ait fini,
indépendamment de la durée d'exécution de la requête. Lorsque la première
connexion se termine, le suivant peut être servi, tandis que les autres
attendent.
les jointures. mSQL peut devenir irrémédiablement lent si vous modifiez l'ordre
des tables dans la colonne SELECT . Dans la suite de test, il s'est vu des
tests 15000 fois plus lent que MySQL. Ceci est dû au manque d'optimisateurs
chez mSQL . Toutefois, si vous avez placé les tables dans le bon ordre avec
mSQL 2 et que la clause WHERE est simple et utilise les index, la jointure peut
les clauses ORDER BY et GROUP BY .
la clause DISTINCT .
l'utilisation des colonnes de type TEXT et BLOB .
Support de SQL
GROUP BY et HAVING . mSQL ne supporte pas du tout la clause GROUP BY .
MySQL supporte totalement la clause GROUP BY avec les clauses HAVING et
les fonctions suivantes : COUNT() , AVG() , MIN() , MAX() , SUM() et
STD() . COUNT(*) est optimisée pour retourner très vite le résultat si
SELECT lit les lignes dans une table, qu'aucune autre colonne n'est lue, et
qu'il n'y a pas de clause WHERE . MIN() et MAX() accepte les chaînes de
caractères comme arguments.
Les INSERT et UPDATE avec calculs d'expression. MySQL peut faire des
calculs d'expression dans les commandes INSERT et UPDATE . Par exemple
:
mysql> UPDATE SET x=x*10+y WHERE x<20;
Aliasing. MySQL supporte les alias de colonne.
Identification simple des colonnes. Avec MySQL, si un nom de colonne est
unique dans les tables utilisées pour une jointure, vous n'avez pas à utiliser
son identifiant total.
SELECT avec des fonctions MySQL dispose de nombreuses fonctions (trop
nombreuses à lister ici : voir Fonctions ).
Efficacité d'utilisation de l'espace disque
C'est à dire, comment pouvez?vous réduire la taille de vos tables ?MySQL a des
types très précis, et vous pouvez créer des tables avec un très petit espace. Un
exemple de type de données pratique est le type MEDIUMINT qui occupe 3 octets. Si
vous avez 100 millions d'enregistrement, économiser un octet par enregistrement est
très important.
mSQL2 a un jeu de type de données plus limité, ses tables sont donc plus grosses.
Stabilité
Il est difficile de juger de cela objectivement. Pour un début sur la stabilité du serveur
MySQL, voyez Degré de stabilité de MySQL .
Nous n'avons aucune expérience avec la stabilité du code de mSQL , alors nous ne
 1.8.5 Ce qui n'est pas prévu
46

Manuel MySQL 4.1.x ? Version Française
nous prononceront pas là?dessus.
Prix
Un autre point important est la licence. MySQL dispose d'une licence plus souple
que mSQL , est il est aussi moins cher que mSQL . Quelque soit le produit que vous
utilisez, n'oubliez pas de prendre un contrat de support par email ou une licence
commerciale.
interface Perl
MySQL a la même interface avec Perl que mSQL , avec des fonctionnalités
supplémentaires.
JDBC (Java)
MySQL supporte de nombreux pilotes JDBC :
le pilote mm : un pilote JDBC de type 4, écrit par Mark Matthews
Le pilote Resin : un pilote JDBC commercial et Open Source.
Le pilote gwe : une interface Java par GWE technologies (non supporté).
Le pilote jms : un pilote gwe amélioré par Xiaokun Kelvin ZHU
Le pilote twz : un pilote JDBC de type 4, écrit par Terrence W. Zellers
personnelles et éducationnelles (non supporté).
Le pilote recommandé est le pilote mm. Le pilote Resin est aussi bon (les tests sont
bons) mais nous n'avons pas reçu beaucoup d'informations à son
savons que mSQL a un pilote JDBC, mais nous n'avons pas l'expérience pour le
comparer.
Vitesse de développement
MySQL a une petite équipe de développeur, mais nous sommes très habitués à
coder en C et C++, très rapidement. Comme les threads, les fonctions, GROUP BY et
de nombreuses autres fonctionnalités ne sont pas encore codées pour mSQL , il y a
beaucoup faire pour nous rattraper. Pour mesurer cela, vous pouvez consulter le
fichier d'historique de mSQL HISTORY pour l'an dernier, et le comparer avec la
Il est alors assez évident de voir qui se développe plus vite.
Programmes utilitaires
Les deux projets mSQL et MySQL ont des contributions de tiers très intéressantes.
Comme il est plus facile de porter vers les versions plus récentes (depuis mSQL vers
MySQL), presque toutes les applications intéressantes de mSQL sont disponibles
pour MySQL.
MySQL est livré avec un programme simple msql2mysql qui corrige les différences
de syntaxe entre mSQL et MySQL pour la plupart des fonctions de l'API C. Par
exemple, il modifie les occurrences de msqlConnect() en mysql_connect() .
Convertir un programme client de mSQL vers MySQL requiert un effort minimal.
1.9.1.1 Comment convertir des outils mSQL pour MySQL
Selon notre expérience, il ne prend pas longtemps pour convertir des outils tels que msql?tcl et
msqljava qui utilisent l'API C de mSQL pour qu'ils fonctionnent avec l'API C de MySQL.
La procédure de conversion est la suivante :
Exécutez le script shell 
• 
msql2mysql sur la source. Ce script requiert le programme
replace , qui est distribué avec le serveur MySQL.
 1.9.1.1 Comment convertir des outils mSQL pour MySQL
47

Manuel MySQL 4.1.x ? Version Française
Compilez.
• 
Corrigez les erreurs de compilation.
• 
Les différences entre l'API C de mSQL et de MySQL sont :
MySQL utilise la structure 
• 
MYSQL comme type de connexion, alors que mSQL utilise un int .
mysql_connect()
• 
 prend un pointeur sur la structure MYSQL comme paramètre. Il est facile
d'en définir un globalement, ou d'utiliser la fonction malloc() pour en obtenir un.
mysql_connect() prend aussi deux paramètres supplémentaires, qui sont le nom de
l'utilisateur et son mot de passe. Vous pouvez aussi utiliser NULL, NULL pour retrouver
l'utilisation classique.
mysql_error()
• 
 prend la structure MYSQL comme paramètre. Ajoutez simplement ce
paramètre à votre vieux code msql_error() , si vous portez du vieux code.
MySQL retourne un numéro d'erreur et un message d'erreur pour tous les messages
• 
d'erreurs. mSQL ne retourne que le texte d'erreur.
Certaines incompatibilités existent du fait que le serveur MySQL supporte des connexions
• 
multiples, dans le même processus.
1.9.1.2 Différences entre les protocoles de communication de mSQL et de MySQL
Il y a tellement de différences qu'il est impossible (ou tout au moins très difficile) de ne pas les
supporter toutes.
Les traits les plus caractéristiques de différences entre le protocole de communication de MySQL et
de mSQL :
Un buffer de message peut contenir plusieurs lignes.
• 
Le buffer de message est dynamiquement agrandi si la requête ou le résultat sont plus
• 
grands que le buffer courant, jusqu'à une taille limite configurable.
Tous les paquets sont numérotés pour identifier les paquets doublons ou manquants.
• 
Toutes les valeurs de colonnes sont échangées en mode ASCII. La taille de la colonne est
• 
envoyée dans un paquet binaire (1,2 ou 3 octets).
MySQL peut lire un résultat non bufferisé (sans avoir a stocker tout le résultat dans le client).
• 
Si une opération de lecture/écriture prendre plus de 30 secondes, le serveur ferme la
• 
connexion.
Si la connexion est inactive pendant 8 heures, le serveur ferme la connexion.
• 
1.9.1.3 Comparatif des syntaxes SQL de mSQL 2.0 et MySQL
Types de colonnes
Serveur MySQL
Dispose des types traditionnels (entre autres : Syntaxe de CREATE TABLE ):
le type ENUM pour les chaînes à valeurs limitées.
le type SET pour les combinaisons de valeurs.
BIGINT pour les entiers 64?bit.
MySQL supporte aussi les attributs de types suivants :
option UNSIGNED pour les entiers et nombres à virgule flottante.
otion ZEROFILL pour les entiers.
option AUTO_INCREMENT pour les colonnes qui sont PRIMARY KEY .
mysql_insert_id() .
valeur par DEFAULT pour toutes les colonnes.
 1.9.1.2 Différences entre les protocoles de communication de mSQL et de MySQL
48

Manuel MySQL 4.1.x ? Version Française
mSQL2
Les types de colonnes de mSQL correspondent aux types de MySQL dans cette table
:
mSQL type
Type MySQL correspondant
CHAR(len) CHAR(len)
TEXT(len) TEXT(len) . len est la taille maximale. Et LIKE fonctionne.
INT
INT . Avec de nombreuses options supplémentaires.
REAL
REAL . Ou FLOAT . Les versions 4 et 8 octets sont disponibles.
UINT
INT UNSIGNED
DATE . Utilise le format ANSI SQL plutôt que le format spécifique de
DATE
mSQL .
TIME
TIME
MONEY
DECIMAL(12,2) . Un nombre à virgule fixe.
Création d'index
Serveur MySQL
Les index peuvent être spécifiés au moment de la création de la table avec la
commande CREATE TABLE .
mSQL
Les index doivent être créés après la création de la table, avec une commande
CREATE INDEX séparée.
Insertion d'un identifiant unique dans une table
Serveur MySQL
Utilisez l'option de colonne AUTO_INCREMENT . mysql_insert_id() .
mSQL
Créez une SEQUENCE dans la table et sélectionnez la colonne _seq .
Obtenir un identifiant unique pour une ligne
Serveur MySQL
Ajoutez la clé PRIMARY KEY ou UNIQUE à la table et utilisez ceci. Nouveau en
version 3.23.11 : si la clé PRIMARY ou UNIQUE est constituée d'une seule colonne et
qu'il est de type entier, vous pouvez y faire référence avec _rowid .
mSQL
Utilisez la colonne _rowid . Notez bien que _rowid peut changer durant ce temps,
en fonction de nombreux facteurs.
Lire la date de dernière modification d'une colonne
Serveur MySQL
Ajoutez une colonne de type TIMESTAMP dans la table. Cette colonne prend
automatiquement la date et l'heure courante lors des commandes INSERT ou
UPDATE si vous ne lui affectez pas de valeur, ou si vous lui donnez la valeur NULL .
mSQL
Utilisez la colonne _timestamp .
Comparaisons avec la valeur NULL
Serveur MySQL
 1.9.1.2 Différences entre les protocoles de communication de mSQL et de MySQL
49

Manuel MySQL 4.1.x ? Version Française
MySQL suit la norme ANSI SQL, et la comparaison avec une valeur NULL retourne
toujours NULL .
mSQL
Avec mSQL , NULL = NULL est vrai (TRUE). Vous devez changer =NULL en IS
NULL et <>NULL en IS NOT NULL lorsque vous portez du vieux code de mSQL vers
MySQL.
Comparaisons de chaînes
Serveur MySQL
Normalement, la comparaison de chaînes est faîte sans tenir compte de la casse, et
l'ordre de tri est déterminé par le jeu de caractères courant (ISO?8859?1 Latin1 par
défaut). Si vous ne le souhaitez pas, déclarez vos colonnes avec l'option BINARY ,
qui fera que les comparaisons peuvent être faites en fonction de l'ordre ASCII utilisé
sur l'hôte MySQL.
mSQL
Toutes les comparaisons de chaînes sont faites en tenant compte de la casse, en
fonction de l'ordre ASCII.
Recherche insensible à la casse
Serveur MySQL
LIKE est un opérateur sensible ou non à la casse, suivant les colonnes utilisées. Si
possible, MySQL utilise des index si l'argument de LIKE ne commence pas par un
caractère joker.
mSQL
Utilise CLIKE .
Gestion des espaces finaux
Serveur MySQL
Supprime tous les espaces de fin de chaînes dans les colonnes CHAR et VARCHAR .
Utilisez les colonnes de type TEXT si ce comportement n'est pas souhaité.
mSQL
Conserve les espaces finaux.
clause WHERE
Serveur MySQL
MySQL établit correctement les priorités : AND est calculé avant les OR . Pour obtenir
le comportement de mSQL avec MySQL, utilisez les parenthèses (tel que présenté
dans l'exemple un peu plus loin).
mSQL évalue les opérations de gauche à droite. Cela signifie que
certaines opérations logiques exprimées avec trois arguemnts ou plus ne peuvent
être exprimées. Cela signifie aussi que vous devez modifier des requêtes lorsque
vous passez à MySQL : tout ce que vous avez à faire est d'ajouter des parenthèses.
Supposez que vous avez le code mSQL suivant :
mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;
Pour le passer sur MySQL et le faire fonctionner comme sur mSQL , vous devez
ajouter ces parenthèses :
mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));
Contrôle d'accès
 1.9.1.2 Différences entre les protocoles de communication de mSQL et de MySQL
50

Manuel MySQL 4.1.x ? Version Française
Serveur MySQL
Possède des tables qui stockent les droits de chaque utilisateur, hôte et base.
Comment le système de droits fonctionne .
mSQL
Dispose d'un fichier  dans lequel vous pouvez ajouter et modifier les droits
d'accès des utilisateurs.
1.9.2 Comparatif de MySQL avec PostgreSQL
Lorsque vous lirez ces sections, notez bien que les deux produits évoluent continuellement. Les
équipes de MySQL AB et de PostGreSQL travaillent toutes deux à rendre leur base les meilleures
possibles, et elles présentent toutes les deux des alternatives sérieuses aux bases de données
commerciales.
La comparaison qui suit a été fait par MySQL AB. Nous avons essayé d'être aussi précis et objectifs
que possible, mais même si nous connaissons MySQL sur le bout des doigts, nous n'avons pas une
connaissance aussi pointues des possibilitées de PostgreSQL : nous pourrions être en erreur. Nous
corrigerons ces erreurs dès qu'elles seront portées à notre attention.
Nous souhaitons noter que PostgreSQL et MySQL sont deux produits largement répandus, mais
qui présentent des objectifs différents, même si tous les deux se dirigent vers la compatibilité ANSI
SQL. Cela signifie que pour certaines applications, MySQL est bien plus optimisé, et pour d'autres,
c'est PostGreSQL. Lorsque vous choisissez votre serveur de base de données, commencez par
vérifier que le jeu de fonctionnalités de votre base correspond bien à votre application. Si vous avez
besoin de vitesse pure, MySQL est probablement votre choix. Si vous avez besoin des
fonctionnalités que PostGreSQL propose, utilisez PostgreSQL .
1.9.2.1 Stratégies de développement de MySQL et PostgreSQL
Lorsque nous ajoutons des fonctionnalités à MySQL, nous mettons un point d'honneur à le faire de
manière optimale et définitive. Le code doit être tellement bon que vous n'y verrez rien à ajouter
dans un futur accessible. Nous sommes peu enclins à sacrifier la vitesse aux fonctionnalités, mais
nous faisons notre possible pour trouver une solution qui donnera le meilleur. Cela signifie que le
développement prend plus de temps, mais que le résultat en vaut la peine. Ce type de
développement n'est possible que parce que le code est vérifié par quelques (actuellement 2)
personnes avant qu'il ne soit inclus dans le serveur.
Chez MySQL AB, nous croyons aux publications fréquentes car cela nous permet de transmettre
nos nouveautés plus rapidement aux utilisateurs. Comme nous publions une nouvelle version
mineure toutes les trois semaines, et une version majeure chaque année. Toutes les versions sont
testées soigneusement, avec nos outils de tests et sur de nombreuses plate?formes.
PostgreSQL est basé sur un noyau de nombreux contributeurs. Avec cette configuration, il est
logique d'ajouter de nombreuses fonctionnalités, au lieu de les implanter optimalement, car il sera
toujours temps d'optimiser lorsque le besoin s'en fera sentir.
Une autre différence majeure entre MySQL et PostgreSQL est que presque tout le code de MySQL
est fait par des développeurs employés par MySQL AB et qui travaillent toujours sur ce code. Les
seules exceptions sont le moteur de transaction et la librairie d'expressions régulières.
Le contraste est saisissant avec le code de PostgreSQL, dont la majorité est réalisée par un grand
groupe de personnes avec différentes sensibilités. Ce n'est que récemment que les développeurs
 1.9.2 Comparatif de MySQL avec PostgreSQL
51

Manuel MySQL 4.1.x ? Version Française
de PostGreSQL ont annoncé qu'ils ont eu finalement le temps de faire le tour du code de la version
courante.
Les deux stratégies de développement présentées ont leur mérites et inconvénients. Chez MySQL
AB, nous pensons, bien sur, que notre modèle est le meilleur car il conduit à une meilleure
cohérence du code, et, à notre avis, moins de bogues. Comme nous sommes les auteurs du
serveur MySQL, nous sommes les mieux placés pour coordonner les publications.
1.9.2.2 Comparaison des fonctionnalités de MySQL et PostgreSQL
Sur la page crash?meune liste des avantages et limitations que l'on peut détecter avec un programme. Notez bien que de
nombreuses évaluations numériques peuvent être modifiées avec les options de démarrage des
différentes bases de données. Cette page web est extrêmement pratique si vous voulez vous
assurer que votre application fonctionnera sur différents serveurs SQL, ou si vous voulez convertir
votre application d'un serveur à l'autre.
MySQL offre les avantages suivants sur PostgreSQL:
MySQL
• 
 est généralement plus rapide que PostgreSQL. MySQL 4.0.1 a aussi un cache de
requêtes qui peut accélérer les requêtes pour les lectures de tables les plus fréquentes.
MySQL a une base d'utilisateurs bien plus grande que PostgreSQL. Par conséquent, le
• 
code est testé dans de meilleures conditions, et il a été historiquement plus stable que
PostgreSQL. MySQL est utilisé plus souvent en environnement de production que
PostgreSQL, notamment grâce au fait que MySQL AB, ex TCX DataKonsult AB, a fourni un
support commercial de haute qualité pour le serveur MySQL depuis la première publication,
tandis que, jusqu'à récemment, PostgreSQL n'avait pas de support.
MySQL fonctionne bien mieux sur Windows que PostgreSQL. MySQL fonctionne comme
• 
une application Windows native (un service sur NT/2000/XP), tandis que PostgreSQL
fonctionne en mode émulation de Cygwin . Nous avons entendu dire que PostgreSQL n'est
pas encore stable sous Windows mais non n'avons pas été capable de le vérifier
nous?mêmes.
MySQL a plus d'API avec d'autres langages, et est supporté par un plus grand nombre de
• 
MySQL fonctionne avec les systèmes critiques, à forte charge, 24h/24 et 7j/7. Dans la
• 
plupart des cas, nous n'avons jamais à effectuer d'entretien de MySQL. PostgreSQL ne
supporte par encore les systèmes 24h/24 et 7j/7, car il faut exécuter VACUUM une fois de
temps en temps pour récupérer l'espace vide issu des commandes UPDATE et DELETE , et
pour faire des analyses statistiques qui sont primordiales pour obtenir de bonnes
performances avec PostgreSQL. VACUUM est aussi nécessaire après avoir ajouté un grand
nombre de lignes dans une table. Sur un système très occupé avec de nombreuses
modifications, VACUUM doit être exécuté très fréquemment, et parfois, plusieurs fois dans la
journée. Durant l'exécution de VACUUM , qui peut prendre plusieurs heures si la base de
données est importante, le serveur est, d'un point de vue production, quasiment mort. Notez
qu'avec PostgreSQL version 7.2, l'entretien simple des tables ne nécessite plus le
verrouillage des tables, et le niveau d'utilisation est alors à peu près normal. Une nouvelle
commande VACUUM FULL effectue les entretiens traditionnels en verrouillant la table, et en
réduisant sa taille sur le disque.
Le système de réplication de MySQL a été testé soigneusement, et il est utilisé sur des sites
• 
comme :
Yahoo Finance ( )

( )

Slashdot ( )

 1.9.2.2 Comparaison des fonctionnalités de MySQL et PostgreSQL
52

Manuel MySQL 4.1.x ? Version Française
Dans les deux distributions de MySQL, vous trouverez des suites de tests,
• 
mysql?test?run et crash?meque la suite de performances. Le système de tests est souvent modifié avec des nouveaux
tests pour les nouvelles fonctionnalités, ainsi que les bogues qui nous sont rapportés. Nous
testons chacune de nos versions sur un grand nombre de plate?formes. Ces tests sont plus
sophistiqués que tout ce que nous avons pu voir chez PostgreSQL, et il nous assurent que
le serveur MySQL reste de bonne qualité.
Il y a bien plus de livres concernant MySQL que PostgreSQL. O'Reilly, SAMS, Que etNew
• 
Riders sont des éditeurs importants, avec des livres traitant de MySQL. Toutes les
fonctionnalités de MySQL sont aussi documentées sur le manuel en ligne, car lorsqu'une
nouvelle fonctionnalité est implémentée, les développeurs MySQL doivent la documenter
avant qu'elle soit inclue dans le source.
MySQL support plus de fonctions ODBC que 
• 
PostgreSQL .
MySQL a une commande 
• 
ALTER TABLE beaucoup plus puissante.
MySQL supporte les tables sans transaction pour les applications qui ont besoin de plus de
• 
vitesse. Les tables peuvent être placées en mémoire, comme les tables HEAP , ou bien sur
le disque, comme les tables MyISAMMySQL supporte deux types de gestionnaires de tables, qui supportent les transactions :
• 
InnoDB et BerkeleyDB . Comme chaque moteur de transactions travaille dans différentes
conditions, cela donne plus de possibilités aux auteurs d'applications pour choisir leur
Les tables groupées 
• 
MERGE vous donnent un moyen d'accéder instantanément a plusieurs
tables de même structure, et de les utiliser ensemble, comme une seule. C'est le moyen
parfait lorsque vous avez des tables de logs trop grosses, et que vous les séparez par mois.
Tables MERGE .
La possibilité de compresser les tables en lecture seule, mais tout en ayant un accès direct
• 
aux lignes de la table, vous donnent plus de performance en lecture, en réduisant la taille
des données lues sur le disque. C'est très pratique pour les archives. MySQL possède le support d'outils de recherche en texte plein. Recherche full?text avec
• 
Vous pouvez accéder à de nombreuses bases de données avec la même connexion, du
• 
moment que vous avez les droits pour le faire.
MySQL est codé depuis le début pour être multi?threadé, tandis que PostgreSQL utilise les
• 
processus. Le temps de changement de contexte et d'accès aux zones de stockage est bien
plus court avec des threads qu'entre des processus séparés. Cela donne un avantage de
vitesse à MySQL dans les applications multi?utilisateurs, et aussi avec les systèmes à
plusieurs processeurs symétriques.
MySQL a un système de droits bien plus avancé que PostgreSQL. Alors que PostgreSQL
• 
ne supporte que des droits pour les commandes INSERT , SELECT et UPDATE/DELETE au
niveau de l'utilisateur pour une base ou une table, MySQL vous permet de définir un jeu de
droits complet pour une base, une table ou une colonne. MySQL vous permet aussi de
MySQL supporte un protocole client/serveur compressé qui améliore grandement les
• 
performances sur les connexions lentes.
MySQL applique le concept des ``gestionnaires de table'', et est la seule base de données
• 
relationnelle que nous connaissons qui utilise ce concept. Cela permet différents types de
tables depuis le moteur SQL, et chaque table peut être optimisée pour différentes
performances.
Tous les types de tables MySQL (excepté 
• 
InnoDB ) sont implémentés avec des fichiers
(une table par fichier), ce qui rend très souple les sauvegardes, les déplacements et les
effacements, ou même l'utilisation des liens symboliques pour les tables et les bases, même
lorsque le serveur est éteint.
 1.9.2.2 Comparaison des fonctionnalités de MySQL et PostgreSQL
53

Manuel MySQL 4.1.x ? Version Française
Les outils pour réparer et optimiser les tables 
• 
MyISAM (le type de tables MySQL le plus
courant). Un outil de réparation n'est nécessaire que pour les corruptions physiques dans un
fichier de données, et généralement, pour corriger une défaillance du matériel. Elle permet à
la majorité des données d'être récupérées.
Changer de version de MySQL est très simple. Lorsque vous changer de version de
• 
MySQL, vous n'avez pas à exporter et réimporter vos données, comme vous devez le faire
avec PostgreSQL.
Les inconvénients de MySQL face à PostgreSQL:
Le support des transactions de MySQL n'est pas aussi bien testé que celui de PostgreSQL.
• 
Comme le serveur MySQL utilise les threads, qui ne sont pas encore parfaitement rodés sur
• 
tous les systèmes d'exploitation, il faut alors utiliser les exécutables binaires de
manière optimale.
Le verrouillage de table, tel qu'utilisé par les tables non transactionnelles 
• 
MyISAM , est dans
de nombreux cas plus rapide que les verrous de page, de ligne ou le versionnage.
L'inconvénient est que si l'on ne prend pas garde au fonctionnement du verrouillage de
table, une requête seule, à longue durée d'exécution peut bloquer la table en écriture pour
un long moment. Cela peut être évité en concevant correctement l'application. Sinon, on
Avec UDF (user?defined functions, fonction définies par les utilisateurs), il est possible de
• 
faire évoluer les fonctions du serveur MySQL aussi bien pour les fonctions SQL normales
que pour les fonctions d'agrégation, mais ce système n'est pas aussi pratique que pour
Les modifications qui s'effectuent sur plusieurs tables sont bien plus difficiles à faire avec
• 
MySQL. Toutefois, cela a été corrigé avec la version 4.0.2 et les commandes UPDATE
multi?tables, et en MySQL version 4.1, avec les sous?sélections. En MySQL version 4.0, on
peut utiliser les effacements multi?tables pour effacer plusieurs lignes dans différentes
tables simultanément. Syntaxe des DELETE .
PostgreSQL offre actuellement les avantages suivants sur MySQL :
Notez que comme nous connaissons le plan de développement de MySQL, nous avons inclus la
table suivante, avec les version du serveur MySQL où les fonctionnalités seront supportées.
Malheureusement, nous ne pouvions pas faire les mêmes comparaisons avec les fonctionnalités à
venir de PostgreSQL, car nous ne connaissons pas le plan de développement de PostgreSQL.
Fonctionnalité
version de MySQL
Sous?sélections
4.1
Clé étrangères
5.0 (3.23 avec InnoDB)
Vues
5.0
Procédures stockées
5.0
Triggers
5.0
Unions
4.0
Jointures totales
4.1
Contraintes
4.1 ou 5.0
Curseurs
4.1 ou 5.0
R?trees
4.1 (pour les tables MyISAM)
Tables héritées
Non prévu
 1.9.2.2 Comparaison des fonctionnalités de MySQL et PostgreSQL
54

Manuel MySQL 4.1.x ? Version Française
Type de données extensible
Non prévu
Autres raisons de considérer PostgreSQL :
L'utilisation standard de PostgreSQL est parfois plus proche de la norme ANSI SQL.
• 
Il est possible d'accélérer les traitements de PostgreSQL en codant des procédures
• 
stockées.
Pour les données géographiques, les R?trees font de PostgreSQL un meilleur choix que
• 
MySQL. (note : MySQL version 4.1 dispose des R?trees pour les tables MyISAM).
L'optimiseur PostgreSQL fait des optimisations que l'optimiseur de MySQL ne peut faire. La
• 
plus importante est lors de jointures, lorsqu'il n'y a pas les clés nécessaires, ou lorsque les
jointures se font avec des clés combinées par un OR. La suite de tests de MySQL
vous devriez éviter lorsque vous utilisez différentes bases de données.
PostgreSQL a une plus grande équipe de développement qui contribue au serveur.
• 
Les inconvénients de PostgreSQL face à MySQL :
L'utilitaire 
• 
VACUUM rend PostgreSQL difficile à utiliser en environnement de production
24h/24 et 7j/7.
Les tables sont obligatoirement transactionnelles.
• 
Les commandes 
• 
INSERT , DELETE et UPDATE sont plus lentes.
Pour une liste complète des inconvénients, examinez la première table de cette section.
1.9.2.3 Performances comparées de MySQL et PostgreSQL
Le seul test de vitesse Open Source que nous connaisssons et qui peut être utilisé pour tester les
performances de MySQL et de PostgreSQL (et d'autres bases de données) est le nôtre. Il est
de nombreuses fois aux développeurs de PostgreSQL et aux utilisateurs de PostgreSQL de nous
aider à développer et améliorer ce test, pour en faire le meilleur test possible, mais nous n'avons
pas reçu de réponse de leur part.
Nous, les développeurs MySQL, avons, à cause de cela, passé de nombreuses heures à obtenir
les meilleures performances de PostgreSQL pour ces tests, mais comme nous ne connaissons pas
intimement le serveur PostgreSQL, nous sommes certains d'être passé à coté de certains points.
Sur la page de test, nous avons documenté exactement comment nous avons exécuté le test, pour
qu'il soit facile à tout le monde de reproduire et de confirmer nos résultats.
Les tests sont généralement exécutés avec et sans l'option ??fast . Lorsque l'option ??fast est
utilisée, nous tentons d'utiliser tous les trucs connus du serveur pour que l'exécution soit aussi
rapide que possible. L'idée est que le mode normal doit montrer comment le serveur devrait se
comporter avec une configuration normale, et le mode ??fast montre comment le serveur se
comporte si le développeur utilise toutes les extensions du serveur pour accélérer son application.
Lorsque nous exécutons PostgreSQL avec l'option ??fast , nous exécutons la commande
VACUUM après chaque modification importante de la table, et après l'effacement de table, pour
conserver la base dans un état parfait pour les prochaines sélections. Le temps nécessaire à
l'exécution de la commande VACUUM est mesuré séparément.
Lorsque PostgreSQL 7.1.1 fonctionne, nous n'avons pu le faire fonctionner avec l'option ??fast
car durant les test d' INSERT , le postmaster (démon PostgreSQL) s'est arrété, et la base était
 1.9.2.3 Performances comparées de MySQL et PostgreSQL
55

Manuel MySQL 4.1.x ? Version Française
tellement corrompue qu'il a été impossible de redémarrer le postmaster. Après un deuxième
problème identique, nous avons décidé de reporter les tests ??fast jusqu'à la prochaine version
de PostgreSQL. Les détais sur la machine avec laquelle nous avons exécuté les tests sont
disponible sur la page de tests.
Avant de passer aux autres tests de performances que nous connaissons, nous souhaitons vous
donner des détails sur le contexte des tests.
Il est très facile d'écrire un test qui montre que toutes les bases du monde sont les meilleures, en
se limitant simplement aux points forts de la base, et en ne testant rien qui soit une faiblesse. De
plus, si la conclusion se ramène à un seul chiffre, c'est encore plus facile.
Cela revient à mesurer la vitesse de MySQL par rapport à PostgreSQL en regardant simplement les
temps moyens des tests de MySQL sur notre page. En se basant sur ces informations, notre
serveur MySQL serait 40 fois plus rapide que PostgreSQL, ce qui est, bien sûr, faux. Nous
pourrions même rendre les choses encore pires en prenant les tests où PostgreSQL a les pires
performances, et dire que MySQL est plus de 2000 fois plus rapide que PostgreSQL.
Le fait est que MySQL fait un certain nombre d'optimisation que PostgreSQL ne fait pas. C'est aussi
vrai, bien sûr, dans le sens inverse. Un optimiseur SQL est un programme complexe, et une
compagnie peut passer des années à le rendre de plus en plus rapide.
Lorsque vous regardez les résultats des tests, vous devriez vous limiter aux opérations que vous
utilisez dans votre application, et utiliser simplement ces résultats pour décider quelle base de
données est la plus adaptée à vos besoins. Les résultats de tests vous montrent quelles opérations
sont le point faible de chaque base, et vous donnent des indications sur ce qu'il faudra éviter de
faire.
Nous connaissons deux tests de performances qui indiquent que PostgreSQL est plus rapide que
MySQL. Ces deux tests sont faits dans un environnement multi?utilisateur, un test que nous, chez
MySQL AB, nous n'avons pas eu le temps de mettre en place car c'est une tâche énorme de le faire
pour que ce soit équitable pour chaque base.
Le premier est le test payant, effectué pour Great Bridge, une entreprise qui a tenté durant 16 mois
de bâtir un modèle d'affaires avec PostgreSQL mais qui a désormais cessé les opérations. C'est
probablement le pire test que nous ayons jamais vu. Non seulement ce test était bâti pour ne tester
que les points forts de PostgreSQL, mais il était totalement déloyal pour toutes les autres bases de
données utilisées dans le test.
Note : nous savons aussi que même certains des développeurs principaux de PostgreSQL n'ont
pas aimé la manière avec laquelle Great Bridge a dirigé le test, et nous ne blâmons pas l'équipe de
PostgreSQL pour ces tests.
Ce test a été condamné dans de nombreux articles et groupes d'utilisateurs, et nous ne citerons
que quelques?uns des points qui étaient incorrects.
Les tests ont été exécutés avec un outil commercial très cher, qui rendent impossibles aux
• 
entreprises Open Source comme nous de vérifier les résultats ou même de voir comment
les tests ont été mis en place. L'outil n'était même pas un véritable outil de test de
performances, mais une application de mise en place et de tests. Dire que c'est un outil
``standard'' de tests est bien loin de la vérité.
Great Bridge a admis qu'ils ont optimisé le serveur PostgreSQL (avec 
• 
VACUUM avant le test)
et optimisé le démarrage pour les tests, ce qu'ils n'ont pas fait pour les autres bases. Ils
disent ``Ce processus optimise les index et libère un peu d'espace sur le disque. Les index
 1.9.2.3 Performances comparées de MySQL et PostgreSQL
56

Manuel MySQL 4.1.x ? Version Française
optimisés améliorent les performances marginalement''. Nos tests indiquent clairement la
différence lorsqu'on exécute une série de sélections sur une base qui a été entretenue avec
VACUUM ou pas : le facteur peut atteindre 10.
Les résultats des tests étaient eux?même très étranges. La documentation de tests AS3AP
• 
mentionne qu'ils sont des ``sélections, jointures simples, projections, agrégations,
modification d'une ligne et modifications massives''.
PostgreSQL est bon pour les SELECT s et les JOIN s (spécialement après l'exécution de la
commande VACUUM ), mais n'est pas très performant pour les INSERT s ou les UPDATE .
Les tests semblent indiquer que seuls des SELECT ont été exécutés. Cela peut facilement
expliquer le nombre de bons résultats pour PostgreSQL dans ce test. Les mauvais résultats
de MySQL seront évident un peu plus bas, dans ce document.
Ils ont exécuté les soi?disant tests depuis une machine sous Windows vers un serveur
• 
Linux, via ODBC, une configuration que personne n'utiliserait pour un environnement
multi?utilisateur. Cela testait surtout le pilote ODBC et le protocole Windows utilisé entre les
clients et le serveur, plutôt que le serveur lui?même.
Lorsque les tests ont été exécutés avec Oracle et MS?SQL (Great Bridge a indirectement
• 
indiqué que ces bases étaient utilisées dans les tests), ils n'ont pas utilisé le protocole natif
mais ODBC. Toute personne qui a utilisé Oracle sait que toutes les vraies applications
utilisent l'interface native au lieu d'ODBC. Faire un test via ODBC et dire que les résultats
sont comparables avec les situations d'utilisation de la base dans le monde réel ne peut être
considéré comme équitable. Ils auraient dû faire deux tests, avec et sans ODBC, pour
fournir des faits (après que leurs experts aient optimisé les serveurs, bien sûr).
Ils font référence au tests TPC?C, mais ils ne mentionnent nulle part que le test n'était pas
• 
un vrai test TPC?C et qu'ils n'étaient pas autorisés à dire que c'était un tel test. Un test
TPC?C ne peut être conduit que par les règles approuvées par le TPC Council (
de TPC et discrédité leurs propres tests. Les règles dictées par le TPC Council sont très
strictes pour s'assurer que personne ne produit de faux résultats ou tire des conclusions
invérifiables. Apparemment, Great Bridge n'était pas interessé par cela.
Après le premier test, nous avons contacté Great Bridge et nous leur avons mentionné les
• 
erreurs évidentes qu'ils avaient faits avec le serveur MySQL :
Travailler avec une version beta de notre pilote ODBC.

Travailler avec un système Linux qui n'était pas optimisé pour les threads.

Utiliser une vieille version de MySQL alors qu'il en existait une nouvelle.

Ne pas démarrer MySQL avec les bonnes options pour gérer les environnements

fortement multi?utilisateurs (la configuration par défaut est optimisée pour
consommer le moins de ressources).
Great Bridge a exécuté un nouveau test, avec notre nouveau pilote ODBC, et avec de
meilleures options de démarrage de MySQL mais ils ont refusé d'utiliser notre librairie glibc
ou notre binaire standard (utilisé par 80% de nos utilisateurs), qui étaient statiquement
compilé avec la librairie glibc.Selon nos sources, Great Bridge n'a rien fait pour s'assurer
que les autres bases de données étaient correctement configurées pour leur environnement
de tests. Nous sommes certains qu'ils n'ont pas contacté Oracle ou Microsoft pour leur
demander des conseils de configurations.
Le test était payé par Great Bridge, et ils ont décidé de publier une partie des résultats, bien
• 
choisis (au lieu de tous les publier).
Tim Perdue, un inconditionnel de PostgreSQL et un utilisateur réticent de MySQL, publia une
nous avons eu connaissance de la comparaison, nous avons téléphoné à Tim Perdue à ce propos,
car il y avait de nombreux résultats étranges dans ses publications. Par exemple, il statuait que
MySQL avait un problème avec 5 utilisateurs durant ses tests, alors que nous avons des utilisateurs
avec des machines similaires, qui utilisent MySQL avec plus de 2000 utilisateurs simultanés, et 400
 1.9.2.3 Performances comparées de MySQL et PostgreSQL
57

Manuel MySQL 4.1.x ? Version Française
requêtes par secondes. (Dans ce cas, la limite est la bande passante du réseau, pas le serveur
SQL).
Il semblait qu'il utilisait un noyau Linux qui avait des problèmes avec les threads, comme les noyaux
avant le 2.4 qui avait des problèmes avec les threads sur les machines à plusieurs processeurs.
Nous avons documenté dans le manuel comment corriger ce problème, et Tim devrait être bientôt
au courant de ce problème.
Les autres problèmes possibles pourraient provenir d'une vieille librairie glibc ou du fait que MySQL
n'utilise pas une version exécutable de notre site web, qui est bâtie avec une version corrigée de
glibc library. Dans ces cas, les symptômes sont ceux que Tim a mesuré.
Nous avons demandé à Tim d'avoir accès a ses données pour que nous puissions reproduire le
test, et s'il pouvait vérifier la version de MySQL sur sa machine pour voir ce qui n'allait pas. Il a
promis qu'il nous contacterait mais n'a rien fait à ce jour.
A cause de cela, nous ne pouvons pas non plus avoir confiance en ce test.
Avec le temps qui passe, les technologies évoluent, et les tests précédents ne sont désormais plus
valables. Le serveur MySQL dispose d'un jeu de gestionnaires de tables, avec des choix très
comment les tests ci?dessus s'effectuent avec les différents gestionnaires de tables de MySQL.
PostgreSQL a aussi, bien sûr, de nouvelles fonctionnalités depuis que ces tests ont été menés.
Comme ces tests ne sont pas publiquement disponibles, il n'y a pas moyen pour nous de savoir
comment les bases se comportent de nos jours avec ces tests.
Conclusion :
Les seuls tests qui existent aujourd'hui, disponibles au téléchargement pour tous, et que vous
pouvez exécuter avec MySQL, PostgreSQL sont les tests de MySQL. Chez MySQL AB, nous
croyons que les bases de données Open Source devraient être testées avec des outils Open
Source ! C'est le seul moyen de nous assurer que personne ne peut faire de tests que personne
ne peut reproduire, et les utiliser pour proclamer que sa base est meilleure que les autres. Sans
connaître le fond des choses, il est impossible de répondre à une telle déclaration.
Ce que nous trouvons étrange est que chaque test que nous avons vu à propos de PostgreSQL est
impossible à reproduire, et indique que PostgreSQL est le meilleur dans la plupart des tests, alors
que les nôtres , que tout le monde peut reproduire, montrent le contraire. Avec cela, nous ne
voulons pas dire que PostgreSQL n'est pas bon dans de nombreuses tâches (il l'est !!), ou qu'il
n'est pas plus rapide que MySQL dans certaines conditions. Nous voulons juste voir un test
équitable où PostgreSQL se comporte bien, pour que nous puissions avoir une compétition amicale
!
Pour plus d'informations sur nos tests, voyez La suite de tests comparatifs de MySQL .
Nous travaillons actuellement sur une suite de tests de perfomance qui inclue des tests multi
utilisateurs, et une meilleure documentation sur les tests individuels pour indiquer ce qu'ils font et
comment ajouter d'autres tests à la suite.
 1.9.2.3 Performances comparées de MySQL et PostgreSQL
58

2 Installation de MySQL
Ce chapitre décrit comment obtenir et installer MySQL :
Pour une liste de sites à partir desquels vous pouvez obtenir MySQL, voyez Comment
• 
Pour savoir quelles plate?formes sont supportées, voyez Systèmes d'exploitation supportés
• 
pour faire fonctionner MySQL. Certains sont plus robustes et efficaces que d'autres, voyez
Plusieurs versions de MySQL sont disponibles à la fois sous forme de binaires ou de code
• 
source. Nous fournissons aussi un accès public à notre arbre source aux personnes
souhaitant suivre les derniers développements et nous aider à tester le nouveau code. Pour
Les instructions d'installation à partir des binaires ou des sources sont données dans
• 
Chacun de ces jeux d'instructions inclut une partie sur des problèmes spécifiques que vous
pourriez rencontrer.
Pour les procédures consécutives à l'installation, voyez Configuration et tests consécutifs à
• 
sources ou à partir des binaires.
2.1 Installation standard rapide de MySQL
2.1.1 Installer MySQL sous Linux
Il est recommandé d'installer MySQL sous Linux en utilisant un fichier RPM. Les RPM de MySQL
sont actuellement compilé sur une RedHAt en version 6.2, mais devraient fonctionner sur toute
autre version de Linux qui supporte rpm et utilise glibc .
Si vous avez des problèmes avec un fichier RPM, si vous obtenez par exemple l'erreur `` Sorry,
the host 'xxxx' could not be looked uples distribution binaires .
Les fichiers RPM dont vous pourriez avoir besoin sont :
MySQL?
• 
Le serveur MySQL. Vous en aurez besoin à moins que vous ne vouliez que vous connecter
à un serveur MySQL tournant sur une autre machine.
MySQL?client?
• 
Les programmes clients MySQL standards. Vous avez certainement besoin d'installer ce
paquet.
MySQL?bench?
• 
Tests et bancs d'essai. Nécessite Perl et les modules RPM msql?mysql?modules.
MySQL?devel?
• 
 2 Installation de MySQL
59

Manuel MySQL 4.1.x ? Version Française
Librairies et fichiers d'inclusions dont vous aurez besoin pour compiler d'autres clients
MySQL, tels que les modules Perl.
MySQL?
• 
 Celui?ci contient le code source de tous les paquets
précédents. Il peut donc être utilisé pour construire des fichiers RPM pour d'autres
architectures (par exemple, l'Alpha ou le SPARC).
Pour voir tous les fichiers présents dans un paquet RPM, lancez :
shell> rpm ?qpl MySQL?
Pour effectuer une installation standard minimale, lancez :
shell> rpm ?i MySQL? MySQL?client?
Pour installer uniquement le paquet du client MySQL, lancez :
shell> rpm ?i MySQL?client?
Le fichier RPM place les données dans /var/lib/mysql . Le RPM crée aussi les entrées
appropriées dans /etc/rc.d/ pour lancer le serveur automatiquement au démarrage. (Cela
signifie que, si vous avez déjà effectué une installation auparavant, vous pouvez avoir besoin de
faire une sauvegarde de vos fichiers de démarrage précédents si vous les changez, de façon à ne
pas les perdre.)Après l'installation des fichiers RPM, le démon mysqld devrait fonctionner et vous
l'installation .
Si quelque chose se passe mal, vous pouvez trouver davantage d'informations dans le chapitre
d'installation des binaires. Installer une distribution binaire de MySQL .
2.1.2 Installer MySQL sous Windows
Le serveur MySQL pour Windows est disponible sous deux formes :
La forme binaire contient un programme de configuration qui installe tout ce dont vous avez
• 
besoin de telle façon que vous puissiez démarrer le serveur immédiatement.
La distribution sous forme de code source contient tout le code et les fichiers de support
• 
distribution sous forme de sources pour Windows .
En règle générale, vous devriez utiliser la distribution aurez besoin des choses
suivantes :
Un système d'exploitation Windows 32?bit tel que Windows 9x, Me, NT, 2000, ou XP. La
• 
famille NT (NT, Windows 2000 et XP) permet de faire fonctionner le serveur MySQL en tant
tables de plus de 4 Go, vous devez installer MySQL sur un système de fichiers NTFS ou
supérieur. N'oubliez pas d'utiliser MAX_ROWS et AVG_ROW_LENGTH quand vous créez les
Support du protocole TCP/IP.
• 
Une copie du binaire ou de la distribution MySQL pour WIndows, qui peut être téléchargée
• 
fichier au format zip et nous vous recommandons l'utilisation d'un client FTP adéquat qui
supporte la reprise des transferts afin d'éviter des problèmes de corruption de fichiers
pendant le téléchargement.
Un programme d'extraction 
• 
ZIP pour décompresser le fichier de la distribution.
Suffisamment d'espace disque pour décompresser, installer et créer les bases de données
• 
en relation avec vos besoins.
 2.1.2 Installer MySQL sous Windows
60

Manuel MySQL 4.1.x ? Version Française
Si vous envisagez de vous connecter à MySQL via 
• 
ODBC , vous aurez aussi besoin du pilote
MyODBC . Support ODBC pour MySQL .
2.1.2.1 Installation des binaires
Si vous travaillez avec les serveurs NT/2000/XP, loguez?vous en utilisateur avec les
• 
permissions d'administrateur.
Si vous faites une mise à jour d'une version plus récente de MySQL, il est nécessaire
• 
d'arrêter le serveur. Si vous utilisez le serveur en tant que service, utilisez :
C:\> NET STOP MySQL
Dans les autres cas, utilisez :
C:\mysql\bin> mysqladmin ?u root shutdown
Avec les serveurs NT/2000/XP, si vous voulez changer l'exécutable du serveur (e.g., ?max
• 
or ?nt), il est aussi nécessaire de stopper le service :
C:\mysql\bin> mysqld?max?nt ??remove
Dézipper les fichiers dans un emplacement temporaire.
• 
Exécutez le fichier 
• 
 pour commencer l'installation. Si vous voulez l'installer à un
autre emplacement que celui pas défaut c:\mysql , utilisez le bouton Parcourir pour
spécifier un emplacement.
Terminer le processus d'installation.
• 
2.1.2.2 Préparation de l'environnement MySQL de Windows
A partir de la version 3.23.38 de MySQL, la distribution Windows inclut le binaire du serveur normal
et le binaire du serveur MySQL?Max. Voici une liste des différents serveurs MySQL que vous
pouvez utiliser :
Binaire
Description
Compilé avec débogage total et vérification automatique de l'allocation de
mysqld
mémoire, liens symboliques, tables InnoDB et BDB.
mysqld?opt
Binaire optimisé sans le support des tables transactionnelles.
Binaire optimisé pour NT/2000/XP sans support des tunnels nommés. Vous
mysqld?nt
pouvez faire fonctionner cette version sur Windows 9x/Me, mais dans ce cas, les
tunnels nommés ne sont pas crées et vous devez avoir TCP/IP installé.
Binaire optimisé avec support des liens symboliques et des tables InnoDB et
mysqld?max
BDB.
mysqld?max?nt Comme mysqld?max , mais compilé avec le support des tunnels nommés.
A partir de la version 3.23.50, les tunnels nommés ne sont activés que si on démarre mysqld avec
??enable?named?pipe .
Tous les binaires précédents sont optimisés pour le processeur Pentium Pro mais devraient
fonctionner avec n'importe quel processeur Intel >= i386.
Vous devrez utiliser un fichiers d'options pour spécifier votre configuration MySQL dans les
circonstances suivantes :
Le répertoire d'installation ou de données est différent de ceux par défaut ( 
• 
c:\mysql et
c:\mysql\data ).
Vous voulez utilisez l'un de ces serveurs :
• 

 2.1.2.1 Installation des binaires
61

Manuel MySQL 4.1.x ? Version Française
mysqld?

mysqld?max?

Vous avez besoin de paramétrer la configuration du serveur.
• 
Normalement, vous pouvez utiliser l'outil WinMySQLAdmin pour éditer le fichier d'options  .
Dans ce cas, vous n'avez pas à vous soucier de ce qui suit.
Il y'a deux fichiers d'options avec la même fonction :  et  . Toutefois, pour éviter la
confusion, il est préférable de n'en utiliser qu'un seul. Les deux fichiers sont en texte plein. Le fichier
 , si utilisé, doit être crée dans le répertoire racine du lecteur C. Le fichier  , si utilisé,
doit être crée dans le répertoire système de Windows. (Ce répertoire est souvent nommé
C:\WINDOWS ou C:\WINNT . Vous pouvez déterminer sa valeur exacte en regardant la valeur de la
variable d'environnement windir .) MySQL regarde en premier le fichier  , puis le fichier
 .
Si votre PC utilise un système de boot ou le lecteur C n'est pas le lecteur de boot, votre seule option
est d'utiliser le fichier  . Notez aussi que si vous utilisez l'outil WinMySQLAdmin , celui?ci
n'utilisera que le fichier  . Le répertoire \mysql\bin contient un fichier d'aide avec les
instruction pour utiliser cet outil.
En utilisant  , créez le fichier d'options et éditez la section [mysqld] pour spécifier
les valeurs des paramètres basedir et datadir :
[mysqld]
# set basedir to installation path, e.g., c:/mysql
basedir=le_dossier_d'installation
# set datadir to location of data directory,
# e.g., c:/mysql/data or d:/mydata/data
datadir=le_dossier_des_données
Notez que les chemins de Windows doivent être spécifiés dans les fichiers d'options en utilisant des
slashes normaux ( / ) au lieu des backslashes ( \ ). Si vous utilisez des backslashes, vous devez les
doubler.
Si vous voulez utiliser un répertoires de données autre que c:\mysql\data , vous devez copier le
contenu entier du dossier c:\mysql\data au nouvel endroit.
Si vous voulez utiliser les tables transactionnelles InnoDB , vous aurez besoin de créer
manuellement deux nouveaux répertoires pour contenir les les données et les logs InnoDB,
c:\ibdata et c:\iblogs . Vous aurez aussi besoin d'ajouter quelques lignes supplémentaires
dans le fichier d'options. Options de démarrage InnoDB .
Si vous ne voulez pas utiliser les tables InnoDB , ajoutez l'option skip?innodb au fichier
d'options.
Maintenant, vous pouvez commencer à tester le démarrage du serveur.
2.1.2.3 Démarrer le serveur pour la première fois
Tester à partir d'une console DOS est la meilleure chose à faire car le serveur affiche des
messages qui y apparaissent. Si quelque chose n'est pas bon dans votre configuration, ces
messages vous aiderons à identifier et corriger le problème.
Assurez?vous d'être dans le répertoire où se situe le serveur, puis entrez cette commande :
 2.1.2.3 Démarrer le serveur pour la première fois
62

Manuel MySQL 4.1.x ? Version Française
C:\mysql\bin> mysqld?max ??standalone
Vous devriez voir ce qui suit pendant le démarrage du serveur :
InnoDB: The first specified datafile c:\ibdata\ibdata1 did not exist:
InnoDB: a new database to be created!
InnoDB: Setting file c:\ibdata\ibdata1 size to 209715200
InnoDB: Database physically writes the file full: wait...
InnoDB: Log file c:\iblogs\ib_logfile0 did not exist: new to be created
InnoDB: Setting log file c:\iblogs\ib_logfile0 size to 31457280
InnoDB: Log file c:\iblogs\ib_logfile1 did not exist: new to be created
InnoDB: Setting log file c:\iblogs\ib_logfile1 size to 31457280
InnoDB: Log file c:\iblogs\ib_logfile2 did not exist: new to be created
InnoDB: Setting log file c:\iblogs\ib_logfile2 size to 31457280
InnoDB: Doublewrite buffer not found: creating new
InnoDB: Doublewrite buffer created
InnoDB: creating foreign key constraint system tables
InnoDB: foreign key constraint system tables created
011024 10:58:25  InnoDB: Started
Windows .
2.2 Notes générales à propos de l'installation
Methods of Installation, , ,
2.2.1 Comment obtenir MySQL ?
courante et les instructions de téléchargement.Notre miroir principal est situé sur
informations à propos des futurs miroirs et de quoi nous informer de la non?validité de l'un d'entre
eux.
2.2.2 Systèmes d'exploitation supportés par MySQL
Nous utilisons GNU Autoconf , alors il est possible de porter MySQL sur tous les systèmes
modernes qui utilisent les threads Posix et un compilateur C++. Pour compiler uniquement le client,
un compilateur C++ est simplement nécessaire. Nous utilisons et développons le logiciel
nous?même, en commençant par Sun Solaris (Versions 2.5 ? 2.7) et SuSE Linux version 7.x.
Notez que pour de nombreux systèmes d'exploitation, le support natif des threads ne fonctionne
qu'avec les dernières versions. MySQL a été compilé avec succès sur les combinaisons système
d'exploitation/package de threads suivants :
AIX 4.x, 5.x avec les threads natifs. Notes sur IBM?AIX .
• 
Amiga.
• 
BSDI 2.x avec le package MIT?pthreads. Notes relatives aux versions 2.x de BSD/OS .
• 
BSDI 3.0, 3.1 et 4.x avec les threads natifs. Notes relatives aux versions 2.x de BSD/OS .
• 
DEC Unix 4.x avec les threads natifs. Notes sur Alpha?DEC?UNIX (Tru64) .
• 
FreeBSD 2.x avec le package MIT?pthreads. Notes relatives à FreeBSD .
• 
FreeBSD 3.x et 4.x avec les threads natifs. Notes relatives à FreeBSD .
• 
 2.2 Notes générales à propos de l'installation
63

Manuel MySQL 4.1.x ? Version Française
HP?UX 10.20 avec les threads DCE ou avec le package MIT?pthreads. Notes sur HP?UX
• 
HP?UX 11.x avec les threads natifs Notes sur HP?UX Version 11.x .
• 
Linux 2.0+ avec LinuxThreads 0.7.1+ ou 
• 
glibc 2.0.7+. Notes relatives à Linux (toutes les
Mac OS X. Notes relatives à Mac OS X .
• 
NetBSD 1.3/1.4 Intel et NetBSD 1.3 Alpha (requiert GNU make). Notes relatives à NetBSD .
• 
OpenBSD > 2.5 avec les threads natifs. OpenBSD < 2.5 avec le package MIT?pthreads.
• 
OS/2 Warp 3, FixPack 29 et OS/2 Warp 4, FixPack 4. Notes relatives à OS/2 .
• 
SGI Irix 6.x avec les threads natifs. Notes sur SGI Irix .
• 
Solaris 2.5 et plus récent, avec les threads natifs sur SPARC et x86. Notes relatives à
• 
SunOS 4.x avec le package MIT?pthreads. Notes relatives à Solaris .
• 
Caldera (SCO) OpenServer avec un port récent du package FSU Pthreads. Notes sur
• 
Caldera (SCO) UnixWare 7.0.1. Notes sur Caldera Unixware Version 7.0 .
• 
Tru64 Unix
• 
Windows 9x, Me, NT, 2000 et XP. Notes relatives à Windows .
• 
Notez que toutes les plate?formes ne sont pas équipées de la même façon pour faire fonctionner
MySQL. Les capacités d'une plateforme pour supporter de fortes charges avec MySQL est
déterminé par ceci :
Stabilité générale de la librairie de threads. Une plateforme qui a une excellente réputation
• 
en général, mais une librairie de threads instable, dont le code est utiisé par MySQL, même
si le reste est parfait, fera de MySQL une application instable.
La capacité du noyeau et/ou de la librairie de threads de profiter des capacités
• 
multi?processeurs, symétrique ou pas. En d'autres termes, lorsqu'un processus crée un
thread, il doit être possible pour ce thread de s'exécuter sur différents processeurs.
La capacité du noyau et/ou de la librairie de threads de faire fonctionner de nombreux
• 
threads qui posent et lévent des verrous mutex en peut de temps, fréquemment, sans
changement de contexte excessif. En d'autres termes, si l'implémentation de
pthread_mutex_lock() est trop soucieux du temps CPU, cela va ralentir sérieusement
MySQL. Si ce problème n'est pas réglé, ajouter des processeurs supplémentaires va
finalement ralentir MySQL.
Performance et stabilité générale du système de fichiers.
• 
La capacité du système d'exploitation de gérer de grands fichiers, et de le faire
• 
efficacement, si vos tables sont grandes.
Notre niveau d'expertise avec la plate?forme, chez MySQL AB. Si vous connaissons bien
• 
une plate?forme, vous pourront introduire des optimisations et des corrections spécifiques à
la plate?forme, et activé lors de la compilation. Nous pouvons aussi fournir des conseils
judicieux pour cnofigurer votre système optimalement pour MySQL.
Le temps de tests que vous avons consacré à des configurations similaires, en interne.
• 
Le nombre d'utilisateur de MySQL qui font fonctionner MySQL avec succès sur cette
• 
plate?forme, avec des configurations similaires. SI ce nombre est grand, les chances de
rencontrer un problème spécifique sont faibles.
En se basant sur les critères précédents, les meilleures plate?forme pour MySQL sont x86 avec
SuSE Linux 7.1, 2.4 kernel, et ReiserFS (ou toute autre distribution Linux similaire) et SPARC avec
Solaris 2.7 ou 2.8. FreeBSD vient en troisième, mais nous espérons bien le voir rejoindre le groupe
de tête, une fois que la librairie de threads sera améliorée. Nous espérons aussi être bientôt
capables d'ajouter les autres plate?formes sur laquelle MySQL compile, et fonctionne correctement,
mais pas toujours le bon niveau de stabilité et de performances. Cela réclame des efforts de notre
 2.2 Notes générales à propos de l'installation
64

Manuel MySQL 4.1.x ? Version Française
part, en coopération avec les développeurs de ces plate?formes. Si vous êtes interessés par
l'amélioration de ces composants, et que vous êtes en position pour influencer le développement,
demandez des instructions détaillées à MySQL en envoyant un email à .
Notez bien que la comparaison précédente ne signifie pas qu'un système d'exploitation est meilleur
que l'autre, en général. Nous avons classé les systèmes en fonction de leur capacité à faire
fonctionner un système MySQL, et nous nous limitons à cette comparaison. Avec cela en tête, le
résultat de cette comparaison serait différent si nous y ajoutions d'autres problèmes. Et dans
certains cas, la seule raison qui fait qu'un OS est meilleur que l'autre est parce que nous y avons
consacré plus de temps, pour optimiser et tester. Nous nous bornons à exprimer notre point de vue
pour vous aider à décider quelle plate forme choisir pour votre serveur MySQL.
2.2.3 Quelle version de MySQL utiliser ?
La première décision à prendre est de savoir si vous voulez utiliser la dernière version de
développement ou la dernière version stable :
En règle générale, si vous utilisez MySQL pour la première fois ou si vous essayer de le
• 
porter vers un système pour lequel il n'existe pas de distribution binaire, nous vous
recommandons d'utiliser la dernière version stable (actuellement la version 3.23). Notez que
toutes les versions de MySQL sont passées aux bancs de test MySQL avant chaque sortie
(même les versions de développement).
D'autre part, si vous utilisez un vieux système et que vous voulez procéder à une mise à
• 
jour, sans pour autant risquer de mettre à jour sans raison, vous devriez mettre à jour vers la
dernière version de la même branche que celle que vous êtes en train d'utiliser (dans le cas
où un numéro de version supérieur existe). Nous avons essayé de résoudre uniquement les
bogues fatals et de produire des patchs petits et sûrs pour cette version.
La seconde décision est de déterminer si vous devez utiliser une distribution source ou binaire.
Dans la plupart des cas, vous devrez utiliser une distribution binaire, si celle?ci existe pour votre
plate?forme, car elle s'installera certainement plus facilement qu'une distribution source.
Dans les cas suivants, vous devrez opter pour une installation à partir des sources :
Si vous voulez installer MySQL à un endroit particulier. (Les distributions binaires standards
• 
sont ``prêtes à l'emploi'' à n'importe quel endroit, mais vous pouvez vouloir davantage de
flexibilité).
Pour être apte à satisfaire les différents besoins des utilisateurs, nous fournissons deux
• 
distributions binaires : une compilée avec le support du gestionnaire de tables non
transactionnel (un binaire petit et rapide), et une autre configurée avec la plupart des options
avancées, telles que le support des transactions. Les deux versions sont compilées à partir
des mêmes sources. Tous les clients natifs MySQL peuvent se connecter aux deux
distribution binaire avancée est marquée du suffixe ?max et est configurée avec
les mêmes options que mysqld?maxmysqld .
Si vous souhaitez utiliser des fichiers RPM de MySQL?Max, vous devez tout d'abord
installer les RPM MySQL standards.
Si vous voulez configurer 
• 
mysqld avec certaines options supplémentaires qui ne sont pas
présentes dans les distributions binaires standards. Ci?dessous, une liste des options les
plus courantes que vous pourriez vouloir utiliser :
??with?innodb

??with?berkeley?db

 2.2.3 Quelle version de MySQL utiliser ?
65

Manuel MySQL 4.1.x ? Version Française
??with?raid

??with?libwrap

??with?named?z?lib (Ceci est appliqué à certains binaires)

??with?debug[=full]

La distribution binaire standard est normalement compilée avec le support de tous les jeux
• 
de caractères et sont supposés fonctionner sur nombre de processeurs de la même
vous souhaitez un serveur MySQL plus véloce, vous pouvez vouloir le recompiler
juste avec le support des jeux de caractères dont vous avez besoin, utiliser un meilleur
compilateur (comme pgcc ), ou utiliser des options de compilations davantage optimisées
pour votre processeur.
Si vous avez rencontré des bogues et que vous les avez rapporté à l'équipe de
• 
développement MySQL, vous recevrez probablement un patch que vous devrez appliquer à
la distribution source pour que le bogue soit résolu.
Si vous voulez consulter (et/ou modifier) le code C et C++ qui compose MySQL, vous
• 
devrez obtenir une distribution source. Le code source est toujours la solution ultime. Les
distributions sources contiennent aussi davantage de tests et d'exemples que les
distributions binaires.
La politique de nommage de MySQL utilise des numéros de version qui consiste en trois nombres
suivis d'un suffixe. Par exemple, une version nommée mysql?3.21.17?beta doit être interprétée
de la façon suivante :
Le premier nombre ( 
• 
3 ) décrit le format de fichier. Toutes les versions 3 ont le même format
de fichier.
Le second nombre ( 
• 
21 ) correspond au niveau de version. Normalement, il y a le choix
entre deux d'entre eux. L'un correspond à la version/branche stable (actuellement 23 ) et
l'autre se réfère à la branche de développement (actuellement 4.0 ). Normalement, les
deux versions sont stables, mais la version de développement peut comporter des lacunes,
manquer de documentation sur des nouvelles fonctionnalités, ou peut ne pas compiler sur
certains systèmes.
Le troisième nombre ( 
• 
17 ) est le numéro de version au sein du niveau de version. Celui?ci
est incrémenté à chaque nouvelle publication. En temps normal, vous souhaiterez utiliser la
dernière version du niveau de version que vous avez choisi.
Le suffixe ( 
• 
beta ) indique le niveau de stabilité de la version. Les suffixes possibles sont :
alpha

 indique que la publication contient de grandes portions de nouveau code qui
n'a pas été testé à 100%. Les bogues connus (d'ordinaire, il n'y en a aucun) doivent
aussi de nouvelles commandes et extensions dans la plupart des versions alpha. Du
développement actif qui inclut des changements majeurs dans le code peut
concerner les versions alpha, mais tout sera testé avant de faire une publication. Il
ne devrait pas y avoir de bogues connus dans les publications de MySQL.
beta

 signifie que tout le nouveau code a été testé. Aucune fonctionnalité majeure
qui pourrait causer corruption du code n'est ajoutée. Il ne doit pas y avoir un seul
bogue connu. Une version alpha passe en beta quand il n'y a pas eu de bogue fatal
rapporté depuis au moins un mois et que nous ne prévoyons pas de nouvelle
fonctionnalité qui pourrait corrompre d'anciennes commandes.
gamma

 est une version bêta qui existe depuis un certain temps et qui semble
fonctionner correctement. Seulement des changements mineurs sont effectués. C'est
ce que de nombreuses autres compagnies appellent une publication.
S'il n'y a pas de suffixe, cela signifie que la version fonctionne depuis un certain

temps sur différents sites avec aucun rapport de bogue autre que des bogues
spécifiques à une plate?forme. Seuls des corrections critiques sont appliquées à la
publication. C'est ce que l'on appelle une version stable.
 2.2.3 Quelle version de MySQL utiliser ?
66

Manuel MySQL 4.1.x ? Version Française
Toutes les versions de MySQL passent par nos tests et bancs d'essais standards pour nous
assurer qu'elles peuvent être utilisées sans danger. Les séries de tests s'améliorent en permanence
car les tests standards sont étendus dans le temps pour traquer tous les bogues précédemment
trouvées.
Notez bien que toutes les versions de MySQL ont été testées au moins avec :
Une batterie de tests internes
C'est une reproduction d'un système de production client. Il comporte de
nombreuses tables avec des centaines de Mo de données.
Les bancs de tests MySQL
Ils effectuent une série de requêtes communes. C'est aussi un test pour savoir si le
comparatifs de MySQL .
Le test crash?me
Il tente de déterminer de quelles fonctionnalités disposent les bases de données et
quelles en sont les limites. La suite de tests comparatifs de MySQL .
Un autre test provient du fait que nous avons la version la plus récente de MySQL dans notre
propre environnement de production interne, sur au moins une machine. Nous avons plus de 100
Go de données à manipuler.
2.2.4 Dispositions d'installation
Cette section décrit les répertoires par défaut crées en installant les distributions binaires et les
distributions de sources.
Une distribution binaire est installée en la décompressant dans le répertoire d'installation que vous
avec choisis (souvent /usr/local/mysql ) et crée les répertoires suivants à cet endroit :
Répertoire
Contenu du répertoire
bin
Programmes clients et le serveur mysqld
data
Fichiers de log et bases de données
include
Fichiers (entêtes) inclus
lib
Librairies
scripts
mysql_install_db
share/mysql
Fichiers de messages d'erreurs
sql?bench
Benchmarks
Une distribution des sources est installée après que vous l'ayez configuré et compilé. Par défaut,
l'installation se fait dans /usr/local , dans les sous?répertoires suivants :
Répertoire
Contenu du répertoire
bin
Programmes clients et scripts
include/mysql
Fichiers (entêtes) inclus
info
Documentation au format Info
lib/mysql
Librairies
libexec
Le serveur mysqld
share/mysql
Fichiers de messages d'erreurs
sql?bench
Benchmarks et test crash?me
var
Fichiers de log et bases de données
 2.2.4 Dispositions d'installation
67

Manuel MySQL 4.1.x ? Version Française
Dans le répertoire d'installation, les dispositions d'une installation des sources diffère d'une
installation binaire des façons suivantes :
Le serveur 
• 
mysqld est installé dans le répertoire libexec plutôt que dans le répertoire bin
.
Le répertoire des données est 
• 
var plutôt que data .
mysql_install_db
• 
 est installé dans le répertoire /usr/local/bin plutôt que dans
/usr/local/mysql/scripts .
Le répertoire des fichier d'entête et les répertoires des librairies sont 
• 
include/mysql et
lib/mysql au lieu de include et lib .
Vous pouvez créer votre propre installation binaire à partir d'une distribution de sources compilées
en exécutant le script scripts/make_binary_distribution .
2.2.5 Quand et comment sont publiées les nouvelles versions
MySQL évolue rapidement ici, à MySQL AB, et nous voulons le partager avec les autres utilisateurs
de MySQL. Nous essayons de faire une nouvelle version à chaque fois que nous avons implanté
des fonctionnalités qui seront utiles à d'autres.
Nous essayons aussi d'aider les utilisateurs dont les requêtes sont faciles à programmer. Nous
prenons en considération tout ce que nos clients nous demandent, et nous accordons une attention
particulière à nos clients qui ont pris une licence e?mail étendue.
Personne n'est obligé de télécharger une nouvelle version. La sections News vous indiquera si la
nouvelle version contient une fonctionnalité que vous attendez. Historique des versions de MySQL .
Nous utilisons la politique suivante, lors de la mise à jour de MySQL :
Pour chaque modification mineure, le dernier numéro de la chaîne de version est
• 
incrémenté. Lorsqu'il y a des nouvelles fonctionnalités importantes ou des incompatibilité
mineures avec la version précédente, nous incrémentons le chiffre du milieu. Lorsque le
format de fichier change, le premier numéro est incrémenté.
Des versions tables et testées sont publiées une à deux fois dans l'année, mais si de petits
• 
bogues apparaissent, une version qui ne va corriger que ces bogues sera publiée.
Des versions fonctionnelles avec des corrections de bogues pour les vieilles versions sont
• 
publiées toutes les 1 à 8 semaines.
Les distributions binaires de certaines plate?formes seront compilées par nos soins pour les
• 
versions majeures. D'autres personnes font des versions binaires pour d'autres systèmes,
mais probablement moins fréquemment.
Nous rendons généralement public les correctifs, une fois que nous avons découverts de
• 
prochaine version.
Pour les bogues non critiques mais ennuyant, nous allons les ajouter dans le serveur de
• 
sources de MySQL, et ils seront publiés dans la prochaine version.
Si il y a un bogue fatal dans une version, nous publierons une nouvelle version aussitôt que
• 
possible. Nous apprécions que les autres éditeurs fasse la même chose.
La version stable actuelle est la version 3.23; nous avons déjà commencé à développer activement
la version 4.0. Les bogues seront corrigés dans cette version. Nous ne croyons pas à un gel
complet, car cela laisserait en plan des corrections de bogues, et des listes de souhaites. ``Un peu
gelé'' signifie que nous pourrions apporter de petits ajouts qui ``n'affecterons pas presque sûrement
pas le fonctionnement''.MySQL utilise un système de numérotation légèrement différent pour les
 2.2.5 Quand et comment sont publiées les nouvelles versions
68

Manuel MySQL 4.1.x ? Version Française
autres produits. En général, il est relativement sûr d'utiliser une version qui a été publiée il y a
quelques semaines sans être remplacée par une nouvelle version.
2.2.6 Binaires compilés par MySQL AB
Comme service, nous, MySQL AB, proposons un jeu de distributions binaires de MySQL qui sont
compilés sur nos machines, ou les machines auxquelles nos clients nous ont gentiment donné
accès.
Ces distributions sont générées avec le script scripts/make_binary_distribution et sont
configurés avec les compilateurs et options suivantes :
SunOS 4.1.4 2 sun4c avec gcc 2.7.2.1
CC=gcc CXX=gcc CXXFLAGS="?O3 ?felide?constructors" ./configure
??prefix=/usr/local/mysql ??disable?shared
??with?extra?charsets=complex ??enable?assembler
SunOS 5.5.1 (et plus) sun4u avec egcs 1.0.3a ou 2.90.27 ou gcc 2.95.2 et plus récent
CC=gcc CFLAGS="?O3" CXX=gcc CXXFLAGS="?O3 ?felide?constructors
?fno?exceptions ?fno?rtti" ./configure
??prefix=/usr/local/mysql ??with?low?memory
??with?extra?charsets=complex ??enable?assembler
SunOS 5.6 i86pc avec gcc 2.8.1
CC=gcc CXX=gcc CXXFLAGS=?O3 ./configure
??prefix=/usr/local/mysql ??with?low?memory
??with?extra?charsets=complex
Solaris 2.8 sparc avec gcc 2.95.3
CC=gcc CFLAGS="?O3 ?fno?omit?frame?pointer" CXX=gcc
CXXFLAGS="?O3 ?fno?omit?frame?pointer ?felide?constructors
?fno?exceptions ?fno?rtti" ./configure
??prefix=/usr/local/mysql "??with?comment=Official MySQL
binary" ??with?extra?charsets=complex "??with?server?suffix="
??enable?thread?safe?client ??enable?local?infile
??enable?assembler ??disable?shared
Linux 2.0.33 i386 avec pgcc 2.90.29 ( egcs 1.0.3a)
CFLAGS="?O3 ?mpentium ?mstack?align?double" CXX=gcc
CXXFLAGS="?O3 ?mpentium ?mstack?align?double
?felide?constructors ?fno?exceptions ?fno?rtti" ./configure
??prefix=/usr/local/mysql ??enable?assembler
??with?mysqld?ldflags=?all?static
??with?extra?charsets=complex
Linux 2.2.x avec x686 avec gcc 2.95.2
CFLAGS="?O3 ?mpentiumpro" CXX=gcc CXXFLAGS="?O3 ?mpentiumpro
?felide?constructors ?fno?exceptions ?fno?rtti" ./configure
??prefix=/usr/local/mysql ??enable?assembler
??with?mysqld?ldflags=?all?static ??disable?shared
??with?extra?charsets=complex
SCO 3.2v5.0.4 i386 avec gcc 2.7?95q4
CC=gcc CXX=gcc CXXFLAGS=?O3 ./configure
??prefix=/usr/local/mysql ??with?extra?charsets=complex
AIX 2 4 avec gcc 2.7.2.2
CC=gcc CXX=gcc CXXFLAGS=?O3 ./configure
??prefix=/usr/local/mysql ??with?extra?charsets=complex
OSF/1 V4.0 564 alpha avec gcc 2.8.1
 2.2.6 Binaires compilés par MySQL AB
69

Manuel MySQL 4.1.x ? Version Française
CC=gcc CFLAGS=?O CXX=gcc CXXFLAGS=?O3 ./configure
??prefix=/usr/local/mysql ??with?low?memory
??with?extra?charsets=complex
Irix 6.3 IP32 avec gcc 2.8.0
CC=gcc CXX=gcc CXXFLAGS=?O3 ./configure
??prefix=/usr/local/mysql ??with?extra?charsets=complex
BSDI BSD/OS 3.1 i386 avec gcc 2.7.2.1
CC=gcc CXX=gcc CXXFLAGS=?O ./configure
??prefix=/usr/local/mysql ??with?extra?charsets=complex
BSDI BSD/OS 2.1 i386 avec gcc 2.7.2
CC=gcc CXX=gcc CXXFLAGS=?O3 ./configure
??prefix=/usr/local/mysql ??with?extra?charsets=complex
FreeBSD 4.4?stable i386 avec gcc 2.95.3
CC=gcc CFLAGS="?O3 ?fno?omit?frame?pointer" CXX=gcc
CXXFLAGS="?O3 ?fno?omit?frame?pointer ?felide?constructors
?fno?exceptions ?fno?rtti" ./configure
??prefix=/usr/local/mysql "??with?comment=Official MySQL
binary" ??with?extra?charsets=complex "??with?server?suffix="
??enable?thread?safe?client ??enable?local?infile
??enable?assembler ??with?named?z?libs=not?used
??disable?shared
Si vous avez des options plus optimales pour l'une des configurations précédement listées, vous
pouvez toujours nous en faire part sur la liste de distribution des développeurs (
).
Les distributions RPM antérieures à la version 3.22 de MySQL sont contribuées par nos utilisateurs.
A partir de la version 3.22, les RPM sont générés par nous chez MySQL AB.
Si vous voulez compiler une version de débogage de MySQL, vous devez ajouter ??with?debug
ou ??with?debug=full aux lignes de configurations précédentes et effacer les options
?fomit?frame?pointer .
Pour les distributions Windows, voyez Installer MySQL sous Windows .
2.2.7 Installer MySQL à partir d'une distribution binaire
Construction du programme client .
Vous aurez besoin des outils suivants pour installer les binaires MySQL :
GNU 
• 
gunzip pour décompresser la distribution.
Un programme 
• 
tar pour désarchiver la distribution. GNU tar est connu pour fonctionner.
Le tar de Sun connaît quelques problèmes.
L'utilisation de fichiers RPM (RedHat Package Manager) est une autre façon d'installer MySQL
sous Linux. Installer MySQL sous Linux .Si vous rencontrez des problèmes, utilisez toujours
mysqlbug
bogue, mysqlbug rassemble des informations sur le système qui aidera les autres à résoudre votre
problème. En n'utilisant pas mysqlbug , vous amoindrissez vos chances d'obtenir une solution à
votre problème ! Vous trouverez mysqlbug dans le répertoire scripts après avoir désarchivé la
distribution. Comment rapporter des bogues ou problèmes .
 2.2.7 Installer MySQL à partir d'une distribution binaire
70

Manuel MySQL 4.1.x ? Version Française
Les commandes de base que vous devez lancer pour installer et utiliser MySQL à partir des
binaires sont les suivantes :
shell> groupadd mysql
shell> useradd ?g mysql mysql
shell> cd /usr/local
shell> gunzip < /path/to/mysql?VERSION? | tar xvf ?
shell> ln ?s full?path?to?mysql?VERSION?OS mysql
shell> cd mysql
shell> scripts/mysql_install_db
shell> chown ?R root  .
shell> chown ?R mysql data
shell> chgrp ?R mysql .
shell> bin/safe_mysqld ??user=mysql &
or
shell> bin/mysqld_safe ??user=mysql &
si vous utilisez MySQL 4.x
Vous pouvez ajouter des nouveaux utilisateurs en utilisant le script bin/mysql_setpermission
si vous installez les modules Perl DBI et Msql?Mysql?modules .
Une description plus détaillée est disponible ci?dessous.
consécutifs à l'installation , pour la configuration et les tests consécutifs à l'installation :
Choisissez le répertoire ou vous voulez désarchiver la distribution et déplacez?vous y. Dans
• 
l'exemple suivant, nous désarchivons la distribution dans le répertoire /usr/local et
créons un répertoire /usr/local/mysql dans lequel MySQL est installé. (Les instructions
suivantes supposent bien sûr que vous avez les autorisations suffisantes pour créer des
fichiers dans /usr/local . Si ce répertoire est protégé, vous aurez besoin de faire
l'installation en tant que root .)
Procurez?vous un fichier de distribution à partir d'un des sites cités dans Comment obtenir
• 
MySQL .Les distributions binaires de MySQL sont fournies sous forme d'archives tar
compressées et ont des noms de la forme mysql?VERSION? , où VERSION est
un nombre (par exemple, 3.21.15 ), et OS indique le type de système d'exploitation pour
lequel la distribution est compilée (par exemple, pc?linux?gnu?i586 ).
Si vous voyez une distribution binaire avec le suffixe 
• 
?max , cela signifie que le binaire
supporte les tables avec les transactions ainsi que d'autres fonctionnalités. partir du même code source.
Ajoutez un utilisateur et un groupe avec les droits desquels 
• 
mysqld fonctionnera :
shell> groupadd mysql
shell> useradd ?g mysql mysql
Ces commandes ajoutent le groupe mysql group et l'utilisateur mysql . La syntaxe de
useradd et de groupadd peut varier de façon significative suivant les versions d'Unix.
Elles peuvent aussi s'appeler adduser et addgroup . Vous pouvez aussi souhaiter
nommer le groupe et l'utilisateur autrement que mysql .
Déplacez?vous dans le répertoire d'installation choisi :
• 
shell> cd /usr/local
Décompressez la distribution et créez le répertoire d'installation :
• 
shell> gunzip < /chemin/de/mysql?VERSION? | tar xvf ?
shell> ln ?s chemin?complet?de?mysql?VERSION?OS mysql
La première commande crée un répertoire mysql?VERSION?OS . La seconde commande
crée un lien symbolique vers ce répertoire. Cela vous permet de vous référer plus facilement
au répertoire d'installation en appelant /usr/local/mysql .
Déplacez vous dans le répertoire d'installation :
• 
 2.2.7 Installer MySQL à partir d'une distribution binaire
71

Manuel MySQL 4.1.x ? Version Française
shell> cd mysql
Vous y trouverez de nombreux fichiers et sous?répertoires. Les plus importants lors de
l'installation sont les sous?répertoires bin et scripts .
Si vous souhaitez utiliser 
• 
mysqlaccess et placer la distribution MySQL à un endroit non
standard, vous devez changer l'endroit où mysqlaccess s'attend à trouver le client mysql .
Editez le script bin/mysqlaccess aux environs de la ligne 18. Cherchez une ligne qui
ressemble à ceci :
$MYSQL     = '/usr/local/bin/mysql';    # path to mysql executable
Changez le chemin pour avoir le bon endroit où mysql est actuellement stocké sur votre
système. Si vous ne le faites pas, vous obtiendrez une erreur Broken pipe quand vous
lancerez mysqlaccess .
Créez les tables de privilèges MySQL (ceci est nécessaire si vous n'avez jamais installé
• 
MySQL auparavant) :
shell> scripts/mysql_install_db
Veuillez noter que les versions de MySQL antérieures à la version 3.22.10 démarraient le
serveur MySQL quand vous exécutiez mysql_install_db . Ce n'est plus le cas.
Nommez 
• 
root en tant que propriétaire des binaires et l'utilisateur avec les droits duquel
vous ferez fonctionner mysqld comme propriétaire du répertoire de données :
shell> chown ?R root  /usr/local/mysql
shell> chown ?R mysql /usr/local/mysql/var
shell> chgrp ?R mysql /usr/local/mysql
La première commande change les attributs owner en faveur de l'utilisateur root , la
seconde change les attributs owner du répertoire de données en faveur de l'utilisateur
mysql , et la troisième change les attributs group en faveur du groupe mysql .
Si vous voulez installer le support de l'interface Perl 
• 
DBI / DBD , référez?vous à
Si vous souhaitez que MySQL se lance automatiquement au démarrage de votre machine,
• 
vous pouvez copier support?files/mysql.server à l'endroit où votre système stocke
ses fichiers de démarrage. Davantage d'informations sont disponibles dans le script
support?files/mysql.serverautomatiquement .
Après que tout soit installé, vous devez initialiser et tester votre distribution :
shell> /usr/local/mysql/bin/safe_mysqld ??user=mysql &
consécutifs à l'installation .
2.3 Installer MySQL à partir des sources
Avant de procéder à l'installation à partir des sources, vérifiez auparavant que notre distribution
binaire pour votre plate?forme ne fonctionne pas. Nous faisons un maximum d'efforts pour nous
assurer que nos binaires sont compilés avec les meilleures options possibles.
Vous avez besoin des outils suivants pour compiler et installer MySQL à partir des sources :
GNU 
• 
gunzip pour décompresser la distribution.
Un programme 
• 
tar pour désarchiver la distribution. GNU tar est connu pour fonctionner.
Le tar de Sun connaît quelques problèmes.
Un compilateur C++ ANSI fonctionnel. 
• 
gcc >= 2.95.2, egcs >= 1.0.2 ou egcs 2.91.66 ,
SGI C++, et SunPro C++ sont quelques?uns des compilateurs réputés pour fonctionner.
libg++ n'est pas nécessaire si vous utilisez gcc . gcc 2.7.x souffre d'un bogue qui
l'empêche de compiler quelques fichiers C++ correctement écrits, tels que
 2.3 Installer MySQL à partir des sources
72

Manuel MySQL 4.1.x ? Version Française
 . Si vous disposez seulement de gcc 2.7.x, vous devez mettre à jour
votre gcc afin de compiler MySQL. gcc 2.8.1 est aussi reconnu pour rencontrer des
problèmes sur certaines plate?formes, il devrait donc être désactivé si un autre compilateur
existe pour la plate?forme.
gcc >= 2.95.2 est recommandé pour compiler MySQL dans ses versions 3.23.x.
Un bon programme 
• 
make . GNU make est une fois de plus recommandé et est quelquefois
requis. Si vous rencontrez des problèmes, nous vous recommandons d'essayer GNU make
3.75 ou supérieur.
Si vous utilisez une version récente de gcc , suffisamment récente pour reconnaître l'option
?fno?exceptions , il est très important que vous l'utilisiez. Sinon, vous risquez de compiler un
binaire qui crashe aléatoirement. Nous recommandons donc l'utilisation de
?felide?constructors et ?fno?rtti en même temps que ?fno?exceptions . En cas de
doute, faites la chose suivante :
CFLAGS="?O3" CXX=gcc CXXFLAGS="?O3 ?felide?constructors ?fno?exceptions \
       ?fno?rtti" ./configure ??prefix=/usr/local/mysql ??enable?assembler \
       ??with?mysqld?ldflags=?all?static
Sur la plupart des systèmes, il en résultera un binaire rapide et vous rencontrez des
problèmes, utilisez toujours mysqlbugMême si le problème n'est pas un bogue, mysqlbug rassemble des informations sur le système qui
aidera les autres à résoudre votre problème. En n'utilisant pas mysqlbug , vous amoindrissez vos
chances d'obtenir une solution à votre problème ! Vous trouverez mysqlbug dans le répertoire
scripts après avoir désarchivé la distribution. Comment rapporter des bogues ou problèmes .
2.3.1 Vue d'ensemble de l'installation rapide
Les commandes de base que vous devez exécuter pour installer MySQL à partir des sources sont :
shell> groupadd mysql
shell> useradd ?g mysql mysql
shell> gunzip < mysql? | tar ?xvf ?
shell> cd mysql?VERSION
shell> ./configure ??prefix=/usr/local/mysql
shell> make
shell> make install
shell> scripts/mysql_install_db
shell> chown ?R root  /usr/local/mysql
shell> chown ?R mysql /usr/local/mysql/var
shell> chgrp ?R mysql /usr/local/mysql
shell> cp support?files/my?
shell> /usr/local/mysql/bin/safe_mysqld ??user=mysql &
ou
shell> /usr/local/mysql/bin/mysqld_safe ??user=mysql &
si vous utilisez MySQL 4.x.
Si vous voulez avoir le support des tables InnoDB, vous devez éditer le fichier  et
enlever le caractère # avant le paramètre qui commence par  , et Options de démarrage InnoDB .Si vous utilisez un fichier RPM source, faites :
shell> rpm ??rebuild MySQL?
Cela produira un fichier RPM binaire que vous pourrez pouvez ajouter des utilisateurs
en lançant le script bin/mysql_setpermission si vous installez les modules Perl DBI et
Msql?Mysql?modules .
 2.3.1 Vue d'ensemble de l'installation rapide
73

Manuel MySQL 4.1.x ? Version Française
Ci?dessous, une description plus détaillée.
consécutifs à l'installation , pour la configuration et les tests consécutifs à l'installation :
Notez le répertoire où vous voulez décompacter les sources et déplacez vous y.
• 
Récupérez une distribution des sources à partir d'un des sites listés sur Comment obtenir
• 
Si vous souhaitez utiliser les tables Berkeley DB avec MySQL, vous devez obtenir une
• 
version modifiée du code source de Berkeley DB. Veuillez lire le chapitre relatif aux tables
Berkeley DB avant de procéder. Tables BDB ou BerkeleyDB .Les distributions des sources
MySQL sont fournies sous forme d'archive tar compressées et ont des noms comme
mysql? , où VERSION est un nombre comme 4.0.5a.
Ajoutez un utilisateur et un groupe avec les droits desquels 
• 
mysqld fonctionnera :
shell> groupadd mysql
shell> useradd ?g mysql mysql
Ces commandes ajoutent le groupe mysql group et l'utilisateur mysql . La syntaxe de
useradd et de groupadd peut varier de façon significative suivant les versions d'Unix.
Elles peuvent aussi s'appeler adduser et addgroup . Vous pouvez aussi souhaiter
nommer le groupe et l'utilisateur autrement que mysql .
Décompressez la distribution dans le répertoire courant :
• 
shell> gunzip < /path/to/mysql? | tar xvf ?
Cette commande crée un répertoire nommé mysql?VERSION .
Déplacez?vous dans le répertoire racine de la distrbution décompressée :
• 
shell> cd mysql?VERSION
Notez bien que vous devez alors configurer et compiler MySQL depuis ce répertoire racine.
Vous ne pouvez pas le compiler à partir d'un autre répertoire.
Configurez votre version et compilez tout :
• 
shell> ./configure ??prefix=/usr/local/mysql
shell> make
Quand vous lancez la commande configure , vous pouvez spécifier quelques options.
Lancez ./configure ??helpoptions habituelles de configure , traite des options les plus  configure échoue,
l'aide, ajoutez s'il vous plait les quelques lignes de  qui pourraient selon vous
aider à résoudre le problème. Ajoutez aussi les deux dernières lignes de sortie de
configure si configure s'arrête précipitemment. Envoyez le rapport de bogue en
utilisant le script mysqlbug . Comment rapporter des bogues ou problèmes .
sur les problèmes les plus courants.
Installez tout :
• 
shell> make install
Vous aurez certainement besoin de lancer cette commande en tant que root .
Créez les tables de gestion des droits MySQL (ceci est nécessaire uniquement si vous
• 
n'avez pas installé MySQL auparavant):
shell> scripts/mysql_install_db
Veuillez noter que les versions de MySQL antérieures à la version 3.22.10 démarraient le
serveur MySQL quand vous exécutiez mysql_install_db . Ce n'est plus le cas!
Nommez 
• 
root en tant que propriétaire des binaires et l'utilisateur avec les droits duquel
vous ferez fontionner mysqld comme propriétaire du répertoire de données :
shell> chown ?R root  /usr/local/mysql
shell> chown ?R mysql /usr/local/mysql/var
shell> chgrp ?R mysql /usr/local/mysql
 2.3.1 Vue d'ensemble de l'installation rapide
74

Manuel MySQL 4.1.x ? Version Française
La première commande change les attributs owner en faveur de l'utilisateur root , la
seconde change les attributs owner du répertoire de données en faveur de l'utilisateur
mysql , et la troisième change les attributs group en faveur du groupe mysql .
Si vous voulez installer le support de l'interface Perl 
• 
DBI / DBD , référez?vous à
Si vous souhaitez que MySQL se lance automatiquement au démarrage de votre machine,
• 
vous pouvez copier support?files/mysql.server à l'endroit où votre système stocke
ses fichiers de démarrage. Davantage d'informations sont disponibles dans le script
support?files/mysql.serverautomatiquement .
Après que tout soit installé, vous devez initialiser et tester votre distribution :
shell> /usr/local/mysql/bin/safe_mysqld ??user=mysql &
Si cette commande échoue immédiatement sur un mysqld daemon ended , vous pouvez trouvez
des informations dans le fichier mysql?data?directory/'hostname'.err . La raison la plus
courante est que vous avez déjà un autre serveur mysqldconsécutifs à l'installation .
2.3.2 Appliquer des patches
Parfois, des patches sont publiés sur la liste de diffusion ou sont placés sur la page des patches sur
la liste de diffusion, sauvegardez le message qui contient le patch, placez?le dans le répertoire
racine de vos sources MySQL et lancez les commandes suivantes :
shell> patch ?p1 < patch?file?name
shell> rm config.cache
shell> make clean
Les patches venant du site FTP sont distribués sous forme de fichiers en texte clair ou bien sous
forme de fichiers compressés avec gzip . Appliquez un patch en texte clair de la même façon
qu'avec les patches de la liste de diffusion. Pour appliquer un patch compressé, déplacez?vous
dans le répertoire racine de vos sources et lancez les commandes suivantes :
shell> gunzip < patch?file? | patch ?p1
shell> rm config.cache
shell> make clean
Après avoir appliqué un patch, suivez les instructions d'une installation normale à partir des
sources, à commencer par l'étape du ./configure . Après avoir lancé le make install ,
redémarrez votre serveur MySQL.
Vous aurez certainement besoin d'arrêter tout autre serveur MySQL avant de lancer make
install . (Utilisez pour cela mysqladmin shutdown .) Certains systèmes n'autorisent pas
l'installation d'une nouvelle version d'un programme ; elle remplace la version qui est en train de
s'exécuter.
2.3.3 Options habituelles de configure
Le script configure vous donne un bon moyen de contrôler la configuration de votre distribution
MySQL. Habituellement, vous faites cela en spécifiant les options dans la ligne de commande de
configure . Vous pouvez aussi affecter le comportement de configure en utilisant certaines
 2.3.2 Appliquer des patches
75

Manuel MySQL 4.1.x ? Version Française
supportées par configure , exécutez cette commande :
shell> ./configure ??help
Les options de configure les plus utilisées sont décrites ici :
Pour ne compiler que les librairies et programmes clients, et non le serveur, utilisez l'option
• 
??without?server :
shell> ./configure ??without?server
Si vous n'avez pas de compilateur C++, mysql ne compilera pas (c'est le programme client
qui requière C++). Dans ce cas, vous pouvez supprimer la partie de code dans configure
qui vérifie l'existence d'un compilateur C++, puis exécuter ./configure avec l'option
??without?server . La compilation essaiera encore de construire mysql , mais vous
pouvez ignorer les messages d'erreurs concernant  . (Si make stoppe, essayez
make ?k pour dire de continuer même si on rencontre des erreurs.)
Si vous voulez obtenir une librairie MySQL embarquée ( 
• 
libmysqld.a ) vous devez utiliser
l'option ??with?embedded?server .
Si vous ne voulez pas que vos fichiers de log et bases de données soient dans
• 
/usr/local/var , utiliser une commande configure se rapprochant de l'une des
commandes suivantes :
shell> ./configure ??prefix=/usr/local/mysql
shell> ./configure ??prefix=/usr/local \
           ??localstatedir=/usr/local/mysql/data
La première change le préfixe de l'installation pour que tout soit installé dans
/usr/local/mysql au lieu de /usr/local par défaut. La seconde commande préserve
le préfixe d'installation par défaut mais change le répertoire par défaut pour les bases de
données (normalement /usr/local/var ) en /usr/local/mysql/data . Après que
vous ayez compilé MySQL, vous pouvez changer ces options dans les fichiers d'options.
Fichier d'options  .
Si vous utilisez Unix et que vous voulez que la socket de MySQL soit à un autre endroit que
• 
celui par défaut (normalement /tmp ou /var/run ) utilisez une commande configure
comme celle?ci :
shell> ./configure ??with?unix?socket?
Notez que le fichier donné doit avoir un chemin absolu ! Vous pourrez aussi changer le
chemin vers mysql.sockprotéger  .
Si vous voulez compiler des programmes liés statiquement (par exemple, pour créer une
• 
distribution binaire, pour obtenir plus de vitesse, ou pour résoudre des problèmes avec
quelques distributions RedHat Linux), exécutez configure de la manière suivante :
shell> ./configure ??with?client?ldflags=?all?static \
           ??with?mysqld?ldflags=?all?static
Si vous utilisez 
• 
gcc et n'avez pas libg++ ou libstdc++ d'installés, vous pouvez dire à
configure d'utiliser gcc en tant que compilateur C++ :
shell> CC=gcc CXX=gcc ./configure
Quand vous utilisez gcc en tant que compilateur C++, aucune tentative de liaison avec
libg++ ou libstdc++ ne sera effectuée. Il peut être bon d'utiliser cette méthode même si
vous avez les librairies citées, car quelques versions de celles?ci ont causé des problèmes
à des utilisateurs MySQL par le passé.Voici quelques variables d'environnement à définir
selon le compilateur que vous utilisez :
Compilateur
Options recommandées
gcc 2.7.2.1
CC=gcc CXX=gcc CXXFLAGS="?O3 ?felide?constructors"
CC=gcc CXX=gcc CXXFLAGS="?O3 ?felide?constructors
egcs 1.0.3a
?fno?exceptions ?fno?rtti"
gcc 2.95.2
 2.3.2 Appliquer des patches
76

Manuel MySQL 4.1.x ? Version Française
CFLAGS="?O3 ?mpentiumpro" CXX=gcc CXXFLAGS="?O3
?mpentiumpro \ ?felide?constructors ?fno?exceptions ?fno?rtti"
CFLAGS="?O3 ?mpentiumpro ?mstack?align?double" CXX=gcc \
pgcc 2.90.29 ou
CXXFLAGS="?O3 ?mpentiumpro ?mstack?align?double
plus récent
?felide?constructors \ ?fno?exceptions ?fno?rtti"
Dans la plupart des cas, vous pouvez obtenir un binaire MySQL raisonnablement optimal en
utilisant les options de la table précédente et en ajoutant les options suivantes aux lignes de
configuration :
??prefix=/usr/local/mysql ??enable?assembler \
??with?mysqld?ldflags=?all?static
En d'autres termes, la ligne de configuration ressemble à ce qui suit pour les versions
récentes de gcc :
CFLAGS="?O3 ?mpentiumpro" CXX=gcc CXXFLAGS="?O3 ?mpentiumpro \
?felide?constructors ?fno?exceptions ?fno?rtti" ./configure \
??prefix=/usr/local/mysql ??enable?assembler \
??with?mysqld?ldflags=?all?static
compilés avec une optimisation totale et devraient être parfaits pour la plupart des
pouvez modifier pour rendre le binaire encore plus rapide, mais cela est réservé aux
utilisateurs avancés. Comment la compilation et les liaisons affectent la vitesse de MySQL .
Si la génération échoue et produit des erreurs disant que votre compilateur ou outil de
liaison n'est pas capable de créer la librairie partagée .# ( '#' étant
un numéro de version), vous pouvez contourner ce problème en donnant l'option
??disable?shared à configure . Dans ce cas, configure ne générera pas de librairie
partagée .# .
Vous pouvez configurer MySQL pour qu'il n'utilise pas les valeurs 
• 
DEFAULT pour les
colonnes non? NULL (c'est à dire, les colonnes qui ne peuvent être NULL ). Cela fait générer
des erreurs aux requêtes INSERT si vous ne spécifiez pas explicitement une valeur pour
toutes les colonnes non? NULL . Pour supprimer l'utilisation des valeurs par défaut,
exécutez configure de cette façon :
shell> CXXFLAGS=?DDONT_USE_DEFAULT_FIELDS ./configure
Par défaut, MySQL utilise le jeu de caractères ISO?8859?1 (Latin1). Pour changer le jeu par
• 
défaut, utilisez l'option ??with?charset :
shell> ./configure ??with?charset=CHARSET
CHARSET peut être l'un des big5 , cp1251 , cp1257 , czech , danish , dec8 , dos ,
euc_kr , gb2312 , gbk , german1 , hebrew , hp8 , hungarian , koi8_ru , koi8_ukr ,
latin1 , latin2 , sjis , swe7 , tis620 , ujis , usa7 , ou win1251ukrentre le serveur et le client, regardez du côté de la commande SET CHARACTER SET .
Syntaxe de SET .
Attention : Si vous changez les jeux de caractères après avoir crée des tables, vous devrez
exécuter myisamchk ?r ?q ??set?character?set=charset sur chaque table. Vous
index pourraient être stockés de manière incorrecte sinon. (Cela peut survenir si vous
installez MySQL, créez quelques tables, puis reconfigurez MySQL pour qu'il utilise un jeu de
caractères différent et le réinstallez.)
Avec l'option ??with?extra?charsets=LIST vous pouvez définir les jeux de caractères
additionnels à compiler dans le serveur.
Ici LIST est soit une liste de jeux de caractères séparés par des espaces, soit complex
pour inclure tous les jeux de caractères ne pouvant être chargés dynamiquement, ou encore
all pour inclure tous les jeux de caractères dans les binaires.
 2.3.2 Appliquer des patches
77

Manuel MySQL 4.1.x ? Version Française
Pour configurer MySQL avec le code de débogage, utilisez l'option 
• 
??with?debug :
shell> ./configure ??with?debug
Cela alloue un vérificateur d'allocation de mémoire qui peut trouver quelques erreurs et qui
Si vos programmes clients utilisent les threads, vous avez besoin de compiler une version
• 
sûre pour les threads de la librairie du client MySQL avec l'option de configuration
??enable?thread?safe?client . Cela créera une librairie libmysqlclient_r avec
Les options relatives à un système d'exploitation particulier peuvent être trouvées dans la
• 
d'exploitation .
2.3.4 Installer à partir de l'arbre source de développement
Attention : Vous devez lire cette partie seulement si vous voulez nous aider à tester notre nouveau
code. Si vous souhaitez seulement faire fonctionner MySQL sur votre système, vous devriez utiliser
la distribution d'une version standard (que ce soit une distribution sous forme de sources ou de
binaire).
Pour obtenir notre arbre source de développement le plus réent, suivez les instructions suivantes :
Téléchargez 
• 
BitKeeper à partir de ? . Vous
aurez besoin de Bitkeeper 2.0 ou supérieur pour accéder à notre dépôt.
Suivez les instructions pour l'installer.
• 
Après avoir installé 
• 
BitKeeper , commencez par vous déplacer dans le répertoire à partir
duquel vous voulez travailler, et lancez l'une des commandes suivantes pour dupliquer la
branche MySQL de votre choix :Pour dupliquer la branche 3.23, utilisez cette commande :
shell> bk clone :7000 mysql?3.23
Pour dupliquer la branche 4.0, utilisez cette commande :
shell> bk clone :7001 mysql?4.0
Pour dupliquer la branche 4.1, utilisez cette commande :
shell> bk clone :7004 mysql?4.1
Dans les exemples précédents, l'arbre source sera déposé dans les sous?répertoires
mysql?3.23/ , mysql?4.0/ , ou mysql?4.1/ de votre répertoire premier
téléchargement de l'arbre source peut prendre un certain temps, selon la vitesse de votre
connexion. Soyez patients.
Vous aurez besoin de GNU 
• 
autoconf 2.52 , de automake 1.5 , de libtool 1.4 , et
de m4 pour lancer la prochaine série de commandes.
shell> cd mysql?4.0
shell> bk ?r get ?Sq
shell> aclocal; autoheader; autoconf;  automake;
shell> ./configure  # Ajoutez ici vos options favorites
shell> make
Si vous obtenez des erreurs étranges pendant cette étape, vérifiez bien que vous avez
vraiment installé libtool !
Une collection de nos scripts de configuration les plus courants de trouve dans le
sous?répertoire BUILD/ . Si vous êtes fainéants, vous pouvez utiliser
BUILD/compile?pentium?debug . Pour compiler sur une architecture différente,
modifiez ce script en enlevant les drapeaux spécifiques au Pentium.
Quand la compilation est achevée, lancez 
• 
make install . Prenez garde sur des machines
de production. Cette commande pourrait écraser votre installation actuelle. Si vous avez une
autre installation de MySQL, nous vous recommandons de lancer ./configure avec des
valeurs des options prefix , with?tcp?port , et unix?socket?path différentes de
 2.3.4 Installer à partir de l'arbre source de développement
78

Manuel MySQL 4.1.x ? Version Française
celles de votre serveur de production.
Torturez votre nouvelle installation et tentez de faire planter les nouvelles fonctionnalités.
• 
Commencez par lancer make testSi vous avez échoué avec l'étape 
• 
make et que la distribution ne compile pas, envoyez un
indispensables outils GNU, et qu'ils échouent dans l'analyse de vos fichiers de configuration,
envoyez aussi un rapport. D'autre part, si vous exécutez aclocal et que vous obtenez
l'erreur command not found ou un problème du même type, n'envoyez pas de rapport. A
la place, assurez vous que les outils nécessaires sont bien installés et que votre variable
PATH est configurée de telle façon que votre interpréteur de commandes les trouvent.
Après la première opération 
• 
bk clone pour obtenir l'arbre source, vous devez lancer
régulièrement bk pull pour obtenir les mises à jour.
Vous pouvez examiner l'historique des changements de l'arbre avec toutes les différences
• 
en utilisant bk sccstool . Si vous apercevez des différences anormales ou sur lesquelles
De même, si vous pensez avoir une meilleure méthode pour traiter un problème, envoyez
un e?mail accompagné d'un patch à la même adresse. bk diffs vous fournira un patch
après que vous ayez fait vos changements aux sources. Si vous n'avez pas le temps de
coder votre idée, envoyez en juste une description.
BitKeeper
• 
 dispose d'une aide agréable à laquelle vous pouvez accéder via bk helptool
.
Veuillez noter que chaque commit ( 
• 
bk ci ou bk citool ) postera un message avec un
aperçu des changements à notre liste de diffusion interne, à la façon habituelle des
propositions avec seulement les commentaires des changements.
Généralement, vous n'aurez pas besoin d'utiliser commit (l'arbre public interdisant les bk
push ), mais plutôt d'utiliser la méthode bk diffs décrite plus haut.
2.3.5 Problèmes de compilation?
Tous les programmes MySQL compilent proprement chez nous, sans aucune alerte sur Solaris
avec gcc . Sur d'autres systèmes, des alertes peuvent apparaître à cause de différences dans le
avec MIT?pthreads. Pour d'autres problèmes, voyez la liste suivante.
La solution à de nombreux problèmes implique une reconfiguration. Si vous avez besoin de faire
une reconfiguration voici quelques conseils généraux :
Si 
•  configure est exécuté après une première exécution, il peut utiliser des informations
qui ont été rassemblées durant une première invocation. Ces informations sont stockées
dans le fichier config.cache . Lorsque configure est lancé, il commence par regarder
dans ce fichier, et lire le contenu qui existe, en supposant que ces données sont toujours
correctes. Cette supposition est invalide si vous faîtes une reconfiguration.
Chaque fois que vous exécutez 
• 
configure , vous devez exécuter à nouveau make pour
recompiler. Toutefois, vous devrez peut être supprimer les vieux fichiers d'objets qui ont été
compilé en utilisant différentes configurations précédentes.
Pour éviter d'utiliser de vieilles informations de configuration, ou des vieux fichiers d'objet, vous
pouvez utiliser ces commandes, avant configure :
shell> rm config.cache
shell> make clean
Alternativement, vous pouvez aussi utiliser make distclean .La liste suivante décrit certains
problèmes lors de la compilation de MySQL, qui surviennent souvent :
 2.3.5 Problèmes de compilation?
79

Manuel MySQL 4.1.x ? Version Française
Si vous avez des problèmes lors de la compilation de 
• 
 , comme ceux qui sont
décrits ci?dessous, vous avez probablement été à court de mémoire ou d'espace de swap :
Internal compiler error: program cc1plus got fatal signal 11
  ou
Out of virtual memory
  ou
Virtual memory exhausted
Le problème est que gcc requiert de grandes quantité de mémoire pour compiler
 avec les fonctions inline. Essayez d'exécuter configure avec l'option
??with?low?memory :
shell> ./configure ??with?low?memory
Cette option ajoute ?fno?inline dans la ligne de compilation, si vous utilisez gcc et ?O0
si vous utilisez autre chose. Vous pouvez essayer ??with?low?memory même si il vous
reste suffisamment de mémoire, et que vous ne pensez pas être limité. Ce problème a été
observé sur des systèmes avec de généreuses configurations, et ??with?low?memory
résout ce problème.
Par défaut, 
• 
configure choisit c++ comme compilateur, et GNU c++ pour les liens avec
?lg++ . Si vous utilisez gcc , ce comportement peut poser les problèmes suivants :
configure: error: installation or configuration problem:
C++ compiler cannot create executables.
Vous pourriez aussi observer des problèmes durant la compilation, avec g++ , libg++ ou
libstdc++ .La cause de ces problèmes est que vous avez peut être que vous n'avez pas
g++ , ou que vous avez g++ mais pas libg++ , ou libstdc++ . Regardez le fichier de log
 . Il va sûrement contenir la raison exacte du mauvais fonctionnement de votre
compilateur. Pour contourner ce problème, vous pouvez utiliser gcc comme compilateur
C++. Essayez de modifier la variable d'environnement CXX avec la valeur "gcc ?O3" . Par
exemple :
shell> CXX="gcc ?O3" ./configure
Cela fonctionne car gcc compile les sources C++ aussi bien que g++ , mais il n'est pas lié
avec libg++ ou libstdc++ par dé autre moyen pour régler ces problèmes, bien
sur, est d'installer g++ , libg++ et libstdc++ . Nous vous recommandons toutefois de ne
pas utiliser libg++ ou libstdc++ avec MySQL car cela ne fera qu'accroître la taille de
votre exécutable binaire, sans vous apporter d'avantages. Par le passé, certaines versions
de ces librairies ont posé des problèmes étranges aux utilisateurs MySQL.
Si votre compilation échoue avec des erreurs, ou si l'une des erreurs suivantes apparaît,
• 
vous devez changer la version de make en GNU make :
making all in mit?pthreads
make: Fatal error in reader: Makefile, line 18:
Badly formed macro assignment
  ou
make: file `Makefile' line 18: Must be a separator (:
  ou
pthread.h: No such file or directory
Solaris et FreeBSD sont connus pour avoir des problèmes avec make .
GNU make version 3.75 est reconnu pour fonctionner.
Si vous voulez définir des options supplémentaires qui seront utilisées par votre compilateur
• 
C ou C++, faites le en ajoutant ces options aux variables d'environnement CFLAGS et
CXXFLAGS . Vous pouvez aussi spécifier le nom du compilateur via les variables CC et CXX .
Par exemple :
shell> CC=gcc
shell> CFLAGS=?O3
shell> CXX=gcc
shell> CXXFLAGS=?O3
shell> export CC CFLAGS CXX CXXFLAGS
options disponibles sur divers systèmes.
 2.3.5 Problèmes de compilation?
80

Manuel MySQL 4.1.x ? Version Française
Si vous obtenez un message d'erreur comme celui?ci, vous devrez mettre à jour votre
• 
version de gcc :
client/libmysql.c:273: parse error before `__attribute__'
gcc 2.8.1 est connu pour fonctionner, mais nous recommandons l'utilisation de gcc 2.95.2
ou egcs 1.0.3a.
Si vous obtenez des erreurs telles que celles qui sont affichées ci?dessous lors de la
• 
compilation de mysqld , c'est que configure n'a pas correctement détecter le dernier
argument des fonctions accept() , getsockname() ou getpeername() :
cxx: Error: , line 645: In this statement, the referenced
     type of the pointer value "&length" is "unsigned long", which
     is not compatible with "int".
new_sock = accept(sock, (struct sockaddr *)&cAddr, &length);
Pour corriger ce problème, éditez le fichier config.h (qui est généré par le fichier
configure ). Recherchez ces lignes :
/* Define as the base type of the last arg to accept */
#define SOCKET_SIZE_TYPE XXX
Remplacez XXX par size_t ou int , suivant votre système d'exploitation. Notez que vous
devrez faire cette manipulation à chaque fois que vous exécuterez le script configure car
configure regénère config.h .
Le fichier 
• 
 est généré à partir du fichier  . Normalement, le
processus de création ne s'occupe pas de  , car MySQL en a déjà une copie.
Cependant, si vous devez le recréer, vous pouvez rencontrer cette erreur :
"", line xxx fatal: default action causes potential...
Cela indique que votre version de yacc est inadéquate. Vous devrez probablement
réinstaller bison (la version GNU de yacc ) et l'utiliser à la place.
Si vous avez besoin de déboguer 
• 
mysqld ou un client MySQL, exécutez le script
configure avec l'option ??with?debug , puis recompilez vos clients avec la nouvelle
librairie. Déboguer un client MySQL .
2.3.6 Notes relatives aux MIT?pthreads
Cette section décrit quelques informations concernant l'utilisation des MIT?pthreads.
Notez que sur Linux vous ne devez pas utiliser les MIT?pthreads mais installer LinuxThreads !
Notes relatives à Linux (toutes les versions de Linux) .
Si votre système ne fournit pas un support nattif des threads, vous aurez besoin de construire
MySQL en utilisant le package des MIT?pthreads. Cela inclut les anciens systèmes FreeBSD,
plus partie de la distribution des sources ! si vous avez besoin de ce package, vous pouvez l'obtenir
récupéré, décompressez l'archive dans le répertoire racine de votre répertoire des sources de
MySQL. Cela créera le répertoire mit?pthreads .
Sur la plupart des systèmes, vous pouvez forcer l'utilisation des MIT?pthreads en exécutant
• 
configure avec l'option ??with?mit?threads :
shell> ./configure ??with?mit?threads
La compilation dans un dossier non?sources n'est pas supporté lors de l'utilisation des
MIT?pthreads car nous voulons minimiser les changements de leur code.
La vérification pour l'utilisation des MIT?pthreads ne survient que durant la partie du
• 
processus de configuration qui s'occupe du code du serveur. Si vous avez configuré la
distribution en utilisant ??without?server pour ne construire que le client, les clients ne
sauront pas si les MIT?pthreads sont utilisés et utiliserons les socket Unix pour les
 2.3.6 Notes relatives aux MIT?pthreads
81

Manuel MySQL 4.1.x ? Version Française
connexions par défaut. Puisque les sockets Unix ne fonctionnent pas avec les MIT?pthreads
sur certaines plate?formes, cela signifie que vous devrez utiliser ?h ou ??host quand vous
exécuterez les programmes clients.
Lorsque MySQL est compilé en utilisant les MIT?pthreads, le verrouillage système est
• 
désactivé par défaut pour des soucis de performances. Vous pouvez demander au serveur
d'utiliser les verrous systèmes avec l'option ??external?locking . Cela n'est requis que
si vous avez besoin de faire fonctionner deux serveurs MySQL avec les mêmes données
(non recommandé).
De temps en temps, la commande 
• 
bind() des pthreads n'arrive pas à attacher une socket
sans afficher d'erreurs (du mois, sous Solaris). Le résultat est que toutes les connexions au
serveur échouent. Par exemple :
shell> mysqladmin version
mysqladmin: connect to server at '' failed;
error: 'Can't connect to mysql server on localhost (146)'
La solution est de terminer le serveur mysqld et de le redémarrer. Cela ne nous est arrivé
que quand nous avons forcé le serveur à se terminer et que nous l'avons redémarré
immédiatement après.
Avec les MIT?pthreads, l'appel système à 
• 
sleep() n'est pas interruptible avec SIGINT
(break). On ne s'en rend compte qua quand on exécute mysqladmin ??sleep . Vous
devez attendre que l'appel système à sleep() se termine avant que le processus ne
s'arrête.
Lors de la liaison, vous pouvez obtenir des messages d'erreurs comme ceux?ci (du moins
• 
sur Solaris); ils peuvent être ignorés :
ld: warning: symbol `_iob' has differing sizes:
    (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4;
file value=0x140);
    /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken
ld: warning: symbol `__iob' has differing sizes:
    (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4;
file value=0x140);
    /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken
D'autres avertissements peuvent être ignorés :
• 
implicit declaration of function `int strtoll(...)'
implicit declaration of function `int strtoul(...)'
Nous n'avons pas réussi à faire fonctionner 
• 
readline avec les MIT?pthreads. (Cela n'est
pas nécessaire, mais peut être utile à quelqu'un.)
2.3.7 La distribution source Windows
Vous aurez besoin de :
Un compilateur VC++ 6.0 (mis à jour avec 4 ou 5 SP et le paquet Pré?processeur) Le
• 
paquet Pré?processeur est nécessaire pour l'assembleur de macros. D'avantage de détails
La distribution source MySQL pour Windows, qui peut être obtenue sur
• 
.
Compiler MySQL
Créez un répertoire de travail (par exemple, workdir)
• 
Décompressez la distribution source dans ce répertoire.
• 
Lancez le compilateur VC++ 6.0.
• 
Dans le menu 
• 
Fichier , sélectionnez Ouvrir un espace de travail .
Ouvrez l'espace de travail 
• 
 que vous trouverez dans le répertoire de travail.
Dans le menu 
• 
Générer , sélectionnez le menu Choisir la configuration active .
 2.3.7 La distribution source Windows
82

Manuel MySQL 4.1.x ? Version Française
Choisissez 
• 
mysqld ? Win32 Debug puis cliquez sur OK.
Appuyez sur 
• 
F7 pour commencer à compiler le serveur de débogage, les bibliothèques, et
quelques applications clientes.
Quand la compilation est terminée, copiez les bibliothèques et les exécutables dans un
• 
répertoire séparé.
Compilez les versions que vous souhaitez de la même manière.
• 
Créez le répertoire pour les outils MySQL : par exemple, 
• 
c:\mysql
A partir du répertoire workdir, copiez les répertoires suivants dans c:\mysql :
• 
Data

Docs

Share

Créez le répertoire 
• 
c:\mysql\bin et copier toutes les applications serveur et client
compilées auparavant.
Si vous le souhaitez, vous pouvez aussi créer le répertoire 
• 
lib et y copier les librairies
compilées auparavant.
Faites un nettoyage en utilisant Visual Studio.
• 
l'environnement MySQL sous Windows .
2.4 Configuration après l'installation, et tests
Une fois que vous avez installé MySQL (que ce soit avec les sources ou avec la distribution
binaire), vous devez initialiser les tables de droits, démarrer le serveur et vous assurer que tout
fonctionne bien. Vous pouvez aussi vouloir configurer le démarrage et l'extinction automatique du
serveur.
Normalement, vous installez les tables de droits et démarrez le serveur comme ceci, pour une
distribution source :
shell> ./scripts/mysql_install_db
shell> cd mysql_installation_directory
shell> ./bin/safe_mysqld ??user=mysql &
Pour une distribution binaire (pas un RPM ou un package), faites ceci :
shell> cd mysql_installation_directory
shell> ./bin/mysql_install_db
shell> ./bin/safe_mysqld ??user=mysql &
Cela crée la base mysql qui va contenir tous les droits, ainsi que la base test, que vous pouvez
utiliser pour tester MySQL, ainsi que les droits pour l'utilisateur qui fait fonctionner
mysql_install_db et un utilisateur root (sans mots de passe). Cela va aussi démarrer le
serveur mysqld .
mysql_install_db ne va pas écraser d'anciens droits installé, et il peut être utilisé en toutes
circonstances. Si vous ne voulez pas de base test , vous pouvez la supprimer avec la commande
mysqladmin ?u root drop test .
Les tests sont plus facilement exécuté depuis le niveau supérieur de la distribution MySQL. Pour la
distribution binaire, c'est votre dossier d'installation (typiquement, /usr/local/mysql ). Pour une
distribution source, c'est le dossier principal de votre dossier source MySQL.
Dans les commandes présentées dans cette section et dans les sous sections suivantes, BINDIR
est le chemin jusqu'au programmes binaires de la distribution, comme mysqladmin et
safe_mysqld . Pour une distribution binaire, il s'agit du dossier bin dans la distribution. Pour une
distribution source, BINDIR vaut sûrement /usr/local/bin , à moins que vous ne spécifiez un
 2.4 Configuration après l'installation, et tests
83

Manuel MySQL 4.1.x ? Version Française
dossier d'installation différent que /usr/local avec le script configure . EXECDIR est le chemin
jusqu'au serveur mysqld . Pour une distribution binaire, c'est la même valeur que BINDIR . Pour
une distribution source, EXECDIR est probablement /usr/local/libexec .
Les tests sont décrits en détails :
Si besoin, démarrez le serveur 
• 
mysqld et modifiez les tables initiales de droits de MySQL
qui contiennent les privilèges qui déterminent les droits de connexion des utilisateurs au
serveur. Cela se fait normalement avec le script mysql_install_db :
shell> scripts/mysql_install_db
Typiquement, mysql_install_db doit être exécuté uniquement lors de votre première
installation de MySQL. Par conséquent, si vous faites évoluer une installation, vous pouvez
éviter cette étape. Cependant, mysql_install_db est tout à fait sécuritaire, et vous ne
modifiera pas des tables existants, alors dans le doute, vous pouvez toujours utiliser
mysql_install_db .
mysql_install_db crée six tables ( user , db , host , tables_priv , columns_priv ,
and func ) dans la base mysql database. Une description des droits initiaux est proposé
permettront au root MySQL de faire ce qu'il souhaite, et notamment, d'autoriser la création
et l'utilisation de la base test ou dont le nom commence par test_ .
Si vous ne configurez pas les tables de droits, l'erreur suivante va apparaître dans le fichier
de log, au démarrage du serveur :
mysqld: Can't find file: ''
Cela peut aussi arriver avec la distribution binaire de MySQL, si vous ne démarrez pas
MySQL exactement avec  pouvez avoir besoin d'exécuter mysql_install_db en tant que root . Toutefois, si
vous pouvez exécuter le serveur MySQL en tant qu'utilisateur avec peu de droits (non?root),
tant que cet utilisateur a les droits de lecture et d'écriture dans le dossier de données. Les
instructions pour faire fonctionner MySQL avec un autre utilisateur sont données dans le
chapitre Comment faire tourner MySQL en tant qu'utilisateur normal .
Si vous avez des problèmes avec mysql_install_dbmysql_install_db .
Il y des alternatives à l'utilisation de mysql_install_db tel qu'il est fourni dans la
distribution MySQL :
Vous pouvez éditer le script 

mysql_install_db avant de l'exécuter, pour modifier
les droits initiaux qui sont implantés dans les tables de droits. C'est pratique si vous
voulez installer MySQL sur de nombreuses machines, avec les mêmes droits. Dans
ce cas, vous aurez probablement à ajouter quelques insertions INSERT dans les
tables  et  !
Si vous voulez modifier des éléments dans la table de droits après les avoir installé,

vous pouvez exécuter mysql_install_db , puis utiliser mysql ?u root mysql
pour vous connecter aux tables de droit en tant que root MySQL, et exécuter les
commandes SQL nécessaires, directement dans les tables de droits.
Il est possible de recréer complètement les tables de droits une fois qu'elles ont été

créées. Vous pouvez faire cela si vous avez déjà installé les tables, mais que vous
voulez les recréer après édition de mysql_install_db .
MySQL .
 2.4 Configuration après l'installation, et tests
84

Manuel MySQL 4.1.x ? Version Française
Démarrez le serveur MySQL comme ceci :
• 
shell> cd mysql_installation_directory
shell> bin/safe_mysqld &
Utilisez 
• 
mysqladmin pour vérifier que le serveur fonctionne. Les commandes suivantes
fournissent un accès simple pour tester si le serveur fonctionne correctement :
shell> BINDIR/mysqladmin version
shell> BINDIR/mysqladmin variables
Le résultat de mysqladmin version varie suivant votre plate?forme et votre version de
MySQL, mais il doit être similaire à ceci :
shell> BINDIR/mysqladmin version
mysqladmin  Ver 8.14 Distrib 3.23.32, for linux on i586
Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license.
Server version          3.23.32?debug
Protocol version        10
Connection              Localhost via Unix socket
TCP port                3306
UNIX socket            
Uptime:                 16 sec
Threads: 1  Questions: 9  Slow queries: 0
Opens: 7  Flush tables: 2  Open tables: 0
Queries per second avg: 0.000
Memory in use: 132K  Max memory used: 16773K
Pour savoir ce que vous pouvez faire d'autre avec BINDIR/mysqladmin , appelez le avec
l'option ??help .
Vérifiez que vous pouvez éteindre le serveur :
• 
shell> BINDIR/mysqladmin ?u root shutdown
Verifiez que vous pouvez redémarrer le serveur. Faites cela avec 
• 
safe_mysqld ou
directement avec mysqld . Par exemple :
shell> BINDIR/safe_mysqld ??log &
Si safe_mysqld échoue, essayez d'exécuter MySQL depuis le dossier d'installation (si
Exécutez un test simple pour vérifier que le serveur fonctionne. Le résultat devrait être
• 
similaire à ces lignes ci :
shell> BINDIR/mysqlshow
+???????????+
| Databases |
+???????????+
| mysql     |
+???????????+
shell> BINDIR/mysqlshow mysql
Database: mysql
+??????????????+
|    Tables    |
+??????????????+
| columns_priv |
| db           |
| func         |
| host         |
| tables_priv  |
| user         |
+??????????????+
 2.4 Configuration après l'installation, et tests
85

Manuel MySQL 4.1.x ? Version Française
shell> BINDIR/mysql ?e "SELECT host,db,user FROM db" mysql
+??????+????????+??????+
| host | db     | user |
+??????+????????+??????+
| %    | test   |      |
| %    | test_% |      |
+??????+????????+??????+
Il y a aussi la suite de performances dans le dossier sql?bench (dans le dossier
d'installation MySQL) que vous pouvez utiliser pour comparer les performances de MySQL
avec d'autres plate?formes. Le dossier sql?bench/Results contient le résultat de
nombreux tests avec différentes bases et plate?forme. Pour exécuter tous les tests,
exécutez cette commande :
shell> cd sql?bench
shell> run?all?tests
Si vous n'avez pas de dossier sql?bench , vous utilisez probablement une distribution
binaire au format RPM. Les distribution source RPM incluent le dossier de tests. Dans ce
cas, vous devez d'abord installer la suite de test avant de l'utiliser. Depuis MySQL Version
3.22, il y a des fichiers de tests RPM, appelé mysql?bench?VERSION? qui
contient les données de tests et les donné vous avez une distribution source, vous
pouvez aussi exécuter les tests dans le dossier tests . Par exemple, pour exécuter
 , faites ceci :
shell> BINDIR/mysql ?vvf test <
Les résultats attendus sont présentés dans le fichier  .
2.4.1 Problèmes d'exécution de mysql_install_db
Le but du script mysql_install_db est de générer un nouveau système de droits pour MySQL. Il
ne modifiera aucune autre donnée! Il ne fera rien du tout si vous avez des tables de droits
installées.
Si vous voulez recréer vos tables de droits, vous devez éteindre le serveur mysqld , si il
fonctionnait, et faire ceci :
mv mysql?data?directory/mysql mysql?data?directory/mysql?old
mysql_install_db
Cette section liste les problèmes que vous pourriez rencontrer lors de l'exécution du script
mysql_install_db :
mysql_install_db n'installe pas les tables de droits
Vous réalisez que mysql_install_db n'arrive pas à installer les tables de droits,
et se termine sur ce message :
starting mysqld daemon with databases from XXXXXX
mysql daemon ended
Dans ce cas, examinez le fichier de log très attentivement! Le fichier de log est situé
dans le dossier XXXXXX indiqué dans le message d'erreur, et il indiquera pourquoi
mysqld n'a pas démarré. SI vous ne comprenez pas ce qui est arrivé, incluez le log
dans votre message, lors de l'envoi du rapport de bugs avec mysqlbugrapporter des bogues ou problèmes .
Un démon mysqld fonctionne déjà
Dans ce cas, vous n'avez probablement pas exécuté mysql_install_db du tout.
Vous avez exécuté mysql_install_db une fois, lorsque vous avez installé MySQL
pour la première fois.
Installer un second démon mysqld n'est pas possible lorsque le premier fonctionne.
 2.4.1 Problèmes d'exécution de mysql_install_db
86

Manuel MySQL 4.1.x ? Version Française
Cela arrive lorsque vous avez une installation MySQL pré?existantes, mais que vous
voulez installer une autre version ailleurs (par exemple, pour faire des tests ou
simplement pour avoir deux installations). Généralement, le problème survient
lorsque le second serveur est démarré, et qu'il essaie d'utiliser les mêmes ports et
sockets que le premier. Dans ce cas, vous recevez des message d'erreur tels que :
Can't start server: Bind on TCP/IP port: Address already in
use ou Can't start server: Bind on unix socket...serveurs sur la même machine .
You don't have write access to /tmp
Si vous n'avez pas les droits d'accès suffisant pour créer un fichier de socket à
l'endroit prévu (dans /tmp ) ou les permissions pour créer un fichier temporaire dans
/tmp, vous allez avoir une erreur lors de l'utilisation de mysql_install_db ou
avec mysqld .
Vous pouvez spécifier une socket différente et un dossier temporaire différent avec
les options suivantes :
shell> TMPDIR=/some_tmp_dir/
shell>
shell> export TMPDIR MYSQL_UNIX_PORT
Voir Comment protéger  .
some_tmp_dir doit être un chemin vers un dossier dans lequel vous avez les
permissions d'écriture. Variables d'environnement MySQL .
Après cela, vous devriez être capable d'exécuter mysql_install_db et démarrer
le serveur avec ces commandes :
shell> scripts/mysql_install_db
shell> BINDIR/safe_mysqld &
mysqld crashes immediately
Si vous utilisez RedHat version 5.0 avec une version de glibc plus ancienne que
2.0.7?5, assurez vous que vous avez installé les patchs glibc ! Il y a beaucoup de
littérature à ce propos dans les archives de listes de diffusion. Des liens vers les
(toutes les versions de Linux) .
Vous pouvez aussi démarrer mysqld manuellement avec l'option
??skip?grant?tables puis ajouter les tables de droits avec S mysql :
shell> BINDIR/safe_mysqld ??skip?grant?tables &
shell> BINDIR/mysql ?u root mysql
Dans la base mysql , exécutez manuellement les commandes SQL disponibles
dans mysql_install_db . Assurez vous que vous n'oubliez pas la commande
mysqladmin flush?privileges ou mysqladmin reload pour dire au serveur
de prendre en compte les tables de droits.
2.4.2 Problèmes de démarrage du serveur MySQL
Si vous allez utiliser des tables qui supportent les transactions (InnoDB, BDB), vous devez
commencer par créer un fichier my.cnfde tables MySQL .
 2.4.2 Problèmes de démarrage du serveur MySQL
87

Manuel MySQL 4.1.x ? Version Française
Généralement, vous démarrez le serveur mysqld de l'une de ces façons :
En utilisant le script 
• 
mysql.server . Ce script est utilisé à la base au moment du
démarrage et de l'extinction du système, et il est décrit avec plus de détail dans le chapitre
En appelant le script 
• 
safe_mysqld , qui va déterminer les options correctes pour mysqld
puis utiliser ces options. Pour Windows NT/2000/XP, voyez Démarrer MySQL avec Windows NT / 2000 / XP .
• 
En appelant 
• 
mysqld directement.
Lorsque le démon mysqld démarre, il change le dossier de travail par le dossier de données. C'est
là qu'il doit trouver les fichiers de log, et le fichier pid (ID de processus), ainsi que les dossiers de
bases.
Le chemin du dossier de données est codé en dur lorsque la distribution est compilée. Cependant,
si mysqld cherche le dossier de données ailleurs que là ou il est vraiment, il ne va pas fonctionner
correctement. Si vous avez des problèmes avec les chemins, vous pouvez utiliser les options dont
mysqld dispose pour vous permettre de modifier dynamiquement le chemin du dossier de données
: il suffit d'appeler mysqld avec l'option ??help . Vous pouvez remplacer les valeurs par défaut en
spécifiant les chemins corrects en ligne de commande avec mysqld . Ces options fonctionneront
aussi avec safe_mysqld .
Normalement, vous devez appeler mysqld uniquement depuis le dossier d'installation de MySQL.
Vous pouvez faire cela avec l'option ??basedir . Vous pouvez aussi consulter l'affichage de
??help pour vérifier le changement des options de chemin (notez que ??help doit être l'option
finale d'une commande mysqld . Par exemple :
shell> EXECDIR/mysqld ??basedir=/usr/local ??help
Une fois que vous avez déterminé le chemin que vous souhaitez, vous pouvez démarrer le serveur
sans l'option ??help .Quelque soit la méthode que vous utilisez pour démarrer le serveur, si elle
échoue, vérifiez le fichier de log pour savoir pourquoi. Les fichiers de log sont situés dans le dossier
de données (typiquement /usr/local/mysql/data pour une distribution binaire,
/usr/local/var pour une distribution source, et \mysql\data\ sous Windows).
Regardez dans le dossier de données et recherchez des fichiers de la forme  et
 ou host_name est le nom de votre serveur. Vérifiez alors les dernières lignes de
ce fichier :
shell> tail
shell> tail
Recherchez des lignes comme celles?ci :
000729 14:50:10  bdb:  Recovery function for LSN 1 27595 failed
000729 14:50:10  bdb:  warning: : No such file or directory
000729 14:50:10  Can't init databases
Cela signifie que vous n'avez pas démarré mysqld avec ??bdb?no?recover et Berkeley DB a
trouvé une erreur dans les fichiers de log lorsqu'il a essayé de restaurer votre base. Pour pouvoir
continuer, vous devez déplacer le vieux fichier de log Berkeley DB vers un autre dossier, pour
l'examiner plus tard. Les fichiers de logs sont nommés log.0000000001 , et ce nombre augmente
au fil du vous exécutez mysqld avec les tables BDB et que mysqld fait des core dumps
au démarrage, c'est peut être que vous avez des problèmes avec le fichier de restauration de BDB.
Dans ce cas, essayez de démarrer mysqld avec ??bdb?no?recover . Si cela aide, vous devriez
alors retirer tous les fichiers de log log.* du dossier de données, et démarrer mysqld à nouveau.
Si vous obtenez l'erreur suivant, cela signifie que d'autres programmes (ou un autre serveur
mysqld ) fonctionne déjà avec le port TCP/IP ou la socket que mysqld essaie d'utiliser :
Can't start server: Bind on TCP/IP port: Address already in use
 2.4.2 Problèmes de démarrage du serveur MySQL
88

Manuel MySQL 4.1.x ? Version Française
  ou
Can't start server : Bind on unix socket...
Utilisez ps pour vous assurer que vous n'avez pas d'autre serveur mysqld qui fonctionne. SI vous
ne pouvez pas trouver d'autre serveur en fonctionnement, essayer d'exécuter la commande
telnet votre?nom?d?hote numero?de?port?tcp puis pressez la touche 'Entrée' plusieurs
fois. SI vous n'obtenez pas de message d'erreur comme telnet: Unable to connect to
remote host: Connection refused , alors un autre processus utilise le port TCP/IP de
mysqld . Voyez Problèmes d'exécution de mysql_install_dbserveurs MySQL sur la même machine .
Si mysqld est en fonctionnement, vous pouvez connaître les chemins qu'il utilise avec la
commande suivante :
shell> mysqladmin variables
ou
shell> mysqladmin ?h 'your?host?name' variables
Si vous obtenez une erreur Errcode 13 , qui indique Permission denied , lors du démarrage
de mysqld , cela signifie que vous n'avez pas les droits de lecture ou d'écriture sur le dossier de
données de MySQL, ou dans le dossier de logs. Dans ce cas, vous devriez démarrer mysqld en
tant que root, ou changer les permissions des fichiers et dossiers utilisés.Si safe_mysqld démarre
le serveur, mais que vous n'arrivez pas à vous y connecter, vous devriez vous assurer que vous
avez une entrée dans le fichier /etc/hosts qui ressemble à ceci :
127.0.0.1       localhost
Ce problème survient uniquement sur les systèmes qui n'ont pas une librairie de threads
fonctionnels, ou pour lesquels MySQL a été configuré pour utiliser les MIT? vous ne
pouvez pas faire démarrer mysqld , essayez de faire un fichier de trace pour identifier le problème.
Créer des fichiers de traçage .
Si vous utilisez les tables InnoDB , reportez vous aux options de configuration spécifiques à
InnoDB . Options de démarrage InnoDB .
Si vous utilisez les tables BDB (Berkeley DB), vous devriez vous familiariser avec les options de
démarrage spécifiques à BDB. Options de démarrage BDB .
2.4.3 Lancer et arrêter MySQL automatiquement.
Les scripts mysql.server et safe_mysqld peuvent être utilisés pour démarrer le serveur
automatiquement au moment du démarrage du serveur. mysql.server peut aussi servir à arrêter
le serveur.
Le script mysql.server peut servir à démarrer ou arrêter le serveur en l'appelant avec les
arguments start ou stop :
shell> mysql.server start
shell> mysql.server stop
mysql.server est installé dans le dossier share/mysql du dossier d'installation de MySQL, ou
dans le dossier support?files de la distribution source.Avant que mysql.server ne démarre
le serveur, il change de dossier pour aller dans le dossier d'installation et appelle safe_mysqld .
Vous pourriez avoir à éditer mysql.server si vous avez une installation binaire dans une situation
non standard. Modifiez la commande cd avec le dossier correct, avant qu'il n'exécute
 2.4.3 Lancer et arrêter MySQL automatiquement.
89

Manuel MySQL 4.1.x ? Version Française
safe_mysqld . Si vous voulez que le serveur fonctionne avec un utilisateur spécifique, ajouter
l'option user appropriée dans le fichier  , tel que présenté ultérieurement dans cette
section.
mysql.server stop arrête le serveur en lui envoyant un signal. Vous pouvez éteindre le serveur
manuellement avec la commande mysqladmin shutdown .
Vous pouvez ajouter ces commandes de démarrage et d'arrêt aux endroits appropriés dans votre
fichier /etc/rc* lorsque vous démarrez MySQL dans les applications de production. Notez que si
vous modifiez mysql.server , et que vous passez à une nouvelle version de MySQL, votre
vesrion modifiée sera écrasée, et vous devriez faire une copie de sauvegarde de votre
votre système utilise /etc/rc.local pour démarrer des scripts externes, vous devriez ajouter la
ligne suivante :
/bin/sh ?c 'cd /usr/local/mysql ; ./bin/safe_mysqld ??user=mysql &'
Vous pouvez aussi ajouter des options à mysql.server via le fichier global  file. Un
fichier  typique peut ressembler à ceci :
[mysqld]
datadir=/usr/local/mysql/var
port=3306
user=mysql
[mysql.server]
basedir=/usr/local/mysql
Le script mysql.server comprend les options suivantes : datadir , basedir et pid?file .
La table suivante montre quels groupes d'options chaque scripts de démarrage utilise :
Script
Groupe d'options
mysqld
mysqld and server
mysql.server
mysql.server , mysqld , and server
safe_mysqld
mysql.server , mysqld , and server
Fichier d'options  .
2.5 Changer de version de MySQL
Vous pouvez toujours les fichiers de structures et de données entre les différentes versions de
MySQL. La version de base actuelle est la version 3. Si vous changez le jeu de caractères lors de
l'utilisation de MySQL (ce qui va aussi affecter le tri), vous devez exécuter la commande
myisamchk ?r ?q ??set?character?set=charset sur toutes les tables. Sinon, vos index ne
seront pas correctement triés.
Si vous avez peur des nouvelles versions, vous pouvez toujours renommer votre vieux mysqld
avec un nom comme mysqld?ancienne_version . Si votre nouveau serveur mysqld se
comportement bizarrement, vous pourrez toujours l'éteindre, et redémarrer avec votre vieux
mysqld !
Lorsque vous faites une évolution de version, vous devriez toujorus faire une sauvegarde de vos
anciennes données.
Si après un changement de version, vous rencontrez des problèmes avec les clients recompilés,
 2.5 Changer de version de MySQL
90

Manuel MySQL 4.1.x ? Version Française
comme Commands out of sync ou des core dumps inopinés, vous avez probablement utiliser
un vieux fichier d'entête ou une vieille librairie lors de la compilation de vos programmes. Dans ce
cas, vérifiez la date de votre fichier mysql.h , et de votre librairie libmysqlclient.a , pour vous
assurer qu'ils proviennent bien de la nouvelle distribution MySQL. Si ce n'est pas le cas, recompilez
vos programmes!
Si vous avez des problèmes comme si le nouveau serveur mysqld qui ne veut pas démarrer, ou
que vous ne pouvez pas vous connecter sans un mot de passe, vérifiez que vous n'avez pas un
vieux fichier  dans votre installation! Vous pouvez le vérifier comme ceci : program?name
??print?defaults . Si cette commande affiche autre chose que le nom du programme, vous
avez un fichier  actif, qui perturbe vos opérations.
C'est une bonne idée que de reconstruire et reinstaller le module Msql?Mysql à chaque fois que
vous faites une nouvelle version de MySQL, en particulier si vous rencontrez des symptômes tels
que les DBI qui font des core dump après votre mise à jour de MySQL.
2.5.1 Passer de la version 3.23 à la version 4.0
En général, ce que vous devez faire pour passer en version 4.0, à partir d'une version plus
ancienne :
Exécutez le script 
• 
mysql_fix_privilege_tables pour ajouter de nouveaux droits et
fonctionnalités à a table MySQL.
Editez les scripts de démarrage MySQL pour les fichiers de configuration pour ne plus
• 
utiliser les options abandonnées, listées ci?dessous.
Convertissez vos vieilles tables 
• 
ISAM en tables MyISAM avec la commande :
mysql_convert_table_format database . Notez que cela ne doit être fait que si
toutes les tables de la base sont des tables ISAM ou MyISAM . Si ce n'est pas le cas, vous
devrez alors utiliser la commande ALTER TABLE table_name TYPE=MyISAM sur toutes
les tables ISAM .
Assurez vous que vous n'avez pas de client MySQL qui utilise des librairies partagées
• 
(comme les modules Perl Msql?Mysql). Si vous en avez, vous devriez les recompiler car les
structures utilisées dans  ont changées.
MySQL 4.0 va fonctionner même si vous ne suivez pas les instructions ci?dessus, mais il ne sera
pas capable de profiter des nouveaux droits disponibles avec MySQL 4.0 et vous pourriez
rencontrer des problèmes lors de l'évolution vers MySQL 4.1 ou plus récent. Les fichiers ISAM
fonctionne toujours en MySQL 4.0 mais il est abandonné, et il sera désactivé en MySQL 5.0.
Les anciens clients doivent fonctionner avec le serveur version 4.0 sans aucun problème.
Même si vous suivez les instructions ci?dessus, vous pourrez retourner en version MySQL 3.23.52
ou plus récent, si vous rencontrez des difficultés avec MySQL 4.0. Dans ce cas, vous devez utiliser
la commande mysqldump sur toutes les tables qui utilisent un index en texte plein, et restaurer ces
tables en 3.23 (car la version 4.0 utilise un nouveau format pour les index en texte plein).
Voici une liste plus complète de points à contrôler lorsque vous passez à la version 4.0 :
MySQL 4.0 a de très nombreux nouveaux droits dans la table 
• 
 . Syntaxe de
GRANT et REVOKE .
Pour faire fonctionner ces nouveaux droits, vous devez exécuter le script
mysql_fix_privilege_tables . Jusqu'à ce que ce script soit exécuté, les utilisateurs
 2.5.1 Passer de la version 3.23 à la version 4.0
91

Manuel MySQL 4.1.x ? Version Française
auront les droits de SHOW DATABASES , CREATE TEMPORARY TABLES , et LOCK TABLES .
Les droits de SUPER et EXECUTE héritent leur valeur du droit de PROCESS . REPLICATION
SLAVE et REPLICATION CLIENT héritent leur valeur de FILE .
Si vous avez un script qui crée automatiquement des nouveaux utilisateur, vous devez le
modifier pour y inclure les nouveaux droits. Si vous n'utilisez pas la commande GRANT dans
ces scripts, c'est une bonne idée que de les vérifier.
En version 4.0.2, l'option ??safe?show?database est abandonnée (et ne fait plus rien du
tout). Options de démarrage de mysqld liées à la sécurité .
Si vous obtenez des interdictions d'accès pour les nouveaux utilisateurs en version 4.0.2,
vous devriez vérifier si vous avez besoin de nouveaux droits que vous n'utilisiez pas avant.
En particulier, vous aurez besoin du droit de REPLICATION SLAVE (au lieu de FILE ) pour
les nouveaux esclaves.
Les paramètres de démarrage 
• 
myisam_max_extra_sort_file_size et
myisam_max_extra_sort_file_size sont désormais exprimés en octets, et non plus
en Mo, comme cela était le cas jusqu'en version 4.0.3). Les systèmes externes de
verrouillages des tables MyISAM/ISAM sont désormais désactivés par défaut. Vous pouvez
les réactiver avec l'option ??external?locking Pour la plupart des utilisateurs, ce n'est
jamais nécessaire.
Les options de démarrage suivantes ont été renommées :
• 
Ancien nom
Nouveau nom .
myisam_bulk_insert_tree_size
bulk_insert_buffer_size
query_cache_startup_type
query_cache_type
record_buffer
read_buffer_size
record_rnd_buffer
read_rnd_buffer_size
sort_buffer
sort_buffer_size
warnings
log?warnings
Les options de démarrage record_buffer , sort_buffer et warnings vont encore
fonctionner avec MySQL 4.0 mais elles sont obsolètes.
Les variables SQL suivantes ont changé de nom.
• 
Ancien nom
Nouveau nom .
SQL_BIG_TABLES
BIG_TABLES
SQL_LOW_PRIORITY_UPDATES
LOW_PRIORITY_UPDATES
SQL_MAX_JOIN_SIZE
MAX_JOIN_SIZE
SQL_QUERY_CACHE_TYPE
QUERY_CACHE_TYPE
Les anciens noms fonctionneront encore en MySQL 4.0, mais sont obsolètes.
Vous devez utiliser la commande 
• 
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=# au lieu de
SET SQL_SLAVE_SKIP_COUNTER=# .
Renommez les options de démarrage 
• 
??skip?locking en ??skip?external?locking
et ??enable?locking en ??external?locking .
SHOW MASTER STATUS
• 
 retourne désormais une liste vide si les logs binaires ne sont pas
activés.
SHOW SLAVE STATUS
• 
 retourne désormais une liste vide si l'esclave n'est pas initialisé.
mysqld
• 
 dispose désormais de l'option ??temp?pool activée par défaut, car cela donne de
meilleurs performances sur certains systèmes d'exploitation.
Les colonnes 
• 
DOUBLE et FLOAT acceptent désormais l'option UNSIGNED pour le stockage
(auparavant, UNSIGNED était ignoré pour ces colonnes).
ORDER BY column DESC
• 
 trie désormais les valeurs NULL en premier. En version 3.23, ce
n'était pas toujours le cas.
 2.5.1 Passer de la version 3.23 à la version 4.0
92

Manuel MySQL 4.1.x ? Version Française
SHOW INDEX
• 
 a 2 colonnes de plus ( Null et Index_type ) qu'il n'avait pas en version
3.23.
SIGNED
• 
 est un mot réservé.
Le résultat de toutes les opérations sur les bits, 
• 
| ,  , << , >> et ~ est maintenant
non signé. Cela peut poser des problèmes si vous aviez un contexte
dans lequel vous souhaitez un résultat signé. Fonctions de
Note
• 
 : lorsque vous utilisez la soustraction entre des entiers dont l'un est UNSIGNED , le
résultat sera non signé! En d'autres termes, avant de passer à la version MySQL 4.0, vous
devriez vérifier les situations où votre application soustrait une valeur d'un entier non signé,
et que vous attendez une valeur négative, ou si vous soustrayez une valeur non signée
d'une colonne. Vous pouvez désactiver ce comportement en utilisant l'option de démarrage
??sql?mode=NO_UNSIGNED_SUBTRACTION lorsque vous démarrez mysqldPour utiliser 
• 
MATCH ... AGAINST (... IN BOOLEAN MODE) avec vos table,s vous
devez les reconstruire avec ALTER TABLE table_name TYPE=MyISAM , même si la
table est déjà au format MyISAM .
LOCATE()
• 
 et INSTR() sont sensibles à la casse, si l'un des arguments est une chaîne
binaire. Sinon, ils sont insensibles à la casse.
STRCMP()
• 
 utilise désormais le jeu de caractères courant pour les comparaisons, ce qui
signifie que le comportement par défaut des comparaisons est désormais insensible à la
casse.
HEX(string)
• 
 retourne désormais les caractères convertis sous la forme d'une chaîne
hexadécimale. Si vous voulez convertir un nombre en hexadécimal, vous devez vous
assurer d'appeler HEX() avec un argument numérique.
En version 3.23, 
• 
INSERT INTO ... SELECT fonctionne toujours avec l'option IGNORE .
En version 4.0.1, MySQL va s'arrêter (et peut être annuler la transaction) si vous ne
spécifiez pas l'option IGNORE .
safe_mysqld
• 
 est renommée en mysqld_safe . Pour encore un peu de temps, nous
allons inclure dans nos distributions binaires le script safe_mysqld vous la forme d'un lien
symbolique vers mysqld_safe .
Les fonctions de l'ancienne API C API 
• 
mysql_drop_db , mysql_create_db et
mysql_connect ne sont plus supportées, à moins que vous ne compiliez MySQL avec
CFLAGS=?DUSE_OLD_FUNCTIONS . Au lieu de cela, il sera plus sage de changer vos
programmes, pour qu'il utilisent la nouvelle API 4.0.
Dans la structure 
• 
MYSQL_FIELD , length et max_length ont évolué de unsigned int
en unsigned long . Cela ne va pas causer de problèmes, hormis le fait qu'ils peuvent
générer des messages d'alerte lorsqu'ils sont utilisé comme argument de fonctions comme
printf() .
Vous devriez utiliser la commande 
• 
TRUNCATE TABLE lorsque vous voulez effacer toutes les
lignes d'une table, et que vous ne souhaitez pas savoir combien de lignes ont été effacées
de la table (car TRUNCATE TABLE est plus rapide que DELETE FROM table_name ).
Vous allez rencontrer une erreur si vous avez un verrou actif ou une transaction active, et
• 
que vous essayez d'utiliser les commandes TRUNCATE TABLE ou DROP DATABASE .
Vous devriez utiliser des entiers pour stocker les valeurs dans les colonnes de type BIGINT
• 
(au lieu d'utiliser des chaînes, comme vous le faisiez en MySQL 3.23). Utiliser des chaînes
va toujours fonctionner, mais passer des entiers est bien plus efficace.
Le format de 
• 
SHOW OPEN TABLE a été changé.
Les clients multi?threadés doivent utiliser 
• 
mysql_thread_init() et
mysql_thread_end()Si vous voulez recompiler le module Perl DBD::mysql, vous devez prendre les versions
• 
Msql?Mysql?modules 1.2218 ou plus récente, car les anciennes versions des module DBD
utilisent une fonction drop_db() abandonnée.
RAND(seed)
• 
 retourne un nombre différent en version 4.0 qu'en version 3.23 : cela est fait
 2.5.1 Passer de la version 3.23 à la version 4.0
93

Manuel MySQL 4.1.x ? Version Française
pour différencier plus fortement RAND(seed) de RAND(seed+1) .
2.5.2 Passer de la version 3.22 à la version 3.23
MySQL version 3.23 supporte les nouvelles tables MyISAM et les anciennes tables ISAM . Vous
n'avez pas à convertir vos anciennes tables pour utiliser la nouvelle version 3.23. Par défaut, toutes
les nouvelles tables seront créées avec le type MyISAM (à moins que vous ne lanciez mysqld avec
l'option ??default?table?type=isam ). Vous pouvez changer la table ISAM en table MyISAM
avec la commande ALTER TABLE table_name TYPE=MyISAM ou le script Perl
mysql_convert_table_format .
Les clients des versions 3.22 et 3.21 vont fonctionner sans problèmes avec la verison 3.23 du
serveur.
La liste suivante indique les points à vérifier lors de la migration :
Toutes les tables qui utilisent le jeu de caractères 
• 
tis620 doivent être corrigées avec
myisamchk ?r ou REPAIR TABLE .
Si vous exécutez une commande 
• 
DROP DATABASE sur un lien symbolique, le lien et la base
originale seront effacés. Cela n'arrivait pas en 3.22 car configure ne détectait pas les
appels à readlink .
OPTIMIZE TABLE
• 
 ne fonctionne que pour les tables MyISAM . Pour les autres types de
tables, vous devez utiliser ALTER TABLE pour optimiser la table. Durant la commande
OPTIMIZE TABLE , la table est verrouillée.
Le client MySQL 
• 
mysql est démarré par défaut avec l'option option
??no?named?commands (?g) . Cette option peut être désactivée avec
??enable?named?commands (?G) . Cela peut causer des problèmes d'incompatibilité
dans certains cas : par exemple, dans les scripts SQL qui utilisent des commandes
nommées sans point virgule! Le format long de la commande devrait fonctionner
correctement.
Les fonctions de date qui travaille sur des parties de dates (comme 
• 
MONTH() ) vont
désormais retourner 0 pour la date 0000?00?00 . (MySQL 3.22 retournait NULL .)
Si vous utilisez le jeu de caractères 
• 
allemand pour les tris, vous devez réparer vos tables
avec isamchk ?r , car nous avons fait des modifications dans l'ordre de tri.
Le type de retour par défaut de 
• 
IF dépendant maintenant des deux arguments, et plus
seulement du premier.
AUTO_INCREMENT
• 
 ne fonctionne pas sur les nombres négatifs. La raison pour cela est que
les nombres négatifs posaient des problèmes d'écrasement entre ?1 et 0.
AUTO_INCREMENT pour les tables MyISAM est maintenant géré à un niveau plus bas, et il
est bien plus rapide. Pour les tables MyISAM, les anciens numéros ne sont plus réutilisés,
même si vous effacez des lignes dans la table.
CASE
• 
 , DELAYED , ELSE , END , FULLTEXT , INNER , RIGHT , THEN et WHEN sont de
nouveaux mots réservés.
FLOAT(X)
• 
 est maintenant un véritable type de nombre à virgule flottante, avec un nombre
défini de décimales.
Lors de la déclaration de 
• 
DECIMAL(length,dec) , la taille de l'argument n'inclut plus une
place pour le signe ou le séparateur décimal.
Une chaîne 
• 
TIME doit être fournie au format suivant : [[[DAYS]
[H]H:]MM:]SS[.fraction] ou [[[[[H]H]H]H]MM]SS[.fraction] .
LIKE
• 
 compare maintenant les chaînes en appliquant les mêmes règles que = . Si vous
voulez l'ancien comportement, vous pouvez compiler MySQL avec l'option
CXXFLAGS=?DLIKE_CMP_TOUPPER .
REGEXP
• 
 est maintenant insensible à la casse pour les chaînes normales (non binaires).
 2.5.2 Passer de la version 3.22 à la version 3.23
94

Manuel MySQL 4.1.x ? Version Française
Quand vous vérifiez/réparez des tables, vous devez utiliser 
• 
CHECK TABLE ou myisamchk
pour les tables MyISAM ( .MYI ) et isamchk pour les tables ISAM ( .ISM ).
Si vous voulez que les fichiers d'export de 
• 
mysqldump soit compatibles entre les versions
MySQL 3.22 et 3.23, vous ne devez pas utiliser l'option ??opt ou ??all de mysqldump .
Vérifiez tous vos appels à 
• 
DATE_FORMAT() pour vous assurer qu'il y a un signe
pourcentage '%' avant chaque caractère de format (MySQL version 3.22 et plus récent
avait déjà cette syntaxe).
mysql_fetch_fields_direct
• 
 est maintenant une fonction (c'était une macro), qui
retourne un pointeur sur MYSQL_FIELD au lieu de MYSQL_FIELD .
mysql_num_fields()
• 
 ne peut plus être utilisé sur les objets MYSQL* (c'est maintenant
une fonction qui prend MYSQL_RES* comme argument. Il faut donc utiliser
mysql_field_count() à la place).
En MySQL version 3.22, le résultat de 
• 
SELECT DISTINCT ... était toujours trié. En
version 3.23, vous devez spécifier la clause GROUP BY ou ORDER BY pour obtenir un
résultat trié.
SUM()
• 
 retourne désormais NULL , au lieu de 0, si il n'y a pas de lignes à calculer. Ceci
s'accorde avec la norme SQL.
AND
• 
 ou OR avec les valeurs NULL vont désormais retourner NULL au lieu de 0. Cela affecte
surtout les requêtes qui utilisait NOT ou une expression AND/OR telle que NOT NULL = NULL
. LPAD() et RPAD() vont réduire la taille de la chaîne résultante, si elle est plus grand que
l'argument de taille.
2.5.3 Passer de la version 3.21 à la version 3.22
Rien qui n'affecte la compatibilité n'a changé entre les versions 3.21 et 3.22. Le seul problème
courant est que les nouvelles tables qui sont créées avec le type DATE vont désormais utiliser le
nouveau format de stockage. Vous ne pourrez pas accéder à ces nouveaux formats depuis les
vieilles versions de mysqld .
Après avoir installé MySQL version 3.22, vous devriez démarrer le nouveau serveur, et exécuter le
script mysql_fix_privilege_tables . Il va ajouter les nouveaux droits à la commande GRANT .
SI vous oubliez cela, vous obtiendrez des erreurs Access denied lorsque vous essayez d'utiliser
les commandes ALTER TABLE , CREATE INDEX ou DROP INDEX . Si votre compte root MySQL
utilise un mot de passe, vous devriez l'indiquer au script mysql_fix_privilege_tables .
L'interface C de mysql_real_connect() a changé. Si vous avez un vieux client qui appelle cette
fonction, vous devez placer un 0 pour le nouvel argument db (ou réécrire le client pour qu'il envoie
l'élément db , et accélère les connexions). Vous devez aussi appeler mysql_init() avant
d'appeler mysql_real_connect() ! Ce changement a été fait pour permettre l'appel de la
fonction mysql_options() , qui sauve les options dans la structure MYSQL .
La variable key_buffer de mysqld a changé de nom, et est devenue key_buffer_size , mais
vous pouvez toujours utiliser l'ancien nom dans vos fichiers de démarrage.
2.5.4 Passer de la version 3.20 à la version 3.21
Si vous avez une version de MySQL plus ancienne que la version 3.20.28 et que vous voulez
passer à la version 3.21, vous devez suivre ces étapes :
Vous pouvez démarrer le serveur mysqld version 3.21 avec le script safe_mysqld
??old?protocol pour l'utiliser avec les clients de la version 3.20. Dans ce cas, la fonction
mysql_errno() des nouveaux clients ne sera pas fonctionnelle, et seul CR_UNKNOWN_ERROR
 2.5.3 Passer de la version 3.21 à la version 3.22
95

Manuel MySQL 4.1.x ? Version Française
(mais il fonctionne pour les erreurs client), et le serveur utilisera l'ancienne fonction password()
plutôt que la nouvelle.
Si vous n'utilisez pas l'option ??old?protocol avec mysqld , vous devez suivre ces instructions
:
Tous les clients doivent être recompilés. Si vous utilisez ODBC, vous devez obtenir le
• 
nouveau pilote MyODBC 2.x.
Le script 
• 
scripts/add_long_password doit être utilisé pour convertir le champs
Password de la table  en CHAR(16) .
Tous les mots de passe doivent être réassignés dans la table 
• 
 pour utiliser les
mots de 62 bits au lieu de 31 bits.
Le format de table n'a pas changé, ce qui vous évite d'avoir à convertir des tables.
• 
MySQL version 3.20.28 et plus récent peut gérer les nouvelles tables user sans affecter les clients.
Si vous avez une version plus ancienne que la 3.20.28, les mots de passe ne seront plus valide, si
vous convertissez la table user . Pour être tranquille, commencez par faire passer votre version à
la 3.20.28 puis passez en version 3.21. Le nouveau client fonctionne avec le serveur 3.20.x
mysqld , alors si vous rencontrez des problèmes avec la version 3.21.x, vous pouvez toujours vous
rabattre sur les vieux serveurs 3.20.x sans recompiler les clients.
Si vous n'utilisez pas l'option ??old?protocol de mysqld , les vieux clients vont émettre une
erreur :
ERROR: Protocol mismatch. Server Version = 10 Client Version = 9
La nouvelle interface Perl DBI / DBD supporte aussi l'ancienne interface mysqlperl . Le seul
changement que vous devez faire si vous utilisez mysqlperl est de changer les arguments de la
fonction connect() . Les nouveaux arguments sont : host , database , user , et password (les
arguments user et password ont été échangés). L'interface DBI .
Les modifications actuelles affectent les requêtes des anciennes applications :
HAVING
• 
 doit être spécifié avant la clause ORDER BY .
Les paramètres de la fonction 
• 
LOCATE() ont été échangés.
Il y a de nouveaux mots réservés. Les plus notables sont 
• 
DATE , TIME et TIMESTAMP .
2.5.5 Migrer depuis une autre architecture
Si vous utilisez MySQL version 3.23, vous pouvez copier les fichiers .frm , .MYI et .MYD entre les
différentes architectures qui supportent le même format de nombre à virgule flottante (MySQL prend
en charge les échanges d'octets).
Les données MySQL des tables ISAM et les fichiers d'index ( .ISD et *.ISM , respectivement) sont
dépendantes de l'architecture, et dans certains cas, dépendantes du système d'exploitation. Si vous
voulez déplacer des applications vers une autre machine qui a une autre architecture, ou un autre
système d'exploitation que votre machine courante, il est recommandé de ne pas faire une simple
copie de base en copiant les fichiers vers leur nouvelle destination. Utilisez plutôt mysqldump .
Par défaut, mysqldump va créer un fichier de requêtes SQL. Vous pouvez alors transférer le fichier
sur une autre machine, et le fournir comme script à un client mysql .
Essayez la commande mysqldump ??help pour voir quelles options sont disponibles. Si vous
 2.5.5 Migrer depuis une autre architecture
96

Manuel MySQL 4.1.x ? Version Française
envoyez les données vers une nouvelle version de MySQL, il recommandé d'utiliser l'option
mysqldump ??opt pour obtenir un export compact et plus rapide.
Le plus facile (mais pas le plus rapide) pour déplacer une base de données entre deux machines et
d'exécuter les commandes suivantes sur la machine qui héberge la base :
shell> mysqladmin ?h 'other hostname' create db_name
shell> mysqldump ??opt db_name \
        | mysql ?h 'other hostname' db_name
Si vous voulez copier la base depuis une machine distante sur un réseau lent, vous pouvez utiliser :
shell> mysqladmin create db_name
shell> mysqldump ?h 'other hostname' ??opt ??compress db_name \
        | mysql db_name
Vous pouvez aussi stocker le résultat dans un fichier, et transférer le fichier sur la machine de
destination, puis charger ce fichier dans le serveur. Par exemple, vous pouvez exporter la base vers
un fichier source comme ceci :
shell> mysqldump ??quick db_name | gzip >
Le fichier créé est compressé. Transférez le fichier contenant le contenu de votre base sur la
machine de destination, puis utilisez ces commandes :
shell> mysqladmin create db_name
shell> gunzip < | mysql db_name
Vous pouvez aussi utiliser mysqldump et mysqlimport pour accomplir cette opération. Pour les
grandes tables, c'est bien plus rapide que d'utiliser simplement mysqldump . Dans les commandes
suivantes, DUMPDIR représente le chemin complet du dossier que vous utilisez pour stocker le
résultat de mysqldump .Premièrement, créez un dossier pour les fichiers d'exportation, puis faites
l'export :
shell> mkdir DUMPDIR
shell> mysqldump ??tab=DUMPDIR db_name
Puis transférez les fichiers du dossier DUMPDIR dans un dossier correspondant, dans la machine
de destination, puis chargez ces fichiers dans MySQL comme ceci :
shell> mysqladmin create db_name           # Création de la base
shell> cat DUMPDIR/*.sql | mysql db_name   # Création des tables dans la base
shell> mysqlimport db_name DUMPDIR/*.txt   # Chargement des données dans les tables
N'oubliez pas non plus de copier le contenu de votre base mysql car c'est là que résident les droits
( user , db , host ). Vous devrez alors exécuter les commandes en tant que root MySQL sur la
nouvelle machine, jusqu'à ce que vous ayez réinstallé mysql .
Après l'importation de la base mysql sur la nouvelle machine, exécutez la commande
mysqladmin flush?privileges pour que le serveur relise les droits.
2.6 Notes spécifiques aux systèmes d'exploitation
2.6.1 Notes relatives à Linux (toutes versions)
Les notes suivantes relatives à glibc ne s'appliquent que dans la situation où vous construisez
MySQL vous?même. Si vous n'utilisez pas Linux sur une machine x86 machine, dans la plupart des
cas, il sera mieux pour vous d'utiliser nos binaires. Nous lions nos binaires avec la meilleur version
patchée de glibc que nous pouvons fournir et avec les meilleurs options du compilateur, en
essayant de les rendre bons pour un serveur qui connait de fortes charges. Et donc, si vous lisez le
texte suivant et que vous avez un doute sur ce que vous devez faire, essayez d'abord notre binaire
pour voir s'il vous convient, et ne vous souciez de vosz propres constructions qu'après vous être
 2.6 Notes spécifiques aux systèmes d'exploitation
97

Manuel MySQL 4.1.x ? Version Française
assurés que notre binaire ne répond pas à vos attentes. Dans ce cas, nous apprécierons une note
à propos de cela, pour que nous puissions faire mieux la prochaine fois. Pour les besoins d'un
utilisateur de base, pour des configurations avec beaucoup de connexions et/ou des tables
dépassant la limite des 2G, notre binaire est dans la plupart des cas le meilleur choix.MySQL utilise
LinuxThreads sur Linux. Si vous utilisez une vielle version de Linux qui ne possède pas glibc2 ,
vous devz installer LinuxThreads avant d'essayer de compiler MySQL. Vous pouvez obtenir
LinuxThreads à l'adresse suivante : . Note : Nous avons
rencontré quelques problèmes étranges avec Linux 2.2.14 et MySQL sur les systèmes SMP. Si
vous avez un système SMP, nous vous recommandons de mettre à jour à Linux 2.4 dès que
possible ! Votre système n'en sera que plus rapide et plus stable !
Notez que les versions de glibc inférieure ou égale à la 2.1.1 ont un bogue fatal dans la gestion
de pthread_mutex_timedwait , qui est utilisé lors que vous exécutez INSERT DELAYED . Nous
vous recommandons de ne pas utiliser INSERT DELAYED avant de mettre à jour glibc.
Si vous planifiez d'avoir plus de 1000 connexions simultanées, vous aurez besoin d'apporter
quelques modifications à LinuxThreads, le recompiler, et relier MySQL avec le nouveau
libpthread.a . Augmentez PTHREAD_THREADS_MAX dans
sysdeps/unix/sysv/linux/bits/local_lim.h à 4096 et diminuez STACK_SIZE dans
linuxthreads/internals.h à 256 KB. Les chemins sont relatifs à la racine de glibc . Notez
que MySQL ne sera pas stable autour de 600?1000 connexions si STACK_SIZE est à 2 MB (par
défaut).
Si MySQL n'arrive pas à ouvrir assez de fichiers, ou à créer assez de connexions, il se peut que
vous n'ayez pas configuré Linux pour qu'il gère assez de fichiers.
Dans Linux 2.2 ou plus, vous pouvez connaitre le nombre de gestionnaires de fichiers alloués en
faisant :
cat /proc/sys/fs/file?max
cat /proc/sys/fs/dquot?max
cat /proc/sys/fs/super?max
Si vous avez plus de 16 MB de mémoire, vous devez ajouter qauelque chose comme ce qui suit
dans vos scripts d'initialisation ( /etc/init.d/boot.local sur SuSE Linux) :
echo 65536 > /proc/sys/fs/file?max
echo 8192 > /proc/sys/fs/dquot?max
echo 1024 > /proc/sys/fs/super?max
Vous pouvez aussi exécuter les commandes précédentes à partir de la ligne de commande en tant
que root, mais les changements seront perdus au prochain redémarrage de l'ordinateur.
Vous pouvez sinon définir ces paramètres lors du démarrage de la machine en utilisant l'outil
sysctl , qui est utilisé par plusieurs distributions Linux (SuSE l'a aussi ajouté, à partir de SuSE
Linux 8.0). Ajoutez simplement les valeurs suivantes dans un fichier nommé  :
# Increase some values for MySQL
?max = 65536
fs.dquot?max = 8192
fs.super?max = 1024
Vous devez aussi ajouter ce qui suit à  :
[safe_mysqld]
open?files?limit=8192
Cela devrait permettre à MySQL de créer jusqu'à 8192 fichiers de constante
STACK_SIZE des LinuxThreads contrôle l'espacement des piles de threads dans l'espace
d'adressage. Elle doit être assez grande pour qu'il y ait plusieurs chambres pour la pile de chaque
 2.6 Notes spécifiques aux systèmes d'exploitation
98

Manuel MySQL 4.1.x ? Version Française
thread individuel, mais assez petite pour empêcher les piles de certains threads d'agir sur les
données globales de mysqld . Malheureusement, l'implémentation Linux de mmap() , comme nous
l'avons découvert, will successfully unmap an already mapped region if you ask it to map out an
address already in use, zeroing out the data on the entire page, instead of returning an error. So,
the safety of mysqld or any other threaded application depends on the "gentleman" behaviour of
the code that creates threads. The user must take measures to make sure the number of running
threads at any time is sufficiently low for thread stacks to stay away from the global heap. With
mysqld , you should enforce this "gentleman" behaviour by setting a reasonable value for the
max_connections variable.
Si vous construisez MySQL vous?mêmes et ne voulez pas vous amuser à patcher LinuxThreads,
vous ne devez pas dépasser 500 pour la valeur de max_connections . Cela devrait même être
moins si vous avez un tampon de clefs assez large, de grosses tables heap, ou d'autres choses qui
peuvent faire allouer beaucoup de mémoire à mysqld , ou si vous utilisez un noyau 2.2 avec un
patch 2G. Si vous utilisez notre binaire ou RPM 3.23.25 ou plus, vous pouvez mettre
max_connections à 1500 sans problèmes, en supposant que vous n'avez ni de grosses tables
heap ni grands tampons de clefs. Plus vous réduirez STACK_SIZE dans LinuxThreads plus les
threads créés seront sûrs. Nous recommandons une valeur entre 128K et 256K.
Si vous utilisez beaucoup de connexions simultanées vous souffrirez peut?être d'une
"fonctionnalité" du noyau 2.2 qui pénalise un processus lors du fork ou du clonage d'un enfant en
essayant de prévenir un attaque du type fork bomb. This will cause MySQL not to scale well as you
increase the number of concurrent clients. On single?CPU systems, we have seen this manifested
in a very slow thread creation, which means it may take a long time to connect to MySQL (as long
as 1 minute), and it may take just as long to shut it down. On multiple?CPU systems, we have
observed a gradual drop in query speed as the number of clients increases. In the process of trying
to find a solution, we have received a kernel patch from one of our users, who claimed it made a lot
of difference for his site. The patch is available at
testing of this patch on both development and production systems. It has significantly improved
MySQL performance without causing any problems and we now recommend it to our users who are
still running high?load servers on 2.2 kernels. This issue has been fixed in the 2.4 kernel, so if you
are not satisfied with the current performance of your system, rather than patching your 2.2 kernel, it
might be easier to just upgrade to 2.4, which will also give you a nice SMP boost in addition to fixing
this fairness bug.
We have tested MySQL on the 2.4 kernel on a 2?CPU machine and found MySQL scales much
better?there was virtually no slowdown on queries throughput all the way up to 1000 clients, and the
MySQL scaling factor (computed as the ratio of maximum throughput to the throughput with one
client) was 180%. We have observed similar results on a 4?CPU system?virtually no slowdown as
the number of clients was increased up to 1000, and 300% scaling factor. So for a high?load SMP
server we would definitely recommend the 2.4 kernel at this point. We have discovered that it is
essential to run mysqld process with the highest possible priority on the 2.4 kernel to achieve
maximum performance. This can be done by adding renice ?20 $$ command to safe_mysqld
. In our testing on a 4?CPU machine, increasing the priority gave 60% increase in throughput with
400 clients.
Nous essayons aussi actuellement d'obtenir des informations sur le bon fonctionnement de MySQL
sur le noyaux 2.4 sur les systèmes 4?voies and 8?voies. Si vous avez accès à un tel système et
que vous avez effectués quelques tests de performances, envoyez?nous un mail à
greatly hurts MySQL performance, especially on SMP systems. The implementation of mutex in
LinuxThreads in glibc?2.1 is very bad for programs with many threads that only hold the mutex
for a short time. On an SMP system, ironic as it is, if you link MySQL against unmodified
 2.6 Notes spécifiques aux systèmes d'exploitation
99

Manuel MySQL 4.1.x ? Version Française
LinuxThreads , removing processors from the machine improves MySQL performance in many
cases. We have made a patch available for glibc 2.1.3 to correct this behaviour (
?2.1?patch ).With glibc?2.2.2 MySQL
version 3.23.36 will use the adaptive mutex, which is much better than even the patched one in
glibc?2.1.3 . Be warned, however, that under some conditions, the current mutex code in
glibc?2.2.2 overspins, which hurts MySQL performance. The chance of this condition can be
reduced by renicing mysqld process to the highest priority. We have also been able to correct the
overspin behaviour with a patch, available at
overspin, maximum number of threads, and stack spacing all in one. You will need to apply it in the
linuxthreads directory with patch ?p0 </tmp/linuxthreads?2.2.2.patch . We hope it
will be included in some form in to the future releases of glibc?2.2 . In any case, if you link
against glibc?2.2.2 you still need to correct STACK_SIZE and PTHREAD_THREADS_MAX . We
hope that the defaults will be corrected to some more acceptable values for high?load MySQL setup
in the future, so that your own build can be reduced to ./configure; make; make install .
We recommend that you use the above patches to build a special static version of libpthread.a
and use it only for statically linking against MySQL . We know that the patches are safe for MySQL
and significantly improve its performance, but we cannot say anything about other applications. If
you link other applications against the patched version of the library, or build a patched shared
version and install it on your system, you are doing it at your own risk with regard to other
applications that depend on LinuxThreads .
Si vous rencontrez des problèmes étranges lors de l'installation de MySQL, ou quoi que ce soit qui
s'en rapproche, il est fort possible que cela soit un problème de librairie ou de compilateur. Si c'est
le cas, l'utilisation de notre binaire les résoudra.
Un problème connu avec la distribution binaire est que avec les anciens systèmes Linux qui utilisent
libc (comme RedHat 4.x ou Slackware), vous obtiendrez quelques erreurs non?fatales de
résolutions de noms d'hôtes. Notes relatives à Linux pour les distribution binaires .
Lors de l'utilisation des LinuxThreads vous verrez un minimum de trois processus en cours. Il s'agit
en fait de threads, il y'a a un pour le gestionnaire des LinuxThreads, un pour gérer les connexions,
et un autre pour gérer les alarmes et les signaux.Notez que le noyau Linux et la librairie
LinuxThread ne peuvent avoir par défaut que 1024 threads. Cela signifie que vous ne pouvez avoir
que 1021 connexions à MySQL sur un système non?patché. La page
vous voyez un processus de démon mysqld mort avec ps , cela signifie le plus souvent que vous
crashe constamment .
To get a core dump on Linux if mysqld dies with a SIGSEGV signal, you can start mysqld with the
??core?file option. Note that you also probably need to raise the core file size by adding
ulimit ?c 1000000 to safe_mysqld or starting safe_mysqld with
??core?file?size=1000000 . safe_mysqld , le script père de mysqld .
Si vous liez votre propre client MySQL et que vousobtenez l'erreur suivante :
.1: ./my: fatal: .4:
open failed: No such file or directory
lors de son exécution, le problème peut être contourné des façons suivantes :
Liez le client avec les options suivantes (au lieu de 
• 
?Lpath ) :
?Wl,r/path? .
Copiez 
• 
 dans /usr/lib .
 2.6 Notes spécifiques aux systèmes d'exploitation
100

Manuel MySQL 4.1.x ? Version Française
Ajoutez le chemin vers le répertoire où se trouve 
• 
 à la variable
d'environnement LD_RUN_PATH avant de mettre en marche votre client.
Si vous utilisez le compilateur Fujitsu (fcc / FCC) vous aurez quelques problèmes en compilant
MySQL car les fichiers d'entêtes Linux sont très orientés gcc .
La ligne suivante de configure devrait fonctionner avec fcc/FCC :
CC=fcc CFLAGS="?O ?K fast ?K lib ?K omitfp ?Kpreex ?D_GNU_SOURCE \
?DCONST=const ?DNO_STRTOLL_PROTO" CXX=FCC CXXFLAGS="?O ?K fast ?K lib \
?K omitfp ?K preex ??no_exceptions ??no_rtti ?D_GNU_SOURCE ?DCONST=const \
?Dalloca=__builtin_alloca ?DNO_STRTOLL_PROTO \
'?D_EXTERN_INLINE=static __inline'" ./configure ??prefix=/usr/local/mysql \
??enable?assembler ??with?mysqld?ldflags=?all?static ??disable?shared \
??with?low?memory
2.6.1.1 Notes relatives à Linux pour les distributions binaires
MySQL requière au moins la version 2.0 de Linux.
Attention : Certains utilisateurs de MySQL nous ont avertis qu'ils ont rencontré de graves
problèmes de stabilité avec MySQL et le noyau 2.2.14 de Linux. Si vous utilisez ce noyau, vous
devez mettre à jour à la 2.2.19 (ou plus récent) ou a un noyau 2.4. Si vous utilisez un ordinateur
multi?processeurs, vous devriez sérieusement songer à passer au noyau 2.4 qui vous aportera de
grandes performances niveau vitesse.
La version binaire est liée avec ?static , ce qui signifie que normalement vous n'avez pas besoin
de vous soucier des versions des librairies système que vous avez. Vous n'avez pas besoin
d'installer LinuxThreads non plus. Un programme lié avec ?static est légèrement plus grand
qu'un programme liée dynamiquement mais aussi un peu plus rapide (3?5%). Un problème,
toutefois, est que vous ne pouvez utiliser de fonctions définies par l'utilisateur avec un programme
lié statiquement. Si vous allez écrire ou utiliser des fonctions UDF (c'est réservé aux développeurs
C ou C++), vous devez compiler MySQL vous?mêmes, en utilisant les liaisons dynamiques.
Si vous utilisez un système basé sur libc (au lieu de glibc2 ), vous aurez probablement
quelques problèmes de résolution des noms d'hôtes et des problèmes avec getpwnam() avec les
versions binaires. (Cela vient du fait que glibc dépend malheureusement de quelques librairies
externes pour résoudre les noms d'hôtes et getpwent() , même quand elle est compilée avec
?static ). Dans ce cas, vous obtiendrez probablement l'erreur suivante quand vous exécuterez
mysql_install_db :
Sorry, the host 'xxxx' could not be looked up
ou l'erreur suivante quand vous essayez de démarrer mysqld avec l'option ??user :
getpwnam: No such file or directory
Vous pouvez résoudre ce problème de la façon suivante :
Obtenez une distribution des sources MySQL (un distribution RPM ou le 
• 
 ) et
installez la à la place.
Exécutez 
• 
mysql_install_db ??force ; cela n'exécutera pas le test resolveip dans
mysql_install_db . Le mauvais côté est que vous ne pourrez pas utiliser de noms
d'hôtes dans les tables de droits; vous devez utiliser les adresses IP à la place (sauf pour
localhost ). Si vous utilisez une vielle version de MySQL qui ne supporte pas ??force ,
vous devez supprimer le test resolveip dans mysql_install à l'aide d'un éditeur.
Démarrez 
• 
mysqld avec su au lieu d'utiliser ??user .
 2.6.1.1 Notes relatives à Linux pour les distributions binaires
101

Manuel MySQL 4.1.x ? Version Française
Le binaire Linux?Intel et les RPM de MySQL sont configurés pour la vitesse la plus grande possible.
Nous essayons toujours d'utiliser le compilateur le plus rapide support Perl de MySQL
requière la version 5.004_03 de Perl ou plus récent.
Sur quelques version de Linux 2.2, vous pouvez obtenir l'erreur Resource temporarily
unavailable quand vous faites beaucoup de nouvelles connexions à un serveur mysqld en
utilisant TCP/IP.
Le problème est que Linux possède un délai entre votre fermeture de la socket TCP/IP et sa
libération par le système. Vu qu'il y'a un nombre fini de places pour les branchements TCP/IP, vous
obtiendrez l'erreur précédente si vous essayez de faire beaucoup de connexions TCP/IP en peu de
temps, comme quand vous exécutez le benchmark MySQL test?connect via TCP/IP.
Nous avons envoyé des questions plusieurs fois à propos de ce problème à différentes listes de
diffusions Linux mais n'avons jamais réussi à résoudre ce problème proprement.
Le seul 'correctif' connu pour ce problème est d'utiliser des connexions persistantes dans vos
clients ou d'utiliser les sockets, si vous utilisez le serveur de bases de données et le client sur la
même machine. Nous espérons que le noyau de Linux 2.4 corrigera ce problème bientôt.
2.6.1.2 Notes relatives à Linux x86
MySQL requière la version 5.4.12 de libc ou plus récent. Il est connu pour fonctionner avec libc
5.4.46. La version 2.0.6 de glibc ou plus récente devrait aussi fonctionner. Il y'a eu quelques
problèmes avec les RPM de glibc de RedHat, et donc, si vous avez des problèmes, vérifiez s'il
existe des mises à jour ! Les RPM de glibc 2.0.7?19 et 2.0.7?29 snot connus pour fonctionner.
Si vous utilisez gcc 3.0 ou plus récent pour compiler MySQL, vous devez installer la librairie
libstdc++v3 avant de compiler MySQL; si vous ne le faites pas vous obtiendrez une erreur à
propos d'un symbole __cxa_pure_virtual manquant durant la liaison !
Sur quelques vieilles distributions de Linux, configure peut produire une erreur comme celle qui
suit :
Syntax error in sched.h. Change _P to __P in the /usr/include/sched.h file.
See the Installation chapter in the Reference Manual.
Faites ce que le message d'erreur dit et ajoutez un _ à la macro _P qui n'en a qu'un, puis essayez à
pouvez obtenir quelques avertissements en compilant; celles qui suivent peuvent
être ignorées :
?o objs?thread/mysqld.o
: In function `void init_signals()':
:315: warning: assignment of negative value `?1' to
`long unsigned int'
: In function `void * signal_hand(void *)':
:346: warning: assignment of negative value `?1' to
`long unsigned int'
Sur Debian GNU/Linux, si vous voulez que MySQL démarre automatiquement lors du démarrage
de votre système, faites ce qui suit :
shell> cp support?files/mysql.server /etc/init.d/mysql.server
shell> /usr/sbin/update?rc.d mysql.server defaults 99
mysql.server peut être trouvé dans le dossier share/mysql dans le dossier d'installation de
MySQL ou dans le dossier support?files de l'arborescence des sources de MySQL.
Si mysqld provoque toujours un core dump au démarrage, le problème peut être que vous avez un
vieux /lib/libc.a . Renommez le, puis supprimez sql/mysqld et faites à nouveau un make
 2.6.1.2 Notes relatives à Linux x86
102

Manuel MySQL 4.1.x ? Version Française
install puis réassayez. Ce problème a été reporté sur quelques installations de Slackware.
Si vous obtenez l'erreur suivante en liant mysqld , cela signifie que votre libg++.a n'est pas
installé correctement :
/usr/lib/libc.a(putc.o): In function `_IO_putc':
putc.o(.text+0x0): multiple definition of `_IO_putc'
Vous pouvez éviter d'utiliser libg++.a en exécutant configure comme suit :
shell> CXX=gcc ./configure
2.6.1.3 Notes relatives à Linux SPARC
Sur quelques implémentations, readdir_r() est cassé. Le symptome est que SHOW DATABASES
retourne toujours un résultat vide. Cela peut être corrigé en supprimant HAVE_READDIR_R de
config.h après avoir configuré et avant de commencer à compiler.
Quelques problèmes demanderont le patchage de votre installation Linux. Le patch peut être trouvé
distribution sparclinux? de Linux qui est disponible sur 
(une version de Linux qui n'a jamais été mélangée avec la 2.0.30 officielle). Vous devez aussi
installer la version 0.6 des LinuxThreads ou une version plus récente.
2.6.1.4 Notes relatives à Linux Alpha
La version 3.23.12 de MySQL est la première version de MySQL à être testée sur Linux?Alpha. Si
vous voulez utiliser MySQL sur Linux?Alpha, vous devez vous assurer d'avoir cette version ou une
version plus récente.
Nous avons testé MySQL sur Alpha avec nos benchmarks et notre suite de tests, et cela semble
fonctionner correctement.
Nous construisons actuellement les packages binaires de MySQL sur SuSE Linux 7.0 pour AXP,
kernel 2.4.4?SMP, Compaq C compiler (V6.2?505) et Compaq C++ compiler (V6.3?006) sur une
machine Compaq DS20 avec un processeur Alpha pouvez trouver les précédents
lieu de gcc, nous obtenons à peu près 9?14% de meilleures performances avec MySQL.Notez que
jusqu'au version 3.23.52 et 4.0.2 de MySQL nous avons optimisé le binaire pour le CPU courant
seulement (en utilisant l'option de compilation ?fast ); cela signifiait que vous ne pouviez utiliser
nos binaires si vous n'aviez pas un processeur Alpha EV6.
Avec les realeases suivantes nous avons ajouté l'option ?arch generic à nos options de
compilation, ce qui assure que le binaire fonctionne sur tout les processeurs Alpha. Nous compilons
aussi statiquement pour éviter les problèmes de librairies.
CC=ccc CFLAGS="?fast ?arch generic" CXX=cxx \
CXXFLAGS="?fast ?arch generic ?noexceptions ?nortti" \
./configure ??prefix=/usr/local/mysql ??disable?shared \
??with?extra?charsets=complex ??enable?thread?safe?client \
??with?mysqld?ldflags=?non_shared ??with?client?ldflags=?non_shared
Si vous voulez utiliser egcs la ligne de configuration suivante a fonctionné pour nous :
CFLAGS="?O3 ?fomit?frame?pointer" CXX=gcc \
CXXFLAGS="?O3 ?fomit?frame?pointer ?felide?constructors \
?fno?exceptions ?fno?rtti" ./configure ??prefix=/usr/local/mysql \
 2.6.1.3 Notes relatives à Linux SPARC
103

Manuel MySQL 4.1.x ? Version Française
??disable?shared
Quelques problèmes connus lors de l'utilisation de MySQL sur Linux?Alpha:
Le débogage d'applications thréadées comme MySQL ne fonctionnera pas avec 
• 
gdb 4.18
. Vous devez télécharger et utiliser gdb 5.1 à la place !
Si vous essayez de lier statiquement 
• 
mysqld en utilisant gcc , l'image résultante videra son
noyau (core dump) au démarrage. En d'autres termes, n' utilisez pas
??with?mysqld?ldflags=?all?static avec gcc .
2.6.1.5 Note relative à Linux PowerPC
MySQL devrait fonctionner sur MkLinux avec le dernier package glibc (testé avec glibc 2.0.7).
2.6.1.6 Notes relatives à Linux MIPS
Pour faire fonctionner MySQL sur Qube2, (Linux Mips), vous aurez besoin de la librairie glibc la
plus récente ( glibc?2.0.7?29C2 est connue pour marcher). Vous devez aussi utiliser le
compilateur egcs C++ ( egcs?1.0.2?9 , gcc 2.95.2 ou plus récent).
2.6.1.7 Notes relatives à Linux IA64
Pour pouvoir compiler MySQL sous Linux IA64, nous utilisons les lignes de compilation suivante :
En utilisant gcc?2.96 :
CC=gcc CFLAGS="?O3 ?fno?omit?frame?pointer" CXX=gcc \
CXXFLAGS="?O3 ?fno?omit?frame?pointer ?felide?constructors \
?fno?exceptions ?fno?rtti" ./configure ??prefix=/usr/local/mysql \
"??with?comment=Official MySQL binary" ??with?extra?charsets=complex
Sur IA64 les binaires des clients MySQL utilisent des librairies partagées. Cela signifie que si vous
installez notre distribution binaire à un autre endroit que /usr/local/mysql vous devez modifier
le fichier  ou ajouter le chemin vers le répertoire où vous avez
 à la variable d'environnement LD_LIBRARY_PATH .
Problèmes en reliant avec la librairie du client MySQL .
2.6.2 Notes relatives à Windows
Cette section décrit l'utilisation de MySQL sur Windows. Ces informations sont aussi fournies dans
le fichier README disponible avec la distribution Windows de MySQL.
2.6.2.1 Démarrer MySQL sous Windows 95, 98 ou Me
MySQL utilise TCP/IP pour connecter le client au serveur (cela permet à une machine distante de
se connecter à votre serveur MySQL). A cause de cela, vous devez installer TCP/IP sur votre
machine avant de démarrer MySQL. Vous pouvez trouver TCP/IP sur votre CDRom
Windows.Notez que si vous utilisez une vieille version de Windows 95 (par exemple, OSR2), il est
probable que vous ayez une vieille version du Winsock; MySQL requiert Winsock 2! Vous pouvez
librairie Winsock 2, et ce paragraphe ne s'applique démarrer le serveur mysqld , vous
 2.6.1.5 Note relative à Linux PowerPC
104

Manuel MySQL 4.1.x ? Version Française
devez utiliser une fenêtre MS?DOS et y taper :
C:\> C:\mysql\bin\mysqld
Cela va démarrer mysqld en tâche de fond, sans fenê pouvez arrêter MySQL avec la
commande :
C:\> C:\mysql\bin\mysqladmin ?u root shutdown
Ce script appelle l'utilitaire d'administration MySQL sous le nom de `root', qui est l'administrateur
par défaut. Notez bien que les noms d'utilisateurs de MySQL sont totalement indépendants des
utilisateurs Windows.Notez que Windows 95/98/Me ne supporte pas la création des pipes nommés.
Sur ces plate?formes, vous ne pouvez utiliser que des pipes pour vous connecter à un serveur
MySQL distant, qui tournerait sur un hôte Windows NT/2000/XP (le serveur MySQL soit aussi
supporter les pipes nommés, bien sur. Par exemple, utiliser mysqld?opt sous NT/2000/XP ne
permettra pas d'utiliser les pipes nommés. Vous devez utiliser soit mysqld?nt , soit
mysqld?max?nt ).
Si mysqld ne démarre pas, vérifiez le fichier \mysql\data\ pour voir si le serveur n'a
pas placé un message d'erreur indiquant la cause du problème. Vous pouvez aussi essayer de
démarrer le serveur avec la commande mysqld ??standalone ; dans ce cas, vous pourriez voir
apparaître des informations sur l'écran qui vous aideront à résoudre le problème.
La dernière option est de démarrer mysqld avec l'option ??standalone ??debug . Dans ce cas,
mysqld va écrire le fichier de log C:\mysqld.trace qui devrait contenir l'explication du problème.
Créer des fichiers de traçage .
Utilisez mysqld ??help pour afficher toutes les options que mysqld comprend!
2.6.2.2 Démarrer MySQL sur Windows NT, 2000 ou XP
Pour faire fonctionner MySQL avec TCP/IP sous Windows NT 4, vous devez installer le service
pack 3 (ou plus récent)!
Normalement, vous devez installer MySQL comme un service Windows NT/2000/XP. Dans le cas
où le serveur fonctionnerait déjà, commencez par le stopper, en utilisant cette commande :
C:\mysql\bin> mysqladmin ?u root shutdown
Cela appelle l'utilitaire d'administation MySQL, avec l'utilisateur ` root ', qui est par défaut un
Administrateur de MySQL. Notez bien que le système de droits de MySQL est totalement
indépendant du système d'utilisateur de Windows.Maintenant, l'installation du serveur en tant que
service :
C:\mysql\bin> mysqld?max?nt ??install
Si des options sont nécessaires, vous devez les spécifier comme `` Start parameters '' dans
l'utilitaire Windows Services avant de démarrer le service MySQL.L'utilitaire Services (
Windows Service Control Manager ) est disponible dans le Windows Control Panel
(sous les Outils d'administration de Windows 2000). Il est recommandé de fermer les
utilitaires de services durant l'installation ??install ou la suppression ??remove , pour éviter des
erreurs étranges.
sous Windows .
Notez bien que depuis MySQL version 3.23.44, vous avez le choix de configurer le serveur en
 2.6.2.2 Démarrer MySQL sur Windows NT, 2000 ou XP
105

Manuel MySQL 4.1.x ? Version Française
Manual au lieu d'automatique (si vous ne voulez pas que le service démarre en même temps que
le serveur) :
C:\mysql\bin> mysqld?max?nt ??install?manual
Le service est installé avec le nom MySQL . Une fois installé, il peut être immédiatement démarré
depuis l'utilitaire Services , ou avec la commande en ligne NET START MySQL .Une fois qu'il
fonctionne, mysqld?max?nt peut être arrété avec mysqladmin , depuis l'utilitaire de services, ou
en utilisant la commande en ligne NET STOP MySQL .
Lorsqu'il fonctionne comme service, le système d'exploitation va automatiquement arréter MySQL
au moment de l'exticntion. Avec MySQL versions inférieures à 3.23.47, Windows attendait
simplement quelques secondes l'extinction, puis si cela durait trop, il tuait le processus, ce qui
causait parfois des problèmes. Par exemple, au démarrage suivant, le gestionnaire de table
InnoDB devait faire une restauration après crash. Depuis MySQL version 3.23.48, Windows attend
plus longtemps que MySQL s'arrête. Si vous notez que ce temps n'est pas suffisant pour votre
installation, il est recommandé de ne pas utiliser MySQL sous forme de service, mais à partir de la
ligne de commande, et de l'éteindre manuellement avec mysqladmin shutdown .
Il y a ce problème avec Windows NT (mais pas Windows 2000/XP), qui, par défaut, attend 20
secondes l'extinction d'un service, puis tue le processus. Vous pouvez augmenter ce délai en
ouvrant l'éditeur de base de registre \winnt\system32\ et en modifiant la valeur
de WaitToKillServiceTimeout dans
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control . Spécifiez une nouvelle
valeur en millisecondes, par exemple 120000 pour que Windows NT attende désormais jusqu'à 120
secondes.
Notez que lorsqu'il fonctionne comme un service, mysqld?max?nt n'a pas d'accès à la console, et
ainsi, aucun mesasge n'est disponible. Les erreurs sont alors stockées dans le fichier
c:\mysql\data\ .
Si vous avez des problèmes à installer mysqld?max?nt comme service, essayer de le démarrer
en utilisant le chemin complet :
C:\> C:\mysql\bin\mysqld?max?nt ??install
Si cela ne fonctionne pas, vous pouvez faire démarrer proprement mysqld?max?nt en modifiant le
chemin dans la base de vous ne voulez pas démarrer mysqld?max?nt comme service,
vous pouvez le démarrer comme ceci :
C:\> C:\mysql\bin\mysqld?max?nt ??standalone
ou
C:\> C:\mysql\bin\mysqld ??standalone ??debug
Cette dernière méthode vous donnera une trace de débogage dans le fichier C:\mysqld.trace .
Créer des fichiers de traçage .
2.6.2.3 Faire fonctionner MySQL sous Windows
MySQL supporte TCP/IP sur toutes les plate?formes Windows et les tunnels nommés sur
NT/2000/XP. Par défaut, les tunnels nommés sont utilisés sur NT/2000/XP pour les connexions
locales et TCP/IP pour tout les autres cas si le client à TCP/IP d'installé. Le nom d'hôte spécifie le
protocole à utiliser :
Nom d'hôte Protocole
NULL
Sur NT/2000/XP, essayer les tunnels nommés avant; si cela ne fonctionne pas,
(aucun)
utiliser TCP/IP. Sur 9x/Me, TCP/IP est utilisé.
 2.6.2.3 Faire fonctionner MySQL sous Windows
106

Manuel MySQL 4.1.x ? Version Française
.
Tunnels nommés
localhost
TCP/IP vers l'hôte courant
hostname
TCP/IP
Vous pouvez forcer un client MySQL à utiliser les tunnels nommés en spécifiant l'option ??pipe ou
en spécifiant le nom d'hôte . en tant que nom d'hôte. Utilisez l'option ??socket pour spécifier le
nom du tunnel.
Notez qu'à partir de la version 3.23.50, les tunnels nommés ne sont activés que si mysqld est
démarré avec ??enable?named?pipe . Il en est ainsi car certains utilisateurs ont rencontré des
problèmes en coupant le serveur MySQL lorsque celui?ci utilise des tunnels nommés.
Vous pouvez vérifier si MySQL fonctionne en exécutant les commandes suivantes :
C:\> C:\mysql\bin\mysqlshow
C:\> C:\mysql\bin\mysqlshow ?u root mysql
C:\> C:\mysql\bin\mysqladmin version status proc
C:\> C:\mysql\bin\mysql test
Si mysqld est lent à répondre aux connexions sur Windows 9x/Me, il y'a probablement un
problème avec vos DNS. Dans ce cas, démarrez mysqld avec ??skip?name?resolve et utilisez
localhost et les adresses IP dans les tables de droits MySQL. Vous pouvez aussi éviter les DNS
lors de la connexion à un serveur mysqld?nt MySQL tournant sur NT/2000/XP en utilisant
l'argument ??pipe pour spécifier l'utilisation des tunnels nommés. Cela fonctionne pour la plupart
des clients y'a deux versions de l'outil en ligne de commande MySQL :
Binaire Description
Compilé nativement sur Windows, ce qui fournit des possiblités très limitées d'édition de
mysql
texte.
mysqlc Compilé avec le compilateur Cygnus GNU et librairies, ce qui fournit l'édition readline .
Si vous voulez utiliser  , vous devez copier C:\mysql\lib\ dans le
répertoire système de Windows ( \windows\system ou un endroit similaire).
Les privilèges par défaut sur Windows donnent un accès à tous les utilisateurs locaux pour toutes
les bases de données sans spécifier de mot de passe. Pour rendre MySQL un peu plus sécurisé,
vous devez définir un mot de passe pour tout les utilisateurs et supprimer la ligne dans la table
 qui contient Host='localhost' et User='' .
Vous devez aussi ajouter un mot de passe pour le nouvel utilisateur root . L'example suivant
commence par supprimer l'utilisateur anonyme qui possède tous les privilèges, puis configure un
mot de passe pour l'utilisateur root :
C:\> C:\mysql\bin\mysql mysql
mysql> DELETE FROM user WHERE Host='localhost' AND User='';
mysql> QUIT
C:\> C:\mysql\bin\mysqladmin reload
C:\> C:\mysql\bin\mysqladmin ?u root password votre_mot_de_passe
Après avoir changé le mot de passe, si vous voulez couper le serveur mysqld , vous pouvez le
faire en utilisant la commande :
C:\> mysqladmin ??user=root ??password=votre_mot_de_passe shutdown
Si vous utilisez la vielle version 3.21 de MySQL sous Windows, la commande précédente échouera
avec l'erreur : parse error near 'SET password' . La solution est de mettre à jour à la
dernière version de MySQL qui est maintenant disponible.
 2.6.2.3 Faire fonctionner MySQL sous Windows
107

Manuel MySQL 4.1.x ? Version Française
Avec les versions courantes de MySQL vous pouvez facilement ajouter des utilisateurs et changer
les privilèges avec les commandes GRANT et REVOKE . Syntaxe de GRANT et REVOKE .
2.6.2.4 Connexion à un serveur MySQL distants, sous Windows avec SSH
Voici une note pour connecter un serveur MySQL avec une connexion sécurisée grâce à SSH (de
David Carlson ) :
Installez un client SSH pour votre machine Windows. En tant qu'utilisateur, le meilleur que je
• 
connaisse est celui de SecureCRTf?secureavec Google à
.
Démarrez votre client SSH Windows. Spécifiez 
• 
Host_Name =
yourmysqlserver_URL_or_IP . Spécifiez userid=your_userid pour vous loger dans
votre serveur (probablement avec un mot de passe et un nom d'utilisateur différent).
Configurez le forward de port. Faites soit un forward distant (spécifiez 
• 
local_port: 3306
, remote_host: yourmysqlservername_or_ip , remote_port: 3306 ) soit un
forward local (spécifiez port: 3306 , host: localhost , remote port: 3306 ).
Sauvez le tout, sinon vous devrez le refaire la prochaine fois.
• 
Connectez vous à votre serveur avec la session SSH que vous venez de créer.
• 
Sous votre machine Windows, démarrez une application ODBC (comme Access).
• 
Créez un nouveau fichier dans Windows et reliez le avec MySQL en utilisant le pilote ODBC
• 
de la même façon que vous le feriez habituellement, hormis le fait que vous devrez taper
localhost comme hôte serveur au lieu de yourmysqlservername .
Vous avez maintenant une connexion ODBC avec un serveur MySQL distant, et sécurisée avec
SSH.
2.6.2.5 Paratger les données entre plusieurs disque sous Windows
A partir de la version 3.23.16 de MySQL, les serveurs mysqld?max et mysql?max?nt dans les
distributions MySQL sont compilés avec l'option ?DUSE_SYMDIR . Cela vous permet de placer une
base de données sur un disque différent en lui ajoutant un lien symbolique (c'est d'une certaine
manière similaire au fonctionnement des liens symboliques sous Unix).
Sous Windows, vous créez un lien symbolique vers la base de données en créant un fichier qui
contient le cheminvers le répertoire de destination et en le sauvant dans le répertoire mysql_data
sous le nom  . Notez que le lien symbolique ne sera utilisé que si le répertoire
mysql_data_dir\database n'existe pas.
Par exemple, si le répertoire des données de MySQL est C:\mysql\data et que vous voulez avoir
une base de données foo située dans D:\data\foo , vous devez créer le fichier
C:\mysql\data\ qui contient le texte D:\data\foo\ . Après cela, toutes les tables
crées dans foo le seront dans D:\data\foo .
Notez qu'à cause de la pénalité sur la vitesse que vous obtenez en ouvrant toutes les tables, nous
n'avons pas activé cela par défaut, même si vous avez compilé MySQL avec le support des liens
symboliques. Pour les activer, vous devez placer dans votre fichier  ou  l'entrée
suivante :
 2.6.2.4 Connexion à un serveur MySQL distants, sous Windows avec SSH
108

Manuel MySQL 4.1.x ? Version Française
[mysqld]
use?symbolic?links
En MySQL 4.0 nous activerons les liens symboliques par défaut. Vous devrez alors utiliser l'option
skip?symlink pour les désactiver.
2.6.2.6 Compiler les clients MySQL sous Windows
Dans vos fichiers sources, vous devez inclure windows.h avant mysql.h :
#if defined(_WIN32) || defined(_WIN64)
#include <windows.h>
#endif
#include <mysql.h>
Vous pouvez soit lier votre code avec la librairie dynamique  , qui est juste une
interface pour charger  à la demande, soit lier avec la librairie statique
 .
Notez que puisque les librairies mysqlclient sont compilées en tant que librairies threadées, vous
devez aussi compiler votre code pour qu'il soit multi?thréadé !
2.6.2.7 MySQL pour Windows face à MySQL pour Unix
MySQL pour Windows a prouvé qu'il était très stable. Cette version de MySQL a les mêmes
fonctionnalités que la version Unix, a quelques exceptions :
Windows 95 et les threads
Windows 95 perf environs 200 octets de mémoire central lors de la création de
chaque thread. Chaque connexion MySQL crée un nouveau thread, ce qui fait qu'il
n'est pas recommandé d'exécuter mysqld pour des durées longues sur Windows 95
si votre serveur gère de nombreuses connexions. Les autres versions de Windows
ne souffrent pas du même problème.
Lectures concurrentes
MySQL dépends des fonctions pread() et pwrite() pour être capable de mêler
des INSERT et des SELECT . Actuellement, nous utilise mutexes pour émuler les
fonctions pread() / pwrite() . Nous allons, à long terme, remplacer ce niveau
d'interface par une interface virtuelle de façon à ce que nous puissions utiliser
l'interface readfile() / writefile() de Windows NT/2000/XP pour gagner de la
vitesse. L'implémentation courante limite le nombre de fichiers ouverts par MySQL à
1024, ce qui signifie que vous ne pouvez pas utiliser d'aussi nombreux threads
concurrents sur NT/2000/XP que sur Unix.
Blocking read
MySQL utilise une lecture bloquée pour chaque connexion. Cela signifie que :
Une connexion ne sera pas déconnectée automatiquement après 8 heures
d'inactivité, comme c'est le cas sous Unix.
Si une connexion se bloque, il est impossible de la détruire sans tuer MySQL.
mysqladmin kill ne fonctionne pas sur une connexion endormie.
mysqladmin shutdown ne peut pas s'exécuter tant qu'il y a des
connexions qui dorment.
Nous envisageons de corriger ce problème, lorsque les développeurs Windows
auront fourni un palliatif.
DROP DATABASE
 2.6.2.6 Compiler les clients MySQL sous Windows
109

Manuel MySQL 4.1.x ? Version Française
Vous ne pouvez pas détruire une base qui est utilisée par un autre thread.
Killing MySQL from the task manager
Vous ne pouvez pas tuer MySQL depuis le gestionnaire de tâche ou avec un utilitaire
d'extinction de Windows 95. Vous devez l'éteindre avec mysqladmin shutdown .
Noms sensibles à la casse
Les noms de fichiers sont insensibles à la casse sous Windows, ce qui fait que les
noms de tables et de bases ne sont pas sensibles à la casse pour MySQL sur
Windows. La seule restriction est que les noms de tables et de bases doivent être
donnés avec même casse dans le nom (tout en majuscules, ou en minuscules).
Sensibilité à la casse pour les noms .
Le caractère '\'
Les composants d'un chemin sont séparés par le caractère '\' sous Windows, qui
est aussi le caractère de protection de MySQL. Si vous utilisez la commande LOAD
DATA INFILE ou SELECT ... INTO OUTFILE , vous devez doubler le caractère
'\' :
mysql> LOAD DATA INFILE "C:\\tmp\\" INTO TABLE skr;
mysql> SELECT * INTO OUTFILE 'C:\\tmp\\' FROM skr;
Alternativement, vous pouvez utiliser les noms de fichiers au format Unix, avec le
caractère '/' :
mysql> LOAD DATA INFILE "" INTO TABLE skr;
mysql> SELECT * INTO OUTFILE '' FROM skr;
Can't open named pipe erreur
Si vous utilisez MySQL 3.22 sous NT avec les derniers clients mysql, vous allez
obtenir cette erreur :
error 2017: can't open named pipe to host: . pipe...
Ceci est dû au fait que les versions modernes de MySQL utilisent des pipes nommés
sous NT, par défaut. Pour éviter cette erreur, vous devez utiliser l'option
??host=localhost sur les nouveaux clients, ou bien créer le fichier d'options
C:\ , qui contiendra les informations suivantes :
[client]
host = localhost
Depuis la version 3.23.50, les pipes nommés sont les seuls activés si mysqld est
démarré avec ??enable?named?pipe .
Erreur Access denied for user
Si vous rencontrez l'erreur Access denied for user:
'[email protected]' to database 'mysql' lors de l'accès au serveur
MySQL sur la même machine, cela signifie que MySQL ne peut résoudre
proprement votre nom d'hô corriger cela, vous devriez créer un fichier
\windows\hosts dans l'information suivante :
127.0.0.1       localhost
ALTER TABLE
Lorsque vous exécutez la commande ALTER TABLE , la table est verrouillé,
empêchant les autres threads d'y accéder. Cela est lié au fait que sous Windows,
vous ne pouvez pas effacer un fichier qui est en cours d'utilisation par d'autres
threads : à l'avenir, vous pourrions trouver un moyen de contourner ce problème.
La commande DROP TABLE sur une table qui est utilisée dans le cadre
d'un MERGE ne fonctionne pas sous Windows, car le gestionnaire de MERGE garde la
carte des tables cachée de la couche supérieure de MySQL. Comme Windows ne
vous autorise pas à effacer des fichiers qui sont ouverts, vous devez d'abord vider de
la mémoire toutes les tables du MERGE (avec la commande FLUSH TABLES ) puis
effacer la table MERGE avant d'effacer les tables. Nous allons corriger cela lorsque
nous introduirons la notion de VIEW s.
Les directives DATA DIRECTORY et INDEX DIRECTORY de
CREATE TABLE sont ignorées sous Windows, car Windows ne supporte pas les
liens symboliques.
 2.6.2.6 Compiler les clients MySQL sous Windows
110

Manuel MySQL 4.1.x ? Version Française
Voici quelques problèmes connus et pas encore corrigés, si jamais quelqu'un souhaite nous aider
sur la version Windows :
Mettre en place une librairie pour un utilisateur simple 
• 
 . Elle inclurait toutes les
caractéristiques d'un serveur MySQL standard, hormis la création de threads. Cela
permettra d'inclure facilement MySQL dans des applications qui n'ont pas vraiment besoin
du support client, ou qui n'ont pas besoin d'accéder à un serveur distant.
Ajouter des icônes sympas pour le démarrage et l'arrêt de MysQL, dans l'installateur.
• 
Lorsque 
• 
mysqld est enregistré comme service avec ??install (sous NT) il serait bien de
pouvoir ajouter les options par défaut de la ligne de commande. Pour le moment, le palliatif
consiste à lister les paramètres dans le fichier C:\ .
Il serait vraiment pratique de pouvoir arrêter le processus 
• 
mysqld depuis le gestionnaire de
tâches. Pour le moment, il faut passer par mysqladmin shutdown .
Le port de 
• 
readline sur Windows pour pouvoir l'utiliser avec l'outil de ligne de commande
mysql .
Des versions graphiques des clients standards MySQL ( 
• 
mysql , mysqlshow ,
mysqladmin et mysqldump ) seraient bien.
Il serait bien si les fonctions de lecture et d'écriture sur les sockets de 
• 
net.c pouvaient être
interrompues. Cela rendrait possible l'arrêt des threads en court avec mysqladmin kill
sous Windows.
mysqld
• 
 se lance toujours avec la locale "C" et non pas avec la locale par défaut. Nous
voulons que mysqld utilise la configuration de localisation pour l'ordre de tri.
Ajouter des macros pour utiliser les méthodes rapides d'incrément/décrément compatibles
• 
avec les threads, fourni par Windows.
D'autres spécificités de Windows sont décrites dans le fichier README qui est livré avec la
distribution Windows de MySQL.
2.6.3 Remarques pour Solaris
Sous Solaris, vous pouvez renontrer des problèmes avant même d'avoir désarchivé la distribution
MySQL! Le programme tar de Solaris ne peut pas manipuler de noms de fichiers longs,
provoquant les messages suivants quand vous décompressez MySQL :
x mysql?3.22.12?beta/bench/Results/ATIS?mysql_odbc?NT_4.0?cmp?db2,\
informix,ms?sql,mysql,oracle,solid,sybase, 0 bytes, 0 tape blocks
tar: directory checksum error
Dans ce cas, vous devez utiliser GNU tar ( gtar ) pour désarchiver la distribution. Vous pouvez
native des threads Sun fonctionne uniquement depuis Solaris 2.5. Pour les versions 2.4 et
antérieures, MySQL utilisera automatiquement les MIT?pthreads. Remarques sur MIT?pthreads .
Vous pouvez rencontrer les erreurs suivantes lors du configure:
checking for restartable system calls... configure: error can not run test
programs while cross compiling
Cela signifie que l'installation de votre compilateur est défectueuse! Dans ce cas, vous devez mettre
à jour votre compilateur en faveur d'une version plus récente. Vous pouvez aussi résoudre le
problème en inérant la ligne suivante dans le fichier config.cache :
ac_cv_sys_restartable_syscalls=$&#123;ac_cv_sys_restartable_syscalls='no'&#125;
Si vous utilisez Solaris sur une architecture SPARC, nous recommandons gcc 2.95.2 comme
compilateur. Vous pouvez le trouver sur . Notez que egcs 1.1.1 et gcc 2.8.1 ne
 2.6.3 Remarques pour Solaris
111

Manuel MySQL 4.1.x ? Version Française
fonctionnent pas correctement sur SPARC!La ligne configure recommandée dans le cas de
l'utilisation de gcc 2.95.2 est:
CC=gcc CFLAGS="?O3" \
CXX=gcc CXXFLAGS="?O3 ?felide?constructors ?fno?exceptions ?fno?rtti" \
./configure ??prefix=/usr/local/mysql ??with?low?memory ??enable?assembler
Si vous avez une machine UltraSPARC, vous pouvez gagner 4% de performances supplémentaires
en ajoutant "?mcpu=v8 ?Wa,?xarch=v8plusa" à CFLAGS et vous utilisez le
compilateur Forte 5.0 (et supérieur) de Sun, vous pouvez lancer configure de la façon suivante :
CC=cc CFLAGS="?Xa ?fast ?native ?xstrconst ?mt" \
CXX=CC CXXFLAGS="?noex ?mt" \
./configure ??prefix=/usr/local/mysql ??enable?assembler
Vous pouvez créer un binaire 64 bits avec :
CC=cc CFLAGS="?Xa ?fast ?native ?xstrconst ?mt ?xarch=v9" \
CXX=CC CXXFLAGS="?noex ?mt ?xarch=v9" \
./configure ??prefix=/usr/local/mysql ??enable?assembler
Lors de bancs de tests MySQL, nous avons gagné 4% en vitesse sur une UltraSPARC en utilisant
Forte 5.0 en mode 32 bits plutôt que gcc 3.2 avec les marqueurs ?mcpu.
Si vous créez un binaire 64 bits, il est de 4% plus lent que le binaire 32 bits, mais en contrepartie
vous pouvez gérer davantage de treads et de mémoire.
Si vous rencontrez des problèmes avec fdatasync ou sched_yield , vous pouvez les résoudre
en ajoutant LIBS=?lrt à la ligne configure.
Le paragraphe suivant ne s'applique qu'aux compilateurs plus anciens que WorkShop 5.3 :
Vous pouvez avoir à modifier le script configure et changer la ligne :
#if !defined(__STDC__) || __STDC__ != 1
en :
#if !defined(__STDC__)
Si vous activez __STDC__ avec l'option ?Xc , le compilateur Sun ne peut pas compiler avec le
fichier d'entêtes pthread.h de Solaris. C'est un bogue de Sun (compilateur ou fichier d'inclusion
défectueux).
Si mysqld génère les messages d'erreur suivants lorsque vous le lancez, cela est du au fait que
vous avez compilé MySQL avec le compilateur de Sun sans activer l'option multi?threads ( ?mt ):
libc internal error: _rmutex_unlock: rmutex not held
Ajoutez ?mt à CFLAGS et CXXFLAGS puis réessayez.
Si vous utilisez la version SFW de gcc (fournie avec Solaris 8), vous devez ajouter /opt/sfw/lib
à la variable d'environnement LD_LIBRARY_PATH avant de lancer le configure.
Si vous utilisez le gcc disponible sur  , vous pouvez rencontrer de nombreux
problèmes. Vous devriez recompiler gcc et les GNU binutils sur la machine à partir de laquel vous
les utiliserez, afin d'éviter tout souci.
Si vous obtenez l'erreur suivante lorsque vous compilez MySQL avec gcc , cela signifie que votre
gcc n'est pas configuré pour votre version de Solaris :
shell> gcc ?O3 ?g ?O2 ?DDBUG_OFF  ?o thr_alarm ...
./thr_alarm.c: In function `signal_hand':
./thr_alarm.c:556: too many arguments to function `sigwait'
 2.6.3 Remarques pour Solaris
112

Manuel MySQL 4.1.x ? Version Française
La meilleure chose à faire dans ce cas est d'obtenir la version la plus récente de gcc et de compiler
avec votre gcc actuel! Au moins pour Solaris 2.5, la plupart des versions binaires de gcc ont
d'anciens fichiers d'inclusion inutilisables qui planteront les programmes qui utilisent les threads
(ainsi probablement d'autres programmes)!
Solaris ne fournit pas de versions statiques de toutes les librairies système ( libpthreads et
libdl ), vous ne pouvez donc pas compiler MySQL avec ??static . Si vous tentez de le faire,
vous obtiendrez l'erreur :
ld: fatal: library ?ldl: not found
ou
undefined reference to `dlopen'
ou
cannot find ?lrt
Si de nombreux processus essaient de se connecter très rapidement à mysqld , vous verrez cette
erreur dans le journal MySQL :
Error in accept: Protocol error
Pour éviter cela, vous pouvez lancer le serveur avec l'option ??set?variable back_log=50 .
Veuillez noter que ??set?variable est déprécié depuis MySQL 4.0, utilisez uniquement
??back_log=50 . Options en ligne de commande de mysqld .Si vous liez votre propre client
MySQL, vous pouvez avoir l'erreur suivante quand vous le lancez :
.1: ./my: fatal: .#:
open failed: No such file or directory
Le problème peut être évité avec l'une des méthodes suivantes :
Liez le client avec le marqueur suivant (à la place de 
• 
?Lpath ) :
?Wl,r/full?path?to? .
Copiez 
• 
 dans /usr/lib .
Ajoutez le chemin du répertoire où 
• 
 est installé à la variable
d'environnement LD_RUN_PATH avant de lancer votre client.
Si vous avez des soucis avec configure qui essaie de lier avec ?lz et que vous n'avez pas installé
zlib , vous avez deux solutions :
Si vous voulez utiliser le protocole compresseé de communication, vous devrez vous
• 
procurer et installer zlib sur .
Configurez avec 
• 
??with?named?z?libs=no .
Si vous utilisez gcc et rencontrez des problèmes en chargeant la fonction UDF dans MySQL,
essayez d'ajouter ?lgcc à la ligne de liaison de la fonction UDF .
Si vous voulez que MySQL se lance automatiquement, vous pouvez copier
support?files/mysql.server dans /etc/init.d et créer un lien symbolique pointant
dessus et s'appelant /etc/rc3.d/S99mysql.server .
Comme Solaris ne supporte pas les fichiers core pour les applications setuid() , vous ne pouvez
pas obtenir un fichier core de mysqld si vous utilisez l'option ??user .
 2.6.3 Remarques pour Solaris
113

Manuel MySQL 4.1.x ? Version Française
2.6.3.1 Notes relatives à Solaris 2.7/2.8
Vous pouvez normalement utiliser les binaires Solaris 2.6 sur Solaris 2.7 et 2.8. La plupart des
fonctionnalitées de Solaris 2.6 s'appliquent aussi à Solaris 2.7 et 2.8.
Notez que la version 3.23.4 de MySQL et plus doivent être capables de détecter automatiquement
les nouvelles versions de Solaris et d'activer les parades pour résoudre les problèmes suivants !
Solaris 2.7 / 2.8 ont quelques bogues dans les fichiers inclus. Vous verrez peut?être l'erreur
suivante en utilisant gcc :
/usr/include/widec.h:42: warning: `getwc' redefined
/usr/include/wchar.h:326: warning: this is the location of the previous
definition
Si cela arrive, vous pouvez faire ce qui suit pour résoudre ce problème :Copiez
/usr/include/widec.h vers .../lib/gcc?lib/os/gcc?version/include et changez la
ligne 41 de :
#if     !defined(lint) && !defined(__lint)
en
#if     !defined(lint) && !defined(__lint) && !defined(getwc)
Alternativement, vous pouvez éditer directement le fichier /usr/include/widec.h . De toutes
façons, après avoir apporté la correction, vous devez effacer config.cache et exécuter
configure à nouveau !Si vous obtenez des erreurs comme celles qui suivent quand vous
exécutez make , c'est parce que configure n'a pas détecté le fichier curses.h (probablement à
cause de l'erreur dans /usr/include/widec.h ) :
In file included from :50:
/usr/include/term.h:1060: syntax error before `,'
/usr/include/term.h:1081: syntax error before `;'
La solution est de faire l'une des choses qui suit :
Configurez avec 
• 
CFLAGS=?DHAVE_CURSES_H CXXFLAGS=?DHAVE_CURSES_H
./configure .
Editez 
• 
/usr/include/widec.h comme indiqué plus haut et ré?exécutez configure.
Effacez la ligne 
• 
#define HAVE_TERM di fichier config.h et exécutez make à nouveau.
Si vous obtenez une erreur disant que votre programme de liaison ne peut trouver ?lz lors de la
liaison du programme de votre client, le problème est probablement que votre fichier  est
installé dans /usr/local/lib . Vous pouvez corriger ceci en utilisant l'une des méthodes
suivantes :
Ajoutez 
• 
/usr/local/lib à LD_LIBRARY_PATH .
Ajoutez un lien vers 
• 
 à partir de /lib .
Si vous utilisez Solaris 8, vous pouvez installer la zlib optionnelle à partir de votre CD Solaris
• 
8.
Configurez MySQL avec l'option 
• 
??with?named?z?libs=no .
2.6.3.2 Remarques pour Solaris x86
Sous Solaris 2.8 sur x86, mysqld va crasher (core dump) si vous l'exécutez 'strip'.
Si vous utilisez gcc ou egcs sous Solaris x86 et que vous rencontrez des problèmes avec des
coredumps, lorsqu'il y a de la charge, il est recommandé d'utiliser la commande de configure
suivante :
 2.6.3.1 Notes relatives à Solaris 2.7/2.8
114

Manuel MySQL 4.1.x ? Version Française
CC=gcc CFLAGS="?O3 ?fomit?frame?pointer ?DHAVE_CURSES_H" \
CXX=gcc \
CXXFLAGS="?O3 ?fomit?frame?pointer ?felide?constructors ?fno?exceptions \
?fno?rtti ?DHAVE_CURSES_H" \
./configure ??prefix=/usr/local/mysql
Cela va éviter les problèmes avec la librairie libstdc++ et avec les exceptions C++.
Si cela ne vous aide pas, il est recommandé de compiler une version de débogage, et de l'exécuter
avec un fichier de trace sous gdb . Déboguer mysqld sous gdb .
2.6.4 Notes relatives à BSD
Cette section fournit des informations pour les différentes variétés de BSD, ainsi que les versions
spécifiques de celles?ci.
2.6.4.1 Notes relatives à FreeBSD
FreeBSD 3.x est recommandé pour exécuter MySQL vu que le package des threads est plus
intégré.La façon la plus facile et la plus conseillée d'installer est d'utiliser les ports du serveur et du
client MySQL disponibles sur .Les utiliser vous donnera :
Un MySQL fonctionnant avec toutes les optimisations connues pour votre version active de
• 
FreeBSD.
Configuration et construction automatique.
• 
Scripts de démarrage installés dans /usr/local/etc/rc.d.
• 
La possibilité de voir tous les fichiers installés avec pkg_info ?L. Et la possibilité de les
• 
effacer tous avec pkg_delete si vous ne voulez plus de MySQL sur cette machine.
Il est recommandé d'utiliser les MIT?pthreads sur FreeBSD 2.x et les threads natifs sur les versions
3 et plus. Il est possible de faire fonctionner le tout avec les threads natifs sur les dernières versions
2.2.x mais vous rencontrerez probablement des problèmes en coupant mysqld .Le Makefile de
MySQL requière GNU make ( gmake ) pour fonctionner. Si vous voulez compiler MySQL vous
devez d'abord installer GNU make .
Assurez?vous que votre configuration de la résolution des noms est bonne. Sinon, vous airez
peut?être quelques problèmes lors de la connexion à mysqld .
Assurez vous que l'entrée localhost dans le fichier /etc/hosts est correcte (sinon, vous aurez
des problèmes pour vous connecter à la base de données). Le fichier /etc/hosts doit
commencer par :
127.0.0.1       localhost localhost.votre.domaine
La manière recommandée de compiler et d'installer MySQL sur FreeBSD avec gcc (2.95.2 et plus)
est :
CC=gcc CFLAGS="?O2 ?fno?strength?reduce" \
CXX=gcc CXXFLAGS="?O2 ?fno?rtti ?fno?exceptions ?felide?constructors \
?fno?strength?reduce" \
./configure ??prefix=/usr/local/mysql ??enable?assembler
gmake
gmake install
./scripts/mysql_install_db
cd /usr/local/mysql
./bin/mysqld_safe &
 2.6.4 Notes relatives à BSD
115

Manuel MySQL 4.1.x ? Version Française
Si vous vous apercevez que configure utilisera les MIT?pthreads, vous devriez lire les notes
relatives aux MIT?pthreads. Remarques sur MIT?pthreads .
Si vous obtenez une erreur de make install disant qu'il ne peut trouver
/usr/include/pthreads , configure n'a pas détecté que vous avez besoin des
MIT?pthreads. Cela est corrigé en exécutant ces commandes :
shell> rm config.cache
shell> ./configure ??with?mit?threads
l'utilisateur mysqld dans (et regénérez le avec cap_mkdb). Assurez?vous aussi de
définir la classe appropriée pour cet utilisateur dans le fichier des mots de passe si vous n'utilisez
mysqld .
Si vous avez beaucoup de mémoire, vous devriez penser à recompiler le noyau pour permettre à
MySQL d'utiliser plus de 512M de RAM. Regardez l' option MAXDSIZ dans le fichier de
configuration de LINT pour plus d'informations.
Si vous avez des problèmes avec la date courante dans MySQL, configurer la variable
d'environnement TZ aidera sûrement. Variables d'environnement MySQL .
Pour obtenir un système sécurisé et stable, vous ne devez utiliser que les noyaux FreeBSD
marqués ?RELEASE .
2.6.4.2 Notes concernant NetBSD
Pour compiler sur NetBSD vous aurez besoin de GNU make . Sinon, la compilation stoppera
lorsque make essayera d'exécuter lint sur les fichiers C++.
2.6.4.3 Notes relatives à OpenBSD 2.5
Dans la version 2.5 de OpenBSD, vous pouvez compiler MySQL avec les threads natifs avec les
options suivantes :
CFLAGS=?pthread CXXFLAGS=?pthread ./configure ??with?mit?threads=no
2.6.4.4 Notes relatives à OpenBSD 2.8
Nos utilisateurs nous ont informé que OpenBSD 2.8 comporte un bogue des threads qui pose
quelques problèmes avec MySQL. Les développeurs d'OpenBSD ont résolu ce problème, mais
depuis le 25 janvier 2001 ce n'est disponible que dans la branche ``?current''. Les symptômes de ce
bogue sont : réponses lentes, beaucoup de charge, grande utilisation du CPU, et crashes.
Si vous obtenez une erreur comme Error in accept:: Bad file descriptor ou erreur 9
en essayant d'ouvrir les tables ou les dossiers, le problème est probablement que vous n'avez pas
alloué assez de descripteurs de fichiers à MySQL.
Dans ce cas, essayez de démarrer safe_mysqld en tant que root avec les options suivantes :
 2.6.4.2 Notes concernant NetBSD
116

Manuel MySQL 4.1.x ? Version Française
??user=mysql ??open?files?limit=2048
2.6.4.5 Notes relatives aux versions 2.x de BSD/OS
Si vous obtenez l'erreur suivante lors de la compilation de MySQL, votre valeur de ulimit pour la
mémoire vortuelle est trop petite :
item_func.h: In method `Item_func_ge::Item_func_ge(const Item_func_ge &)':
item_func.h:28: virtual memory exhausted
make[2]: *** [item_func.o] Error 1
Essayez d'utiliser ulimit ?v 80000 et exécutez make à nouveau. Si cela ne fonctionne pas et
que vous utilisez bash , essayez de passer à csh ou sh ; quelques utilisateurs de BSDI ont reporté
des problèmes avec bash et ulimit .
Si vous utilisez gcc , vous aurez peut?être aussi à utiliser l'option ??with?low?memory de
configure pour pouvoir compiler  .
Si vous avez des problèmes avec la date courante dans MySQL, configurer la variable TZ vous
aidera probablement. Variables d'environnement MySQL .
2.6.4.6 Notes relatives aux versions 3.x de BSD/OS
Mettez à jour à la version 3.1 de BSD/OS. Si cela n'est pas possible, installez le patch BSDIpatch
M300?038.
Utilisez la commande suivante lors de la configuration de MySQL :
shell> env CXX=shlicc++ CC=shlicc2 \
       ./configure \
           ??prefix=/usr/local/mysql \
           ??localstatedir=/var/mysql \
           ??without?perl \
           ??with?unix?socket?
Ce qui suit fonctionne aussi :
shell> env CC=gcc CXX=gcc CXXFLAGS=?O3 \
       ./configure \
           ??prefix=/usr/local/mysql \
           ??with?unix?socket?
Vous pouvez changer les répertoires si vous voulez, ou utiliser les valeurs par défaut en ne
spécifiant pas de vous avez des problèmes de performances alors que la charge est
petite, essayez d'utiliser l'option ??skip?thread?priority de mysqld ! Cela exécutera tous les
threads avec la même priorité; Sur la version 3.1 de BSDI, cela donne de meilleures performances
(en attendant que BSDI corrige sont gestionnaire de threads).
Si vous obtenez l'erreur virtual memory exhausted durant la compilation, vous devez essayer
en utilisant ulimit ?v 80000 et exécutant make à nouveau. Si cela ne fonctionne pas et que
vous utilisez bash , essayez de passer à csh ou sh ; quelques utilisateurs de BSDI ont reporté des
problèmes avec bash et ulimit .
 2.6.4.5 Notes relatives aux versions 2.x de BSD/OS
117

Manuel MySQL 4.1.x ? Version Française
2.6.4.7 Notes relatives aux versions 4.x de BSD/OS
Les versions 4.x de BSDI ont quelques bogues relatifs aux threads. Si vous voulez utiliser MySQL
sur ce système, vous devez installer tous les patches liés aux threads. vous devez au moins
installer M400?023.
Sur quelques systèmes avec une version 4.x de BSDI, vous pouvez rencontrer des problèmes avec
les librairies partagées. Le symptôme est que vous ne pouvez utiliser aucun programme client,
comme par exemple, mysqladmin . Dans ce cas, vous devez le reonfigurer pour qu'il n'utilise pas
les librairies paratgées avec l'option ??disable?shared de configure.
Quelques utilisateurs ont eu avec BSDI 4.0.1 un problème faisant qu'après un bout de temps, le
binaire mysqld ne peut plus ouvrir de tables. Cela est du au fait qu'un bogue relatif au système ou
à la librairie fait changer de répertoire à mysqld sans qu'on ne l'ait demandé !
La solution est soit de mettre à jour vers la version 3.23.34 ou de supprimer la ligne #define
HAVE_REALPATH de config.h après avoir exécuté configure et avant d'exécuter make .
Notez que ce qui précède signifie que vous ne pouvez pas créer de lien symbolique sur un dossier
de bases de données vers un autre dossier de bases de données ou lier une table symboliquement
vers une autre base de données sur BSDI ! (Créer un lien symbolique vers un autre disque
fonctionne).
2.6.5 Notes relatives à Mac OS X
2.6.5.1 Bêta publique Mac OS X
MySQL devrait fonctionner sans problèmes sur la bête publique de Mac OS X (Darwin). Vous
n'avez pas besoin du patch pthread pour cet OS !
2.6.5.2 Mac OS X Server
Avant d'essayer d'installer MySQL sur Mac OS X server vous devez d'abord installer le package
pthread à partir de .
Notre binaire pour Mac OS X est compilé sur Rhapsody 5.5 avec la ligne de configuration suivante :
CC=gcc CFLAGS="?O2 ?fomit?frame?pointer" CXX=gcc CXXFLAGS="?O2 \
?fomit?frame?pointer" ./configure ??prefix=/usr/local/mysql \
"??with?comment=Official MySQL binary" ??with?extra?charsets=complex \
??disable?shared
Vous voudrez peut?être ajouter des alias dans vos fichiers de ressources shell pour accéder à
mysql et mysqladmin à partir de la ligne de commande :
alias mysql '/usr/local/mysql/bin/mysql'
alias mysqladmin '/usr/local/mysql/bin/mysqladmin'
2.6.6 Notes sur les autres Unix
 2.6.4.7 Notes relatives aux versions 4.x de BSD/OS
118

Manuel MySQL 4.1.x ? Version Française
2.6.6.1 Notes relatives à HP?UX pour les distributions binaires
Quelques distributions binaires de MySQL pour HP?UX sont distribués en tant que fichier depot HP
et archive tar. Pour utiliser le fichier depot, vous devez avoir au moins HP?UX 10.x pour avoir accès
aux outils depot de HP.
La version HP de MySQL a été compilée sur un serveur HP 9000/8xx sous HP?UX 10.20, et utilise
les MIT?pthreads. Elle est connue pour bien fonctionner sous cette configuration. A partir de la
version 3.22.26 de MySQL vous pouvez aussi compiler avec le package de threads natifs HP.
Autres configurations pouvant fonctionner :
HP 9000/7xx avec HP?UX 10.20+
• 
HP 9000/8xx avec HP?UX 10.30
• 
Les configurations suivantes semblent ne jamais vouloir fonctionner :
HP 9000/7xx ou 8xx avec HP?UX 10.x où x < 2
• 
HP 9000/7xx ou 8xx avec HP?UX 9.x
• 
Pour installer la distribution, utilisez l'une des commandes suivantes, où /chemin/vers/depot
est le chemin complet vers le fichier dépôt :
Pour tout installer, serveur, client et outils de développement :
• 
shell> /usr/sbin/swinstall ?s /chemin/vers/depot
Pour n'installer que le serveur :
• 
shell> /usr/sbin/swinstall ?s /chemin/vers/depot mysql.server
Pour n'installer que le package client :
• 
shell> /usr/sbin/swinstall ?s /chemin/vers/depot mysql.client
Pour n'installer que les outils de développement :
• 
shell> /usr/sbin/swinstall ?s /chemin/vers/depot mysql.developer
Le depot place les binaires et les librairies dans /opt/mysql et les données dans
/var/opt/mysql .Le depot crée aussi les entrées appropriées dans /etc/init.d et
/etc/rc2.d pour démarrer le serveur automatiquement lors du boot. Evidemment, il faut être
root pour installer.
Pour installer la distribution HP?UX , vous devez avoir une copie de GNU tar .
2.6.6.2 Notes relatives à la version 10.20 de HP?UX
Il y'a quelques petits problèmes que vous pourrez rencontrer lors de la compilation de MySQL sur
HP?UX. Nous recommandons l'utilisation de gcc au lieu du compilateur natif de HP?UX, car gcc
produit un meilleur code !
Nous recommandons l'utilisation de gcc 2.95 sur HP?UX. N'utilisez pas les options de haute
optimisation (comme ?O6) car cela pourrait ne pas être sûr sur HP?UX.
La ligne de configuration suivante devrait fonctionner avec gcc 2.95 :
CFLAGS="?I/opt/dce/include ?fpic" \
CXXFLAGS="?I/opt/dce/include ?felide?constructors ?fno?exceptions \
?fno?rtti" CXX=gcc ./configure ??with?pthread \
??with?named?thread?libs='?ldce' ??prefix=/usr/local/mysql ??disable?shared
 2.6.6.1 Notes relatives à HP?UX pour les distributions binaires
119

Manuel MySQL 4.1.x ? Version Française
La ligne de configuration suivante devrait fonctionner avec gcc 3.1 :
CFLAGS="?DHPUX ?I/opt/dce/include ?O3 ?fPIC" CXX=gcc \
CXXFLAGS="?DHPUX ?I/opt/dce/include ?felide?constructors ?fno?exceptions \
?fno?rtti ?O3 ?fPIC" ./configure ??prefix=/usr/local/mysql \
??with?extra?charsets=complex ??enable?thread?safe?client \
??enable?local?infile  ??with?pthread \
??with?named?thread?libs=?ldce ??with?lib?ccflags=?fPIC
??disable?shared
2.6.6.3 HP?UX Version 11.x Notes
Pour les version 11.x de HP?UX nous recommandons MySQL 3.23.15 ou plus récent.
A cause de quelques bogues critiques dans les librairies standard de HP?UX, vous devez installer
les patches suivants avant d'essayer de faire fonctionner MySQL sous HP?UX 11.0 :
PHKL_22840 Streams cumulative
PHNE_22397 ARPA cumulative
Cela résoudra le problème de l'obtention de EWOULDBLOCK à partir de recv() et EBADF à partir de
accept() dans les applications threadées.
Si vous utilisez gcc 2.95.1 sur un système HP?UX 11.x non?patché, vous obtiendrez l'erreur :
In file included from /usr/include/unistd.h:11,
                 from ../include/global.h:125,
                 from mysql_priv.h:15,
                 from :19:
/usr/include/sys/unistd.h:184: declaration of C function ...
/usr/include/sys/pthread.h:440: previous declaration ...
In file included from item.h:306,
                 from mysql_priv.h:158,
                 from :19:
Le problème est que HP?UX ne définit pas pthreads_atfork() avec consistence. Il possède
des prototypes en conflit dans /usr/include/sys/unistd.h :184 et
/usr/include/sys/pthread.h :440 (détails ci?dessous).
Une solution est de copier /usr/include/sys/unistd.h dans mysql/include et éditer
unistd.h en le changeant pour qu'il corresponde à la définition dans pthread.h . Voici les
modifications :
183,184c183,184
<      extern int pthread_atfork(void (*prepare)(), void (*parent)(),
<                                                void (*child)());
???
>      extern int pthread_atfork(void (*prepare)(void), void (*parent)(void),
>                                                void (*child)(void));
Après cela, la ligne de configuration suivante devrait fonctionner :
CFLAGS="?fomit?frame?pointer ?O3 ?fpic" CXX=gcc \
CXXFLAGS="?felide?constructors ?fno?exceptions ?fno?rtti ?O3" \
./configure ??prefix=/usr/local/mysql ??disable?shared
Si vous utilisez MySQL 4.0.5 avec le compilateur HP?UX, vous pouvez utiliser : (testé avec cc
B.11.11.04):
CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure ??with?extra?character?set=complex
 2.6.6.3 HP?UX Version 11.x Notes
120

Manuel MySQL 4.1.x ? Version Française
Vous pouvez ignorer toutes les erreurs de ce type :
aCC: warning 901: unknown option: `?3': use +help for online documentation
Si vous obtenez l'erreur suivante de configure :
checking for cc option to accept ANSI C... no
configure: error: MySQL requires a ANSI C compiler (and a C++ compiler).
Try gcc. See the Installation chapter in the Reference Manual.
Vérifiez que le chemin vers le compilateur KRne précède pas le chemin vers le compilateur C et
C++ HP?UX.
Une autre raison qui pourrait vous empêcher de compiler, et le fait de n'avoir pas définit l'option
+DD64 ci?dessus.
2.6.6.4 Notes relatives à IBM?AIX
La détection automatique de xlC est absente de Autoconf, ce qui fait qu'un commande configure
comme celle qui suit est requise lors de la compilation de MySQL (Cet exemple utilise le
compilateur IBM) :
export CC="xlc_r ?ma ?O3 ?qstrict ?qoptimize=3 ?qmaxmem=8192 "
export CXX="xlC_r ?ma ?O3 ?qstrict ?qoptimize=3 ?qmaxmem=8192"
export CFLAGS="?I /usr/local/include"
export LDFLAGS="?L /usr/local/lib"
export CPPFLAGS=$CFLAGS
export CXXFLAGS=$CFLAGS
./configure ??prefix=/usr/local \
        ??localstatedir=/var/mysql \
        ??sysconfdir=/etc/mysql \
        ??sbindir='/usr/local/bin' \
        ??libexecdir='/usr/local/bin' \
        ??enable?thread?safe?client \
        ??enable?large?files
Ce sont les options utilisées pour compiler la distribution de MySQL qui peut être trouvée sur
http://www? .Si vous changez le ?O3 en ?O2 dans la ligne précédente, vous devez
aussi enlever l'option ?qstrict (c'est une limitation du compilateur IBM C).
Si vous utilisez gcc ou egcs pour compiler MySQL, vous devez utiliser l'option
?fno?exceptions , vu que la gestion des exceptions de gcc / egcs n'est pas sûre pour les
threads ! (Cela est testé avec egcs 1.1.) Il y'a aussi quelques problèmes connus avec l'assembleur
d'IBM, qui peuvent lui faire générer du mauvais code lors de son utilisation avec gcc.
Nous recommandons la ligne de configure suivante avec egcs et gcc 2.95 sur AIX :
CC="gcc ?pipe ?mcpu=power ?Wa,?many" \
CXX="gcc ?pipe ?mcpu=power ?Wa,?many" \
CXXFLAGS="?felide?constructors ?fno?exceptions ?fno?rtti" \
./configure ??prefix=/usr/local/mysql ??with?low?memory
Le ?Wa,?many est nécessaire pour que la compilation se passe sans problèmes. IBM est au
courant de ce problème mais n'est pas pressé de le corriger à cause de l'existence du palliatif.
Nous ne savons pas si ?fno?exceptions est requise avec gcc 2.95 , mais comme MySQL
n'utilise pas les exeptions et que l'option en question génère un code plus rapide, nous vous
recommandons de toujours utiliser cette option avec egcs / gcc .Si vous obtenez un problème
avec le code de l'assembleur essayez en changeant l'option ?mcpu=xxx pour l'adapter à votre
processeur. Le plus souvent, on a besoin de power2, power, ou powerpc, et sinon 604 ou 604e. Je
ne suis pas positif mais je pense que l'utilisation de "power" sera sûre la plupart du temps, même
sur une machine vous ne savez pas quel est votre processeur, exécutez "uname ?m",
cela vous renverra une chaîne comme "000514676700", avec un format xxyyyyyymmss où xx et ss
 2.6.6.4 Notes relatives à IBM?AIX
121

Manuel MySQL 4.1.x ? Version Française
sont toujours des zéros, yyyyyy est un identifiant unique du système et mm est l'identifiant du CPU
Planar. Une liste de ces valeurs peut être trouvée sur
donnera un type et un modèle de machine que vous pouvez utiliser pour déterminer quel type de
processeur vous vous avez des problèmes avec les signaux (MySQL se termine de
manière imprévue lors des montées en charge) vous avez peut?être trouvé un bogue du système
avec les threads et les signaux. Dans ce cas, vous pouvez demander à MySQL de ne pas utiliser
les signaux en configuration avec :
shell> CFLAGS=?DDONT_USE_THR_ALARM CXX=gcc \
       CXXFLAGS="?felide?constructors ?fno?exceptions ?fno?rtti \
       ?DDONT_USE_THR_ALARM" \
       ./configure ??prefix=/usr/local/mysql ??with?debug ??with?low?memory
Cela n'affecte pas les performances de MySQL, mais comporte un effet secondaire faisant en sorte
que vous ne pourrez tuer les clients en état ``sleeping'' sur une connexion avec mysqladmin
kill ou mysqladmin shutdown . A la place, le client se terminera lorsqu'il émmetra sa
prochaine quelques versions de AIX, lier avec libbind.a fait vider son noyau à
getservbyname (core dump). Il s'agit d'un bogue AIX et doit être remonté à IBM.
Pour AIX 4.2.1 et gcc vous devez apporter les modifications suivantes :
Après la configuration, éditez config.h et include/my_config.h et changez la ligne qui
comporte
#define HAVE_SNPRINTF 1
en
#undef HAVE_SNPRINTF
Et finalement, dans  vous devez ajouter un prototype pour initgoups.
#ifdef _AIX41
extern "C" int initgroups(const char *,int);
#endif
2.6.6.5 Notes relatives à SunOS 4
Avec SunOS 4, les MIT?pthreads sont requis pour compiler MySQL, ce qui signifie que vous aurez
besoin de GNU make .
Quelques systèmes SunOS 4 ont des problèmes avec les librairies dynamiques et libtool . Vous
pouvez utiliser la ligne suivante de configure pour éviter ce problème :
shell> ./configure ??disable?shared ??with?mysqld?ldflags=?all?static
Lors de la compilation de readline , vous pouvez obtenir des avertissements à propos de
définitions dupliquées. Vous pouvez les de la compilation de mysqld , il y'aura
quelques avertissements implicit declaration of function . Vous pouvez les ignorer.
2.6.6.6 Notes pour Alpha?DEC?UNIX (Tru64)
Si vous utilisez egcs 1.1.2 sur Digital Unix, vous devez passer à gcc 2.95.2, car egcs connait de
sérieux bugs sur DEC!
Lorsque vous compilez des programmes threadés sous Digital Unix, la documentation recommande
l'utilisation de l'option ?pthread avec cc et cxx et les librairies ?lmach ?lexc (en plus de
?lpthread ). Vous devriez exécuter le script configure comme ceci :
CC="cc ?pthread" CXX="cxx ?pthread ?O" \
./configure ??with?named?thread?libs="?lpthread ?lmach ?lexc ?lc"
 2.6.6.5 Notes relatives à SunOS 4
122

Manuel MySQL 4.1.x ? Version Française
Lorsque vous compilez mysqld , vous pouvez voir apparaître des alertes comme celles?ci :
: In function void handle_connections()':
:626: passing long unsigned int *' as argument 3 of
accept(int,sockadddr *, int *)'
Vous pouvez les ignorer tranquillement. Elles apparaissent car configure ne peut détecter que
des erreurs, et pas des vous démarrez le serveur directement en ligne de commande,
vous pouvez rencontrer des problèmes d'interruption si vous vous déconnectez. Lorsque vous vous
déconnectez, les processus en cours recoivent le signal SIGHUP . Si c'est le cas, essayez de
démarrer le serveur comme ceci :
shell> nohup mysqld [options] &
nohup fait que la commande suivante va ignorer les signaux SIGHUP envoyés par le terminal.
Alternativement, vous pouvez démarrer le serveur avec le script safe_mysqld , qui appelle le
démon mysqld avec l'option nohup pour vous. safe_mysqld , le script père de mysqld .SI vous
avez des problèmes pour compiler mysys/get_opt.c , vous pouvez simplement supprimer la
ligne #define _NO_PROTO au début du fichier!
Si vous utilisez le compilateur cc de Compaq, la ligne de configuration suivante devrait fonctionner :
CC="cc ?pthread"
CFLAGS="?O4 ?ansi_alias ?ansi_args ?fast ?inline speed all ?arch host"
CXX="cxx ?pthread"
CXXFLAGS="?O4 ?ansi_alias ?ansi_args ?fast ?inline speed all ?arch host \
?noexceptions ?nortti"
export CC CFLAGS CXX CXXFLAGS
./configure \
??prefix=/usr/local/mysql \
??with?low?memory \
??enable?large?files \
??enable?shared=yes \
??with?named?thread?libs="?lpthread ?lmach ?lexc ?lc"
gnumake
Si vous avez un problème avec libtool , lorsque vous compilez les librairies partagées, ou
lorsque vous linkez mysql , vous devriez pouvoir résoudre ce problème avec :
cd mysql
/bin/sh ../libtool ??mode=link cxx ?pthread  ?O3 ?DDBUG_OFF \
?O4 ?ansi_alias ?ansi_args ?fast ?inline speed \
?speculate all \ ?arch host  ?DUNDEF_HAVE_GETHOSTBYNAME_R \
?o mysql  mysql.o readline.o sql_string.o completion_hash.o \
../readline/libreadline.a ?lcurses \
 ?lm
cd ..
gnumake
gnumake install
scripts/mysql_install_db
2.6.6.7 Notes pour Alpha?DEC?OSF/1
Si vous avez des problèmes de compilation et que le CC de DEC et gcc sont installés, essayez
d'utiliser le script configure comme ceci :
CC=cc CFLAGS=?O CXX=gcc CXXFLAGS=?O3 \
./configure ??prefix=/usr/local/mysql
Si vous avez des problèmes avec le fichier c_asm.h , vous pouvez créer un fichier inerte c_asm.h
avec :
 2.6.6.7 Notes pour Alpha?DEC?OSF/1
123

Manuel MySQL 4.1.x ? Version Française
touch include/c_asm.h
CC=gcc CFLAGS=?I./include \
CXX=gcc CXXFLAGS=?O3 \
./configure ??prefix=/usr/local/mysql
Notez que les problèmes suivants avec le programme ld peuvent être corrigés en téléchargeant le
V4.0D et avec le compilateur "DEC C V5.6?071 on Digital Unix V4.0 (Rev. 878)" le compilateur
présente un comportement étrange (undefined asm symbols). /bin/ld apparaît aussi comme
incorrect (problèmes avec des erreurs _exit undefined survenant lors du link de mysqld ). Sur
ce système, nous avons réussi à compiler MySQL avec le script configure suivant, après avoir
remplacé /bin/ld par la version de OSF 4.0C:
CC=gcc CXX=gcc CXXFLAGS=?O3 ./configure ??prefix=/usr/local/mysql
Avec le compilateur Digital "C++ V6.1?029", la ligne suivante doit fonctionner :
CC=cc ?pthread
CFLAGS=?O4 ?ansi_alias ?ansi_args ?fast ?inline speed ?speculate all \
       ?arch host
CXX=cxx ?pthread
CXXFLAGS=?O4 ?ansi_alias ?ansi_args ?fast ?inline speed ?speculate all \
          ?arch host ?noexceptions ?nortti
export CC CFLAGS CXX CXXFLAGS
./configure ??prefix=/usr/mysql/mysql ??with?mysqld?ldflags=?all?static \
            ??disable?shared ??with?named?thread?libs="?lmach ?lexc ?lc"
Avec certaines versions de OSF/1, la fonction alloca() est boguée. Corrigez cela en supprimant
la ligne du fichier config.h qui définit 'HAVE_ALLOCA' .
La fonction alloca() a aussi un prototype incorrect dans /usr/include/alloca.h . L'alerte en
résultant peut être ignorée.
Le script configure va utiliser automatiquemt les librairies de threads suivantes :
code{??with?named?thread?libs="?lpthread ?lmach ?lexc ?lc"}.
En utilisant gcc , vous pouvez aussi essayer le script configure avec ceci :
shell> CFLAGS=?D_PTHREAD_USE_D4 CXX=gcc CXXFLAGS=?O3 ./configure ...
Si vous avez des problèmes avec les signaux (MySQL s'arrête inopinéments sous forte charge),
vous pouvez avoir rencontré un bogue de l'OS avec les threads, et les signaux. Dans ce cas, vous
pouvez indiquer à MySQL de ne pas utiliser les signaux avec la configuration suivante :
shell> CFLAGS=?DDONT_USE_THR_ALARM \
       CXXFLAGS=?DDONT_USE_THR_ALARM \
       ./configure ...
Cela ne modifie pas les performances de MySQL, mais vous ne pourrez plus terminer les clients qui
sont en mode ``sleeping'' sur une connexion avec la commande mysqladmin kill ou
mysqladmin shutdown . Au lieu de cela, le client sera terimné lorsqu'il émettra la prochaine
 gcc 2.95.2, vous aurez probablement les problèmes de compilation suivants :
:1456: Internal compiler error in `scan_region', at except.c:2566
Please submit a full bug report.
Pour corriger cela, vous devez aller dans le dossier sql et faire un ``copier coller'' de la dernière
ligne gcc , tout en remplaçant le code ?O3 par le code ?O0 ou ajouter le code ?O0 immédiatement
après gcc si vous n'avez aucune option ?O sur votre ligne de compilation). Après cela, vous pouvez
retourner au niveau de la racine de MySQL, et tenter à nouveau un make .
 2.6.6.7 Notes pour Alpha?DEC?OSF/1
124

Manuel MySQL 4.1.x ? Version Française
2.6.6.8 Notes relatives à SGI Irix
Si vous utilisez la version 6.5.3 d'Irix ou plus récente, mysqld ne pourra créer de threads que si
vous l'exécutez en tant qu'utilisateur possédant le privilège CAP_SCHED_MGT (comme root ) ou
que vous donnez au serveur mysqld ce privilège avec la commande suivante :
shell> chcap "CAP_SCHED_MGT+epi" /opt/mysql/libexec/mysqld
Vous devrez peut?être supprimer quelques définitions dans config.h après avoir exécuté
configure et avant de compiler.
Sur quelques implémentations d'Irix, la fonction alloca() ne marche pas. Si le serveur mysqld se
stoppe sur quelques requêtes SELECT , supprimez les lignes de config.h qui définissent
HAVE_ALLOC et HAVE_ALLOCA_H . Si mysqladmin create ne fonctionne pas, supprimez la ligne
qui définit HAVE_READDIR_R dans config.h . Vous devrez peut?être supprimer la ligne de
HAVE_TERM_H aussi.
SGI recommande que vous installiez tous les patches de cette page :
Vous devrez, au moins, installer la dernière version du noyau, de rld et de libc .
Vous avez besoin de tous les patches POSIX sur cette page, pour le support des pthreads :
rapprochant de la suivante lors de la compilation de  :
"/usr/include/curses.h", line 82: error(1084): invalid combination of type
Tapez ce qui suit dans le répertoire racine de votre source MySQL :
shell> extra/replace bool curses_bool < /usr/include/curses.h \
> include/curses.h
shell> make
Un problème de planification a aussi été signalé. Si seul un thread est en cours, les choses
ralentissent. Evitez cela en démarrant un autre client. Cela pourra accélérer l'exécution de l'autre
thread de 2 à 10 fois. Ceci est un problème pas encore très clair avec les threads Irix; vous devrez
improviser pour trouver des solutions en attendant que cela soit corrigé.
Si vous compilez avec gcc , vous pouvez utiliser la commande configure suivante :
CC=gcc CXX=gcc CXXFLAGS=?O3 \
./configure ??prefix=/usr/local/mysql ??enable?thread?safe?client \
??with?named?thread?libs=?lpthread
Sous Irix 6.5.11 avec les compilateurs natifs Irix C et C++ versions 7.3.1.2, ce qui suit est connu
pour fonctionner :
CC=cc CXX=CC CFLAGS='?O3 ?n32 ?TARG:platform=IP22 ?I/usr/local/include \
?L/usr/local/lib' CXXFLAGS='?O3 ?n32 ?TARG:platform=IP22 \
?I/usr/local/include ?L/usr/local/lib' ./configure \
??prefix=/usr/local/mysql ??with?innodb ??with?berkeley?db \
??with?libwrap=/usr/local \
??with?named?curses?libs=/usr/local/lib/libncurses.a
2.6.6.9 Notes pour Caldera (SCO)
Le port courant a été testé avec les systèmes ``sco3.2v5.0.4'' et ``sco3.2v5.0.5''. Il y a eu aussi
beaucoup de progrès sur le port de ``sco 3.2v4.2''.
 2.6.6.8 Notes relatives à SGI Irix
125

Manuel MySQL 4.1.x ? Version Française
Pour le moment, le compilateur recommandé sur OpenServer est gcc 2.95.2. Avec lui, vous devriez
pouvoir compiler MySQL simplement avec :
CC=gcc CXX=gcc ./configure ... (options)
Pour OpenServer 5.0.X, vous devez utiliser 
• 
gcc?2.95.2p1 ou plus récent, de Skunkware.
Vous avez besoin du port 
• 
GCC 2.5.x pour ce produit, et du système de développement. Ils
sont nécessaires sur cette version de Caldera (SCO) Unix. Vous ne pouvez pas juste utiliser
le système gcc dev.
Vous devez obtenir le package FSU Pthreads et l'installer en premier. Il est disponible à
• 
obtenir un package précompilé à
FSU Pthreads peut être compilé sur Caldera (SCO) Unix 4.2 avec tcpip. Ou OpenServer 3.0
• 
ou Open Desktop 3.0 (OS 3.0 ODT 3.0), avec le Caldera (SCO) Development System
installé, utilisant le bon port de GCC 2.5.x ODT ou OS 3.0, vous aurez besoin du bon port de
GCC 2.5.x Il y a beaucoup de problèmes sans un bon port. Le port de ce produit requiert le
système SCO Unix Development. Sans cela, vous manquerez des librairies et des linkeurs
nécessaires.
Pour compiler FSU Pthreads sur votre système, faites ceci :
• 
Exécutez 

./configure dans le dossier threads/src et sélectionnez l'option SCO
OpenServer. Cette commande copie Makefile.SCO5 dans Makefile .
Exécutez 

make .
Pour faire l'installation dans le dossier par défaut 

/usr/include , connectez vous
en root , puis utilisez cd vers le dossier thread/src , et exécutez la commande
make install .
N'oubliez pas d'utiliser GNU 
• 
make pour compiler MySQL.
Si vous ne démmarez pas 
• 
safe_mysqld en tant que root , vous aurez probablement la
limite de 110 fichiers ouverts par processus. mysqld va écrire une note à ce propos de le
fichier de log.
Avec SCO 3.2V5.0.5, vous devez utiliser FSU Pthreads version 3.5c ou plus récent. Vous
• 
devez aussi utiliser gcc 2.95.2 ou plus récent!La commande configure suivante doit
fonctionner :
shell> ./configure ??prefix=/usr/local/mysql ??disable?shared
Avec SCO 3.2V4.2, vous devez utiliser FSU Pthreads version 3.5c ou plus récent. La
• 
commande configure suivante doit fonctionner :
shell> CFLAGS="?D_XOPEN_XPG4" CXX=gcc CXXFLAGS="?D_XOPEN_XPG4" \
       ./configure \
           ??prefix=/usr/local/mysql \
           ??with?named?thread?libs="?lgthreads ?lsocket ?lgen ?lgthreads" \
           ??with?named?curses?libs="?lcurses"
Vous pouvez avoir des problèmes avec certains fichiers d'inclusion. Dans ce cas, vous
pouvez trouver un nouveau fichier d'inclus spécifique à SCO à
décompresser de fichier dans le dossier include de votre dossier source MySQL.
Notes de développement Caldera (SCO):
MySQL devrait détecter automatiquement les FSU Pthreads et compiler 
• 
mysqld avec
?lgthreads ?lsocket ?lgthreads .
Les librairies de développement Caldera (SCO) development sont ré?entrantes avec les
• 
FSU Pthreads. Caldera dit que ses librairies de fonctions sont ré?entrantes, et donc, que
FSU Pthreads aussi. FSU Pthreads sur OpenServer essaie d'utiliser le schéma SCO pour
 2.6.6.8 Notes relatives à SGI Irix
126

Manuel MySQL 4.1.x ? Version Française
en faire des librairies ré?entrantes.
Les FSU Pthreads (tout au moins la version de ) est livré compilé
• 
avec GNU malloc . Si vous avez des problèmes d'utilisation de mémoire, assurez vous que
gmalloc.o est inclus dans libgthreads.a et  .
Avec les FSU Pthreads, les appels systèmes suivant sont compatibles avec pthreads :
• 
read() , write() , getmsg() , connect() , accept() , select() et wait() .
Le CSSA?2001?SCO.35.2 (le patch est indiqué comme un patch de sécurité dans
• 
erg711905?dscr_remap (version 2.0.0)) rend bogué les FSU threads et MySQL instable.
Vous devez supprimer ce patch si vous voulez exécuter mysqld sur un serveur OpenServer
5.0.6.
Si vous voulez installer DBI sur Caldera (SCO), vous devez éditer le fichier Makefile dans
DBI?xxx et chaque sous?dossier.
Notez que les lignes suivantes présupposent que gcc 2.95.2 ou plus récent est installé :
Ancien :                                  Nouveau :
CC = cc                               CC = gcc
CCCDLFLAGS = ?KPIC ?W1,?Bexport       CCCDLFLAGS = ?fpic
CCDLFLAGS = ?wl,?Bexport              CCDLFLAGS =
LD = ld                               LD = gcc ?G ?fpic
LDDLFLAGS = ?G ?L/usr/local/lib       LDDLFLAGS = ?L/usr/local/lib
LDFLAGS = ?belf ?L/usr/local/lib      LDFLAGS = ?L/usr/local/lib
LD = ld                               LD = gcc ?G ?fpic
OPTIMISE = ?Od                        OPTIMISE = ?O1
Ancien :
CCCFLAGS = ?belf ?dy ?w0 ?U M_XENIX ?DPERL_SCO5 ?I/usr/local/include
Nouveau :
CCFLAGS = ?U M_XENIX ?DPERL_SCO5 ?I/usr/local/include
Ceci est dû au fait que le Perl dynaloader ne va pas charger les modules DBI si ils ont été
compilés avec icc ou cc .
Perl fonctionne au mieux avec cc .
2.6.6.10 Notes relatives à la version 7.0 fr Caldera (SCO) Unixware
Vous devez utiliser une version de MySQL supérieure ou égale à la 3.22.13 car cette version
corrige quelques problèmes de port vers Unixware.
Nous avons réussi à compiler MySQL avec la ligne suivante de configure sur la version 7.0.1 de
Unixware :
CC=cc CXX=CC ./configure ??prefix=/usr/local/mysql
Si vous voulez utiliser gcc , vous devez utiliser la version 2.95.2 de gcc ou plus récente.Caldera
de sécurité pre?OSR506. Le correctif de telnetd est aussi disponible sur
.1 avec des instructions pour installer sur les systèmes pre?OSR506.
Il est bon d'installer les patches précédents avant d'essayer de compiler/utiliser MySQL.
 2.6.6.10 Notes relatives à la version 7.0 fr Caldera (SCO) Unixware
127

Manuel MySQL 4.1.x ? Version Française
2.6.7 Notes relatives à OS/2
MySQL utilise un certain nombre de fichiers ouverts. A cause de cela, vous devez ajouter un ligne
se rapprochant de la suivante dans votre fichier  :
SET EMXOPT=?c ?n ?h1024
Si vous ne le faites pas, vous obtiendrez probablement l'erreur :
File 'xxxx' not found (Errcode: 24)
Lors de l'utilisation de MySQL avec OS/2 Warp 3, FixPack 29 ou plus est requis. Avec OS/2 Warp
4, FixPack 4 ou plus est requis. C'est un besoin de la librairie des Pthreads. MySQL doit être
installé sur une partition qui supporte les noms de fichiers longs, tel que HPFS, FAT32, script
 doit être exécuté à partir du  d'OS/2 et ne fonctionnera probablement pas
avec des substitus tel que  .
Le script scripts/mysql?install?db a été renommé. Il est maintenant nommé 
et est un script REXX, qui mettra en place les configurations de sécurité par défaut de MySQL et
créera les icônes WorkPlace Shell pour MySQL.
Le support des module dynamiques est compilé, mais n'est pas assez testé. Les modules
dynamiques doivent être compilés en utilisant la librairie run?time Pthreads.
gcc ?Zdll ?Zmt ?Zcrtdll=pthrdrtl ?I../include ?I../regex ?I.. \
    ?o exemple ?L../lib ?lmysqlclient
mv
Note : A cause des limitations de OS/2, les noms des modules UDF ne doivent pas dépasser 8
caractères. Les modules sont stockés dans le répertoire /mysql2/udf ; le script
safe? placera ce répertoire dans la variable d'environnement BEGINLIBPATH . Lors
de l'utilisation des modules UDF, les extensions spécifiées sont ignorées. Elle est supposée être
.udf . Par exemple, sous Unix, le module partagé peut se nommer  et vous
chargeriez une de ses fonctions de la façon suivante :
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "";
Sous OS/2, me module s'appelera  , mais vous n'aurez pas à spécifier son extension
:
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "exemple";
2.6.8 Notes relatives à BeOS
Nous sommes vraiment intéressés par le port de MySQL sur BeOS, mais malheureusement, nous
n'avons personne qui s'y connaisse en BeOS ou qui ait le temps de s'en occuper.
Nous sommes intéressés par quelqu'un qui serait prêt à faire le port, et nous l'aiderions pour toutes
les questions techniques qu'il pourrait se poser durant le processus.
Nous avons déjà eu des contacts avec des développeurs BeOS qui ont dit que MySQL était porté à
80% sur BeOS, mais nous n'avons plus entendu parler d'eux depuis.
2.6.9 Notes relatives à Novell NetWare
Nous sommes vraiment intéressés par le port de MySQL sur NetWare, mais malheureusement,
nous n'avons personne qui s'y connaisse en NetWare ou qui ait le temps de s'en occuper.
 2.6.7 Notes relatives à OS/2
128

Manuel MySQL 4.1.x ? Version Française
Nous sommes intéressés par quelqu'un qui serait prêt à faire le port, et nous l'aiderions pour toutes
les questions techniques qu'il pourrait se poser durant le processus.
2.7 Commentaires sur l'installation de Perl
2.7.1 Installer Perl sur Unix
Le support Perl pour MySQL est fournit par les interfaces clientes DBI / DBD. Le code client des modules DBD / DBI de Perl, requière une version de celui?ci supérieure ou
égale à la version 5.004. L'interface ne fonctionnera pas si vous avez une ancienne version de
Perl.
Le support Perl de MySQL requière aussi que vous ayez installé le support de programmation de
clients pour MySQL. Si vous avez installé MySQL à partir de fichiers RPM, les programmes clients
sont dans le RPM client, mais le support de la programmation de clients est dans le RPM des
développeurs. Assurez?vous d'avoir installé le dernier RPM.
Depuis la version 3.22.8, le support Perl est distribué séparément du reste de la distribution
MySQL. Si vous voulez installer le support Perl, les fichiers dont vous aurez besoin peuvent être
trouvés sur .
Les distributions de Perl sont fournies en tant qu'archives compréssées tar et ont des noms
comme MODULE? , où MODULE est le nom du module et VERSION est le numéro
de version. Vous devez obtenir les distributions Data?Dumper , DBI , et Msql?Mysql?modules et
les installer dans cet ordre. La procédure d'installation est décrite ici. L'exemple montré ici concerne
le module Data?Dumper , mais la procédure est la même pour les trois distributions :
Décompressez la distribution dans le dossier courant :
• 
shell> gunzip < Data?Dumper? | tar xvf ?
Cette commande crée un dossier appelé Data?Dumper?VERSION .
Mettez vous dans le répertoire racine de la distribution décompressée :
• 
shell> cd Data?Dumper?VERSION
Construisez la distribution et compilez tout :
• 
shell> perl
shell> make
shell> make test
shell> make install
La commande make test est importante car elle vérifie que le module fonctionne. Notez que
quand vous exécutez cette commande durant l'installation de Msql?Mysql?modules pour tester le
code de l'interface, le serveur MySQL doit être en marche sinon le test échouera.
Il est bon de reconstruire et réinstaller la distribution Msql?Mysql?modules à chaque fois que
vous réinstallez une nouvelle version de MySQL, particulièrement si vous avez des problèmes avec
vos scripts DBI après avoir avoir mis à jour MySQL.
Si vous n'avez pas le droit d'installer des modules Perl dans le dossier système ou que vous voulez
installer des modules locaux de Perl, la référence suivante pourra vous aider :
Regardez le paragraphe Installing New Modules that Require Locally Installed
Modules .
 2.7 Commentaires sur l'installation de Perl
129

Manuel MySQL 4.1.x ? Version Française
2.7.2 Installer ActiveState Perl sur Windows
Pour installer le module DBD MySQL avec ActiveState Perl sous Windows, vous devez faire ce qui
suit :
Obtenez ActiveState Perl à partir de et
• 
installez le.
Ouvrez un terminal DOS.
• 
Si requis, définissez la variable HTTP_proxy. Par exemple, vous pouvez faire :
• 
set :3128
Démarrez le programme PPM :
• 
C:\> c:\perl\bin\
Installez 
• 
DBI , si ce n'est pas déjà fait :
ppm> install DBI
Si cela fonctionne, exécutez la commande suivante :
• 
install \
?mysql?
Ce qui suit devrait fonctionner avec la version 5.6 d'ActiveState ce qui précède ne veut pas
fonctionner, vous devez à la place installer le pilote MyODBC et vous connecter au serveur MySQL
via ODBC :
use DBI;
$dbh= DBI?>connect("DBI:ODBC:$dsn","$utilisateur","$motdepasse") ||
  die "Obtenu l'erreur $DBI::errstr lors de la connexion à $dsn\n";
2.7.3 Installer la distribution Perl de MySQL sous Windows
Cette distribution Perl de MySQL contient DBI , DBD:MySQL et DBD:ODBC .
Obtenez la distribution Perl pour Windows à partir de
• 
Décompressez la distribution dans 
• 
C: pour obtenir le dossier C:\PERL .
Ajoutez le répertoire 
• 
C:\PERL\BIN à votre path.
Ajoutez le répertoire 
• 
C:\PERL\BIN\MSWIN32?x86?thread ou
C:\PERL\BIN\MSWIN32?x86 à votre path.
Vérifiez que 
• 
perl fonctionne en exécutant perl ?v dans un terminal DOS.
2.7.4 Problèmes lors de l'utilisation des interfaces Perl DBI et DBD
Si Perl vous informe qu'il ne peut trouver le module  , il se trouve
probablement que Perl n'arrive pas à trouver la librairie partagée  .
Vous pouvez corriger cela en suivant l'une des méthodes suivantes :
Compilez la distribution 
• 
Msql?Mysql?modules avec perl ?static
?config au lieu de perl  .
Copiez 
• 
 dans le dossier où se situent vos autres librairies partagées
(souvent /usr/lib ou /lib ).
Sous Linux vous pouvez ajouter le chemin vers le dossier dans lequel se trouve
• 
 au fichier  .
Ajoutez le chemin complet vers le dossier où se situe 
• 
 à la variable
d'environnement LD_RUN_PATH .
 2.7.2 Installer ActiveState Perl sur Windows
130

Manuel MySQL 4.1.x ? Version Française
Si vous obtenez l'erreur suivante de DBD?mysql , vous utilisez probablement gcc (ou un vieux
binaire compilé avec gcc ) :
/usr/bin/perl: can't resolve symbol '__moddi3'
/usr/bin/perl: can't resolve symbol '__divdi3'
Ajoutez ?L/usr/lib/gcc?lib/... ?lgcc à la commande de liaison lorsque la librairie
 est construite (vérifiez l'affichage de make concernant  quand vous compilez
le client Perl). L'option ?L doit spécifier le chemin vers le dossier où se situe libgcc.a sur votre
systè autre cause du problème peut être que Perl et MySQL ne sont pas tous deux
compilés avec gcc . Dans ce cas là, vous devrez faire en sorte qu'ils le soient.
Si vous obtenez les erreurs suivantes de la part de Msql?Mysql?modules quand vous exécutez
ces tests :
t/00base............install_driver(mysql) failed:
Can't load '' for module DBD::mysql:
: undefined symbol:
uncompress at /usr/lib/perl5/5.00503/i586? line 169.
cela signifie que vous avez besoin d'inclure la librairie dynamique, ?lz, dans la ligne de liaison. Cela
peut se faire en changeant ce qui suit dans  :
$sysliblist .= " ?lm";
en
$sysliblist .= " ?lm ?lz";
Après cela, vous devez exécuter 'make realclean' et reprendre l'installation dès le dé vous
voulez utiliser le module de Perl sur un système qui ne supporte pas les liaisons dynamiques
(comme Caldera/SCO) vous pouvez générer une version statique de Perl incluant DBI et
DBD?mysql . L'approche est de générer une version de Perl avec le code de DBI lié et de l'installer
au dessus de votre Perl courant. Puis vous utilisez cette version pour en créer à nouveau une autre
qui comporte le code de DBD lié et d'installer cette version ci.
Sur Caldera (SCO), vous devez définir les variables d'environnement suivantes :
shell> LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib
ou
shell> LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\
/usr/progressive/lib:/usr/skunk/lib
shell> LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\
/usr/progressive/lib:/usr/skunk/lib
shell> MANPATH=scohelp:/usr/man:/usr/local1/man:/usr/local/man:\
/usr/skunk/man:
D'abord, créez un Perl incluant un DBI lié statiquement en exécutant des commandes dans le
dossier où se situe votre distribution DBI :
shell> perl ?static ?config
shell> make
shell> make install
shell> make perl
Ensuite, vous devez installer le nouveau Perl. Les affichages de make perl vous indiqueront les
commandes make exactes que vous aurez besoin d'exécuter pour faire l'installation. Sur Caldera
(SCO), il s'agit de make ?f Makefile.aperl inst_perl MAP_TARGET=perl .Puis, utilisé le
Perl qui vient d'être créé pour en créer un nouveau qui inclut un DBD::mysql lié statiquement en
exécutant ces commandes dans le dossier où votre distribution de Msql?Mysql?modules se situe
:
 2.7.2 Installer ActiveState Perl sur Windows
131

Manuel MySQL 4.1.x ? Version Française
shell> perl ?static ?config
shell> make
shell> make install
shell> make perl
Finalement, vous devez installer ce nouveau Perl. Une fois de plus, l'affichage de make perl vous
indiquera la commande à utiliser.
 2.7.2 Installer ActiveState Perl sur Windows
132

3 Tutoriels d'introduction
Ce chapitre fournit un tutoriel d'introduction à MySQL en montrant comment utiliser le client mysql
pour créer et utiliser une simple base de données. mysql (quelques fois nommé ``moniteur
terminal'' ou juste ``moniteur'') est un programme interactif qui vous permet de vous connecter à un
serveur MySQL, exécuter des requêtes et voir les résultats. mysql peut aussi être utilisé en mode
batch : vous placez vos requêtes dans un fichier, puis vous faites exécuter à mysql le contenu de
ce fichier. Les deux manières d'utiliser mysql sont expliquées ici.
Pour voir une liste d'options fournies par mysql , invoquez?le avec l'option ??help :
shell> mysql ??help
Ce chapitre assume que mysql est installé sur votre machine et qu'un serveur MySQL est
disponible pour que vous vous y connectiez. Si ce n'est pas le cas, contactez votre administrateur
MySQL. (Si vous êtes l'administrateur, vous aurez besoin de consulter d'autres sections de ce
manuel.)Ce chapitre décrit le processus d'installation et d'utilisation d'une base de données en
entier. Si vous n'êtes intéressés que par l'accès à une base de données existante, vous pouvez
sauter les sections décrivant la création de la base et des tables.
Ce chapitre n'est qu'un tutoriel, beaucoup de détails ne sont pas approfondis. Consultez les
sections appropriées du manuel pour plus d'informations sur les sujets abordés.
3.1 Connexion et déconnexion au serveur
Pour vous connecter au serveur, vous aurez dans la plupart des cas à fournir un nom d'utilisateur à
MySQL, et, sûrement, un mot de passe. Si le serveur fonctionne sur une autre machine que la
vôtre, vous devrez spécifier son adresse. Contactez votre administrateur pour connaître les
paramètres à utiliser lors de la connexion (hôte, nom d'utilisateur, mot de passe à utiliser...). Une
fois que vous aurez les bons paramètres, vous pourrez vous connecter de la façon suivante :
shell> mysql ?h hote ?u utilisateur ?p
Enter password: ********
******** représente votre mot de passe, entrez?le lorsque mysql affiche Enter password: .Si
tout fonctionne, vous devrez voir quelques informations d'introduction suivies d'une invite de
commande mysql> :
shell> mysql ?h host ?u user ?p
Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 459 to server version: 3.22.20a?log
Type 'help' for help.
mysql>
L'invite vous dit que mysql attend que vous entriez des commandes.Quelques installations de
MySQL autorisent les connexions anonymes au serveur tournant sur l'hôte local. Si c'est la cas sur
votre machine, vous devriez arriver à vous connecter à ce serveur en invoquant la commande
mysql sans aucune option :
shell> mysql
Après vous être connecté avec succès, vous pouvez vous déconnecter à tout moment en entrant
QUIT dans l'invite mysql> :
mysql> QUIT
Bye
Vous pouvez aussi le faire en appuyant sur Ctrl?D.
 3 Tutoriels d'introduction
133

Manuel MySQL 4.1.x ? Version Française
La plupart des exemples dans les sections suivantes supposent que vous êtes connecté au
serveur. Cela se voit à l'invite mysql> .
3.2 Entrer des requêtes
Assurez?vous d'être connecté au serveur, comme expliqué précédemment dans cette section.
Faire ceci ne sélectionnera pas une base par lui même, mais c'est normal. A ce stade, il est
important de découvrir la façon dont sont publiées les requêtes, pour ensuite pouvoir créer des
tables, y insérer et rechercher des données. Cette section décrit les principes de base pour entrer
une commande, en utilisant plusieurs requêtes que vous pouvez essayer pour vous familiariser
avec la façon dont mysql fonctionne.
Voilà une commande simple qui demande au serveur de vous donner son numéro de version et la
date courante. Entrez?la comme suit, juste après l'invite mysql> puis pressez Enter :
mysql> SELECT VERSION(), CURRENT_DATE;
+??????????????+??????????????+
| VERSION()    | CURRENT_DATE |
+??????????????+??????????????+
| 3.22.20a?log | 1999?03?19   |
+??????????????+??????????????+
1 row in set (0.01 sec)
mysql>
La requête révèle plusieurs choses à propos de mysql :
Une commande consiste normalement en une commande SQL suivie d'un point?virgule. (Il
• 
y'a quelques cas ou le point?virgule n'est pas requis. QUIT , mentionnée plus tôt, en fait
partie. Nous verrons les autres plus tard.)
Lorsque vous entrez une commande, 
• 
mysql l'envoi au serveur pour l'exécution et affiche le
résultat, puis affiche un autre mysql> pour indiquer qu'il attend une autre commande.
mysql
• 
 affiche le résultat des requêtes dans une table (lignes et colonnes). La première ligne
contient le nom des colonnes. Les lignes suivantes constituent le résultat de la requête.
Normalement, les titres des colonnes sont les noms des champs des tables de la base de
données que vous avez récupérés. Si vous récupérez la valeur d'une expression au lieu
d'une colonne (comme dans l'exemple précédent), mysql nomme la colonne en utilisant
l'expression elle?même.
mysql
• 
 vous indique combien de lignes ont été retournées et combien de temps d'exécution
la requête a pris, ce qui vous donnera une approximation des performances du serveur. Ces
valeurs sont imprécises car elles représentent le temps soft (et non le temps CPU ou hard),
et qu'elles sont affectées par des facteurs tels que la charge du serveur ou l'accessibilité du
réseau. (Dans un soucis de brièveté, la ligne contenant ``rows in set'' n'est plus montrée
dans les exemples suivants de ce chapitre.)
Les mots?clefs peuvent être entrés sous n'importe quelle forme de casse. Les requêtes suivantes
sont équivalentes :
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;
Voilà une autre requête. Elle montre que vous pouvez utiliser mysql en tant que simple calculatrice
:
mysql> SELECT SIN(PI()/4), (4+1)*5;
+?????????????+?????????+
| SIN(PI()/4) | (4+1)*5 |
 3.2 Entrer des requêtes
134

Manuel MySQL 4.1.x ? Version Française
+?????????????+?????????+
|    0.707107 |      25 |
+?????????????+?????????+
Les commandes vues jusqu'à présent ont été relativement courtes, et tenaient sur une seule ligne.
Vous pouvez même entrer plusieurs requêtes sur une seule ligne. Il suffit de terminer chacune d'elle
par un point?virgule :
mysql> SELECT VERSION(); SELECT NOW();
+??????????????+
| VERSION()    |
+??????????????+
| 3.22.20a?log |
+??????????????+
+?????????????????????+
| NOW()               |
+?????????????????????+
| 1999?03?19 00:15:33 |
+?????????????????????+
Une commande ne doit pas être obligatoirement sur une seule ligne ; les commandes qui exigent
plusieurs lignes ne sont pas un problème. mysql détermine où se situe la fin de votre commande
en recherchant le point?virgule de terminaison, et pas l'extrémité de la commande entrée. (Dans
d'autres termes, mysql accepte des formats libres d'entrée : il collecte les lignes entrées mais ne
les exécute qu'une fois le point?virgule trouvé.) Voilà une seule requête sur plusieurs lignes :
mysql> SELECT
    ?> USER()
    ?> ,
    ?> CURRENT_DATE;
+????????????????????+??????????????+
| USER()             | CURRENT_DATE |
+????????????????????+??????????????+
| joesmith&#64;localhost | 1999?03?18   |
+????????????????????+??????????????+
Dans cet exemple, notez comment l'invite change de mysql> à ?> après avoir entré la première
ligne d'une requête multi?lignes. C'est la façon dont mysql indique qu'il n'a pas vu de requête
complète et qu'il attend la fin de celle?ci. L'invite est votre ami en vous fournissant la rétroactivité. Si
vous utilisez cette rétroactivité, vous vous rendrez toujours compte de ce que mysql attend. Si
vous décidez d'annuler une commande que vous êtes en train de taper, faites?le en entrant \c :
mysql> SELECT
    ?> USER()
    ?> \c
mysql>
Ici aussi, portez votre attention sur l'invite. Elle se transforme à nouveau en mysql> après que vous
ayez entré \c , vous informant que mysql est prêt pour une nouvelle requê tableau suivant
montre les différentes invites que vous pourrez voir et résume leur signification quand à l'état dans
lequel se trouve mysql :
Invite
Signification
mysql> Prêt pour une nouvelle commande.
    ?> En attente de la ou des lignes terminant la commande.
En attente de la prochaine ligne collectant une chaîne commencée par un guillemet
    '> simple ( ''' ).
En attente de la prochaine ligne collectant une chaîne commencée par un guillemet
    "> double ( '"' ).
Les commandes sur plusieurs lignes sont la plupart du temps des accidents, lorsque vous voulez
faire une commande sur une seule ligne et que vous oubliez le point?virgule de fin. Dans ce cas,
mysql attend la suite de votre saisie :
mysql> SELECT USER()
    ?>
 3.2 Entrer des requêtes
135

Manuel MySQL 4.1.x ? Version Française
Si cela vous arrive (vous pensez que votre requête est complète mais la seule réponse est l'invite
?> ), il est fort probable que mysql attende le point?virgule. Si vous ne notez pas ce que l'invite
vous indique, vous pourriez patienter pendant longtemps avant de réaliser ce que vous devez faire.
Entrez un point?virgule pour compléter la requête, et mysql devrait l'exécuter :
mysql> SELECT USER()
    ?> ;
+????????????????????+
| USER()             |
+????????????????????+
| joesmith&#64;localhost |
+????????????????????+
L'invite '> ainsi que "> apparaissent durant l'entrée de chaîne. Dans MySQL, vous pouvez écrire
une chaîne entourée du caractère ''' ou bien '"' (par exemple, 'Bonjour' or "Au Revoir" ),
et mysql vous laisse entrer une chaîne qui peut être sur plusieurs lignes. Lorsque vous voyez une
invite comme '> ou "> , cela signifie que vous avez entré une ligne contenant le caractère ''' ou
'"' , mais vous n'avez pas encore entré le caractère correspondant qui termine votre chaîne. C'est
pratique si vous entrez réellement une chaîne à lignes multiples, mais est?ce probable ? Pas
vraiment. Plus souvent, les invites '> et "> indiquent que vous avez, par inadvertance, oublié un
caractère de fermeture. Par exemple :
mysql> SELECT * FROM ma_table WHERE nom = "Smith AND age < 30;
    ">
Si vous entrez cette requête SELECT , puis appuyez sur Enter et attendez le résultat, rien ne se
passera. Au lieu de vous demander pourquoi la requête met si longtemps à s'exécuter, remarquez
que l'invite de commande s'est transformée en "> . Cela indique que mysql attend de voir la fin
d'une chaîne de caractères non?terminée. (Voyez?vous l'erreur dans cette requête ? Il manque le
second guillemet à la suite de "Smith .) Que faire ? Le plus simple est d'annuler la commande.
Toutefois, vous ne pouvez vous contenter de taper \c dans ce cas?là, car mysql l'interprète
comme une partie de la chaîne qu'il est en train de collecter ! A la place, entrez le second guillemet
(pour que mysql sache que vous avez fini la chaîne), puis entrez \c :
mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30;
    "> "\c
mysql>
L'invite se change à nouveau en mysql> , indiquant que mysql est prêt pour une nouvelle
requê est important de savoir ce que les invites '> et "> signifient, car si vous avez entré par
erreur une chaîne non terminée, toutes les lignes suivantes que vous entrerez seront ignorées par
mysql , même une ligne contenant QUIT ! Cela peut prêter à confusion, spécialement si vous ne
savez pas que vous devez fournir le guillemet fermant avant de pouvoir annuler la commande
courante.
3.3 Création et utilisation d'une base de données
Maintenant que vous savez entrer des commandes, il est temps d'accéder à une base.
Supposons que vous avec plusieurs animaux chez vous (dans votre ménagerie) et que vous voulez
garder diverses informations les concernant. Vous pouvez le faire en créant des tables pour stocker
vos données et y charger vos informations. Vous pourrez alors répondre à différentes sortes de
questions à propos de vos animaux en récupérant les données à partir des tables. Cette section
vous montre comment :
Créer une base de données
• 
Créer une table
• 
Charger des données dans vos tables
• 
Récupérer des donneées à partir des tables de différentes façons
• 
Utiliser plusieurs tables
• 
 3.3 Création et utilisation d'une base de données
136

Manuel MySQL 4.1.x ? Version Française
La base de données de la ménagerie va être simple (délibérément), mais il n'est pas difficile de
penser à des situations courantes de la vie où vous aurez à utiliser un tel type de base de données.
Par exemple, une telle base pourrait être utilisée par un éleveur pour gérer sa boutique, ou par un
vétérinaire pour garder des traces de ses patients. Une distribution de la ménagerie contenant
quelques requêtes et des exemples de données utilisées dans la section suivante peuvent être
trouvés sur le site web de MySQL. Ils sont disponibles au format compressé tar (
).Utilisez la commande SHOW
pour trouver quelles bases existent déjà sur le serveur :
mysql> SHOW DATABASES;
+??????????+
| Database |
+??????????+
| mysql    |
| test     |
| tmp      |
+??????????+
La liste des bases de données est probablement différente sur votre machine, mais les bases
mysql et test y figurent sûrement. La base mysql est requise car elle gère les accès et les
privilèges. La base test est souvent fournie pour que les utilisateurs y effectuent leurs tests.Notez
que vous ne pourrez voir toutes les bases de données si vous n'avez pas le privilège SHOW
DATABASES . Syntaxe de GRANT et REVOKE .
Si la base de données test existe, essayez d'y accéder :
mysql> USE test
Database changed
Notez que USE , comme QUIT , ne requiert pas de point?virgule. (Vous pouvez terminer ces
commandes avec un point?virgule ; cela ne posera pas de problèmes.) La commande USE est
spéciale d'un autre point de vue : elle doit être donnée sur une seule ligne.
Vous pouvez utiliser la base de données test (si vous y avez accès) pour les exemples qui
suivent, mais tout ce que vous créerez dans cette base pourra être éffacé par quiconque y a accès.
Pour cette raison, vous feriez mieux de demander à votre administrateur MySQL la permission
d'utiliser une base de données rien que pour vous. Supposez que vous voulez nommer la votre
menagerie . L'administrateur a besoin d'exécuter une commande telle que :
mysql> GRANT ALL ON menagerie.* TO votre_nom_mysql;
où votre_nom_mysql est le nom d'utilisateur MySQL qui vous est assigné.
3.3.1 Créer et sélectionner une base de données
Si l'administrateur vous a créé une base de données lors du paramétrage de vos droits, vous
pouvez commencer à l'utiliser. Sinon, vous aurez besoin de la créer par vous?même :
mysql> CREATE DATABASE menagerie;
Sous Unix, les noms des bases de données sont sensibles à la casse (ce qui diffère des mots
réservés de SQL), ce qui fait que vous devez tuojours vous référer à votre base de données avec
menagerie , non avec Menagerie , MENAGERIE , ou d'autres variantes. Cela est aussi valable
pour les noms de tables. (Sous Windows, cette restriction n'est pas appliquée, même si vous devez
vous référer à une table ou une base de la même façon dans une même requête).
 3.3.1 Créer et sélectionner une base de données
137

Manuel MySQL 4.1.x ? Version Française
La création d'une base de données ne la sélectionne pas pour l'utilisation ; vous devez le faire
explicitement. Pour rendre menagerie la base courante, utilisez cette commande :
mysql> USE menagerie
Database changed
Votre base a besoin d'être créée juste une fois, mais vous devez la sélectionner pour l'utiliser,
chaque fois que vous débutez une session mysql . Vous pouvez le faire en publiant une requête
USE comme ci?dessus. Sinon, vous pouvez sélectionner la base directement dans la ligne de
commande lorsque vous invoquez mysql . Vous devez juste spécifier son nom après les
paramètres de connexion dont vous avez besoin. Par exemple :
shell> mysql ?h hote ?u utilisateur ?p menagerie
Enter password: ********
Notez que menagerie n'est pas votre mot de passe dans la commande que nous venons de
montrer. Si vous voulez le fournir dans la ligne de commande après l'option ?p , vous devez le faire
sans espace entre les deux (par exemple, tapez ?pmonmotdepasse , et non ?p monmotdepasse
). Toutefois, mettre le mot de passe en ligne de commande n'est pas recommandé, car le faire
permettrait à d'autres utilisateurs connectés sur votre machine de l'obtenir.
3.3.2 Création d'une table
Créer la base de données est la partie facile, mais jusque?là elle est vide, comme vous le montre
SHOW TABLES :
mysql> SHOW TABLES;
Empty set (0.00 sec)
La partie la plus difficile est le choix de la structure de la base de données : de quelles tables aurez
vous besoin et quelles colonnes devront figurer dans chacune d' voudrez une table qui
contient un enregistrement pour chaque animal. On peut l'appeler la table animal , et elle devra
contenir, au minimum, le nom de chaque animal. Puisque le nom tout seul n'est pas intéressant, la
table devra contenir d'autres informations. Par exemple, si plus d'une personne de votre famille
possède un animal, vous voudrez lister le nom du maître de chaque animal. Vous voudrez
peut?être aussi enregistrer une description basique comme l'espèce ou le sexe.
Et pour l'âge ? C'est intéressant, mais n'est pas bon pour un stockage en base de données. L'âge
change chaque jour, vous devrez donc mettre à jour vos enregistrements assez souvent. Il est
préférable de stocker une valeur fixe, comme la date de naissance. Dans ce cas?là, à chaque fois
que vous aurez besoin de l'âge, vous pourrez l'obtenir en faisant la différence entre la date courante
et la date enregistrée. MySQL fournit des fonctions de calcul sur les dates, cela ne sera donc pas
difficile. Enregistrer la date de naissance, au lieu de l'âge a d'autres avantages :
Vous pouvez utiliser la base de données pour des tâches, comme la génération d'un rappel
• 
pour les prochains anniversaires d'animaux. (Si vous trouvez que ce type de requêtes est
quelque peu idiot, notez que c'est la même question que vous vous poseriez dans le
contexte d'une base de données d'affaires pour identifier les clients à qui vous aurez besoin
d'envoyer un message de voeux, pour cette touche informatiquement assistée
d'humanisme.)
Vous pouvez calculer l'âge à partir d'autres dates que la date du jour. Par exemple, si vous
• 
stockez la date de la mort dans la base de données, vous pourrez facilement calculer l'âge
qu'avait un animal à sa mort.
Vous trouverez probablement d'autres informations qui pourront être utiles dans la table animal ,
mais celles identifiés jusqu'à maintenant sont largement suffisantes pour l'instant : nom, maitre,
 3.3.2 Création d'une table
138

Manuel MySQL 4.1.x ? Version Française
espece, sexe, naissance, et mort.Utilisez une requête CREATE TABLE pour spécifier la structure de
votre table :
mysql> CREATE TABLE animal (nom VARCHAR(20), maitre VARCHAR(20),
    ?> espece VARCHAR(20), sexe CHAR(1), naissance DATE, mort DATE);
VARCHAR est un bon choix pour les colonnes nom , maitre , et espece car leurs valeurs varient en
longueur. La longueur de ces colonnes ne doit pas nécessairement être la même, et n'a pas besoin
d'être forcement 20 . Vous pouvez choisir une taille entre 1 et 255 , celle qui vous semblera la plus
raisonnable. (Si vous faites un mauvais choix et que vous vous apercevez plus tard que vous avez
besoin d'un champ plus long, MySQL fournit la commande ALTER TABLE .)Le sexe des animaux
peut être représenté de plusieurs façons, par exemple, "m" et "f" , ou bien "male" and
"femelle" . Il est plus simple d'utiliser les caractères simples "m" et "f" .
L'utilisation du type de données DATE pour les colonnes naissance et mort est un choix plutôt
judicieux.
Maintenant que vous avez créé une table, SHOW TABLES devrait produire de l'affichage :
mysql> SHOW TABLES;
+?????????????????????+
| Tables in menagerie |
+?????????????????????+
| animal              |
+?????????????????????+
Pour vérifier que la table a été créée de la façon que vous vouliez , utilisez la commande DESCRIBE
:
mysql> DESCRIBE animal;
+???????????+?????????????+??????+?????+?????????+???????+
| Field     | Type        | Null | Key | Default | Extra |
+???????????+?????????????+??????+?????+?????????+???????+
| nom       | varchar(20) | YES  |     | NULL    |       |
| maitre    | varchar(20) | YES  |     | NULL    |       |
| espece    | varchar(20) | YES  |     | NULL    |       |
| sexe      | char(1)     | YES  |     | NULL    |       |
| naissance | date        | YES  |     | NULL    |       |
| mort      | date        | YES  |     | NULL    |       |
+???????????+?????????????+??????+?????+?????????+???????+
Vous pouvez utiliser DESCRIBE quand vous voulez, par exemple, si vous avez oublié les noms des
colonnes dans votre table ou leurs types.
3.3.3 Charger des données dans une table
Après la création de votre table, vous aurez besoin de la remplir. Les commandes LOAD DATA et
INSERT sont utiles pour cela.
Supposons que les enregistrements de vos animaux peuvent être décrits comme suit. (Observez
que MySQL attend les dates au format YYYY?MM?DD ; cela peut différer de ce à quoi vous êtes
habitué.)
nom
maitre
especes
sexe
naissance
mort
Fluffy
Harold
chat
f
1993?02?04
Claws
Gwen
chat
m
1994?03?17
Buffy
Harold
chien
f
1989?05?13
Fang
Benny
chien
m
1990?08?27
Bowser
Diane
chien
m
1998?08?31
1995?07?29
 3.3.3 Charger des données dans une table
139

Manuel MySQL 4.1.x ? Version Française
Chirpy
Gwen
oiseau
f
1998?09?11
Whistler
Gwen
oiseau
1997?12?09
Slim
Benny
serpent
m
1996?04?29
Puisque vous commencez avec une table vide, il est facile de la remplir en créant un fichier texte
contenant une ligne pour chaque animal que vous avez, puis charger son contenu à l'aide d'une
seule commande.
Vous pouvez créer un fichier  contenant un enregistrement par ligne, avec les valeurs
séparés par des tabulations, et ordonnées comme les champs l'étaient dans la requête CREATE
TABLE . Pour les données manquantes (comme un sexe inconnu ou la date de mort d'un animal
toujours en vie), vous pouvez utiliser les valeurs NULL . Pour les représenter dans votre fichier
texte, utilisez \N . Par exemple, l'enregistrement de Whistler l'oiseau ressemblera à ça (l'espace
entre les valeurs est une tabulation) :
nom
maitre
especes
sexe
naissance
mort
Whistler
Gwen
bird
\N
1997?12?09
\N
Pour charger le fichier  dans la table pet , utilisez cette commande :
mysql> LOAD DATA LOCAL INFILE "" INTO TABLE pet;
Vous pouvez spécifier la valeur du séparateur de colonnes et le marqueur de fin de lignes
explicitement dans la commande LOAD DATA si vous le voulez, mais les valeurs par défaut sont la
tabulation et le retour à la ligne. Ceux?là sont suffisants pour que la commande lise le fichier
 correctement.
Lorsque vous voulez ajouter des enregistrements un par un, la commande INSERT est utile. Dans
sa forme la plus simple, où vous spécifiez une valeur pour chaque colonne, dans l'ordre où les
colonnes sont listées dans la requête CREATE TABLE . Supposons que Diane achète un nouvel
hamster nommé Puffball. Vous pourriez ajouter ce nouvel enregistrement en utilisant un INSERT de
la façon suivante :
mysql> INSERT INTO pet
    ?> VALUES ('Puffball','Diane','hamster','f','1999?03?30',NULL);
Notez que les chaînes de caractères et les valeurs de dates sont spécifiées en tant que chaînes
protégées par des guillemets. De plus, avec INSERT vous pouvez insérer la valeur NULL
directement pour représenter une valeur manquante. Vous n'utilisez pas \N comme vous le faites
avec LOAD DATA .
A partir de cet exemple, vous devriez être capable de voir qu'il y'a beaucoup plus de commandes à
taper lorsque vous utilisez la commande INSERT au lieu de LOAD DATA .
3.3.4 Récupérer des informations à partir d'une table
La commande SELECT est utilisée pour récupérer des informations à partir d'une table. La forme
usuelle est :
SELECT quoi_selectionner
FROM quel_table
WHERE conditions_a_satisfaire
quoi_selectionner indique ce que vous voulez voir. Cela peut être une liste de colonnes, ou *
pour indiquer ``toutes les colonnes''. quel_table indique la table à partir de laquelle récupérer les
 3.3.4 Récupérer des informations à partir d'une table
140

Manuel MySQL 4.1.x ? Version Française
données. La clause WHERE est optionnelle. Si elle est présente, conditions_a_satisfaire
spécifie les conditions que les lignes doivent satisfaire pour être séléctionnées.
3.3.4.1 Sélectionner toutes les données
La plus simple forme de SELECT récupère toutes les données d'une table :
mysql> SELECT * FROM animal;
+??????????+????????+?????????+??????+????????????+????????????+
| nom      | maitre | espece  | sexe | naissance  | mort       |
+??????????+????????+?????????+??????+????????????+????????????+
| Fluffy   | Harold | chat    | f    | 1993?02?04 | NULL       |
| Claws    | Gwen   | chat    | m    | 1994?03?17 | NULL       |
| Buffy    | Harold | chien   | f    | 1989?05?13 | NULL       |
| Fang     | Benny  | chien   | m    | 1990?08?27 | NULL       |
| Bowser   | Diane  | chien   | m    | 1998?08?31 | 1995?07?29 |
| Chirpy   | Gwen   | oiseau  | f    | 1998?09?11 | NULL       |
| Whistler | Gwen   | oiseau  | NULL | 1997?12?09 | NULL       |
| Slim     | Benny  | serpent | m    | 1996?04?29 | NULL       |
| Puffball | Diane  | hamster | f    | 1999?03?30 | NULL       |
+??????????+????????+?????????+??????+????????????+????????????+
Cette forme de SELECT est utile si vous voulez récupérer la table entière. par exemple, après l'avoir
juste remplie avec vos données d'origine. Il apparaît alors qu'une erreur s'était glissée dans votre
fichier de données : Bowser a l'air d'être né après sa mort ! En consultant le papier original de son
pedigree, vous trouvez que la date correcte est 1989 et non pas 1998.
Il y'a au moins deux façons de corriger cela :
Corriger le fichier 
• 
 pour corriger l'erreur, puis vider et recharger à nouveau la
table en utilisant DELETE et LOAD DATA :
mysql> SET AUTOCOMMIT=1;  # Utilisé pour une recréation rapide de la table
mysql> DELETE FROM animal;
mysql> LOAD DATA LOCAL INFILE "" INTO TABLE animal;
Toutefois, si vous choisissez cette méthode, vous devrez aussi rentrer à nouveau
l'enregistrement de Puffball.
Corriger uniquement l'enregistrement erroné avec une requête 
• 
UPDATE :
mysql> UPDATE animal SET naissance = "1989?08?31" WHERE nom = "Bowser";
Comme nous l'avons montré, il est facile de récupérer toutes les données d'une table. Toutefois,
vous ne voudrez sûrement pas le faire, surtout si la table devient imposante. A la place, vous serez
plus intéressé par répondre à une question particulière, dans ce cas?là, vous spécifiez quelques
contraintes pour les informations que vous voulez. Regardons quelques requêtes de sélection qui
répondent à des questions à propos de vos animaux.
3.3.4.2 Sélectionner des lignes particuliéres
Vous pouvez sélectionner des lignes particulières de votre table. Par exemple, si vous voulez
vérifier la modification que vous avez effectuée sur la date de naissance de Bowser, sélectionnez
son enregistrement comme suit :
mysql> SELECT * FROM animal WHERE nom = "Bowser";
+????????+????????+????????+??????+????????????+????????????+
| nom    | maitre | espece | sexe | naissance  | mort       |
+????????+????????+????????+??????+????????????+????????????+
| Bowser | Diane  | chien  | m    | 1989?08?31 | 1995?07?29 |
 3.3.4.1 Sélectionner toutes les données
141

Manuel MySQL 4.1.x ? Version Française
+????????+????????+????????+??????+????????????+????????????+
L'affichage confirme que la date est correcte maintenant : 1989, et non comparaison des
chaînes de caractères se fait normalement avec sensibilité à la casse, vous pouvez donc spécifier
le nom "bowser" , "BOWSER" , etc. Le résultat de la requête sera le même.
Vous pouvez spécifier des conditions sur toutes les colonnes, pas seulement nom . Par exemple, si
vous voulez savoir quels animaux sont nés après 1998, testez la colonne naissance :
mysql> SELECT * FROM animal WHERE naissance >= "1998?1?1";
+??????????+????????+?????????+??????+????????????+???????+
| nom      | maitre | espece  | sexe | naissance  | mort  |
+??????????+????????+?????????+??????+????????????+???????+
| Chirpy   | Gwen   | oiseau  | f    | 1998?09?11 | NULL  |
| Puffball | Diane  | hamster | f    | 1999?03?30 | NULL  |
+??????????+????????+?????????+??????+????????????+???????+
Vous pouvez combiner plusieurs conditions, par exemple, pour trouver les chiennes :
mysql> SELECT * FROM animal WHERE espece = "chien" AND sexe = "f";
+???????+????????+????????+??????+????????????+???????+
| nom   | maitre | espece | sexe | naissance  | mort  |
+???????+????????+????????+??????+????????????+???????+
| Buffy | Harold | chien  | f    | 1989?05?13 | NULL  |
+???????+????????+????????+??????+????????????+???????+
La requête précédente utilise l'opérateur logique AND . L'opérateur OR existe aussi :
mysql> SELECT * FROM animal WHERE espece = "serpent" OR espece = "oiseau";
+??????????+????????+?????????+??????+????????????+???????+
| nom      | maitre | espece  | sexe | naissance  | mort  |
+??????????+????????+?????????+??????+????????????+???????+
| Chirpy   | Gwen   | oiseau  | f    | 1998?09?11 | NULL  |
| Whistler | Gwen   | oiseau  | NULL | 1997?12?09 | NULL  |
| Slim     | Benny  | serpent | m    | 1996?04?29 | NULL  |
+??????????+????????+?????????+??????+????????????+???????+
AND et OR peuvent être utilisés ensemble. Si vous le faites, une bonne idée est d'utiliser les
parenthèses pour indiquer comment les conditions doivent être regroupées :
mysql> SELECT * FROM animal WHERE (espece = "chat" AND sexe = "m")
    ?> OR (espece = "chien" AND sexe = "f");
+???????+????????+????????+??????+????????????+???????+
| nom   | maitre | espece | sexe | naissance  | mort  |
+???????+????????+????????+??????+????????????+???????+
| Claws | Gwen   | chat   | m    | 1994?03?17 | NULL  |
| Buffy | Harold | chien  | f    | 1989?05?13 | NULL  |
+???????+????????+????????+??????+????????????+???????+
3.3.4.3 Sélectionner des colonnes particulières
Si vous ne voulez pas voir les lignes entières de votre table, nommez les colonnes qui vous
intéressent, en les séparant par des virgules. Par exemple, si vous voulez savoir quand vos
animaux sont nés, sélectionnez les colonnes nom et naissance :
mysql> SELECT nom, naissance FROM animal;
+??????????+????????????+
| nom      | naissance  |
+??????????+????????????+
| Fluffy   | 1993?02?04 |
| Claws    | 1994?03?17 |
| Buffy    | 1989?05?13 |
| Fang     | 1990?08?27 |
| Bowser   | 1989?08?31 |
| Chirpy   | 1998?09?11 |
| Whistler | 1997?12?09 |
 3.3.4.3 Sélectionner des colonnes particulières
142

Manuel MySQL 4.1.x ? Version Française
| Slim     | 1996?04?29 |
| Puffball | 1999?03?30 |
+??????????+????????????+
Pour trouver qui possède les animaux, utilisez cette requête :
mysql> SELECT maitre FROM animal;
+????????+
| maitre |
+????????+
| Harold |
| Gwen   |
| Harold |
| Benny  |
| Diane  |
| Gwen   |
| Gwen   |
| Benny  |
| Diane  |
+????????+
Toutefois, remarquez que la requête récupère le champ maitre de chaque enregistrement, et
certains apparaissent plus d'une fois. Pour minimiser l'affichage, récupérez chaque résultat unique
une seule fois en ajoutant le mot?clef DISTINCT :
mysql> SELECT DISTINCT maitre FROM animal;
+????????+
| maitre |
+????????+
| Benny  |
| Diane  |
| Gwen   |
| Harold |
+????????+
Vous pouvez utiliser une clause WHERE pour combiner la sélection des lignes avec celle des
colonnes. Par exemple, pour obtenir les dates de naissance des chiens et chats uniquement,
utilisez cette requête :
mysql> SELECT nom, espece, naissance FROM animal
    ?> WHERE espece = "chien" OR espece = "chat";
+????????+????????+????????????+
| nom    | espece | naissance  |
+????????+????????+????????????+
| Fluffy | chat   | 1993?02?04 |
| Claws  | chat   | 1994?03?17 |
| Buffy  | chien  | 1989?05?13 |
| Fang   | chien  | 1990?08?27 |
| Bowser | chien  | 1989?08?31 |
+????????+????????+????????????+
3.3.4.4 Trier les enregistrements
Vous avez sûrement noté dans les exemples précédents que les lignes de résultat sont affichées
sans ordre particulier. Cependant, il est souvent plus facile d'examiner les résultats lorsqu'ils sont
triés d'une manière significative. Pour trier un résultat, vous devez utiliser une clause ORDER BY .
L'exemple suivant présente les dates d'anniversaire des animaux, triées par date :
mysql> SELECT nom, naissance FROM animaux ORDER BY naissance;
+??????????+????????????+
| nom      | naissance  |
+??????????+????????????+
| Buffy    | 1989?05?13 |
| Bowser   | 1989?08?31 |
| Fang     | 1990?08?27 |
| Fluffy   | 1993?02?04 |
| Claws    | 1994?03?17 |
 3.3.4.4 Trier les enregistrements
143

Manuel MySQL 4.1.x ? Version Française
| Slim     | 1996?04?29 |
| Whistler | 1997?12?09 |
| Chirpy   | 1998?09?11 |
| Puffball | 1999?03?30 |
+??????????+????????????+
Sur les noms de colonnes, le tri ? comme toutes les opérations de comparaison ? est normalement
exécuté sans tenir compte de la casse. Cela signifie que l'ordre sera indéfini pour les colonnes qui
sont identiques, excepté leur casse. Vous pouvez forcer le tri sensible à la casse en utilisant la
clause BINARY : ORDER BY BINARY(champ) . Pour trier dans l'ordre inverse, ajoutez le mot?clé
DESC (décroissant) au nom de la colonne à trier :
mysql> SELECT nom, naissance FROM animaux ORDER BY naissance DESC;
+??????????+????????????+
| nom      | naissance  |
+??????????+????????????+
| Puffball | 1999?03?30 |
| Chirpy   | 1998?09?11 |
| Whistler | 1997?12?09 |
| Slim     | 1996?04?29 |
| Claws    | 1994?03?17 |
| Fluffy   | 1993?02?04 |
| Fang     | 1990?08?27 |
| Bowser   | 1989?08?31 |
| Buffy    | 1989?05?13 |
+??????????+????????????+
Vous pouvez effectuer un tri sur plusieurs colonnes. Par exemple, pour trier par types d'animaux,
puis par la date d'anniversaire des animaux, en plaçant les plus jeunes en premier, utilisez la
requête suivante :
mysql> SELECT nom, espece, naissance FROM animaux ORDER BY type, naissance DESC;
+??????????+?????????+????????????+
| nom      | espece  | naissance  |
+??????????+?????????+????????????+
| Chirpy   | oiseau  | 1998?09?11 |
| Whistler | oiseau  | 1997?12?09 |
| Claws    | chat    | 1994?03?17 |
| Fluffy   | chat    | 1993?02?04 |
| Fang     | chien   | 1990?08?27 |
| Bowser   | chien   | 1989?08?31 |
| Buffy    | chien   | 1989?05?13 |
| Puffball | hamster | 1999?03?30 |
| Slim     | serpent | 1996?04?29 |
+??????????+?????????+????????????+
Notez que le mot?clé DESC est appliqué uniquement au nom de la colonne qui le précède (
naissance ) ; les valeurs espece continuent à être triées dans l'ordre croissant.
3.3.4.5 Calcul sur les Dates
MySQL fournit plusieurs fonctions que vous pouvez utiliser pour effectuer des calculs sur les dates,
par exemple, pour calculer l'âge ou pour extraire des parties de date.
Pour déterminer quel âge a chacun de vos animaux, vous devez calculer la différence entre l'année
en cours et l'année de naissance, puis soustraire à la date courante si la date du jour se produit
plus tôt dans l'année civile que la date de naissance. La requête suivante montre, pour chaque
animal, la date de naissance, la date courante, ainsi que l'âge en années.
mysql> SELECT nom, naissance, CURRENT_DATE,
    ?> (YEAR(CURRENT_DATE)?YEAR(naissance))
    ?> ? (RIGHT(CURRENT_DATE,5)<RIGHT(naissance,5))
    ?> AS age
    ?> FROM animaux;
+??????????+????????????+??????????????+??????+
 3.3.4.5 Calcul sur les Dates
144

Manuel MySQL 4.1.x ? Version Française
| nom      |naissance   | CURRENT_DATE | age  |
+??????????+????????????+??????????????+??????+
| Fluffy   | 1993?02?04 | 2001?08?29   |    8 |
| Claws    | 1994?03?17 | 2001?08?29   |    7 |
| Buffy    | 1989?05?13 | 2001?08?29   |   12 |
| Fang     | 1990?08?27 | 2001?08?29   |   11 |
| Bowser   | 1989?08?31 | 2001?08?29   |   11 |
| Chirpy   | 1998?09?11 | 2001?08?29   |    2 |
| Whistler | 1997?12?09 | 2001?08?29   |    3 |
| Slim     | 1996?04?29 | 2001?08?29   |    5 |
| Puffball | 1999?03?30 | 2001?08?29   |    2 |
+??????????+????????????+??????????????+??????+
Ici, YEAR() extrait l'année de la date et RIGHT() extrait les 5 caractères les plus à droite de la date
qui représentent MM?DD (année civile). La partie de l'expression qui compare les valeurs de MM?DD
évalue à 1 ou à 0, qui ajustent la différence d'année à la baisse, si CURRENT_DATE se produit plus
au début de l'année que la naissance . L'expression complète est un peu plus fine en utilisant un
alias ( age ) pour produire un nom de colonne un peu plus requête fonctionne, mais le
résultat pourrait être lu plus facilement si les lignes étaient présentées dans le même ordre. Cela
peut être obtenu en ajoutant une clause ORDER BY nom pour trier le résultat par nom :
mysql> SELECT nom, naissance, CURRENT_DATE,
    ?> (YEAR(CURRENT_DATE)?YEAR(naissance))
    ?> ? (RIGHT(CURRENT_DATE,5)<RIGHT(naissance,5))
    ?> AS age
    ?> FROM animaux ORDER BY nom;
+??????????+????????????+??????????????+??????+
| nom      |naissance   | CURRENT_DATE | age  |
+??????????+????????????+??????????????+??????+
| Bowser   | 1989?08?31 | 2001?08?29   |   11 |
| Buffy    | 1989?05?13 | 2001?08?29   |   12 |
| Chirpy   | 1998?09?11 | 2001?08?29   |    2 |
| Claws    | 1994?03?17 | 2001?08?29   |    7 |
| Fang     | 1990?08?27 | 2001?08?29   |   11 |
| Fluffy   | 1993?02?04 | 2001?08?29   |    8 |
| Puffball | 1999?03?30 | 2001?08?29   |    2 |
| Slim     | 1996?04?29 | 2001?08?29   |    5 |
| Whistler | 1997?12?09 | 2001?08?29   |    3 |
+??????????+????????????+??????????????+??????+
Pour trier le résultat par l' age plutôt que par le nom , utilisez simplement une clause ORDER BY
différente :
mysql> SELECT nom, naissance, CURRENT_DATE,
    ?> (YEAR(CURRENT_DATE)?YEAR(naissance))
    ?> ? (RIGHT(CURRENT_DATE,5)<RIGHT(naissance,5))
    ?> AS age
    ?> FROM animaux ORDER BY age;
+??????????+????????????+??????????????+??????+
| nom      |naissance   | CURRENT_DATE | age  |
+??????????+????????????+??????????????+??????+
| Chirpy   | 1998?09?11 | 2001?08?29   |    2 |
| Puffball | 1999?03?30 | 2001?08?29   |    2 |
| Whistler | 1997?12?09 | 2001?08?29   |    3 |
| Slim     | 1996?04?29 | 2001?08?29   |    5 |
| Claws    | 1994?03?17 | 2001?08?29   |    7 |
| Fluffy   | 1993?02?04 | 2001?08?29   |    8 |
| Fang     | 1990?08?27 | 2001?08?29   |   11 |
| Bowser   | 1989?08?31 | 2001?08?29   |   11 |
| Buffy    | 1989?05?13 | 2001?08?29   |   12 |
+??????????+????????????+??????????????+??????+
Une requête similaire peut être utilisée pour déterminer l'âge qu'avait un animal à sa mort. Vous
determinez les animaux qui le sont en regardant les valeurs mort qui ne valent pas NULL . Alors,
pour ceux dont la valeur est non NULL , calculez la différence entre la mort et la naissance :
mysql> SELECT nom, naissance, mort,
    ?> (YEAR(death)?YEAR(naissance)) ? (RIGHT(mort,5)<RIGHT(naissance,5))
    ?> AS age
 3.3.4.5 Calcul sur les Dates
145

Manuel MySQL 4.1.x ? Version Française
    ?> FROM animaux WHERE mort IS NOT NULL ORDER BY age;
+????????+????????????+????????????+??????+
| nom    |naissance   | mort       | age  |
+????????+????????????+????????????+??????+
| Bowser | 1989?08?31 | 1995?07?29 |    5 |
+????????+????????????+????????????+??????+
Cette requête utilise mort IS NOT NULL plutôt que mort <> NULL parce que NULL est une
quels sont les animaux qui ont leur anniversaire le mois prochain ? Pour effectuer ce type de
calculs, l'année et le jour ne sont pas utiles ; vous voulez simplement extraire le mois de la colonne
naissance . MySQL fournit plusieurs fonctions d'extraction de parties de dates, comme YEAR() ,
MONTH() , et DAYOFMONTH() . MONTH() est la fonction appropriée dans notre cas. Pour voir
comment cette fonction travaille, exécutez une requête simple qui retourne l' naissance et le
MONTH(naissance) :
mysql> SELECT nom, naissance, MONTH(naissance) FROM animaux;
+??????????+????????????+??????????????????+
| nom      | naissance  | MONTH(naissance) |
+??????????+????????????+??????????????????+
| Fluffy   | 1993?02?04 |                2 |
| Claws    | 1994?03?17 |                3 |
| Buffy    | 1989?05?13 |                5 |
| Fang     | 1990?08?27 |                8 |
| Bowser   | 1989?08?31 |                8 |
| Chirpy   | 1998?09?11 |                9 |
| Whistler | 1997?12?09 |               12 |
| Slim     | 1996?04?29 |                4 |
| Puffball | 1999?03?30 |                3 |
+??????????+????????????+??????????????????+
Trouver les animaux qui ont leur anniversaire dans le mois suivant est aisé. Supposez que le mois
courant est Avril. Donc, la valeur du mois est 4 et vous cherchez les animaux nés en Mai (mois 5)
comme ceci :
mysql> SELECT nom, naissance FROM animaux WHERE MONTH(naissance) = 5;
+???????+????????????+
| nom   |naissance   |
+???????+????????????+
| Buffy | 1989?05?13 |
+???????+????????????+
Il y a une petite complication si le mois courant est Décembre, bien sûr. Vous ne pouvez pas
uniquement ajouter 1 au numéro du mois courant ( 12 ) et chercher les animaux qui sont nés le
mois numéro 13, parce qu'il n'existe pas. A la place, vous cherchez les animaux nés en Janvier
(mois numéro 1).
Vous pouvez toujours écrire une requête qui fonctionne quelque soit le mois courant. Comme cela,
vous n'avez pas à utiliser un numéro de mois particulier dans votre requête. DATE_ADD() vous
permet d'ajouter un intervalle de temps à une date donnée. Si vous ajoutez un mois à la valeur de
NOW() , et que vous extrayez le mois à l'aide de MONTH() , le résultat produit le mois dans lequel
vous devez chercher un anniversaire :
mysql> SELECT nom, naissance FROM animaux
    ?> WHERE MONTH(naissance) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));
Une manière différente d'arriver au même résultat est d'ajouter 1 pour trouver le mois prochain
après le mois courant (après l'usage de la fonction ( MOD ) pour ajouter à la valeur du mois la valeur
0 si il est de 12 ) :
mysql> SELECT nom, naissance FROM animaux
    ?> WHERE MONTH(naissance) = MOD(MONTH(NOW()), 12) + 1;
Notez que MONTH retourne un nombre entre 1 et 12. MOD(quelquechose,12) retourne un
nombre entre 0 et 11. Donc, l'addition doit être faite après l'utilisation de la fonction MOD() , sinon,
 3.3.4.5 Calcul sur les Dates
146

Manuel MySQL 4.1.x ? Version Française
nous aurions un intervalle entre Novembre (11) et Janvier (1).
3.3.4.6 Travailler avec la valeur NULL
La valeur NULL peut être surprenante jusqu'à ce que vous vous y habituiez. Conceptuellement,
NULL représente une valeur qui manque, ou une valeur inconnue, et elle est traitée différemment
des autres valeurs. Pour tester la présence de la valeur NULL , vous ne pouvez pas utiliser les
opérateurs arithmétiques habituels comme = , < , ou <> . Pour le voir, il suffit d'essayer ceci :
mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+??????????+???????????+??????????+??????????+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+??????????+???????????+??????????+??????????+
|     NULL |      NULL |     NULL |     NULL |
+??????????+???????????+??????????+??????????+
Clairement, vous n'obtiendrez aucun résultat valable pour ces comparaisons. Utilisez les opérateurs
IS NULL et IS NOT NULL à la place :
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+???????????+???????????????+
| 1 IS NULL | 1 IS NOT NULL |
+???????????+???????????????+
|         0 |             1 |
+???????????+???????????????+
Notez que deux NULL sont considérés comme égaux lors que vous utilisez la clause GROUP BY .
Avec MySQL, 0 et NULL représentent le booléen faux, et tout le reste représente le booléen vrai. La
valeur par défaut du booléen vrai issue d'une comparaison est 1.
Lorsque vous utilisez la clause ORDER BY , les valeurs NULL sont toujours triées en premier, même
si vous utilisez l'attribut DESC .
Ce traitement particulier de NULL explique pourquoi, dans la section précédente, il était nécessaire
de déterminer quel animal ne vivait plus en utilisant la fonction mort IS NOT NULL au lieu de
mort <> NULL .
3.3.4.7 Recherche de modèles
MySQL fournit le standard SQL des recherches de modèles, basé sur une extension des
expressions régulières similaires à celles utilisées par les utilitaires Unix comme vi , grep , et sed
.
La recherche de modèles SQL vous permet d'utiliser le caractère '_' pour trouver n'importe quel
caractère et le caractère '%' pour trouver un nombre arbitraire de caractères (y compris aucun
caractère). Dans MySQL, la recherche de modèles est sensible à la casse par défaut. Quelques
exemples vous sont présentés ici. Notez que vous n'utilisez ni = ni <> lorsque vous utilisez la
recherche de modèles SQL ; utilisez les opérateurs de comparaison LIKE ou NOT LIKE à la place.
Pour trouver les noms commençant par la lettre 'b' :
mysql> SELECT * FROM animaux WHERE nom LIKE "b%";
+????????+????????+????????+??????+????????????+????????????+
| nom    | maitre | espece | sexe | naissance  | mort       |
+????????+????????+????????+??????+????????????+????????????+
| Buffy  | Harold | chien  | f    | 1989?05?13 | NULL       |
| Bowser | Diane  | chien  | m    | 1989?08?31 | 1995?07?29 |
 3.3.4.6 Travailler avec la valeur NULL
147

Manuel MySQL 4.1.x ? Version Française
+????????+????????+????????+??????+????????????+????????????+
Pour trouver les noms finissant par 'fy' :
mysql> SELECT * FROM animaux WHERE nom LIKE "%fy";
+????????+????????+?????????+??????+????????????+???????+
| nom    | maitre | espece  | sexe | naissance  | mort  |
+????????+????????+?????????+??????+????????????+???????+
| Fluffy | Harold | chat    | f    | 1993?02?04 | NULL  |
| Buffy  | Harold | chien   | f    | 1989?05?13 | NULL  |
+????????+????????+?????????+??????+????????????+???????+
Pour trouver les noms contenant le caractères 'w' :
mysql> SELECT * FROM animaux WHERE nom LIKE "%w%";
+??????????+????????+?????????+??????+????????????+????????????+
| nom      | maitre | espece  | sexe | naissance  | mort       |
+??????????+????????+?????????+??????+????????????+????????????+
| Claws    | Gwen   | chat    | m    | 1994?03?17 | NULL       |
| Bowser   | Diane  | chien   | m    | 1989?08?31 | 1995?07?29 |
| Whistler | Gwen   | oiseaux | NULL | 1997?12?09 | NULL       |
+??????????+????????+?????????+??????+????????????+????????????+
Pour trouver les noms contenant exactement 5 caractères, utilisez le caractère de recherche '_' :
mysql> SELECT * FROM animaux WHERE nom LIKE "_____";
+???????+????????+????????+??????+????????????+??????+
| nom   | maitre | espece | sexe | naissance  | mort |
+???????+????????+????????+??????+????????????+??????+
| Claws | Gwen   | chat   | m    | 1994?03?17 | NULL |
| Buffy | Harold | chien  | f    | 1989?05?13 | NULL |
+???????+????????+????????+??????+????????????+??????+
L'autre type de recherche de modèles fourni par MySQL utilise les expressions régulières étendues.
Lorsque vous testez une recherche avec ce type de modèle, utilisez les opérateurs REGEXP et NOT
REGEXP (ou RLIKE et NOT RLIKE qui sont des synonymes).
Quelques caractéristiques des expressions régulières étendues sont :
Le caractère 
• 
'.' trouve n'importe quel caractère.
Une classe de caractères 
• 
'[...]' trouve n'importe quel caractère contenu entre les
crochets. Par exemple, la classe de caractères '[abc]' trouve le caractère 'a' , 'b' , ou
'c' . Pour définir un intervalle de caractères, utilisez un trait d'union. La classe de
caractères '[a?z]' trouvera n'importe quel caractère minuscule, tout comme la classe
'[0?9]' trouvera n'importe quel nombre.
Le caractère 
• 
'*' trouvera aucune ou plus d'instances du caractère qui le précède. Par
exemple, 'x*' trouvera n'importe quel nombre de fois le caractère 'x' , '[0?9]*'
trouvera n'importe quel nombre, et '.*' trouvera n'importe quel nombre de fois n'importe
quel caractère.
Le modèle est trouvé s'il se produit n'importe où dans la valeur testée. (Les modèles SQL ne
• 
sont trouvés que s'ils sont présents en valeur entière.)
Pour ancrer un modèle de sorte qu'il soit trouvé au début ou à la fin de valeur testée, utilisez
• 
'^' au début ou bien '$' à la fin du modèle.
Pour démontrer comment les expressions régulières fonctionnent, les requêtes LIKE vues
précédemment ont été réécrites pour utiliser REGEXP .
Pour trouver les noms qui commencent par la lettre 'b' , utilisez '^' pour trouver le début du nom
:
mysql> SELECT * FROM animaux WHERE nom REGEXP "^b";
+????????+????????+????????+??????+????????????+????????????+
| nom    | maitre | espece | sexe | naissance  | mort       |
+????????+????????+????????+??????+????????????+????????????+
| Buffy  | Harold | chien  | f    | 1989?05?13 | NULL       |
| Bowser | Diane  | chien  | m    | 1989?08?31 | 1995?07?29 |
 3.3.4.6 Travailler avec la valeur NULL
148

Manuel MySQL 4.1.x ? Version Française
+????????+????????+????????+??????+????????????+????????????+
Avant la version 3.23.4 de MySQL, REGEXP était sensible à la casse, et la requête précédente ne
retournait aucune ligne. Pour trouver la lettre 'b' minuscule ou majuscule, utilisez cette requête à
la place :
mysql> SELECT * FROM animaux WHERE nom REGEXP "^[bB]";
Depuis MySQL 3.23.4, pour forcer REGEXP à être sensible à la casse, utilisez le mot?clé BINARY
pour faire de la chaîne, une chaîne binaire. Cette requête trouvera uniquement la lettre minuscule
'b' au début du nom :
mysql> SELECT * FROM animaux WHERE nom REGEXP BINARY "^b";
Pour trouver les noms finissant par 'fy' , utilisez '$' pour trouver la fin du nom :
mysql> SELECT * FROM animaux WHERE nom REGEXP "fy$";
+?????????+????????+????????+???????+????????????+??????+
| nom     | maitre | espece | sexe  | naissance  | mort |
+?????????+????????+????????+???????+????????????+??????+
| Fluffy  | Harold | chat   | f     | 1993?02?04 | NULL |
| Buffy   | Harold | chien  | f     | 1989?05?13 | NULL |
+?????????+????????+????????+???????+????????????+??????+
Pour trouver les noms contenant la lettre 'w' minuscule ou majuscule, utilisez la requête suivante :
mysql> SELECT * FROM animaux WHERE nom REGEXP "w";
+??????????+????????+?????????+??????+????????????+????????????+
| nom      | maitre | espece  | sexe | naissance  | mort       |
+??????????+????????+?????????+??????+????????????+????????????+
| Claws    | Gwen   | chat    | m    | 1994?03?17 | NULL       |
| Bowser   | Diane  | chien   | m    | 1989?08?31 | 1995?07?29 |
| Whistler | Gwen   | oiseaux | NULL | 1997?12?09 | NULL       |
+??????????+????????+?????????+??????+????????????+????????????+
Parce qu'une expression régulière est trouvée si le modèle se trouve n'importe où dans la valeur, il
n'est pas nécessaire dans la requête précédente de mettre un joker de chaque côté du modèle
recherché pour trouver la valeur entière comme cela aurait été le cas en utilisant les modèles de
recherche SQL.
Pour trouver les noms contenant exactement 5 caractères, utilisez '^' et '$' pour trouver le début
et la fin du nom, et 5 instances de '.' au milieu :
mysql> SELECT * FROM animaux WHERE nom REGEXP "^.....$";
+???????+????????+????????+??????+????????????+??????+
| nom   | maitre | espece | sexe | naissance  | mort |
+???????+????????+????????+??????+????????????+??????+
| Claws | Gwen   | chat   | m    | 1994?03?17 | NULL |
| Buffy | Harold | chien  | f    | 1989?05?13 | NULL |
+???????+????????+????????+??????+????????????+??????+
Vous pouvez aussi écrire la requête suivante en utilisant l'opérateur '{n' } ``répéter? n ?fois'' :
mysql> SELECT * FROM animaux WHERE nom REGEXP "^.&#123;5&#125;$";
+???????+????????+????????+??????+????????????+??????+
| nom   | maitre | espece | sexe | naissance  | mort |
+???????+????????+????????+??????+????????????+??????+
| Claws | Gwen   | chat   | m    | 1994?03?17 | NULL |
| Buffy | Harold | chien  | f    | 1989?05?13 | NULL |
+???????+????????+????????+??????+????????????+??????+
3.3.4.8 Compter les lignes
Les bases de données sont souvent employées pour répondre à la question : ``Combien de fois un
certain type de données se trouve dans la table ?'' Par exemple, vous aimeriez savoir combien
d'animaux vous avez, ou bien combien d'animaux chaque propriétaire possède, ou encore savoir
 3.3.4.8 Compter les lignes
149

Manuel MySQL 4.1.x ? Version Française
différentes choses concernant vos animaux.
Savoir combien vous avez d'animaux revient à se poser la question : ``Combien de lignes y a?t?il
dans la table animaux ?'' parcequ'il y a un enregistrement par animaux. La fonction COUNT()
compte le nombre de résultats non NULL , donc, la requête pour compter les animaux ressemble à
ceci :
mysql> SELECT COUNT(*) FROM animaux;
+??????????+
| COUNT(*) |
+??????????+
|        9 |
+??????????+
Vous pouvez trouver également les noms des propriétaires des animaux. Vous pouvez utiliser
COUNT() si vous voulez trouver combien d'animaux possède chaque propriétaire :
mysql> SELECT maitre, COUNT(*) FROM animaux GROUP BY maitre;
+????????+??????????+
| maitre | COUNT(*) |
+????????+??????????+
| Benny  |        2 |
| Diane  |        2 |
| Gwen   |        3 |
| Harold |        2 |
+????????+??????????+
Notez l'utilisation de la clause GROUP BY pour grouper tous les enregistrements par propriétaire.
Sans cela, vous auriez le message d'erreur suivant :
mysql> SELECT maitre, COUNT(maitre) FROM animaux;
ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)
with no GROUP columns is illegal if there is no GROUP BY clause
COUNT() et GROUP BY sont utiles pour caractériser vos données de diverses façons. Les exemples
suivants montrent différentes manières pour obtenir des statistiques sur les animaux.
Nombre d'animaux par espèce :
mysql> SELECT espece, COUNT(*) FROM animaux GROUP BY espece;
+?????????+??????????+
| espece  | COUNT(*) |
+?????????+??????????+
| oiseau  |        2 |
| chat    |        2 |
| chien   |        3 |
| hamster |        1 |
| serpent |        1 |
+?????????+??????????+
Nombre d'animaux par sexe :
mysql> SELECT sexe, COUNT(*) FROM animaux GROUP BY sexe;
+??????+??????????+
| sexe | COUNT(*) |
+??????+??????????+
| NULL |        1 |
| f    |        4 |
| m    |        4 |
+??????+??????????+
(Dans ce résultat, NULL indique les sexes inconnus.)Nombre d'animaux par espèce et sexe :
mysql> SELECT espece, sexe, COUNT(*) FROM animaux GROUP BY espece, sexe;
+?????????+??????+??????????+
 3.3.4.8 Compter les lignes
150

Manuel MySQL 4.1.x ? Version Française
| espece  | sexe | COUNT(*) |
+?????????+??????+??????????+
| oiseau  | NULL |        1 |
| oiseau  | f    |        1 |
| chat    | f    |        1 |
| chat    | m    |        1 |
| chien   | f    |        1 |
| chien   | m    |        2 |
| hamster | f    |        1 |
| serpent | m    |        1 |
+?????????+??????+??????????+
Vous n'avez pas besoin de rechercher une table entière quand vous employez COUNT() . Par
exemple, la requête précédente, si vous voulez trouver uniquement les chiens et les chats,
ressemble à cela :
mysql> SELECT espece, sexe, COUNT(*) FROM animaux
    ?> WHERE espece = "chien" OR espece = "chat"
    ?> GROUP BY espece, sexe;
+?????????+??????+??????????+
| espece  | sexe | COUNT(*) |
+?????????+??????+??????????+
| chat    | f    |        1 |
| chat    | m    |        1 |
| chien   | f    |        1 |
| chien   | m    |        2 |
+?????????+??????+??????????+
Ou bien, si vous voulez trouver le nombre d'animaux par sexe, uniquement pour les animaux dont
le sexe est connu :
mysql> SELECT espece, sexe, COUNT(*) FROM animaux
    ?> WHERE sexe IS NOT NULL
    ?> GROUP BY espece, sexe;
+?????????+??????+??????????+
| espece  | sexe | COUNT(*) |
+?????????+??????+??????????+
| oiseau  | f    |        1 |
| chat    | f    |        1 |
| chat    | m    |        1 |
| chien   | f    |        1 |
| chien   | m    |        2 |
| hamster | f    |        1 |
| serpent | m    |        1 |
+?????????+??????+??????????+
3.3.4.9 Utiliser plus d'une table
La table animal garde les enregistrements de vos animaux. Si vous voulez enregistrer d'autres
informations concernant vos animaux, comme les événements de leurs vies, les visites chez le
vétérinaire, ou encore lorsqu'ils ont mis bas, vous avez besoin d'une autre table. De quoi a besoin
cette table ? Elle doit :
Contenir le nom de l'animal pour savoir à quel animal cet événement se rattache.
• 
Une date pour savoir quand a eu lieu l'événement.
• 
Un champ qui décrit l'événement.
• 
Un champ de type événement, si vous voulez être capable de cataloguer les événements.
• 
En prenant cela en considération, le code CREATE TABLE pour la table evenement doit
ressembler à ceci :
mysql> CREATE TABLE evenement (nom VARCHAR(20), date DATE,
    ?> type VARCHAR(15), remarque VARCHAR(255));
Tout comme la table animal , il est facile d'enregistrer les enregistrements initiaux en créant un
fichier texte délimité par des tabulations, contenant l'information :
 3.3.4.9 Utiliser plus d'une table
151

Manuel MySQL 4.1.x ? Version Française
nom
date
type
remarque
Fluffy
1995?05?15
mise bas
4 chattons, 3 femelles, 1 mâles
Buffy
1993?06?23
mise bas
5 chiots, 2 femelles, 3 mâles
Buffy
1994?06?19
mise bas
3 chiots, 3 femelles
Chirpy
1999?03?21
vétérinaire
needed beak straightened
Slim
1997?08?03
vétérinaire
broken rib
Bowser
1991?10?12
chenil
Fang
1991?10?12
chenil
Fang
1998?08?28
anniversaire
Don d'un nouvel objet de mastication
Claws
1998?03?17
anniversaire
Don d'un nouveau collier anti?puces
Whistler
1998?12?09
anniversaire
Premier anniversaire
Chargez ces enregistrements comme cela :
mysql> LOAD DATA LOCAL INFILE "" INTO TABLE evenement;
En se basant sur ce que vous avez appris des requêtes effectuées sur la table animal , vous
devriez être capable de faire des recherches sur les enregistrements de la table evenement ; le
principe est le même. Quand devez?vous vous demander si la table evenement est seule
suffisante pour répondre à votre question ?
Supposez que vous voulez trouver l'âge de chaque animal lorsqu'il a mis bas. La table evenement
indique quand cela s'est produit, mais pour le calcul de l'âge de la mère, vous avez besoin de sa
date de naissance. Parce que ces informations sont stockées dans la table animal , vous avez
besoin des deux tables pour cette requête :
mysql> SELECT ,
    ?> (TO_DAYS(date) ? TO_DAYS(naissance))/365 AS age,
    ?> remarque
    ?> FROM animal, evenement
    ?> WHERE = AND type = "mise bas";
+????????+??????+????????????????????????????????+
| nom    | age  | remarque                       |
+????????+??????+????????????????????????????????+
| Fluffy | 2.27 | 4 chattons, 3 femelles, 1 mâle |
| Buffy  | 4.12 | 5 chiots, 2 femelles, 3 mâles  |
| Buffy  | 5.10 | 3 chiots, 3 femelles           |
+????????+??????+????????????????????????????????+
Il y a plusieurs choses à noter concernant cette requête :
La clause 
• 
FROM liste les deux tables parce que la requête a besoin d'informations contenues
dans ces deux tables.
Lorsque vous combinez (joignez) des informations provenant de plusieurs tables, vous
• 
devez spécifier quels enregistrements d'une table peuvent être associés à quels
enregistrements des autres tables. C'est aisé parce qu'elles ont toutes les deux une colonne
nom . La requête utilise la clause WHERE pour faire correspondre les enregistrements des
deux tables sur les valeurs de la colonne nom .
Parce que la colonne 
• 
nom apparaît dans les deux tables, vous devez être explicite
concernant la table que vous utilisez lorsque vous vous référez à cette colonne. C'est fait en
faisant précéder le nom de la colonne par le nom de la table.
Vous n'avez pas besoin de deux tables différentes pour effectuer une jointure. Quelques fois, c'est
plus facile de joindre une table sur elle?même, si vous voulez comparer des enregistrements dans
une table avec d'autres enregistrements de la même table. Par exemple, pour trouver des paires
 3.3.4.9 Utiliser plus d'une table
152

Manuel MySQL 4.1.x ? Version Française
multiples parmi vos animaux, vous pouvez joindre la table animal sur elle?même pour trouver les
paires mâles / femelles par rapport à l'espèce :
mysql> SELECT , , , , p1.espece
    ?> FROM animal AS p1, animal AS p2
    ?> WHERE p1.espece = p2.espece AND = "f" AND = "m";
+????????+??????+????????+??????+?????????+
| nom    | sexe | nom    | sexe | espece  |
+????????+??????+????????+??????+?????????+
| Fluffy | f    | Claws  | m    | chat    |
| Buffy  | f    | Fang   | m    | chien   |
| Buffy  | f    | Bowser | m    | chien   |
+????????+??????+????????+??????+?????????+
Dans cette requête, nous avons spécifié des alias pour les noms de tables dans l'ordre de référence
des colonnes et ainsi maintenir directement à quelle instance de la table chaque colonne est
associée.
3.4 Obtenir des informations à propos des bases de
données et des tables

Que faire si vous oubliez le nom d'une base de données ou d'une table, ou bien encore la structure
d'une table donnée (par exemple, comment se nomment ses colonnes) ?
MySQL répond à ce problème en fournissant plusieurs commandes qui renvoient des informations
à propos des tables et des bases de données les contenant.
Vous avez déjà vu SHOW DATABASES qui liste les bases de données gérées par le serveur. Pour
trouver quelle base de données est actuellement sélectionnée, utilisez la fonction DATABASE() :
mysql> SELECT DATABASE();
+????????????+
| DATABASE() |
+????????????+
| menagerie  |
+????????????+
Si vous n'avez encore sélectionné aucune base de données, le résultat est vide.
Pour trouver quelles sont les tables que la base contient (par exemple, quand vous n'êtes pas sûr
du nom d'une table), utilisez cette commande :
mysql> SHOW TABLES;
+?????????????????????+
| Tables in menagerie |
+?????????????????????+
| evenement           |
| animal              |
+?????????????????????+
Si vous voulez en savoir d'avantage sur la structure d'une table, la commande DESCRIBE est utile ;
elle fournit des informations sur chaque colonne de la table :
mysql> DESCRIBE animal;
+???????????+?????????????+??????+?????+?????????+???????+
| Field     | Type        | Null | Key | Default | Extra |
+???????????+?????????????+??????+?????+?????????+???????+
| nom       | varchar(20) | YES  |     | NULL    |       |
 3.4 Obtenir des informations à propos des bases de données et des tables
153

Manuel MySQL 4.1.x ? Version Française
| maitre    | varchar(20) | YES  |     | NULL    |       |
| espece    | varchar(20) | YES  |     | NULL    |       |
| sexe      | char(1)     | YES  |     | NULL    |       |
| naissance | date        | YES  |     | NULL    |       |
| mort      | date        | YES  |     | NULL    |       |
+???????????+?????????????+??????+?????+?????????+???????+
Field indique le nom de la colonne, Type est son type de données, NULL indique si la colonne
peut contenir des valeurs NULL , Key indique si la colonne est indexée et Default spécifie la
valeur par défaut de la vous avez des index sur une table, SHOW INDEX FROM
nom_de_table vous fournira des informations sur elles.
3.5 Exemples de requêtes usuelles
Voilà des exemples qui vous serviront à résoudre les problèmes communs avec MySQL.
Certains exemples utilisent la table shop pour sauvegarder le prix de chaque article (numéro de
l'élément) pour certains vendeurs (dealers). En supposant que chaque vendeur à un prix fixe pour
chaque article, le couple ( article , dealer ) est une clef primaire pour les enregistrements.
Démarrez le client en ligne de commande mysql et sélectionnez une base de données :
mysql nom?base?données
(Dans la plupart des installations de MySQL, vous pouvez utiliser la base de données 'test').
Vous pouvez créer la table d'exemple de la façon suivante :
CREATE TABLE shop (
 article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
 dealer  CHAR(20)                 DEFAULT ''     NOT NULL,
 price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL,
 PRIMARY KEY(article, dealer));
INSERT INTO shop VALUES
(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69),
(3,'D',1.25),(4,'D',19.95);
Ok, les données d'exemple sont :
mysql> SELECT * FROM shop;
+?????????+????????+???????+
| article | dealer | price |
+?????????+????????+???????+
|    0001 | A      |  3.45 |
|    0001 | B      |  3.99 |
|    0002 | A      | 10.99 |
|    0003 | B      |  1.45 |
|    0003 | C      |  1.69 |
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+?????????+????????+???????+
3.5.1 La valeur maximale d'une colonne
``Quel est le numéro du plus grand élément ?''
 3.5 Exemples de requêtes usuelles
154

Manuel MySQL 4.1.x ? Version Française
SELECT MAX(article) AS article FROM shop
+?????????+
| article |
+?????????+
|       4 |
+?????????+
3.5.2 La ligne contenant le maximum d'une certaine colonne
``Trouvez le numéro, vendeur et prix de l'article le plus cher.''
En ANSI SQL cela est facilement fait avec une sous?requête :
SELECT article, dealer, price
FROM   shop
WHERE  price=(SELECT MAX(price) FROM shop)
En MySQL (qui ne gère pas encore les sous?requêtes), vous devez le faire en deux temps :
Obtenir le plus grand prix de la table avec une requête 
• 
SELECT .
Utiliser cette valeur avec cette requête :
• 
SELECT article, dealer, price
FROM   shop
WHERE  price=19.95
Une autre solution est de trier toutes les lignes en ordre décroissant des prix et ne choisir que la
première ligne avec la clause LIMIT qui est spécifique à MySQL :
SELECT article, dealer, price
FROM   shop
ORDER BY price DESC
LIMIT 1
NOTE : s'il y'a beaucoup d'articles chers (par exemple, chaque 19.95) la solution avec LIMIT n'en
montre qu'un !.
3.5.3 Maximum d'une colonne par groupe
``Quel est le plus grand prix par article ?''
SELECT article, MAX(price) AS price
FROM   shop
GROUP BY article
+?????????+???????+
| article | price |
+?????????+???????+
|    0001 |  3.99 |
|    0002 | 10.99 |
|    0003 |  1.69 |
|    0004 | 19.95 |
+?????????+???????+
 3.5.2 La ligne contenant le maximum d'une certaine colonne
155

Manuel MySQL 4.1.x ? Version Française
3.5.4 La ligne contenant la plus grande valeur d'un certain champ par
rapport à un groupe

``Pour chaque article, trouvez le ou les vendeurs avec le plus haut prix.''
En ANSI SQL, je l'aurais fait de cette façon avec une sous?requête :
SELECT article, dealer, price
FROM   shop s1
WHERE  price=(SELECT MAX(s2.price)
              FROM shop s2
              WHERE s1.article = s2.article);
En MySQL il vaut mieux le faire en plusieurs étapes :
Récupérer la liste de (article, plusgrandprix).
• 
Pour chaque article, récupérer la ligne qui a le plus grand prix stocké.
• 
Cela se fait facilement avec une table temporaire :
CREATE TEMPORARY TABLE tmp (
        article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
        price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL);
LOCK TABLES shop read;
INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;
SELECT shop.article, dealer, shop.price FROM shop, tmp
WHERE shop.article=tmp.article AND shop.price=tmp.price;
UNLOCK TABLES;
DROP TABLE tmp;
Si vous n'utilisez pas une table TEMPORARY , vous devez aussi verrouiller celle?ci.``Peut?on le faire
avec une seule requête ?''
Oui, mais en utilisant une astuce inefficace que j'appelle ``astuce du MAX?CONCAT'':
SELECT article,
       SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer,
  0.00+LEFT(      MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price
FROM   shop
GROUP BY article;
+?????????+????????+???????+
| article | dealer | price |
+?????????+????????+???????+
|    0001 | B      |  3.99 |
|    0002 | A      | 10.99 |
|    0003 | C      |  1.69 |
|    0004 | D      | 19.95 |
+?????????+????????+???????+
Le dernier exemple peut, bien sûr, être amélioré en découpant les colonnes concaténées dans le
client.
 3.5.4 La ligne contenant la plus grande valeur d'un certain champ par rapport à un groupe
156

Manuel MySQL 4.1.x ? Version Française
3.5.5 Utiliser les variables utilisateur
Vous pouvez utiliser les variables utilisateur de MySQL pour garder des résultats en mémoire sans
avoir à les enregistrer dans des variables temporaires du client. Variables définies par l'utilisateur .
Par exemple, pour trouver l'article avec le plus haut et le plus bas prix, vous pouvez faire :
mysql> SELECT &#64;min_price:=MIN(price),&#64;max_price:=MAX(price) FROM shop;
mysql> SELECT * FROM shop WHERE price=&#64;min_price OR price=&#64;max_price;
+?????????+????????+???????+
| article | dealer | price |
+?????????+????????+???????+
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+?????????+????????+???????+
3.5.6 Utiliser les clefs étrangères
Depuis la version 3.23.44 de MySQL, les tables InnoDB supportent les contraintes des clefs
étrangères. Tables InnoDB . Consultez aussi Clés étrangères .
Actuellement, vous n'avez pas besoin de clefs étrangères pour réaliser des jointures entre les
tables. La seule chose que MySQL ne fait pas encore (avec les types autres que InnoDB ), est
CHECK pour s'assurer que que la clef que vous utilisez existe bien dans la ou les tables que vous
référencez et il n'efface pas automatiquement les lignes d'une table avec une définition de clef
étrangère. Si vous utilisez vos clefs comme une clef normale, tout marchera parfaitement :
CREATE TABLE person (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name CHAR(60) NOT NULL,
    PRIMARY KEY (id)
);
CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    style ENUM('t?shirt', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
    PRIMARY KEY (id)
);
 INSERT INTO person VALUES (NULL, 'Antonio Paz');
INSERT INTO shirt VALUES
(NULL, 'polo', 'blue', LAST_INSERT_ID()),
(NULL, 'dress', 'white', LAST_INSERT_ID()),
(NULL, 't?shirt', 'blue', LAST_INSERT_ID());
<P>
INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');
INSERT INTO shirt VALUES
(NULL, 'dress', 'orange', LAST_INSERT_ID()),
(NULL, 'polo', 'red', LAST_INSERT_ID()),
(NULL, 'dress', 'blue', LAST_INSERT_ID()),
(NULL, 't?shirt', 'white', LAST_INSERT_ID());
</P>
SELECT * FROM person;
 3.5.5 Utiliser les variables utilisateur
157

Manuel MySQL 4.1.x ? Version Française
+????+?????????????????????+
| id | name                |
+????+?????????????????????+
|  1 | Antonio Paz         |
|  2 | Lilliana Angelovska |
+????+?????????????????????+
SELECT * FROM shirt;
+????+?????????+????????+???????+
| id | style   | color  | owner |
+????+?????????+????????+???????+
|  1 | polo    | blue   |     1 |
|  2 | dress   | white  |     1 |
|  3 | t?shirt | blue   |     1 |
|  4 | dress   | orange |     2 |
|  5 | polo    | red    |     2 |
|  6 | dress   | blue   |     2 |
|  7 | t?shirt | white  |     2 |
+????+?????????+????????+???????+
 SELECT s.* FROM person p, shirt s
 WHERE p.name LIKE 'Lilliana%'
   AND s.owner = p.id
   AND s.color <> 'white';
+????+???????+????????+???????+
| id | style | color  | owner |
+????+???????+????????+???????+
|  4 | dress | orange |     2 |
|  5 | polo  | red    |     2 |
|  6 | dress | blue   |     2 |
+????+???????+????????+???????+
3.5.7 Recherche sur deux clefs
MySQL n'optimise pas encore quand vous effectuez des recherches sur deux clefs différentes
combinées avec OR (la recherche sur une clef avec différentes parties OR est elle pas mal
optimisée) :
SELECT champ1_index, champ2_index FROM test_table WHERE champ1_index = '1'
OR  champ2_index = '1'
La raison est que nous n'avons pas trouvé le temps suffisant pour parvenir à un moyen efficace de
gérer cela dans un cas général. (En comparaison, la gestion de AND est maintenant complètement
générale et fonctionne très bien.) Pour le moment, vous pouvez résoudre ce problème efficacement
en utilisant une table temporaire ( TEMPORARY ). Ce type d'optimisation est très utile si vous utilisez
des requêtes très complexes et que le serveur SQL fait une optimisation dans le mauvais ordre.
CREATE TEMPORARY TABLE tmp
SELECT champ1_index, champ2_index FROM test_table WHERE champ1_index = '1';
INSERT INTO tmp
SELECT champ1_index, champ2_index FROM test_table WHERE champ2_index = '1';
SELECT * from tmp;
DROP TABLE tmp;
La méthode ci?dessus pour résoudre cette requête est en effet une UNION de deux requêtes.
Syntaxe de UNION .
3.5.8 Calculer les visites par jour
Ce qui suit donne une idée d'une utilisation des fonctions de bits pour calculer le nombre de jours
par mois où un utilisateur a visité une page web.
 3.5.7 Recherche sur deux clefs
158

Manuel MySQL 4.1.x ? Version Française
CREATE TABLE t1 (annee YEAR(4), mois INT(2) UNSIGNED ZEROFILL,
             jour INT(2) UNSIGNED ZEROFILL);
INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),
            (2000,2,23),(2000,2,23);
SELECT annee,mois,BIT_COUNT(BIT_OR(1<<jour)) AS jours FROM t1
       GROUP BY annee,mois;
Qui retourne :
+???????+???????+???????+
| annee | mois  | jours |
+???????+???????+???????+
|  2000 |    01 |     3 |
|  2000 |    02 |     2 |
+???????+???????+???????+
Ce qui précède calcule le nombre de jours différents qui a été utilisé pour une combinaison
année/mois, avec suppression automatique des doublons.
3.5.9 Utiliser AUTO_INCREMENT
L'attribut AUTO_INCREMENT peut être utilisé pour générer un identifiant unique pour les nouvelles
lignes :
CREATE TABLE animals (
             id MEDIUMINT NOT NULL AUTO_INCREMENT,
             name CHAR(30) NOT NULL,
             PRIMARY KEY (id)
             );
INSERT INTO animals (name) VALUES ("dog"),("cat"),("penguin"),
                                  ("lax"),("whale");
SELECT * FROM animals;
Qui retourne :
+????+?????????+
| id | name    |
+????+?????????+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
+????+?????????+
Vous pouvez obtenir la valeur utilisée de la clef AUTO_INCREMENT avec la fonction SQL
LAST_INSERT_ID() ou la fonction d'API mysql_insert_id() .
Note : Pour une insertion multi?lignes, LAST_INSERT_ID() / mysql_insert_id() retourneront
la clef AUTO_INCREMENT de la première ligne insérée. Cela permet de reproduire les insertions
multi?lignes sur d'autres services.
Pour les tables MyISAM et BDB vous pouvez spécifier AUTO_INCREMENT sur une colonne
secondaire d'une clef multi?colonnes. Dans ce cas, la valeur générée pour la colonne
auto?incrementée est calculée de la façon suivante : MAX(auto_increment_column)+1)
WHERE prefix=given?prefix . C'est utile lorsque vous voulez placer des données dans des
groupes ordonnés.
CREATE TABLE animals (
             grp ENUM('fish','mammal','bird') NOT NULL,
             id MEDIUMINT NOT NULL AUTO_INCREMENT,
 3.5.9 Utiliser AUTO_INCREMENT
159

Manuel MySQL 4.1.x ? Version Française
             name CHAR(30) NOT NULL,
             PRIMARY KEY (grp,id)
             );
INSERT INTO animals (grp,name) VALUES("mammal","dog"),("mammal","cat"),
                  ("bird","penguin"),("fish","lax"),("mammal","whale");
SELECT * FROM animals ORDER BY grp,id;
Qui retourne :
+????????+????+?????????+
| grp    | id | name    |
+????????+????+?????????+
| fish   |  1 | lax     |
| mammal |  1 | dog     |
| mammal |  2 | cat     |
| mammal |  3 | whale   |
| bird   |  1 | penguin |
+????????+????+?????????+
Notez que dans ce cas, la valeur d' AUTO_INCREMENT sera réutilisée si vous effacez la ligne avec
la plus grande valeur d' AUTO_INCREMENT tous groupes confondus.
3.6 Utilisation de mysql en mode batch
Dans les sections précédentes, vous avez utilisé mysql inter activement pour entrer vos requêtes
et voir les résultats. Vous pouvez aussi utiliser mysql en mode batch. Pour ce faire, placez les
commandes que vous voulez exécuter dans un fichier, puis dites à mysql de lire les entrées à
partir de celui?ci :
shell> mysql < fichier?batch
Si vous utilisez mysql sous windows et que vous avez des caractères spéciaux dans le fichier qui
posent problèmes, vous pouvez faire :
dos> mysql ?e "source fichier?batch"
Si vous devez spécifier les paramètres de connexion en ligne de commande, la commande
ressemblera à ca :
shell> mysql ?h hôte ?u utilisateur ?p < fichier?batch
Enter password: ********
Lorsque vous utilisez mysql de cette façon, vous créez un fichier de script, puis vous l'exé
vous voulez que le script continue, même si il y'a des erreurs, vous devez utiliser l'option ??force
de la ligne de commande.
Pourquoi utilisez un script ? Voici quelques raisons :
Si vous utilisez une requête de façon répétitive (c'est à dire, chaque jour, ou chaque
• 
semaine), en faire un script vous évitera de la réécrire chaque fois.
Vous pouvez générer de nouvelles requêtes à partir de requêtes existantes et similaires en
• 
copiant et éditant des fichiers de scripts.
Ce mode peut aussi être utile lors du développement d'une requête, particulièrement pour
• 
les commandes sur plusieurs lignes ou plusieurs séquences de commandes. Si vous
commetez une erreur, vous n'avez pas à tout récrire. Editez juste votre script pour corriger
l'erreur et dites à mysql de l'exécuter à nouveau.
Si vous avez une requête qui produit beaucoup d'affichage, vous pouvez le rediriger vers un
• 
visionneur plutôt que de le regarder défiler sur votre écran :
shell> mysql < fichier?batch | more
Vous pouvez capturer l'affichage dans un fichier pour un traitement ultérieur :
• 
shell> mysql < fichier_batch >
Vous pouvez distribuer votre script à d'autres personnes pour qu'elles l'exécutent.
• 
 3.6 Utilisation de mysql en mode batch
160

Manuel MySQL 4.1.x ? Version Française
Quelques situations ne permettent pas une utilisation interactive, par exemple, quand vous
• 
exécutez une requête à partir d'une tâche cron . Dans ce cas, vous devez utiliser le mode
batch.
Le format d'affichage par défaut est différent (plus concis) lorsque vous exécutez mysql en mode
batch de celui utilisé inter activement. Par exemple, le résultat de SELECT DISTINCT espece
FROM animal ressemble à ça inter activement :
+?????????+
| espece  |
+?????????+
| oiseau  |
| chat    |
| chien   |
| hamster |
| serpent |
+?????????+
Mais à ça en mode batch :
espece
oiseau
chat
chien
hamster
serpent
Si vous voulez le format d'affichage interactif en mode batch, utilisez mysql ?t . Pour écrire les
commandes exécutez dans la sortie, utilisez mysql ?vvv .
Vous pouvez aussi utiliser un script à partir de l'invite mysql en utilisant la commande source :
mysql> source nom_fichier;
3.7 Requêtes du projet Twin
A Analytikerna et Lentus, nous avons eu à mettre en place le partie système et base de données
d'un grand projet de recherche. Ce projet est une collaboration entre l'institut de médecine
environnementale de l'institut de Karolinska Stockholm et la section de recherche clinique d'âge et
de psychologie à l'université de la Californie du sud.
Le projet nécessite une partie de récolte d'informations où tous les jumeaux en Suède de plus de 65
ans sont contactés par téléphone. Ceux qui répondent à certains critères sont admis à la seconde
étape. Dans celle?ci, les jumeaux qui veulent participer rencontrent une équipe de
médecins/infirmiers. Les examens incluent des examens physiques et neuropsychologiques, des
tests en laboratoire, de la neuro?imagerie, des études psychologiques et de la collecte
d'informations relatives à la famille. En plus de tout cela, les données à propos des facteurs de
risques médicaux et environnementaux sont collectées.
Plus d'informations à propos de l'étude Twin peuvent être trouvées sur :
La dernière partie de ce projet est administrée avec une interface web écrite en utilisant Perl et
MySQL.
Chaque nuit, toutes les informations des interviews sont stockées dans une base de données
MySQL.
 3.7 Requêtes du projet Twin
161

Manuel MySQL 4.1.x ? Version Française
3.7.1 Trouver tous les jumeaux répondant aux critères
La requête suivante a été utilisée pour déterminer qui participerait à la seconde partie du projet :
SELECT
        CONCAT(, ) + 0 AS tvid,
        CONCAT(p1.christian_name, " ", p1.surname) AS Name,
        p1.postal_code AS Code,
        AS City,
        pg.abrev AS Area,
        IF(td.participation = "Aborted", "A", " ") AS A,
        AS dead1,
        l.event AS event1,
        td.suspect AS tsuspect1,
        id.suspect AS isuspect1,
        td.severe AS tsevere1,
        id.severe AS isevere1,
        AS dead2,
        l2.event AS event2,
        h2.nurse AS nurse2,
        h2.doctor AS doctor2,
        td2.suspect AS tsuspect2,
        id2.suspect AS isuspect2,
        td2.severe AS tsevere2,
        id2.severe AS isevere2,
        l.finish_date
FROM
        twin_project AS tp
        /* For Twin 1 */
        LEFT JOIN twin_data AS td ON =
                  AND =
        LEFT JOIN informant_data AS id ON =
                  AND =
        LEFT JOIN harmony AS h ON = h.id
                  AND = h.tvab
        LEFT JOIN lentus AS l ON = l.id
                  AND = l.tvab
        /* For Twin 2 */
        LEFT JOIN twin_data AS td2 ON =
                  AND =
        LEFT JOIN informant_data AS id2 ON =
                  AND =
        LEFT JOIN harmony AS h2 ON =
                  AND =
        LEFT JOIN lentus AS l2 ON =
                  AND = ,
        person_data AS p1,
        person_data AS p2,
        postal_groups AS pg
WHERE
        /* p1 gets main twin and p2 gets his/her twin. */
        /* ptvab is a field inverted from tvab */
        = AND = AND
        = AND p2.ptvab = AND
        /* Just the sceening survey */
        tp.survey_no = 5 AND
        /* Skip if partner died before 65 but allow emigration (dead=9) */
        ( = 0 OR = 9 OR
         ( = 1 AND
          (p2.death_date = 0 OR
           (((TO_DAYS(p2.death_date) ? TO_DAYS(p2.birthday)) / 365)
            >= 65))))
        AND
        (
        /* Twin is suspect */
 3.7.1 Trouver tous les jumeaux répondant aux critères
162

Manuel MySQL 4.1.x ? Version Française
        (td.future_contact = 'Yes' AND td.suspect = 2) OR
        /* Twin is suspect ? Informant is Blessed */
        (td.future_contact = 'Yes' AND td.suspect = 1
                                   AND id.suspect = 1) OR
        /* No twin ? Informant is Blessed */
        (ISNULL(td.suspect) AND id.suspect = 1
                            AND id.future_contact = 'Yes') OR
        /* Twin broken off ? Informant is Blessed */
        (td.participation = 'Aborted'
         AND id.suspect = 1 AND id.future_contact = 'Yes') OR
        /* Twin broken off ? No inform ? Have partner */
        (td.participation = 'Aborted' AND ISNULL(id.suspect)
                                      AND = 0))
        AND
        l.event = 'Finished'
        /* Get at area code */
        AND SUBSTRING(p1.postal_code, 1, 2) =
        /* Not already distributed */
        AND (h.nurse IS NULL OR h.nurse=00 OR h.doctor=00)
        /* Has not refused or been aborted */
        AND NOT (h.status = 'Refused' OR h.status = 'Aborted'
        OR h.status = 'Died' OR h.status = 'Other')
ORDER BY
        tvid;
Quelques explications :
CONCAT(, ) + 0 AS tvid
Nous voulons trier la concaténation de id et tvab dans un ordre numérique. Ajouter
0 au résultat force MySQL à le considérer comme un nombre.
colonne id
Identifie une paire de jumeaux. C'est un clef dans toutes les tables.
colonne tvab
Identifie un jumeau dans une paire. Valeur 1 ou 2 .
colonne ptvab
Inverse de tvab . Si tvab est 1 c'est égal à 2 , et vice?versa. Elle existe pour
diminuer la frappe et faciliter la tâche à MySQL lors de l'optimisation de la requête.
Cette requête montre, entre autres, comment faire pour consulter une table depuis cette même
table en utilisant une jointure ( p1 et p2 ). Dans cet exemple, est utilisé pour chercher quel
partenaire du projet est décédé avant l'âge de 65 ans. Si c'est le cas, la ligne n'est pas
retournée.Tout ce qui précède existe dans toutes les tables avec des informations relatives aux
jumeaux. Nous avons une clé sur les champs id,tvab (toutes les tables), et sur les champs
id,ptvab ( person_data ) pour accélérer les requêtes.
Sur notre machine de production (un 200MHz UltraSPARC), cette requête retourne près de
150?200 lignes et prend moins d'une seconde.
Le nombre d'enregistrements dans les tables utilisées plus haut :
Table
Lignes
person_data
71074
lentus
5291
twin_project
5286
twin_data
2012
informant_data
663
harmony
381
 3.7.1 Trouver tous les jumeaux répondant aux critères
163

Manuel MySQL 4.1.x ? Version Française
postal_groups
100
3.7.2 Afficher une table avec l'état des paires de jumeaux
Chaque entrevue se finit avec un code d'état, appelé event . La requête ci?dessous montre
comment afficher une table avec toutes les paires, rassemblées par code d'état. Elle indique
combien de paires ont terminé, combien de paires ont à moitié terminé et combien on refusé, etc.
SELECT
        t1.event,
        t2.event,
        COUNT(*)
FROM
        lentus AS t1,
        lentus AS t2,
        twin_project AS tp
WHERE
        /* We are looking at one pair at a time */
        =
        AND
        AND =
        /* Just the sceening survey */
        AND tp.survey_no = 5
        /* This makes each pair only appear once */
        AND ='1' AND ='2'
GROUP BY
        t1.event, t2.event;
3.8 Utilisation de MySQL avec Apache
Il existe des programmes vous permettant d'identifier vos utilisateurs à l'aide d'une base MySQL et
qui vous permettent aussi de créer des journaux de log dans vos table MySQL. Portails MySQL .
Vous pouvez changer le format d'archivage d'Apache pour le rendre plus facilement lisible par
MySQL en mettant ce qui suit dans le fichier de configuration d'Apache :
LogFormat \
        "\"%h\",%&#123;%Y%m%d%H%M%S&#125;t,%>s,\"%b\",\"%&#123;Content?Type&#125;o\",  \
        \"%U\",\"%&#123;Referer&#125;i\",\"%&#123;User?Agent&#125;i\""
Avec MySQL, vous pouvez exécuter une requête de la sorte :
LOAD DATA INFILE '/local/access_log' INTO TABLE table_name
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'
 3.7.2 Afficher une table avec l'état des paires de jumeaux
164

4 Administration du serveur
4.1 Configuration de MySQL
4.1.1 Options de ligne de commande de mysqld
Dans la plupart des cas, vous devrez modifier les options de mysqld dans le fichier d'options.
Fichier d'options  .
mysqld et mysqld.server lisent les options des groupes mysqld et server . mysqld_safe lit
les options des groupes mysqld , server , mysqld_safe et safe_mysqld . Un serveur MySQL
intégré lit généralement les options dans les groupes server , embedded et xxxxx_SERVER , où
xxxxx est le nom de l'application.
mysqld accepte les options de ligne de commande suivantes :
??ansi
ANSI .
?b, ??basedir=path
Chemin jusqu'au dossier d'installation. Tous les chemins sont généralement relatifs à
celui?ci.
??big?tables
Autorise la sauvegarde de grands résultats dans des fichiers temporaires. Cela
résout le problème des erreurs 'table full', mais ralentit les requêtes alors que des
tables en mémoire suffirait. Depuis la version version 3.23.2, MySQL est capable de
résoudre automatiquement ce problème en utilisant de la mémoire pour toutes les
tables temporaires de petite taille, et en passant sur le disque au besoin.
??bind?address=IP
L'adresse IP à utiliser.
??character?sets?dir=path
données et le stockage .
??chroot=path
Met le démon mysqld en environnement chroot au démarrage. Recommandé pour
la sécurité. Cela limite les commandes LOAD DATA INFILE et SELECT ... INTO
OUTFILE .
??core?file
Ecrire le fichier core lorsque mysqld s'arrête inopinéement. Pour certains fichiers,
vous devez aussi spécifier ??core?file?size à safe_mysqldn'aurez pas de fichier de core si vous avez aussi utilisé l'option ??user .
?h, ??datadir=path
Chemin jusqu'au dossier des bases.
??debug[...]=
Si MySQL est configuré avec ??with?debug , vous pouvez utiliser cette option pour
obtenir un fichier de trace de ce que mysqld fait. Créer des fichiers de traçage .
??default?character?set=charset
données et le stockage .
??default?table?type=type
 4 Administration du serveur
165

Manuel MySQL 4.1.x ? Version Française
Spécifie le type de table par défaut. Types de tables MySQL .
??delay?key?write[= OFF | ON | ALL]
Comment l'option des tables MyISAM DELAYED KEYSparamètres du serveur .
??delay?key?write?for?all?tables; En MySQL 4.0.3 vous devez utiliser
??delay?key?write=ALL à la place.

Ne vide pas les buffers de clés entre deux écritures pour les tables MyISAMdes paramètres du serveur .
??des?key?file=filename
Lit les clés par défaut utilisées par DES_ENCRYPT() et DES_DECRYPT() dans ce
fichier.
??enable?external?locking (was ??enable?locking)
Active le verrouillage système. Notez que si vous utilisez cette option sur un système
pour qui lockd ne fonctionne pas (comme Linux), vous allez bloquer rapidement
mysqld avec les verrous.
??enable?named?pipe
Active le support des tunnels nommés (seulement sur NT/Win2000/XP).
?T, ??exit?info
Cette option est la combinaison d'options que vous pouvez utiliser pour le débogage
du serveur mysqld; Si vous ne savez pas ce que ca fait exactement, ne les utilisez
pas !
??flush
Ecrit toutes les données sur le disque après chaque requête SQL. Normalement,
MySQL fait des écritures sur le disque après chaque requête, et laisse le système
constamment .
??, ??help
Affiche l'aide courte et termine le programme.
??init?file=file
Lit les commandes SQL dans ce fichier au démarrage.
?L, ??language=...
Spécifie la langue utilisée pour les messages d'erreur du client. Le chemin complet
doit être utilisé. Messages d'erreurs non?anglophones .
?l, ??log[=file]
.
??log?isam[=file]
Enregistre toutes les modifications des tables ISAM/MyISAM dans ce fichier
(uniquement nécessaire pour déboguer ISAM/MyISAM).
??log?slow?queries[=file]
Enregistre toutes les requêtes qui ont pris plus de long_query_time secondes a
s'exécute, dans ce fichier. Le log des requêtes lentes .
??log?update[=file]
Enregistre les modifications dans le fichier file.# où # est un nombre unique si il
n'est pas précisé. Le log des mises à jour .
??log?long?format
Enregistre des informations supplémentaires dans le fichier d'historique. Si vous
utilisez l'option ??log?slow?queries , alors les requêtes que vous qui n'utilisent
pas les index sont enregistrées dans le log de requêtes longues.
??low?priority?updates
Les opérations de modifications de table ( INSERT / DELETE / UPDATE ) auront une
priorité inférieure aux sélections. Cela peut être aussi fait via l'attribut {INSERT |
REPLACE | UPDATE | DELETE} LOW_PRIORITY ... pour baisser la priorité
d'une requête, ou avec SET LOW_PRIORITY_UPDATES=1 pour changer la priorité
 4 Administration du serveur
166

Manuel MySQL 4.1.x ? Version Française
dans plus d'un thread. Problèmes avec le verrouillage de tables .
??memlock
Verrouille le processus mysqld en mémoire. Cela fonctionne si votre système
support la fonction mlockall() (comme Solaris). Ceci peut être utile si vous avez
des problèmes avec le système d'exploitation qui force mysqld a utiliser le swap sur
le disque.
??myisam?recover [=option[,option...]]]
Cette option est la combinaison de DEFAULT , BACKUP , FORCE et QUICK . Vous
pouvez aussi lui donner la valeur explicite de "" si vous voulez désactiver cette
option. Si cette option est utilisée, mysqld va vérifier si la table est marquée comme
corrompue à l'ouverture de chaque table (cette dernière option ne fonctionne que si
vous utilisez l'option ??skip?external?locking ). Si c'est le cas, mysqld va
essayer de vérifier la table. Si la table était corrompue, mysqld essaie alors de la
réparer.
L'option suivante va affecter la manière avec la quelle la réparation s'effectue.
Option
Description
DEFAULT Identique à ne pas donner d'option à ??myisam?recover .
Si la table a été modifiée durant la réparation, sauver une copie du
BACKUP
fichier  , sous le nom de
table_name? .
Exécute une réparation même si nous allons perdre une ou plusieurs
FORCE
lignes dans le fichier .MYD.
QUICK
Ne vérifie pas les lignes dans la table si il n'y a pas eu d'effacement.
Avant que la table ne soit automatiquement réparée, MySQL va ajouter une note
dans le fichier de log d'erreurs. Si vous voulez être capable de restaurer la plupart
des erreurs sans intervention de l'utilisateur, il vaut utiliser les options
BACKUP,FORCE . Cela va forcer la réparation de la table, même si quelques lignes
sont effacées, et conserve le vieux fichier de données comme sauvegarde, pour
examen ultérieur.
??pid?file=path
Le chemin jusqu'au fichier de pid utilisé par safe_mysqld .
?P, ??port=...
Numéro de port utilisé pour attendre les connexion TCP/IP.
?o, ??old?protocol
version 3.20 à la version 3.21 .
??one?thread
MySQL .
?O, ??set?variable var=option
Donne une valeur à une variable. ??help liste ces variables. Vous pouvez trouver
une description complète des variables dans la section sur la commande SHOW
VARIABLES de ce manuel. SHOW VARIABLES . La section de paramétrage inclut
des informations sur comment exploiter ces variables. Notez que ??set?variable
est obsolète depuis MySQL 4.0, utilisez simplement la syntaxe ??var=option .
Choix des paramètres du serveur .
En MySQL 4.0.2, il est possible de changer une variable directement avec la syntaxe
??variable?name=option et set?variable n'est plus nécessaire dans le
fichier de configuration.
 4 Administration du serveur
167

Manuel MySQL 4.1.x ? Version Française
Si vous voulez restreindre la valeur maximale que peut prendre une option via la
commande SET , vous pouvez définir une limite en utilisant l'option de ligne de
commande ??maximum?variable?name . Syntaxe de SET .
Notez que lorsque vous donnez une valeur à une variable, MySQL peut corriger
automatiquement votre valeur pour rester dans un intervalle donné, et ajuster un peu
la valeur pour qu'elle soit optimale.
??safe?mode
Ignore certains étapes d'optimisation.
??safe?show?database
Avec cette option, la commande SHOW DATABASES retourne uniquemnt les bases
pour lesquelles l'utilisateur a des droits. Depuis la version 4.0.2, cette option est
abandonnée, et ne fait plus rien (l'option est activée par défaut) car nous avons
désormais le droit de SHOW DATABASES . Syntaxe de GRANT et REVOKE .
??safe?user?create
Si cette option est activée, un utilisateur ne peut pas créer de nouveaux utilisateurs
avec la commande GRANT si l'utilisateur n'a pas les droits de INSERT dans la table
 ou dans aucune colonne de cette table.
??skip?bdb
Désactive l'utilisation des tables BDB. Cela va économiser de la mémoire et
accélérer le serveur un peu.
??skip?concurrent?insert
Désactive la possibilité de sélectionner et insérer en même temps dans les tables
MyISAM (cela n'est utile que si vous pensez que vous avez trouvé un bug dans cette
fonctionnalité).
??skip?delay?key?write; En MySQL 4.0.3, il est recommandé d'utiliser l'option
??delay?key?write=OFF à la place. Ignorez l'option DELAY_KEY_WRITE de toutes
les tables. Choix des paramètres du serveur .
??skip?grant?tables
Cette option force le serveur à ne pas utiliser le système de privilège du tout. Cela
donne à tous l' accès complet à toutes les bases de données ! Vous pouvez
demander à un serveur en exécution d'utiliser à nouveau les tables de droits en
exécutant la commande mysqladmin flush?privileges ou mysqladmin
reload ).
??skip?host?cache
Ne pas utiliser le cache de nom de domaine pour une résolution des IP plus rapide,
DNS .
??skip?innodb
Désactive l'utilisation des tables Innodb. Cela va économiser de la mémoire et
accélérer le serveur un peu.
??skip?external?locking (ancien ??skip?locking)
Ne pas utiliser le verrouillage du système. Pour utiliser les utilitaires isamchk ou
myisamchkNotez qu'en MySQL version 3.23 vous pouvez utiliser la commande REPAIR et
CHECK pour réparer ou vérifier des tables MyISAM tables.
??skip?name?resolve
Les noms d'hôtes ne sont pas résolus. Toutes les colonnes Host dans vos tables de
droits doivent être des IP numériques ou le mot localhostutilise les DNS .
??skip?networking
Ne pas attendre les connexions TCP/IP du tout. Toutes les interactions du serveur
mysqld seront faites avec les sockets Unix. Cette option est particulièrement
recommandée pour les systèmes qui utilisent des requêtes locales. Comment
 4 Administration du serveur
168

Manuel MySQL 4.1.x ? Version Française
MySQL utilise les DNS .
??skip?new
Ne pas utiliser les nouvelles routines qui sont possiblement erronées.
??skip?symlink
Ne pas effacer ou renommer les fichiers qui ont un lien symbolique dans le dossier
de données.
??skip?safemalloc
Si MySQL est configuré avec ??with?debug=full , tous les programmes
vérifieront la mémoire pour rechercher les écrasment de zone lors des allocations et
libérations de mémoire. Comme ce test est lent, vous pouvez l'éviter, si vous n'avez
pas besoin de tester la mémoire, en utilisant cette option.
??skip?show?database
Ne pas autoriser la commande SHOW DATABASES , a moins que l'utilisateur n'ait les
droits de SHOW DATABASES . Depuis la version 4.0.2, vous n'avez plus besoin de
cette option, car les droits pour ce faire sont distribués avec le droit de SHOW
DATABASES .
??skip?stack?trace
Ne pas écrire les piles de traces. Cette option est pratique lorsque vous utilisez
mysqld avec un débogueur. Sur certains systèmes, vous devez aussi utiliser cette
option pour obtenir un fichier de core. Déboguer un serveur MySQL .
??skip?thread?priority
Désactive la priorisation des threads pour améliorer la vitesse de réponse.
??socket=path
Le fichier de socket à utiliser pour les connexions locales, au lieu du fichier par
défaut  .
??sql?mode=option[,option[,option...]]
Cette option peut être la combinaison de : REAL_AS_FLOAT , PIPES_AS_CONCAT ,
ANSI_QUOTES , IGNORE_SPACE , SERIALIZE et ONLY_FULL_GROUP_BY . Ellep
peut aussi être vide ( "" ) si vous voulez remettre cette option à 0.En spécifiant
toutes les options ci?dessus, vous obtiendrez le même effet qu'avec l'option ??ansi.
Avec cette option, vous pouvez activer les modes SQL dont vous avez besoin.
Exécuter MySQL en mode ANSI .
??temp?pool
En utilisant cette option, vous allez réduire le jeu de noms qui sont utilisés lors de la
création de fichier temporaires, plutôt qu'un nom unique à chaque fois. Ceci est un
palliatif au noyau Linux qui crèe plusieurs fichiers nouveaux avec des noms
différents. Avec l'ancien comportement, Linux semble 'perdre de la mémoire', car ils
sont alloués au cache d'entrées du dossier au lieu de celui du disque.
??transaction?isolation= { READ?UNCOMMITTED | READ?COMMITTED |
REPEATABLE?READ | SERIALIZABLE }

Configure le niveau d'isolation des transactions. Syntaxe de SET TRANSACTION .
?t, ??tmpdir=path
Chemin vers les fichiers temporaires. Il peut s'avérer pratique si votre dossier par
défaut /tmp réside dans une partition qui est trop petite pour absorber les tables
temporaires.
?u, ??user= [user_name | userid]
Exécute le démon mysqld avec l'utilisateur user_name ou userid (numérique).
Cette option est obligatoire lorsque vous démarrez mysqld en tant que root.
?V, ??version
Affiche les informations de version.
?W, ??log?warnings (Was ??warnings)
Enregistre les alertes comme Aborted connection... dans le fichier .err .
Erreurs de communication / connexion annulée .
 4 Administration du serveur
169

Manuel MySQL 4.1.x ? Version Française
Il est possible de modifier la plupart des valeurs durant l'exécution, avec la commande SET
command. Syntaxe de SET .
4.1.2 Fichier d'options
MySQL peu, depuis la version 3.22, lire des options de démarrage par défaut pour le serveur en
ligne de commande, et, par le client, dans un fichier.
MySQL lit les options par défaut dans les fichiers suivants sous Unix :
Fichier
Objet
Options globales
Options spécifiques au serveur
defaults?extra?file
Le fichier spécifié par ??defaults?extra?file=#
Options spécifiques à l'utilisateur
DATADIR est le dossier de données de MySQL (typiquement /usr/local/mysql/data pour les
installation binaires ou /usr/local/var pour une installation source). Notez que c'est ce dossier
qui a été spécifié au moment de la configuration et non pas le dossier de l'option ??datadir
lorsque mysqld démarre ! ( ??datadir n'a aucun effet sur le serveur, car le serveur recherche les
données avant de traiter les options de ligne de commande).
MySQL lit les fichiers d'options suivants sous Windows :
Fichier
Contenu
windows?system?directory\
Options globales
C:\
Options globales
Notez que sous Windows, vous devez spécifier les chemins avec / plutôt que \ . Si vous utilisez \ ,
vous devez le spécifier deux fois, car \ est un caractère de protection pour MySQL.
MySQL essaie de lire les fichiers d'options dans l'ordre dans lequel ils sont présentés ci?dessus. Si
des options sont spécifiées plusieurs fois, la dernière occurrence utilisée prend la préséeance sur
les options spécifiées avant. Les options de ligne de commande ont la priorité sur les options
spécifiées dans les fichiers. Certaines options peuvent être spécifiées en utilisant des variables
d'environnement. Les options spécifiées en ligne de commande ou en fichier ont la priorité sur les
options qui le sont via une variable d'environnement. Variables d'environnement MySQL .
Les programmes suivants utilisent les fichiers d'options : mysql , mysqladmin , mysqld ,
mysqld_safe , mysql.server , mysqldump , mysqlimport , mysqlshow , mysqlcheck ,
myisamchk et myisampack .
Toute option longue qui doit être spécifiée en ligne de commande lorsque MySQL fonctionne, peut
être aussi configurée dans le fichier d'options ( sans les doubles tirets). Exécutez le programme
avec l'option ??help pour avoir une liste des options disponibles.
Un fichier d'options contient des lignes ayant la forme suivante :
#comment
Les lignes de commentaires commencent avec '#' ou ';' . Les lignes vides sont
ignorées.
[group]
 4.1.2 Fichier d'options
170

Manuel MySQL 4.1.x ? Version Française
group est le nom du programme ou du groupe pour lequel vous souhaitez
configurer des options. Après une ligne de groupe, toutes les option et
set?variable s'appliqueront au groupe nommé, jusqu'à la fin du fichier d'option ou
du démarrage d'un autre groupe.
option
Ceci est équivalent à ??option sur la ligne de commande.
option=value
Ceci est équivalent à ??option=value sur la ligne de commande.
set?variable = variable=value
Ceci est équivalent à ??set?variable variable=value sur la ligne de
commande. Cette syntaxe doit être utilisée pour spécifier la valeur d'une variable
mysqld . Notez que ??set?variable est obsolète depuis MySQL 4.0, utilisez
simplement ??variable=value comme tel.
Le groupe client vous permet de spécifier des options qui ne s'appliquent qu'aux clients MySQL
et non pas au serveur mysqld . C'est le groupe idéal pour spécifier des mots de passe de
connexion au serveur (mais assurez?vous que vous êtes le seul à accéder à ce fichier !!).
Notez que pour les options et les valeurs, tous les caractères blancs de début et de fins seront
automatiquement effacés. Vous pouvez utiliser les séquences d'échappement '\b' , '\t' , '\n' ,
'\r' , '\\' et '\s' dans votre chaîne à la place ( '\s' == espace).
Voici un exemple typique de fichier d'options globales :
[client]
port=3306
[mysqld]
port=3306
set?variable = key_buffer_size=16M
set?variable = max_allowed_packet=1M
[mysqldump]
quick
Voici un exemple typique de fichier d'options utilisateur :
[client]
# Le mot de passe suivant va être utilisé avec le serveur
password=mon_mot_de_passe
[mysql]
no?auto?rehash
set?variable = connect_timeout=2
[mysqlhotcopy]
interactive?timeout
Si vous avez une distribution source, vous trouverez des exemples de configuration dans les
fichiers nommés my? dans le dossier support?files . Si vous avez une distribution
binaire, regardez dans le dossier DIR/support?files , où DIR est le chemin de l'installation
MySQL (typiquement /usr/local/mysql ). Actuellement, il y a des exemples de configuration
pour des systèmes petits, moyens, grands et très grands. Vous pouvez copier l'un des fichiers
my? dans votre dossier utilisateur (renommez le fichier en  ) pour le tester.
Tous les clients MySQL qui supportent les fichiers d'options, acceptent les options suivantes :
Option
Description
 4.1.2 Fichier d'options
171

Manuel MySQL 4.1.x ? Version Française
??no?defaults
Ne lire aucun fichier d'options.
Affiche le nom du programme et toutes les options
??print?defaults
qui s'y trouvent.
Utilise uniquement le fichier de configuraiton
??defaults?file=full?path?to?default?file
donné.
Lit ce fichier de configuration après le fichier de
??defaults?extra?file=full?path?to?default?file configuration global, mais avant le fichier de
configuration utilisateur.
Notez ques les options ci?dessus doivent être en ligne de commande pour être utilisées !
??print?defaults peut quand même être utilisé directement après la commande
??defaults?xxx?file .
Note pour les développeurs : la gestion des fichiers d'options est implémentée simplement en
traitant toutes les options qui correspondent (c'est?à?dire, toutes les options appropriées du
groupe), avant les arguments de ligne de commande. Cela fonctionne bien pour les programmes
qui utilisent la dernière occurrence comme valeur d'option, si elle est spécifiée plusieurs fois. Si
vous avez un vieux programme qui traite les options multiples de cette façon mais ne lit pas les
fichiers d'options, vous n'avez besoin que de deux lignes pour qu'il accepte cette fonctionnalité.
Récupérez le code source de n'importe quel client MySQL standard pour voir comment le faire.
En scripts shell, vous pouvez utiliser la commande my_print_defaults pour analyser les fichiers
de configuration :
shell> my_print_defaults client mysql
??port=3306
??
??no?auto?rehash
La ligne ci?dessus affiche toutes les options pour les groupes 'client' et 'mysql'.
4.1.3 Installer plusieurs serveurs sur la même machine
Dans certains cas, vous aurez besoin de plusieurs démons mysqld sur la même machine. Vous
pouvez, par exemple, faire tourner une vieille version de MySQL pour la tester avec une nouvelle.
Vous pouvez aussi donner des accès différents à des utilisateurs de différents serveurs mysqld ,
qu'il gèrent eux?mêmes.
Une méthode pour avoir plusieurs serveurs différents sur la même machine est de le configurer
avec différents sockets et ports comme suit :
shell> MYSQL_UNIX_PORT=/tmp/mysqld?
shell> MYSQL_TCP_PORT=3307
shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
shell> scripts/mysql_install_db
shell> bin/safe_mysqld &
L'annexe sur les variables d'environnement inclut une liste des variables d'environnement que vous
pouvez utiliser pour paramétrer mysqldci?dessus est immédiate et peu propre pour ceux qui font des tests. Ce qui est bien avec cette
méthode, c'est que les connexions que vous réalisez avec le shell ci?dessus seront
automatiquement redirigées vers le serveur en fonctionnement.
 4.1.3 Installer plusieurs serveurs sur la même machine
172

Manuel MySQL 4.1.x ? Version Française
Si vous avez besoin d'une méthode plus permanente, il est recommandé de créer un fichier
d'options pour chaque serveur. Fichier d'options  . Dans votre script de démarrage du
serveur, vous pourriez spécifier tous les serveurs :
safe_mysqld ??defaults?file=path?to?option?file
Enfin, les options suivantes doivent être différentes pour chaque serveur :
port=#
• 
socket=path
• 
pid?file=path
• 
Les options suivantes doivent être différentes, si elles sont utilisées :
log=path
• 
log?bin=path
• 
log?update=path
• 
log?isam=path
• 
bdb?logdir=path
• 
Si vous voulez plus de performances, vous pouvez aussi configurer différemment les options
suivantes :
tmpdir=path
• 
bdb?tmpdir=path
• 
Options en ligne de commande de mysqld .
Si vous installez une version binaire de MySQL (fichiers .tar) et que vous les démarrez avec
./bin/safe_mysqld , alors dans la plupart des cas, la seule option que vous devez modifier est
la socket socket et le port port dans le script safe_mysqld .
Faire fonctionner plusieurs serveurs MySQL sur la même machine .
4.1.4 Faire fonctionner plusieurs serveurs MySQL sur la même machine
Il y a des situations où vous souhaiterez avoir plusieurs serveurs MySQL sur la même machine. Par
exemple, si vous voulez tester une nouvelle version du serveur avec votre configuration de
production sans perturber votre installation de production. Ou bien, vous êtes un fournisseur de
services Internet, et vous voulez fournir des installations distinctes pour des clients différents.
Si vous voulez exécuter plusieurs serveurs MySQL, le plus simple et de compiler les serveurs avec
différents ports TCP/IP et fichiers de sockets pour qu'ils ne soient pas tous à l'écoute du même port
ou de la même socket. mysqld_multi , un programme pour gérer plusieurs serveurs MySQL .
Supposons que votre serveur est configuré avec le numéro de port par défaut, et le numéro de
socket par défaut. Alors vous pouvez configurer le nouveau serveur avec la commande configure
suivante :
shell> ./configure  ??with?tcp?port=numero_port \
             ??with?unix?socket?path=nom_fichier \
             ??prefix=/usr/local/mysql?3.22.9
 4.1.4 Faire fonctionner plusieurs serveurs MySQL sur la même machine
173

Manuel MySQL 4.1.x ? Version Française
Ici, les options numero_port et nom_fichier doivent être différentes des valeurs par défaut, et
avec l'option ??prefix vous allez spécifier un autre dossier d'installation que celui qui est déjà
utilisé par la première installation.
Vous pouvez vérifier le nom de la socket qui est utilisée par un serveur MySQL avec cette
commande :
shell> mysqladmin ?h hostname ??port=numero_port variables
Notez que si vous spécifiez `` localhost '' comme nom d'hôte, mysqladmin va utiliser les
sockets Unix plutôt que TCP/IP.
Si vous avez un serveur MySQL qui utilise déjà le port, vous obtiendrez une liste des variables de
configuration les plus importantes de MySQL, y compris le nom de la socket.
Vous n'avez pas à recompiler un nouveau serveur MySQL juste pour le démarrer sous un autre port
et une autre socket. Vous pouvez changer le port et la socket utilisée au moment du démarrage,
avec safe_mysqld :
shell> /path/to/safe_mysqld ??socket=nom_fichier ??port=numero_port
mysqld_multi peut aussi prendre safe_mysqld (ou mysqld ) comme argument, et passer les
options depuis un fichier de configuration à safe_mysqld , et ainsi, à mysqld .Si vous exécutez
un nouveau serveur sur les mêmes données qu'un autre serveur, avec le log activé, vous devez
spécifier le nom du fichier de log à safe_mysqld avec l'option ??log , ??log?update , ou
??log?slow?queries . Sinon, les deux serveurs risquent d'écrire dans le même fichier de log.
Attention : normalement, vous ne devez pas avoir deux serveurs qui modifient en même temps les
données dans les mêmes bases. Si votre OS ne supporte pas le verrouillage sans échec, cela peut
vous mener à de déplaisantes surprises !
Si vous voulez utiliser un autre dossier de fichiers pour le second serveur, vous pouvez utiliser
l'option ??datadir=path de safe_mysqld .
Notez aussi que démarrer plusieurs serveurs MySQL ( mysqlds ) dans différentes machines, et les
laisser accéder aux même données via NFS est généralement une mauvaise idée ! Le problème
est que NFS va devenir un frein au niveau de la vitesse. Il n'est pas destiné à une telle utilisation. Et
de plus, vous devrez trouver une solution pour vous assurer que deux des mysqld n'interfèrent pas
entre eux. Actuellement, il n'y a pas de plate?forme qui soit 100% fiable pour le verrouillage de
fichiers (le démon lockd ), dans toutes les situations. Pourtant, il va y avoir un risque
supplémentaire avec NFS ; cela rendra le travail encore plus compliqué pour le démon lockd .
Alors, simplifiez?vous la vie, et oubliez cela. La solution efficace est d'avoir un ordinateur avec un
système d'exploitation, qui gère efficacement les threads et a plusieurs processeurs.
Lorque vous voulez vous connecter au serveur MySQL qui fonctionne avec un autre port que le port
qui est compilé par défaut dans votre client, vous pouvez utiliser l'une des méthodes suivantes :
Lancez le client avec l'option 
• 
??host 'hostname' ??port=numero_port pour vous
connecter en TCP/IP, ou [??host localhost] ??socket=nom_fichier pour vous
connecter via une socket Unix.
Dans vos programmes C ou Perl, vous pouvez indiquer le port ou la socket lors de la
• 
connexion au serveur MySQL.
Si vous utilisez le code Perl avec le module 
• 
DBD::mysql , vous pouvez lire les options des
fichiers d'options MySQL. Fichier d'options  .
$dsn = "DBI:mysql:test;mysql_read_default_group=client;
        "
 4.1.4 Faire fonctionner plusieurs serveurs MySQL sur la même machine
174

Manuel MySQL 4.1.x ? Version Française
$dbh = DBI?>connect($dsn, $user, $password);
Modifiez les variables d'environnement 
• 
MYSQL_UNIX_PORT et MYSQL_TCP_PORT pour
qu'elles pointent sur la socket Unix et le port TCP/IP voulu avant de démarrer vos clients. Si
vous utilisez une socket ou un port spécifique, il est recommandé de modifier ces variables
dans votre fichier .loginSpecifiez la socket et le port TCP/IP par défaut dans le fichier 
• 
 de votre dossier
personnel. Fichier d'options  .
4.2 Règles de sécurité et droits d'accès au serveur MySQL
MySQL est pourvu d'un système avancé mais non standard de droits. Cette section décrit son
fonctionnement.
4.2.1 Instructions générales de sécurité
Tous ceux qui utilisent MySQL avec un serveur connecté à l'internet doivent lire cette section, pour
éviter les erreurs de sécurité les plus courantes.
En parlant de sécurité, nous mettons l'accent sur la nécessité de protéger la totalité du serveur (et
non pas seulement le serveur MySQL), contre tous les types d'attaques possibles : cheval de troye,
virus, dénis de services, écoute électronique. Nous ne couvrirons pas la totalité des aspects et des
pannes ici.
MySQL utilise un système de sécurité basé sur les listes de contrôle d'accès (Access Control Lists;
ACLs) pour toutes les connexions, requêtes et autres opérations qu'un utilisateur peut tenter
d'exécuter. Il y a aussi le support des connexions chiffrées par mode SSL, entre le client et le
serveur. De nombreux concepts sont présentés ici, et ne sont pas spécifiques à MySQL. Les
mêmes concepts s'appliquent à de nombreuses applications.
Lorsque vous faîtes fonctionner MySQL, suivez ces règles le plus souvent possible :
Ne jamais donner à quiconque (hormis l'utilisateur mysql root) l'accès à la table 
• 
user
dans la base mysql ! Cette table est primordiale. Le mot de passe chiffré stocké dans la
table est le véritable mot de passe MySQL
 . Quiconque connaît le mot de passe stocké
dans la table user et a accès à la liste des hôtes d'un compte peut facilement se
connecter avec cet utilisateur
 .
Connaissez à fond le système de droits de MySQL. Les commandes 
• 
GRANT et REVOKE sont
utilisées pour contrôler les accès à MySQL. Ne donnez pas plus de droits que nécessaire.
Ne donnez jamais des droits à tous les hôtes. Liste de points à vérifier :
Essayez 

mysql ?u root . Si vous êtes capable de vous connecter avec succès au
serveur sans qu'un mot de passe n'ai été demandé, vous avez un problème. Toute
personne peut se connecter au serveur MySQL en tant qu'utilisateur root avec tous
les droits ! Passez en revue votre installation MySQL, en faisant attention aux mots
de passe root .
Utilisez la commande 

SHOW GRANTS et vérifiez qui a accès à quoi. Supprimez les
droits qui ne sont pas nécessaires avec la commande REVOKE .
Ne gardez par de mot de passe en clair dans vos tables. Lorsque votre ordinateur est
• 
infiltré, l'intrus pourra alors obtenir la liste complète des mots de passe, et les utiliser. Au lieu
de cela, utilisez les fonctions MD5() , SHA1() ou une autre fonction de hash.
Ne choisissez pas vos mots de passe dans un dictionnaire. Il y a des programmes spéciaux
• 
qui sont capable de les casser. Même des mots de passe comme ``xfish98'' sont très
faibles. Bien meilleur est ``duag98'' qui contient aussi le mot ``fish'' mais tapé avec une
 4.2 Règles de sécurité et droits d'accès au serveur MySQL
175

Manuel MySQL 4.1.x ? Version Française
touche à gauche sur le clavier standard QWERTY. Une autre méthode est d'utiliser
``Pfspeb'' qui est un mot créé à partir des premières lettres de la phrase ``Papa fume sa
pipe en bois''. C'est un mot de passe facile à retenir, difficile à deviner pour une personne
qui ne le connaît pas.
Investissez dans un pare?feu. Cela vous protège de presque 50 % de tous les types de
• 
trous de sécurité des logiciels. Placez MySQL derrière un pare?feu, ou dans une zone
démilitarisée (DMZ).Liste de points à vérifier :
Essayez de scanner vos ports depuis Internet, en utilisant des outils comme 

nmap .
MySQL utilise le port 3306 par défaut. Ce port doit être inaccessible depuis des
hôtes indus. Un autre moyen simple de tester si votre port MySQL est accessible ou
pas, est d'essayer la commande suivante depuis une machine distante, où
server_host est l'hôte de votre serveur MySQL :
shell> telnet server_host 3306
Si vous obtenez une connexion et des caractères étranges, c'est que le port est
ouvert, et qu'il devrait être fermé par votre routeur ou votre pare?feu, à moins que
vous n'ayez une bonne raison de le garder ouvert. Si telnet attend ou que la
connexion est refusée, c'est que tout est bon : le port est bloqué.
Ne faites jamais aucune confiance aux données des utilisateurs. Ils peuvent essayer de
• 
nombreux trucs pour vous envoyer du code spécial ou faire passer des séquences de
caractères protégés via des formulaires web, ou n'importe quel outil que votre application
utilise. Soyez certain que votre application reste sécurisée même si un utilisateur obtient du
code comme `` ; DROP DATABASE mysql; ''. Ceci est un exemple extrême, mais de
grosse fuites de données ou des pertes peuvent survenir si un pirate utilise des techniques
similaires, et que vous n'êtes pas préparé pour.
Vérifiez aussi toutes les données numériques. Une erreur commune est de protéger
uniquement les chaînes. Certains pensent que si une base contient des données publiques,
elle ne doit pas être protégée. C'est totalement faux. Au minimum, un attaque en dénis de
service peut être pratiquée sur ces bases. Le plus simple moyen pour vous protéger contre
ce type d'attaque est d'utiliser des apostrophes autour des constantes numériques : SELECT
* FROM table WHERE ID='234' plutôt que SELECT * FROM table WHERE ID=234 .
MySQL convertit automatiquement la chaîne en nombre et supprime tous les caractères non
numériques avant insertion.
Point à vérifier :
Toutes les applications web :

Essayez d'entrer des guillemets 

''' et '"' dans tous vos formulaires web.
Si vous obtenez une erreur MySQL, alors étudiez le problème
immédiatement.
Essayez de modifier toute URL dynamique en ajoutant les codes 

%22 ( '"' ),
%23 ( '#' ) et %27 ( ''' ) dedans.
Essayez de modifier les types de données des URL dynamiques, de

numérique en chaîne, grâce aux exemples ci?dessus. Votre application doit
être sécurisée contre ce type d'attaques.
Essayez d'entrer des caractères comme des espaces ou des symboles

spéciaux au lieu des nombres, dans les champs numériques. Votre
application doit les supprimer avant de le passer à MySQL, ou votre
application doit générer une erreur. Passer des valeurs non vérifiées à
MySQL est très dangereux.
Vérifiez la taille des données avant de les passer à MySQL.

Donnez un autre nom d'utilisateur et un autre mot de passe à votre

application que votre nom d'utilisateur d'administration. Ne donnez pas à
votre application plus de droits que nécessaire.
 4.2 Règles de sécurité et droits d'accès au serveur MySQL
176

Manuel MySQL 4.1.x ? Version Française
Utilisateurs de PHP :

Etudiez la fonction 

addslashes() . Depuis PHP 4.0.3, la fonction
mysql_escape_string() est disponible avec la même fonctionnalité que
son alter ego en API MySQL C.
Utilisateurs de l'API MySQL C :

Vérifiez les appels à 

mysql_real_escape_string() .
Utilisateurs de MySQL++ :

Vérifiez les options 

escape et quote des requêtes.
Utilisateurs Perl DBI :

Vérifiez la méthode 

quote() ou utilisez des variables liées.
Utilisateurs de Java JDBC :

Utilisez l'objet 

PreparedStatement et les variables liées.
Ne transmettez aucunes données non chiffrées via Internet. Ces données peuvent être
• 
accessibles à quiconque a le temps et la capacité d'intercepter des données et de les utiliser
pour son propre usage. Au lieu de cela, utilisez un protocole chiffré tel que SSL ou SSH.
MySQL supporte les connexions SSL en interne, depuis la version 4.0.0. Le forward de port
de SSH peut être utilisé pour créer un tunnel chiffré et compressé pour les communications.
Apprenez à utiliser les utilitaires 
• 
tcpdump et strings . Pour la plupart des cas, vous
pouvez vérifier si les flux de données MySQL sont chiffrés en utilisant une commande telle
que celle ci :
shell> tcpdump ?l ?i eth0 ?w ? src or dst port 3306 | strings
(Cela fonctionne sous Linux et devrait aussi fonctionner sous les autres systèmes avec de
légères adaptations). Attention : si vous ne voyez pas de données, cela ne signifie pas que
vous avez des données chiffrées. Si vous avez besoin de forte sécurité, vous devriez
consulter un expert de la sécurité.
4.2.2 Comment protéger MySQL contre les pirates
Lorsque vous vous connectez à MySQL, vous devriez avoir besoin d'un mot de passe. Ce mot de
passe n'est pas transmis en texte clair sur le réseau, mais comme l'algorithme de chiffrement n'est
pas très fort, quelques efforts permettront à un pirate d'obtenir votre mot de passe s'il est capable
de surveiller le trafic entre le client et le serveur. Si la connexion entre le client et le serveur utilise
des réseaux non fiables, il est alors recommandé d'utiliser un tunnel SSH.Toutes les autres
informations sont transférées comme du texte clair, et quiconque surveille la connexion pourra les
lire. Si vous souhaitez relever ce niveau de sécurité, il est recommandé d'utiliser le protocole
compressé (avec les versions de MySQL 3.22 et plus récentes), pour compliquer considérablement
le problème. Pour rendre la communication encore plus sûre, vous pouvez aussi utiliser ssh . Vous
trouverez une version Open Source du client sshversion commerciale du client sshmettre en place une connexion TCP/IP chiffrée entre le serveur et le client vous utilisez
sécurisées .
Pour rendre le système MySQL encore plus sûr, nous vous recommandons de suivre les
suggestions suivantes :
Utilisez des mots de passe pour tous les utilisateurs MySQL. N'oubliez pas que tout le
• 
monde peut se connecter avec un nom d'utilisateur quelconque, simplement avec l'option
mysql ?u autre_utilisateur nom_de_base , si autre_utilisateur n'a pas de
mot de passe. C'est un comportement classique pour les applications client/serveur que le
client spécifie son nom d'utilisateur. Vous pouvez modifier les mots de passe de tous les
utilisateurs en modifiant le script mysql_install_db avant de l'exécuter, ou vous pouvez
modifier seulement le mot de passe du root MySQL comme ceci :
 4.2.2 Comment protéger MySQL contre les pirates
177

Manuel MySQL 4.1.x ? Version Française
shell> mysql ?u root mysql
mysql> UPDATE user SET Password=PASSWORD('nouveau_mot_de_passe')
    ?>             WHERE user='root';
mysql> FLUSH PRIVILEGES;
N'exécutez jamais le démon MySQL avec l'utilisateur Unix 
• 
root . C'est très dangeureux, car
tout personne ayant le droit de FILE pour créer des fichiers au nom du root (par exemple,
~root/.bashrc ). Pour éviter cela, mysqld refusera de s'exécuter au nom de root à
moins que soit précisé l'option ??user=root . mysqld peut être exécuté avec un
utilisateur ordinaire sans droits particuliers. Vous pouvez aussi créer un utilisateur Unix
mysql pour rendre cela encore plus sûr. Si vous exécutez mysqld sous un autre utilisateur
Unix, vous n'avez pas à changer le mot de passe root dans la table user , car les noms
d'utilisateurs MySQL n'ont rien à voir avec les noms d'utilisateurs Unix. Pour démarrer
mysqld sous un autre nom d'utilisateur Unix, ajoutez la ligne user , qui spécifie le nom de
l'utilisateur, dans le fichier d'options de [mysqld]  ou dans le fichier 
présent dans le dossier de données du serveur. Par exemple :
[mysqld]
user=mysql
Cette ligne va forcer le serveur à démarrer en tant qu'utilisateur mysql , même si vous
démarrez le serveur manuellement ou avec les scripts safe_mysqld , ou mysql.server .
N'acceptez pas les liens symboliques pour les tables (cette fonctionnalité peut être
• 
désactivée avec l'option ??skip?symlink option). Il est généralement important si vous
exécutez mysqld en tant que root, car tout le monde aurait accès en écriture au dossier de
Vérifiez que l'utilisateur Unix qui exécute 
• 
mysqld est le seul utilisateur avec les droits de
lecture et écriture dans le dossier de base de données.
Ne donnez pas le droit de 
• 
PROCESS à tous les utilisateurs. La liste fournie par mysqladmin
processlist affiche le texte des requêtes actuellement exécutées, ce qui permet à toute
personne pouvant exécuter cette commande de lire des valeurs qui seraient en clair, comme
: UPDATE user SET password=PASSWORD('not_secure') .
mysqld réserve une connexion supplémentaire pour les utilisateurs qui ont le droit de
PROCESS , afin que le root MySQL puisse toujours se connecter et vérifier que tout
fonctionne bien, même s'il ne reste plus de connexions libres pour les autres utilisateurs.
Ne donnez pas le droit de 
• 
FILE à tous les utilisateurs. Tout utilisateur qui possède ce droit
peut écrire un fichier n'importe où sur le serveur, avec les droits hérités du démon mysqld !
Pour rendre cela plus sécuritaire, tous les fichiers générés par SELECT ... INTO
OUTFILE sont lisibles par tous, mais personne ne peut les modifier.
Le droit de FILE peut aussi être utilisé pour lire n'importe quel fichier accessible en lecture
au démon qui fait tourner MySQL. Il devient donc possible, suivant les configurations,
d'utiliser la commande LOAD DATA sur le fichier /etc/passwd pour tout mettre en table, et
ensuite le relire avec la commande SELECT .
Si vous ne faites pas confiance à votre DNS, vos pouvez simplement utiliser des adresses
• 
IP au lieu des noms d'hôtes. Dans ce cas, soyez très prudents lors de la création de droits
qui utilisent des caractères joker.
Si vous voulez restreindre le nombre de connexions d'un utilisateur, vous pouvez le faire en
• 
utilisant la variable max_user_connections de mysqld .
4.2.3 Options de démarrage qui concernent la sécurité
Les options suivantes de mysqld affectent la sécurité :
 4.2.3 Options de démarrage qui concernent la sécurité
178

Manuel MySQL 4.1.x ? Version Française
??local?infile[=(0|1)]
If one uses ??local?infile=0 then one can't use LOAD DATA LOCAL INFILE .
??safe?show?database
Avec cette option, la commande SHOW DATABASES ne retourne que les bases pour
lesquelles l'utilisateur courant a des droits. Depuis la verison 4.0.2, cette option est
abandonnée, et ne sert plus à rien (elle est activée par défaut), car désormais, il y a
le droit de SHOW DATABASES . Syntaxe de GRANT et REVOKE .
??safe?user?create
Si cette option est activée, tout utilisateur ne peut créer d'autres utilisateurs avec les
droits de GRANT , s'il ne dispose pas des droits d'insertion dans la table
 . Si vous voulez donner un accès à un utilisateur pour qu'il puisse
créer des utilisateurs avec les droits dont il dispose, vous pouvez lui donner les droits
suivants :
mysql> GRANT INSERT(user) ON TO 'user'&#64;'hostname';
Cela va s'assurer que l'utilisateur ne peut par modifier une colonne directement, mais
qu'il peut exécuter la commande GRANT sur d'autres utilisateurs.
??skip?grant?tables
Cette option force le serveur à ne pas utiliser les tables de droits. Cette option donne
donc tous les droits à tout le monde sur le serveur ! Vous pouvez forcer un serveur
en fonctionnement à reprendre les tables de droits en exécutant la commande
mysqladmin flush?privileges ou mysqladmin reload .)
??skip?name?resolve
Les noms d'hôtes ne sont pas résolus. Toutes les valeurs de la colonne Host dans
les tables de droits doivent être des adresses IP, ou bien localhost .
??skip?networking
Ne pas accepter les connexions TCP/IP venant du réseau. Toutes les connexions au
serveur mysqld doivent être faîtes avec les sockets Unix. Cette option n'existe pas
pour les versions antérieures à la 3.23.27, avec les MIT?pthread, car les sockets
Unix n'étaient pas supportés par les MIT?pthreads à cette époque.
??skip?show?database
Ne pas autoriser la commande SHOW DATABASES , à moins que l'utilisateur n'ait les
droits de SHOW DATABASES . Depuis la version 4.0.2, vous n'avez plus besoin de
cette option, car les accès sont désormais donnés spécifiquement avec le droit SHOW
DATABASES .
4.2.4 Problèmes de sécurité avec LOAD DATA LOCAL
Depuis MySQL 3.23.49 et MySQL 4.0.2, nous avons ajouté de nouvelles options pour traiter les
problèmes de sécurité liés à LOAD DATA LOCAL .
Il existe deux problèmes particuliers pour le support de cette commande :
Comme la lecture du fichier est réalisée depuis le serveur, il est possible théoriquement de créer un
serveur MySQL patché qui pourrait lire n'importe quel fichier sur la machine cliente, qui serait
accessible à l'utilisateur.
Dans un environnement web, où les clients se connectent depuis un serveur web, un utilisateur
peut se servir de la commande LOAD DATA LOCAL pour lire les fichiers qui sont sur le serveur
web, et auquel ce dernier a accès (en supposant qu'un utilisateur peut exécuter n'importe quelle
commande sur le serveur).
Il y a deux protections distinctes pour ces problèmes :
 4.2.4 Problèmes de sécurité avec LOAD DATA LOCAL
179

Manuel MySQL 4.1.x ? Version Française
Si vous ne configurez pas MySQL avec l'option ??enable?local?infile , alors LOAD DATA
LOCAL sera désactivé par tous les clients, à moins que l'option mysql_options(...
MYSQL_OPT_LOCAL_INFILE, 0) soit activée dans le client. mysql_options() .
Pour le client en ligne de commande mysql , LOAD DATA LOCAL peut être activé en spécifiant
l'option ??local?infile[=1] , ou désactivé avec ??local?infile=0 .
Par défaut, tous les clients MySQL et les librairies sont compilés avec ??enable?local?infile ,
pour être compatible avec MySQL 3.23.48 plus ancien.
Vous pouvez désactiver toutes les commandes LOAD DATA LOCAL du serveur MySQL en
démarrant mysqld avec ??local?infile=0 .
Au cas où LOAD DATA LOCAL INFILE est désactivé sur le serveur ou le client, vous obtiendrez le
message d'erreur (1148) :
The used command is not allowed with this MySQL version
4.2.5 Rôle du système de privilèges
La fonction première du système de privilèges de MySQL est d'authentifier les utilisateurs se
connectant à partir d'un hôte donné, et de leur associer des privilèges sur une base de données
comme SELECT , INSERT , UPDATE et DELETE .
Les fonctionnalités additionnelles permettent d'avoir un utilisateur anonyme et de contrôler les
privilèges pour les fonctions spécifiques à MySQL comme LOAD DATA INFILE et les opérations
administratives.
4.2.6 Comment fonctionne le système de droits
Le système de droits de MySQL s'assure que les utilisateurs font exactement ce qu'ils sont
supposés pouvoir faire dans la base. Lorsque vous vous connectez au serveur, vous identité est
déterminée par l'hôte d'où vous vous connectez et le nom d'utilisateur que vous spécifiez . Le
système donne les droits en fonction de votre identité et de ce que vous voulez faire .
MySQL considère votre nom d'hôte et d'utilisateur pour vous identifier, car il n'y pas que peu de
raisons de supposer que le même nom d'utilisateur appartient à la même personne, quelque soit
son point de connexion sur Internet. Par exemple, l'utilisateur joe qui se connecte depuis
 n'est pas forcément la même personne que joe qui se connecte depuis
 . MySQL gère cela en vous aidant à distinguer les différents utilisateurs et hôtes
qui ont le même nom : vous pourriez donner des droits à joe lorsqu'il utilise sa connexion depuis
 , et un autre jeu de droits lorsqu'il se connecte depuis  .
Le contrôle d'accès de MySQL se fait en deux étapes :
Etape 1 : Le serveur vérifie que vous êtes autorisé à vous connecter.
• 
Etape 2 : En supposant que vous pouvez vous connecter, le serveur vérifie chaque requête
• 
que vous soumettez, pour vérifier si vous avez les droits suffisants pour l'exécuter. Par
exemple, si vous sélectionnez des droits dans une table, ou effacez une table, le serveur
s'assure que vous avez les droits de SELECT pour cette table, ou les droits de DROP ,
respectivement.
 4.2.5 Rôle du système de privilèges
180

Manuel MySQL 4.1.x ? Version Française
Le serveur utilise les tables user , db et host dans la base mysql durant les deux étapes. Les
champs de cette table sont les suivants :
Nom de la table
user
db
host
Identifiant
Host
Host
Host
User
Db
Db
Password
User
Champs de droits
Select_priv
Select_priv
Select_priv
Insert_priv
Insert_priv
Insert_priv
Update_priv
Update_priv
Update_priv
Delete_priv
Delete_priv
Delete_priv
Index_priv
Index_priv
Index_priv
Alter_priv
Alter_priv
Alter_priv
Create_priv
Create_priv
Create_priv
Drop_priv
Drop_priv
Drop_priv
Grant_priv
Grant_priv
Grant_priv
References_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv
Lors de la seconde étape du contrôle d'accès (vérification de la requête), le serveur peut, suivant la
requête, consulter aussi les tables tables_priv et columns_priv . Les champs de ces tables
sont :
Nom de la table
tables_priv
columns_priv
Identifiant
Host
Host
Db
Db
User
User
Table_name
Table_name
Column_name
Champs de droits
Table_priv
Column_priv
Column_priv
Autre champs
Timestamp
Timestamp
Grantor
Chaque table de droit contient des champs d'identification et des champs de droits.
Les champs d'identification déterminent quels utilisateurs correspondent à cette ligne dans la table.
Par exemple, une ligne dans la table user avec les valeurs dans les colonnes Host et User de
'' et 'bob' servira à identifier les connexions qui sont faites par l'utilisateur bob
depuis l'hôte  . De même, une ligne dans la table db avec les valeurs des
colonnes Host , User et Db de '' , 'bob' et 'reports' sera utilisée lorsque
l'utilisateur bob se connecte depuis l'hôte  pour accéder à la base reports .
Les tables tables_priv et columns_priv contiennent en plus des champs indiquant les tables
et combinaisons tables et colonnes auxquelles les lignes s'appliquent.
Pour les contrôles d'accès, les comparaisons de nom d'hôte avec la colonne Host sont insensibles
 4.2.5 Rôle du système de privilèges
181

Manuel MySQL 4.1.x ? Version Française
à la casse. Les colonnes User , Password , Db et Table_name sont sensibles à la casse. Les
valeurs de la colonne Column_name sont insensibles à la casse pour les versions de MySQL
3.22.12 et plus récent.
Les champs de droits indiquent si le droit est donné, c'est à dire si l'opération indiquée peut être
exécuté. Le serveur combine les informations dans différentes tables pour former une description
vérification des requêtes .
Les champs d'identification sont des chaînes, déclarées comme suit. La valeur par défaut de
chacun des champs est la chaîne vide.
Nom du champs Type
Notes
Host
CHAR(60)
User
CHAR(16)
Password
CHAR(16)
Db
CHAR(64)
( CHAR(60) pour les tables tables_priv et columns_priv )
Table_name
CHAR(60)
Column_name
CHAR(60)
Dans les tables user , db et host , tous les champs de droits sont déclarés avec le type
ENUM('N','Y') : il peuvent prendre tous les valeurs de 'N' (non) ou 'Y' (oui, YES), et la valeur
par défaut est 'N' .
Dans les tables tables_priv et columns_priv , les champs de droits sont déclarés comme des
champs de type SET :
Nom du
Nom de la table
Valeurs possibles
champs
'Select', 'Insert', 'Update', 'Delete',
tables_priv
Table_priv
'Create', 'Drop', 'Grant', 'References',
'Index', 'Alter'
tables_priv
Column_priv
'Select', 'Insert', 'Update', 'References'
columns_priv Column_priv
'Select', 'Insert', 'Update', 'References'
En bref, le serveur utilise les tables de droits comme ceci :
La table 
• 
user détermine si le serveur accepte ou rejette la connexion. Pour les connexions
acceptées, tous les privilèges donnés dans la table user indiquent des privilèges globaux.
Ces droits d'appliquent à toutes les bases du serveur.
Les tables 
• 
db et host sont utilisées conjointement :
Les champs d'identification de la table 

db déterminent quels utilisateurs peuvent
accéder à quelles bases, depuis quel hôte. Les champs de droits indiquent alors les
opérations permises.
La table 

host est utilisée comme extension de la table db lorsque vous voulez
qu'une ligne de la table db s'applique à plusieurs hôtes. Par exemple, si vous voulez
qu'un utilisateur soit capable d'utiliser une base depuis plusieurs hôtes dans votre
réseau, laissez la colonne Host vide dans la table db , Ce mécanisme est décrit en
détails dans Contrôle d'accès, étape 2 : vérification des requêtes .
Les tables 
• 
tables_priv et columns_priv sont similaires à la table db , mais sont plus
atomiques : elle s'appliquent au niveau des tables et des colonnes, plutôt qu'au niveau des
bases.
 4.2.5 Rôle du système de privilèges
182

Manuel MySQL 4.1.x ? Version Française
Notez que les droits d'administration tels que ( RELOAD , SHUTDOWN , etc...) ne sont spécifiés que
dans la table user . En effet, ces opérations sont des opérations au niveau serveur, et ne sont pas
liées à une base de données, ce qui fait qu'il n'y a pas de raison de les lier avec les autres tables.
En fait user doit être consulté pour déterminer les autorisations d' droit de FILE
est spécifié par la table user . Ce n'est pas un droit d'administration, mais votre capacité à lire ou
écrire des fichiers sur le serveur hôte et dépendant de la base à laquelle vous accédez.
Le serveur mysqld lit le contenu des tables de droits une fois, au démarrage. Lorsqu'il y a des
privilèges prennent?ils effet ? .
Lorsque vous modifiez le contenu des tables de droits, c'est une bonne idée que de s'assurer que
vous avez bien configuré les droits qui vous intéressent. Pour vous aider dans votre diagnostique,
voyez Causes possibles de l'erreur Access denied . Pour des conseils sur les aspects sécurité,
voyez Comment protéger MySQL contre les pirates .
Un outil de diagnostique pratique est le script mysqlaccess , que Yves Carlier a fourni à la
distribution MySQL. Appelez mysqlaccess avec l'option the ??help pour comprendre comment il
fonctionne. Notez que mysqlaccess ne vérifie les accès que pour les tables user , db et host . Il
n'utilise pas les tables de droit de niveau table ou colonne.
4.2.7 Droits fournis par MySQL
Les droits des utilisateurs sont stockés dans les tables user , db , host , tables_priv et
columns_priv de la base mysql (c'est?à?dire, la base nommée mysql ). Le serveur MySQL lit
changements de privilèges prennent?ils effet ? .
Les noms utilisés dans ce manuel font référence aux droits fournis par MySQL version 4.0.2, tel que
présentés dans la table ci?dessous, avec le nom de la colonne associée au droit, dans la table de
droits, et dans le contexte d'application :
Droit
Colonne
Contexte
ALTER
Alter_priv
tables
DELETE
Delete_priv
tables
INDEX
Index_priv
tables
INSERT
Insert_priv
tables
SELECT
Select_priv
tables
UPDATE
Update_priv
tables
bases de données, tables
CREATE
Create_priv
ou index
bases de données ou
DROP
Drop_priv
tables
bases de données ou
GRANT
Grant_priv
tables
bases de données ou
REFERENCES
References_priv
tables
CREATE TEMPORARY TABLES
Create_tmp_table_priv
administration du serveur
EXECUTE
Execute_priv
administration du serveur
FILE
File_priv
accès aux fichiers du
 4.2.7 Droits fournis par MySQL
183

Manuel MySQL 4.1.x ? Version Française
serveur
LOCK TABLES
Lock_tables_priv
administration du serveur
PROCESS
Process_priv
administration du serveur
RELOAD
Reload_priv
administration du serveur
REPLICATION CLIENT
Repl_client_priv
administration du serveur
REPLICATION SLAVE
Repl_slave_priv
administration du serveur
SHOW DATABASES
Show_db_priv
administration du serveur
SHUTDOWN
Shutdown_priv
administration du serveur
SUPER
Super_priv
administration du serveur
Les droits de SELECT , INSERT , UPDATE et DELETE vous permettent de faire des opérations sur
les lignes qui existent, dans une table existante d'une base.
La commande SELECT requiert le droit de SELECT uniquement si des lignes sont lues dans une
une table. Vous pouvez exéctuer une commande SELECT même sans aucun droit d'accès à une
base de données dans le serveur. Par exemple, vous pourriez utiliser le client mysql comme une
simple calculatrice :
mysql> SELECT 1+1;
mysql> SELECT PI()*2;
Le droit de INDEX vous donne le droit de créer et détruire des index de droit de ALTER
vous donne le droit de modifier une table avec la commande ALTER TABLE .
Les droits de CREATE et DROP vous permettent de créer de nouvelles tables et bases de données,
et de les supprimer.
Notez que si vous donnez le droit de DROP pour la base de données mysql à un utilisateur, cet
utilisateur pourra détruire la base qui contient les droits d'accès du serveur !
Le droit de GRANT vous permet de donner les droits que vous possédez à d'autres utilisateurs.
Le droit de FILE vous donne la possibilité de lire et écrire des fichiers sur le serveur avec les
commandes LOAD DATA INFILE et SELECT ... INTO OUTFILE . Tout utilisateur qui possède
ce droit peut donc lire ou écrire dans n'importe quel fichier à l'intérieur duquel le serveur MySQL
peut lire ou écrire.
Les autres droits sont utilisés pour les opérations administratives qui sont exécutées par l'utilitaire
mysqladmin . La table ci?dessous montre quelle commande est associée à mysqladmin avec un
de ces droits :
Droit
Commande autorisée
reload , refresh , flush?privileges , flush?hosts , flush?logs
RELOAD
et flush?tables
SHUTDOWN
shutdown
PROCESS
processlist
SUPER
kill
La commande reload indique au serveur de relire les tables de droits. La commande refresh
vide les tables de la mémoire, écrit les données et ferme le fichier de log. flush?privileges est
un synonyme de reload . Les autres commandes flush?* effectuent des fonctions similaires à la
commande refresh mais sont plus limitées dans leur application, et sont préférables dans certains
contextes. Par exemple, si vous souhaitez simplement vider les tampons dans le fichier de log,
 4.2.7 Droits fournis par MySQL
184

Manuel MySQL 4.1.x ? Version Française
utilisez flush?logs , qui est un meilleur choix que refresh .
La commande shutdown éteint le serveur.
La commande processlist affiche les informations sur les threads qui s'exécutent sur le serveur.
La commande kill termine un des threads du serveur. Vous pouvez toujours afficher et terminer
vos propres threads, mais vous aurez besoin des droits de PROCESS pour afficher les threads, et le
droit de SUPER pour terminer ceux qui ont été démarrés par d'autres utilisateurs. Syntaxe de KILL .
C'est une bonne idée en général, de ne donner les droits de Grant qu'aux utilisateurs qui en ont
besoin, et vous devriez être particulièrement vigilant pour donner certains droits :
Le droit de 
• 
GRANT permet aux utilisateurs de donner leurs droits à d'autres utilisateurs. Deux
utilisateurs avec des droits différents et celui de GRANT pourront combiner leurs droits
respectifs pour gagner un autre niveau d'utilisation du serveur.
Le droit de 
• 
ALTER peut être utilisé pour tromper le système en renommant les tables.
Le droit de 
• 
FILE peut servir à lire des fichiers accessibles à tous sur le serveur, et les placer
dans une base de données. Le contenu pourra alors être lu et manipulé avec SELECT . Cela
inclus le contenu de toutes les bases actuellement hébergées sur le serveur !
Le droit de 
• 
SHUTDOWN peut conduire au dénis de service, en arrêtant le serveur.
Le droit de 
• 
PROCESS permet de voir en texte clair les commandes qui s'exécutent
actuellement, et notamment les changements de mot de passe.
Les droits sur la base de données 
• 
mysql peuvent être utilisés pour changer des mots de
passe ou des droits dans la table des droits (Les mots de passe sont stockés chiffrés, ce qui
évite que les intrus ne les lisent). S'ils accèdent à un mot de passe dans la table
 , ils pourront l'utiliser pour se connecter au serveur avec cet utilisateur (avec
des droits suffisants, le même utilisateur pourra alors remplacer un mot de passe par un
autre).
Il y a des choses qui ne sont pas possibles avec le système de droits de MySQL :
Vous ne pouvez pas explicitement interdire l'accès à un utilisateur spécifique. C'est à dire,
• 
vous ne pouvez pas explicitement décrire un utilisateur et lui refuser la connexion.
Vous ne pouvez pas spécifier qu'un utilisateur a les droits de créer et de supprimer des
• 
tables dans une base, mais qu'il n'a pas les droits pour créer et supprimer cette base.
4.2.8 Se connecter au serveur MySQL
Les clients MySQL requièrent généralement que vous spécifiez les paramètres de connexion pour
vous connecter au serveur MySQL : l'hôte que vous voulez utiliser, votre nom d'utilisateur et votre
mot de passe. Par exemple, le client mysql peut être démarré comme ceci (les arguments
optionnels sont entre crochets '[' et ']' ) :
shell> mysql [?h nom_d_hote] [?u nom_d_utilisateur] [?pvotre_mot_de_passe]
Les formes alternatives des options ?h , ?u , and ?p sont ??host=host_name ,
??user=user_name et ??password=your_pass . Notez qu'il n'y a aucun espace entre l'option
?p ou ??password= et le mot de passe qui le suit.
Note : spécifier un mot de passe en ligne de commande n'est pas sécuritaire ! Tout utilisateur de
votre serveur peut découvrir votre mot de passe en tapant la commande : ps auxwwd'options  .
 4.2.8 Se connecter au serveur MySQL
185

Manuel MySQL 4.1.x ? Version Française
mysql utilise des valeurs par défaut pour chacun des paramètes qui manquent en ligne de
commande :
Le nom d'hôte par défaut est 
• 
localhost .
Le nom d'utilisateur par défaut est votre nom d'utilisateur de système Unix.
• 
Aucun mot de passe n'est transmis si 
• 
?p manque.
Par exemple, pour un utilisateur Unix joe , les commandes suivantes sont équivalentes :
shell> mysql ?h localhost ?u joe
shell> mysql ?h localhost
shell> mysql ?u joe
shell> mysql
Les autres clients MySQL se comportent de manière similaire.
Sous Unix, vous pouvez spécifier différentes valeurs par défaut qui seront utilisées lorsque vous
établierez la connexion, de manière à ce que vous n'ayez pas à entrer ces informations en ligne de
commande lorsque vous invoquez un programme client. Cela peut se faire de plusieurs façons :
Vous pouvez spécifier les informations de connexion dans la section 
• 
[client] du fichier
de configuration  de votre dossier personnel. La section qui vous interesse
ressemble à ceci :
[client]
host=nom_d_hote
user=nom_d'utilisateur
password=votre_mot_de_passe
Fichier d'options  .
Vous pouvez spécifier les paramètres de connexion avec les variables d'environnement.
• 
L'hôte peut être spécifié à mysql avec la variable MYSQL_HOST . L'utilisateur MySQL peut
être spécifié avec la variable USER (uniquement pour Windows). Le mot de passe peut être
spécifié avec MYSQL_PWDd'environnement MySQL .
4.2.9 Contrôle d'accès, étape 1 : Vérification de la connexion
Lorsque vous tentez de vous connecter au serveur MySQL, le serveur accepte ou rejette la
connexion en fonction de votre identité et du mot de passe que vous fournissez. Si le mot de passe
ne correspond pas à celui qui est en base, le serveur vous interdit complètement l'accès. Sinon, le
serveur accepte votre connexion et passe à l'étape 2, et la gestion de commandes.
Votre identité est basée sur trois informations :
L'hôte depuis lequel vous vous connectez
• 
Votre nom d'utilisateur MySQL
• 
Votre mot de passe
• 
La vérification d'identité est réalisée avec les trois colonnes de la table user ( Host , User et
Password ). Le serveur accepte la connexion uniquement si une entrée dans la table user
correspond à votre hôte, et que vous fournissez le mot de passe qui valeurs de la
table user peuvent être paramétrées comme ceci :
Une valeur de la colonne 
• 
Host peut être un nom d'hôte, une adresse IP numérique, ou
encore 'localhost' , qui représente l'hôte local.
Vous pouvez utiliser les caractères jokers 
• 
'%' et '_' dans le champ Host .
 4.2.9 Contrôle d'accès, étape 1 : Vérification de la connexion
186

Manuel MySQL 4.1.x ? Version Française
Une valeur de 
• 
'%' dans la colonne Host remplace n'importe quelle autre valeur.
Une valeur vide pour la colonne 
• 
Host indique que les droits doivent être gérés avec les
entrées de la table host qui correspond à l'hôte se connectant. Vous trouverez plus
d'informations à ce sujet dans le prochain chapitre.
Depuis MySQL version 3.23, les valeurs de 
• 
Host spécifiées sous la forme d'IP numériques
peuvent être complétées avec le masque de réseau qui indique combien de bits d'adresse
sont utilisés. Par exemple :
mysql> GRANT ALL PRIVILEGES ON db.*
    ?> TO david&#64;'192.58.197.0/255.255.255.0';
Cela permet à toute personne se connectant depuis une adresse IP qui satisfait la contrainte
suivante :
user_ip & netmask = host_ip.
Dans l'exemple ci?dessus, toutes les IP dans l'intervalle 192.58.197.0 ? 192.58.197.255
pourront se connecter au serveur MySQL.
Les caractères joker ne sont pas autorisés dans le champ 
• 
User , mais vous pouvez
spécifier une valeur vide qui remplacera tous les noms. Si l'entrée de la table user , qui
correspond à une connexion entrante, a un nom d'utilisateur vide, l'utilisateur est alors
considéré comme anonyme (c'est l'utilisateur sans nom) et non pas le nom d'utilisateur
fourni. Cela signifie qu'un utilisateur fournissant un nom d'utilisateur vide sera utilisé pour
identifier ses droits dans les prochaines étapes.
Le champ 
• 
Password peut être vide. Cela ne signifie pas que n'importe quel mot de passe
est valable, mais que l'utilisateur peut se connecter sans fournir de mot de passe.
Les valeurs non vides du champ Password représentent des valeurs du mot de passe chiffrées.
MySQL ne stocke pas les mots de passe en clair, à la vue de tous. Au contraire, le mot de passe
fourni pas l'utilisateur qui tente de se connecter est chiffré (avec la fonction PASSWORD() ). Le mot
de passe ainsi chiffré est alors utilisé entre le client et le serveur pour vérifier s'il est valable. Cela
évite que des mots de passe en clair circulent entre le client et le serveur, sur la connexion. Notez
que du point de vue de MySQL, le mot de passe chiffré est le vrai mot de passe, ce qui fait que
vous ne devez en aucun cas le donner à un tiers. En particulier, ne donnez pas accès en lecture
aux utilisateurs normaux aux tables d'administration dans la base mysql !Les exemples ci?dessous
illustrent comment différentes variantes de Host et User dans la table user s'appliquent aux
connexion entrantes :
User
Host value
Connexions autorisées
value
''
'fred'
fred , se connectant depuis 
N'importe quel utilisateur, se connectant depuis
''
''
'%'
'fred'
fred , se connectant depuis n'importe quel hôte
N'importe quel utilisateur, se connectant depuis
'%'
''
n'importe quel hôte
fred , se connectant depuis n'importe quel hôte
''
'fred'
dans le domaine 
fred , se connectant depuis  ,
'x.y.%'
'fred'
 ,  , etc. (Ceci n'est
probablement pas très utilisé)
fred , se connectant depuis l'hôte d'IP
'144.155.166.177'
'fred'
144.155.166.177
fred , se connectant depuis un hôte d'IP dans
'144.155.166.%'
'fred'
la classe C 144.155.166
'144.155.166.0/255.255.255.0' 'fred'
Identique à l'exemple précédent
 4.2.9 Contrôle d'accès, étape 1 : Vérification de la connexion
187

Manuel MySQL 4.1.x ? Version Française
Comme vous pouvez utiliser des caractères jokers dans les adresses IP de la colonne Host (par
exemple, '144.155.166.%' pour identifier tout un sous?réseau), il est possible d'exploiter cette
fonctionnalité en nommant un hôte  . Pour contrer de telles
tentatives, MySQL interdit les caractères jokers avec les noms d'hôtes qui commencent par des
chiffres ou des points. Par exemple, si vous avez un nom d'hôte tel que  , il ne sera
jamais trouvé dans la colonne Host des tables de droits. Seule une adresse IP numérique peut être
comparée avec un masque à caractère joker.
Une connexion entrante peut être identifiée par plusieurs entrées dans la table user . Par exemple,
une connexion depuis  par fred sera identifiée de plusieurs façons différentes
dans l'exemple ci?dessus. Comment le serveur va?t?il choisir si il y a plusieurs solutions ? Le
serveur résoud cette question en triant les utilisateurs dans la colonne user après le démarrage, et
il recherchera dans cette liste triée lorsqu'un utilisateur tente de se connecter. La première ligne qui
satisfait les critères sera alors utilisée.
Le tri de la table user suit les règles suivantes. Supposons que votre table user ressemble à ceci :
+???????????+??????????+?
| Host      | User     | ...
+???????????+??????????+?
| %         | root     | ...
| %         | jeffrey  | ...
| localhost | root     | ...
| localhost |          | ...
+???????????+??????????+?
Lorsque le serveur lit cette table, il ordonne les lignes depuis les valeurs les plus spécialisées de la
colonne Host jusqu'aux plus générales ( '%' dans la colonne Host signifie ``tous les hôtes'' et elle
est la moins spécifique). Les entrées identiques dans la colonne Host sont ordonnées en fonction
de la spécificité des valeurs de la colonne User (une entrée vide dans la colonne User signifie
``n'importe quel utilisateur'' et est spécifique). Le résultat de ce tri donne quelque chose comme ceci
:
+???????????+??????????+?
| Host      | User     | ...
+???????????+??????????+?
| localhost | root     | ...
| localhost |          | ...
| %         | jeffrey  | ...
| %         | root     | ...
+???????????+??????????+?
Lorsqu'une connexion est en cours de mise en place, le serveur regarde dans cette liste, et utilisera
la première entrée trouvée. Pour une connexion depuis l'hôte localhost avec le nom d'utilisateur
jeffrey , les entrées 'localhost' dans la colonne Host sont trouvées en premier. Parmi
celles?la, la ligne avec un utilisateur vide satisfait les deux contraintes sur le nom et l'hôte.
'%'/'jeffrey' pourrait avoir fonctionné, mais comme ce n'est pas le premier rencontré, il n'est
pas utilisé.
Voici un autre exemple. Supposons que la table user ressemble à ceci :
+????????????????+??????????+?
| Host           | User     | ...
+????????????????+??????????+?
| %              | jeffrey  | ...
| |          | ...
+????????????????+??????????+?
La table triée ressemble à ceci :
+????????????????+??????????+?
 4.2.9 Contrôle d'accès, étape 1 : Vérification de la connexion
188

Manuel MySQL 4.1.x ? Version Française
| Host           | User     | ...
+????????????????+??????????+?
| |          | ...
| %              | jeffrey  | ...
+????????????????+??????????+?
Une connexion depuis l'hôte  avec jeffrey satisfait les conditions de la
première ligne, tandis qu'une connexion depuis  avec jeffrey satisfait la
seconde erreur commune est de penser que pour un utilisateur donné, toutes les entrées
qui utilisent explicitement ce nom seront utilisées en premier lorsque la connexion est en cours
d'établissement. Ceci est tout simplement faux. L'exemple précédent illustre cette situation, car la
connexion depuis l'hôte  avec jeffrey est la première ligne qui est trouvée,
alors que la ligne contenant 'jeffrey' dans la colonne User est ignorée, car il n'y a pas de nom
d' vous avez des problèmes lors de la connexion, listez le contenu de la table user et
triez?la à la main pour savoir quel est la première ligne qui est trouvée et utilisée.
4.2.10 Contrôle d'accès, étape 2 : Vérification de la requête
Une fois que vous avez établi la connexion, le serveur passe à l'étape 2. Pour chaque requête qui
est fournie avec la connexion, le serveur vérifie si vous avez les droits suffisants pour exécuter une
commande, en fonction du type de commande. C'est à ce moment que les colonnes de droits des
tables d'administration entrent en scène. Ces droits peuvent provenir de la table user , db , host ,
tables_priv ou columns_priv . Les tables d'administration sont manipulées avec les
commandes GRANT et REVOKE . Syntaxe de GRANT et REVOKE . (Vous pouvez aussi vous reporter
table d'administration).
La table d'administration user donne les droits aux utilisateurs au niveau global, c'est à dire que
ces droits s'appliquent quelle que soit la base de données courante. Par exemple, si la table user
vous donne le droit d'effacement , DELETE , vous pouvez effacer des données dans n'importe
quelle base de ce serveur. En d'autres termes, les droits stockés dans la table user sont des droits
de super utilisateur. Il est recommandé de ne donner des droits via la table user uniquement aux
super utilisateurs, ou aux administrateurs de bases. Pour les autres utilisateurs, il vaut mieux laisser
les droits dans la table user à 'N' et donner des droits au niveau des bases uniquement, avec les
tables db et host .
Les tables db et host donnent des droits au niveau des bases. Les droits peuvent être spécifiés
dans ces tables comme ceci :
Les caractères 
• 
'%' et '_' peuvent être utilisés dans la colonne Host et Db des deux
tables. Si vous souhaitez utiliser le caractère '_' comme nom de base, utiliser la séquence
'\_' dans la commande GRANT .
La valeur 
• 
'%' dans la colonne Host de la table db signifie ``tous les hôtes''. Une valeur vide
dans la colonne Host de la table db signifie ``consulte la table host pour plus de détails''.
La valeur 
• 
'%' ou vide dans la colonne Host de la table host signifie ``tous les hôtes''.
La valeur 
• 
'%' ou vide dans la colonne Db des deux tables signifie ``toutes les bases de
données''.
Un utilisateur vide dans la colonne 
• 
User de l'une des deux tables identifie l'utilisateur
anonyme.
Les tables db et host sont lues et triées par le serveur au démarrage (en même temps que la table
user . La table db est triée suivant les valeurs des colonnes Host , Db et User , et la table host
est triée en fonction des valeurs des colonnes Host et Db . Comme pour la table user , le tri place
les entrées les plus spécifiques au début, et les plus générales à la fin. Lorsque le serveur
recherche une ligne, il utilise la première qu'il trouve. Les tables tables_priv et columns_priv
 4.2.10 Contrôle d'accès, étape 2 : Vérification de la requête
189

Manuel MySQL 4.1.x ? Version Française
spécifient les droits au niveau des tables et des colonnes. Les valeurs des droits dans ces tables
peuvent être spécifiés avec les caractères spéciaux suivants :
Les caractères 
• 
'%' et '_' peuvent être utilisés dans la colonne Host et Db des deux
tables.
La valeur 
• 
'%' dans la colonne Host des deux tables signifie ``tous les hôtes''.
Les colonnes 
• 
Db , Table_name et Column_name ne peuvent pas contenir de valeur vide
ou de caractères jokers, dans les deux tables.
Les tables tables_priv et columns_priv sont triées en fonction des colonnes Host , Db et
User . Ce tri est similaire à celui du tri de la table db , même si le tri est bien plus simple, car seul le
champ Host peut contenir des caractères processus de vérification est décrit ci?dessous.
Si vous êtes familier avec le code source de contrôle d'accès, vous noterez que la description
diffère légèrement de l'algorithme utilisé. La description est équivalente à ce que fait en réalité le
code. La différence permet une meilleure approche pédagogique.
Pour les requêtes d'administration comme SHUTDOWN , RELOAD , etc., le serveur vérifie uniquement
l'entrée dans la table user , car c'est la seule table qui spécifie des droits d'administration. Le droit
est donné si la ligne utilisée dans la connexion courante dans la table user donne le droit, et sinon,
ce droit est interdit. Par exemple, si vous souhaitez exécuter la commande mysqladmin
shutdown mais que votre ligne dans la table user ne vous en donne pas le droit ( SHUTDOWN ),
vous n'aurez pas le droit sans même vérifier les tables db ou host : ces tables ne contiennent pas
de colonne Shutdown_priv , ce qui évite qu'on en ait besoin.
Pour les requêtes exploitant une base de données, comme INSERT , UPDATE , etc., le serveur
vérifie d'abord les droits globaux de l'utilisateur (droits de super utilisateur), en regardant dans la
table user . Si la ligne utilisée dans cette table donne droit à cette opération, le droit est donné. Si
les droits globaux dans user sont insuffisants, le serveur déterminera les droits spécifiques à la
base avec les tables db et host :
Le serveur recherche dans la table 
• 
db des informations en se basant sur les colonnes Host
, Db et User . Les champs Host et User sont comparés avec les valeurs de l'hôte et de
l'utilisateur qui sont connectés. Le champ Db est comparé avec le nom de la base de
données que l'utilisateur souhaite utiliser. S'il n'existe pas de ligne qui corresponde à Host
et User , l'accès est interdit.
S'il existe une ligne dans la table 
• 
db et que la valeur de la colonne Host n'est pas vide,
cette ligne définit les droits de l'utilisateur.
Si dans la ligne de la table 
• 
db , la colonne Host est vide, cela signifie que la table host
spécifie quels hôtes doivent être autorisés dans la base. Dans ce cas, une autre recherche
est faite dans la table host pour trouver une ligne avec les colonnes Host et Db . Si aucune
ligne de la table host n'est trouvée, l'accès est interdit. S'il y a une ligne, les droits de
l'utilisateur sont calculés comme l'intersection ( NON PAS l'union !) des droits dans les
tables db et host , c'est?à?dire que les droits doivent être marqués 'Y' dans les deux
tables (de cette façon, vous pouvez donner des droits généraux dans la table db puis les
restreindre sélectivement en fonction des hôtes, en utilisant la table host .
Après avoir déterminé les droits spécifiques à l'utilisateur pour une base grâce aux tables db et
host , le serveur les ajoute aux droits globaux, donnés par la table user . Si le résultat autorise la
commande demandée, l'accès est donné. Sinon, le serveur vérifie les droits au niveau de la table et
de la colonne dans les tables tables_priv et columns_priv , et les ajoute aux droits déjà
acquis. Les droits sont alors donnés ou révoqués en fonction de ces résultats.
Exprimée en termes booléens, la description précédente du calcul des droits peut être résumé
comme ceci :
 4.2.10 Contrôle d'accès, étape 2 : Vérification de la requête
190

Manuel MySQL 4.1.x ? Version Française
droits globaux
OR (droits de base AND droits d'hôte)
OR droits de table
OR droits de colonne
Il n'est peut?être pas évident pourquoi, si les droits globaux issus de la table user sont initialement
insuffisants pour l'opération demandée, le serveur ajoute ces droits à ceux de base, table ou
colonne ? La raison est que la requête peut demander l'application de plusieurs droits. Par
exemple, si vous exécutez une commande INSERT ... SELECT , vous aurez besoin des droits
de INSERT et de SELECT . Vos droits peuvent être tels que la table user donne un droit, mais que
la table db en donne un autre. Dans ce cas, vous aurez les droits nécessaires pour faire une
opération, mais le serveur ne peut le déduire d'une seule table : les droits de plusieurs tables
doivent être combinés pour arriver à la bonne conclusion.
La table host sert à gérer une liste d'hôtes reconnus et sécuritaires.
Chez TcX, la table host contient une liste de toutes les machines du réseau local. Ces machines
reçoivent tous les droits.
Vous pouvez aussi utiliser la table host pour spécifier les hôtes qui ne sont pas sécuritaires.
Supposons que la machine public.votre.domaine t est placée dans une zone publique que
vous considérez comme peu sûre. Vous pouvez autoriser l'accès de toutes les machines, hormis
celle?ci, grâce à la table host configurée comme ceci :
+????????????????????+????+?
| Host               | Db | ...
+????????????????????+????+?
| .domain | %  | ... (tous les droits à 'N')
| %.your.domain      | %  | ... (tous les droits à 'Y')
+????????????????????+????+?
Naturellement, vous devriez toujours tester vos requêtes dans la table de droits, en utilisant
l'utilitaire mysqlaccess pour vous assurer que vous disposez des droits nécessaires pour réaliser
cette opération.
4.2.11 Causes des erreurs Access denied
Si vous rencontrez des erreurs Access denied quand vous essayez de vous connecter au
serveur MySQL, la liste suivante indique quelques actions à entreprendre pour corriger le problème
:
Après l'installation de MySQL, avez vous exécuté le script 
• 
mysql_install_db pour
suivante :
shell> mysql ?u root test
Le serveur devrait vous laisser vous connecter sans erreurs. Vous devez aussi vous assurer
que vous avez un fichier  dans le dossier des bases de données MySQL.
Ordinairement, il s'agit de  , où CHEMIN est le chemin vers
le dossier racine de l'installation MySQL.
Après une installation toute fraîche, vous devez vous connecter au serveur et créer les
• 
utilisateurs en réglant leurs permissions d'accès :
shell> mysql ?u root mysql
Le serveur devrait vous laisser vous connecter car l'utilisateur root de MySQL n'a pas de
mot de passe initial. Ceci est aussi une faille de sécurité, et donc, vous devez choisir un mot
de passe pour l'utilisateur root en même tant que les autres utilisateurs MySQL.
 4.2.11 Causes des erreurs Access denied
191

Manuel MySQL 4.1.x ? Version Française
Si vous essayez de vous connecter en root et que vous rencontrez cette erreur :
Access denied for user: '&#64;unknown' to database mysql
cela signifie que vous n'avez pas d'entrée dans la table user avec une valeur 'root' de la
colonne User et que mysqld cne peut trouver de nom d'hôte à votre client. Dans ce cas,
vous devez redémarrer le serveur avec l'option ??skip?grant?tables et éditer le fichier
/etc/hosts ou \windows\hosts pour ajouter une entrée pour votre hôte.
Si vous obtenez une erreur qui ressemble à celle?ci :
• 
shell> mysqladmin ?u root ?pxxxx ver
Access denied for user: 'root&#64;localhost' (Using password: YES)
Cela signifie que vous utilisez un mot de passe erroné. Mise en place d'un mot de passe .
Si vous avez oublié le mot de passe root, vous pouvez redémarrer mysqld avec
??skip?grant?tablespasse Root oublié .
Si vous obtenez l'erreur suivante même sans spécifier de mot de passe, cela signifie que
vous avez un mauvais mot de passe dans un fichier my.iniVous pouvez ne pas utiliser les fichiers d'options en utilisant l'option ??no?defaults ,
comme suit :
shell> mysqladmin ??no?defaults ?u root ver
Si vous mettez à jour une installation MySQL existante à partir d'une version plus ancienne
• 
que 3.22.11 vers la version 3.22.11 ou plus à jour, avez?vous exécuté le script
mysql_fix_privilege_tables ? Si ce n'est pas le cas, faites le. La structure des tables
de droits a changé avec la version 3.22.11 de MySQL lorsque la commande GRANT est
devenue fonctionnelle.
Si vos droits semblent avoir changé au milieu d'une session, il se peut qu'un
• 
super?utilisateur les ait changé. Recharger les tables de droits affecte les nouvelles
Si vous n'arrivez pas à faire fonctionner votre mot de passe, souvenez?vous que vous
• 
devez utiliser la fonction PASSWORD() si vous le changez avec les commandes INSERT ,
UPDATE , ou SET PASSWORD . L'utilisation de la fonction PASSWORD() n'est pas nécessaire
si vous spécifiez le mot de passe en utilisant la commande GRANT ... INDENTIFIED BY
ou la commande mysqladmin passwordlocalhost
• 
 est un synonyme de votre nom d'hôte local, et est aussi l'hôte par défaut auquel
le client essaye de se connecter si vous n'en spécifiez pas un explicitement. Toutefois, les
connexions à localhost ne fonctionnent pas si vous utilisez une version antérieure à la
3.23.27 qui utilise les MIT?pthreads (les connexions à localhost sont réalisées en
utilisant les sockets Unix, qui n'étaient pas supportés par les MIT?pthreads à ce moment).
Pour contourner ce problème sur de tels systèmes, vous devez utiliser l'option ??host pour
nommer l'hôte du serveur explicitement. Cela créera une connexion TCP/IP vers le serveur
mysqld . Dans ce cas, vous devez avoir votre vrai nom d'hôte dans les entrées de la table
user du serveur hôte. (Cela est vrai même si vous utilisez un programme client sur la
même machine que le serveur.)
Si vous obtenez une erreur 
• 
Access denied lorsque vous essayez de vous connecter à la
base de données avec mysql ?u nom_utilisateur nom_base , vous pouvez avoir un
problème dans la table user . Vérifiez le en vous exécutant mysql ?u root mysql et
entrant la commande SQL suivante :
mysql> SELECT * FROM user;
Le résultat devrait comprendre une entrée avec les colonnes Host et User correspondate
au nom d'hôte de votre ordinateur et votre nom d'utilisateur MySQL.
 4.2.11 Causes des erreurs Access denied
192

Manuel MySQL 4.1.x ? Version Française
Le message d'erreur 
• 
Access denied vous dira en tant que qui vous essayez de vous
identifier, l'hôte à partir duquel vous voulez le faire, et si vous utilisez ou pas un mot de
passe. Normalement, vous devez avoir une entrée dans la table user qui correspondent au
nom d'hôte et nom d'utilisateur donnés dans le message d'erreur. Par exemple, si vous
obtenez une erreur qui contient Using password: NO , cela signifie que vous avez
essayé de vous connecter sans mot de passe.
Si vous obtenez l'erreur suivante en essayant de vous connecter à partir d'un hôte différenet
• 
de celui sur lequel est placé le serveur, c'est qu'il n'y a pas d'enregistrement dans la table
user qui correspond à cet hôte :
Host ... is not allowed to connect to this MySQL server
Vous pouvez contourner le problème en utilisant l'outil en ligne de commande mysql (sur
l'hôte du serveur !) pour ajouter un enregistrement aux tables user , db , ou host pour la
combinaison utilisateur / nom d'hôte avec laquelle vous essayez de vous connecter puis
exécuter mysqladmin flush?privileges . Si vous n'avez pas la version 3.22 de
MySQL et que vous ne connaissez ni l'IP ni le nom d'hôte à partir duquel vous essayez de
vous connecter, vous devez créer une entrée avec '%' dans la colonne Host dans la table
user et redémarrer mysqld avec l'option ??log sur la machine serveur. Après avoir
essayé à nouveau de vous connecter à partir de la machine cliente, les informations
contenues dans le log de MySQL vous apprendront comment vous vous êtes vraiment
connectés. (Remplacez alors l'entrée de la table user contenant '%' avec le nom d'hôte qui
apparait dans le log. Sinon, vous aurez un système non?sécurisé.)Une autre raison pour
cette erreur sous Linux est que vous utilisez une version binaire de MySQL qui est compilée
avec une version de glibc différente de celle que vous utilisez. Dans ce cas, vous devez soit
mettre à jour votre système d'exploitation/glibc, soit télécharger les sources de MySQL et les
compiler vous?même. Un RPM de sources est normalement facile à compiler et installer,
cela ne devrait donc pas vous poser de gros problèmes.
Si vous obtenez une erreur où le nom d'hôte est absent ou que celui?ci est une adresse IP
• 
alors que vous avez bien entré le nom d'hôte :
shell> mysqladmin ?u root ?pxxxx ?h some?hostname ver
Access denied for user: 'root&#64;' (Using password: YES)
Cela signifie que MySQL a rencontré des erreurs lors de la résolution de l'IP du nom d'hôte.
Dans ce cas, vous pouvez exécuter mysqladmin flush?hosts pour vider le cache
interne des DNS. Comment MySQL utilise les DNS .
Les autres solutions sont :
Essayez de trouver le problème avec votre serveur DNS et corrigez le.

Spécifiez les IP à la place des noms d'hôtes dans les tables de droits de MySQL.

Démarrez 

mysqld avec ??skip?name?resolve .
Démarrez 

mysqld avec ??skip?host?cache .
Connectez vous à 

localhost si vous utilisez le serveur et le client sur la même
machine.
Placez le nom de la machine cliente dans 

/etc/hosts .
Si 
•  mysql ?u root test fonctionne mais que mysql ?h votre_hote ?u root test
provoque une erreur Access denied , il se peut que vous ayez entré de mauvaises
informations pour votre nom d'hôte dans la table user . Un problème commun ici est que la
valeur Host dans la table user spécifie un nom d'hôte non?qualifié, mais que vos routines
système de résolution de noms retournent un nom de domaine pleinement qualifié (ou
vice?versa). Par exemple, si vous avez une entrée avec l'hôte 'tcx' dans la table user ,
mais que vos DNS disent à MySQL que votre nom d'hôte est '' , l'entrée
ne fonctionnera pas. Essayez d'ajouter une entrée dans la table user qui contient votre
adresse IP en tant que valeur de la colonne Host . (Une alternative est d'ajouter une entrée
dans la table user avec une valeur de Host qui contient un caractère spécial, par exemple,
'tcx.%' . Toutefois, l'utilisation des noms d'hôtes se terminant par '%' est non?sécurisé
et n 'est pas recommendé !)
 4.2.11 Causes des erreurs Access denied
193

Manuel MySQL 4.1.x ? Version Française
Si 
•  mysql ?u utilisateur test fonctionne mais que mysql ?u utilisateur
autre_base ne fonctionne pas, vous n'avez pas d'entrée pour autre_base listée dans la
table db .
Si 
•  mysql ?u utilisateur nom_base fonctionne à partir du serveur, mais que mysql
?h nom_hote ?u utilisateur nom_base ne fonctionne pas à partir d'une autre
machine, cette machine n'est pas listée dans la table user ou db .
Si vous n'arrivez pas à trouver pourquoi vous obtenez l'erreur 
• 
Access denied , effacez
toutes les entrées de la table user dont la valeur du champ Host contiennent des
caractères spéciaux (entrées contenant '%' ou '_' ). Une erreur commune est d'insérer
une nouvelle entrée avec Host = '%' et User = 'un utilisateur' , en pensant que
cela vous permettra de spécifier localhost pour vous connecter à partir de la même
machine. La raison pour laquelle cela ne fonctionnera pas est que les droits par défaut
incluent une entrée avec Host = 'localhost' et User = '' . Puisque cette entrée
possède une valeur de Host égale à 'localhost' , qui est plus spécifique que '%' , elle
est utilisée de préférence à la nouvelle entrée lors de la connexion à partir de localhost !
La procédure correcte est d'insérer une seconde entrée avec Host = 'localhost' et
User = 'un_utilisateur' , ou de supprimer l'entrée avec Host = 'localhost' et
User = '' .
Si vous avez l'erreur suivante, vous avez peut?être un problème avec la table 
• 
db ou host :
Access to database denied
Si l'entrée sélectionnée dans la table db possède un champ Host vide, assurez?vous qu'il
y'a au moins une entrée correspondante dans la table host spécifiant les hôtes auxquels
l'entrée dans la table db s'applique.
Si vous obtenez l'erreur lors de l'utilisation des commandes SQL SELECT ... INTO
OUTFILE ou LOAD DATA INFILE , votre entrée dans la table user ne possède
probablement pas le privilège FILE .
Souvenez?vous que le programme client utilise les paramètres de connexion spécifiés dans
• 
connexion par défaut lorsque vous ne les spécifiez pas en ligne de commande, vérifiez votre
environnement et le fichier  dans votre répertoire personnel. Vous devrez aussi
vérifier les fichiers système de configuration de MySQL, bien qu'il est fort peu probable que
obtenez une erreur Access denied quand vous démarrer un client sans aucune option,
assurez?vous de ne pas avoir spécifié un vieux mot de passe dans l'un de vos fichiers
d'options ! Fichier d'options  .
Si vous apportez des modifications au tables de droits directement (en utilisant une requête
• 
INSERT ou UPDATE ) et que vos changements semblent ignorés, souvenez vous que vous
devez exécuter une requête FLUSH PRIVILEGES ou la commande mysqladmin
flush?privileges pour demander au serveur de lire à nouveau les tables de droits.
Sinon, vos changements ne seront pris en compte qu'au prochain démarrage du serveur.
Souvenez?vous qu'après avoir choisi le mot de passe root avec une commande UPDATE ,
vous n'aurez pas à le spécifier avant de recharger les privilèges, car le serveur ne sait pas
que vous l'avez modifié !
Si vous avez des problèmes d'accès avec un programme Perl, PHP, Python, ou ODBC,
• 
essayez de vous connecter au serveur avec mysql ?u utilisateur nom_base ou
mysql ?u utilisateur ?pvotre_passe nom_base . Si vous pouvez vous connecter
en utilisant le client mysql , c'est que le problème vient de votre programme et non des
droits MySQL. (Notez qu'il n'y a pas d'espace entre ?p et le mot de passe; vous pouvez
aussi utiliser la syntaxe ??password=votre_passe pour spécifier le mot de passe. Si
vous utilisez l'option ?p toute seule, MySQL vous demandera le mot de passe.)
Pour les tests, démarrez le démon 
• 
mysqld avec l'option ??skip?grant?tables . Vous
pourrez alors changer les tables de droits MySQL puis utiliser le script mysqlaccess pour
 4.2.11 Causes des erreurs Access denied
194

Manuel MySQL 4.1.x ? Version Française
vérifier si vos changements ont l'effet désiré. Lorsque vous êtes satisfait de vos
modifications, exécutez mysqladmin flush?privileges pour dire au serveur mysqld
de commencer à utiliser les nouvelles tables de droits. Note : Recharger les tables de droits
écrase l'option ??skip?grant?tables . Cela vous permet de dire au serveur de
commencer à prendre en considération les droits sans avoir à le couper et le redémarrer.
Si rien ne fonctionne, démarrez le démon 
• 
mysqld avec l'option de débogage (par exemple,
??debug=d,general,query ). Cela affichera l'hôte et les informations de l'utilisateur pour
chaque tentative de connexion. Les informations à propos de chaque commande exécutée
Si vous avez d'autres problèmes avec les tables de droits de MySQL et que vous sentez
• 
que vous devez envoyer le problème à la liste de diffusion, fournissez toujours le contenu de
vos tables de droits. Vous pouvez obtenir les données avec la commande mysqldump
mysql . Comme toujours, postez votre problème à l'aide du script mysqlbugmysqld avec ??skip?grant?tables pour pouvoir exécuter mysqldump .
4.3 Gestion des comptes utilisateurs de MySQL
4.3.1 Syntaxe de GRANT et REVOKE
GRANT priv_type [(liste_colonnes)] [, priv_type [(liste_colonnes)] ...]
    ON &#123;nom_de_table | * | *.* | nom_base.*&#125;
    TO nom_utilisateur [IDENTIFIED BY [PASSWORD] 'password']
        [, nom_utilisateur [IDENTIFIED BY 'password'] ...]
    [REQUIRE
        NONE |
        [&#123;SSL| X509&#125;]
    [CIPHER cipher [AND]]
    [ISSUER issuer [AND]]
    [SUBJECT subject]]
    [WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # |
                          MAX_UPDATES_PER_HOUR # |
                          MAX_CONNECTIONS_PER_HOUR #]]
REVOKE priv_type [(liste_colonnes)] [, priv_type [(liste_colonnes)] ...]
    ON &#123;nom_de_table | * | *.* | nom_base.*&#125;
    FROM nom_utilisateur [, nom_utilisateur ...]
GRANT est disponible depuis MySQL version 3.22.11. Pour les versions plus anciennes de MySQL,
la commande GRANT ne fait commandes GRANT et REVOKE permettent aux administrateurs
système de créer des utilisateurs, de leur donner ou de leur retirer des droits, sur 4 niveaux :
Niveau global
Les droits globaux s'appliquent à toutes les bases de données d'un serveur. Ces
droits sont stockés dans la table  .
Niveau base de données
Les droits de niveau de base de données s'appliquent à toutes les tables d'une base
de données. Ces droits sont stockés dans les tables  et  .
Niveau table
Les droits de table s'appliquent à toutes les colonnes d'une table. Ces droits sont
stockés dans la table mysql.tables_priv .
Niveua de colonne
Les droits de niveau de colonnes s'appliquent à des colonnes dans une table. Ces
droits sont stockés dans la table mysql.columns_priv .
 4.3 Gestion des comptes utilisateurs de MySQL
195

Manuel MySQL 4.1.x ? Version Française
Si vous donnez des droits à un utilisateur qui n'existe pas, vous créerez cet utilisateur. Pour voir des
illustrations du fonctionnement de la commande GRANTMySQL .Pour les commandes GRANT et REVOKE , la clause priv_type peut être spécifiée par les
constantes suivantes :
ALL [PRIVILEGES] Tous les droits sauf WITH GRANT OPTION .
ALTER
Autorise l'utilisation de ALTER TABLE .
CREATE
Autorise l'utilisation de CREATE TABLE .
CREATE TEMPORARY Autorise l'utilisation de CREATE TEMPORARY TABLE .
TABLES
DELETE
Autorise l'utilisation de DELETE .
DROP
Autorise l'utilisation de DROP TABLE .
EXECUTE
Autorise l'utilisateur à exécuter des procédures stockées (pour MySQL 5.0).
Autorise l'utilisation de SELECT ... INTO OUTFILE et LOAD DATA
FILE
INFILE .
INDEX
Autorise l'utilisation de CREATE INDEX et DROP INDEX .
INSERT
Autorise l'utilisation de INSERT .
Autorise l'utilisation de LOCK TABLES sur les tables pour lesquelles
LOCK TABLES
l'utilisateur a les droits de SELECT .
PROCESS
Autorise l'utilisation de SHOW FULL PROCESSLIST .
REFERENCES
Réservé pour le futur.
RELOAD
Autorise l'utilisation de FLUSH .
REPLICATION
Donne le droit à l'utilisateur de savoir où sont les maîtres et esclaves.
CLIENT
REPLICATION
Nécessaire pour les esclaves de réplication (pour lire les historiques
SLAVE
binaires du maître).
SELECT
Autorise l'utilisation de SELECT .
SHOW DATABASES
SHOW DATABASES affiche toutes les bases de données.
SHUTDOWN
Autorise l'utilisation de mysqladmin shutdown .
Autorise une connexion unique même si max_connections est atteind, et
SUPER
l'exécution des commandes CHANGE MASTER , KILL thread ,
mysqladmin debug , PURGE MASTER LOGS et SET GLOBAL .
UPDATE
Autorise l'utilisation de UPDATE .
USAGE
Synonyme de ``pas de droits''.
USAGE peut être utilisé lorsque vous voulez créer un utilisateur sans aucun droit.
Les droits de CREATE TEMPORARY TABLES , EXECUTE , LOCK TABLES , REPLICATION ... ,
SHOW DATABASES et SUPER sont nouveaux en version 4.0.2. Pour utiliser ces droits après mise à
jour en 4.0.2, vous devez exécuter le script mysql_fix_privilege_tables .
Dans les anciennes versions de MySQL, le droit de PROCESS donnait les mêmes droits que le
nouveau droit SUPER .
Pour retirer le droit de GRANT à un utilisateur, utilisez les mêmes valeurs de priv_type avec
GRANT OPTION :
mysql> REVOKE GRANT OPTION ON ... FROM ...;
Les valeurs de priv_type que vous pouvez spécifier pour une table sont SELECT , INSERT ,
UPDATE , DELETE , CREATE , DROP , GRANT , INDEX et ALTER .
 4.3 Gestion des comptes utilisateurs de MySQL
196

Manuel MySQL 4.1.x ? Version Française
Les seules valeurs de priv_type que vous pouvez spécifier pour une colonne, lorsque vous
utilisez la clause liste_colonnes ), sont SELECT , INSERT et UPDATE .
Vous pouvez donner des droits globaux en utilisant la syntaxe ON *.* . Vous pouvez donner des
droits de base en utilisant la syntaxe ON nom_base.* . Si vous spécifiez ON * et que vous avez
une base de données qui est déjà sélectionnée, vous allez donner des droits pour la base de
données courante. Attention : si vous spécifiez ON * et que vous n'avez pas de base courante,
vous allez affecter les droits au niveau du serveur !
Notez bien : les caractères joker '_' and '%' sont autorisés lors de la spécification de noms dans
la commande GRANT . Cela signifie que si vous voulez utiliser par exemple le caractère littéral '_'
comme nom de base, vous devez le spécifier sous la forme '\_' dans la commande GRANT , pour
éviter à l'utilisateur d'accéder à d'autres bases, dont le nom pourrait correspondre au masque
d'expression régulière ainsi créé. Utilisez plutôt GRANT ... ON `foo\_bar`.* TO ... .
Afin de permettre l'identification des utilisateurs depuis des hôtes arbitraires, MySQL supporte la
spécification du nom d'utilisateur nom_utilisateur sous la forme [email protected] . Si vous voulez
spécifier un nom d'utilisateur user qui contient des caractères spéciaux tels que '?' , ou une
chaîne d'hôte host qui contient des caractères joker (comme '%' ), vous pouvez placer le nom de
l'utilisateur ou de l'hôte entre guillemets (par exemple,
'test?utilisateur'@'test?nomdhote' ).
Vous pouvez spécifier des caractères jokers dans le nom d'hôte. Par exemple,
[email protected]'' fait correspondre l'utilisateur user de n'importe quel hôte du domaine
 , et [email protected]'144.155.166.%' fait correspondre l'utilisateur user à n'importe quelle
adresse de la classe C 144.155.166 .
La forme simple de user est synonyme de [email protected]"%" .
MySQL ne supporte pas de caractères joker dans les noms d'utilisateur. Les utilisateurs anonymes
sont définis par l'insertion de ligne avec User='' dans la table  , ou en créant un
utilisateur avec un nom vide, grâce à la commande GRANT .
Note : si vous autorisez des utilisateurs anonymes à se connecter à votre serveur, vous devriez
aussi donner ces droits à tous les utilisateurs locaux [email protected] car sinon, la ligne dans la
table  sera utilisée lorsque l'utilisateur se connectera au serveur MySQL depuis la
machine locale !
Vous pouvez vérifier si cela s'applique à vous en exécutant la requête suivante :
mysql> SELECT Host,User FROM WHERE User='';
Actuellement, la commande GRANT supporte uniquement les noms d'hôte, colonne, table et bases
de données d'au plus 60 caractères. Un nom d'utilisateur peut être d'au plus 16 caractères.
Les droits pour les tables et colonnes sont combinés par OU logique, avec les quatre niveaux de
droits. Par exemple, si la table  spécifie qu'un utilisateur a un droit global de SELECT ,
ce droit ne pourra pas être annulé au niveau base, table ou colonne.
Les droits d'une colonne sont calculés comme ceci :
droit global
OR (droit de base de données ET droit d'hôte)
OR droit de table
OR droit de colonne
 4.3 Gestion des comptes utilisateurs de MySQL
197

Manuel MySQL 4.1.x ? Version Française
Dans la plupart des cas, vous donnez des droits à un utilisateur en utilisant un seul des niveaux de
droits ci?dessus, ce qui fait que la vie n'est pas aussi compliquée. Le détails de la procédure de
droits à une paire utilisateur/hôte qui n'existe pas dans la table  , une ligne sera créée
et restera disponible jusqu'à son effacement avec la commande DELETE . En d'autre termes,
GRANT crée une ligne dans la table user , mais REVOKE ne la supprime pas. Vous devez le faire
explicitement avec la commande DELETE .
Avec MySQL version 3.22.12 ou plus récent, si un nouvel utilisateur est créé, ou si vous avez les
droits de GRANT globaux, le mot de passe sera configuré avec le mot de passe spécifié avec la
clause IDENTIFIED BY , si elle est fournie. Si l'utilisateur a déjà un mot de passe, il sera remplacé
par ce nouveau.
Si vous ne voulez pas faire passer le mot de passe en texte clair, vous pouvez immédiatement
utiliser l'option PASSWORD suivi du mot de passe déjà chiffré avec la fonction PASSWORD() ou l'API
C make_scrambled_password(char *to, const char *password) .
Attention : si vous créez un nouvel utilisateur, mais que vous ne spécifiez pas la clause
IDENTIFIED BY , l'utilisateur n'aura pas de mot de passe. Ce n'est pas sûr.
Les mots de passe peuvent aussi être modifiés par la commande SET PASSWORD.
Si vous donnez les droits de base, une ligne sera ajoutée dans la table  . Lorsque les
droits sur cette base seront supprimés avec la commande REVOKE , cette ligne disparaîtra.
Si un utilisateur n'a pas de droits sur une table, elle ne sera pas affichée lorsqu'il requiert la liste des
tables avec la commande SHOW TABLES .
La clause WITH GRANT OPTION donne à l'utilisateur le droit de donner les droits qu'il possède à
d'autres utilisateurs. La plus grande prudence est recommandée pour cette commande, car il
permettra à terme à deux utilisateurs de combiner les droits dont ils disposent.
MAX_QUERIES_PER_HOUR # , MAX_UPDATES_PER_HOUR # et MAX_CONNECTIONS_PER_HOUR #
sont nouveaux en MySQL 4.0.2. Ces deux options limitent le nombre de requêtes et de
modifications qu'un utilisateur peut réclamer dans une heure. Si # vaut 0 (valeur par défaut), alors
cela signifie qu'il n'y a pas de limitations pour cet utilisateur. Limiter les ressources utilisateur .
Vous ne pouvez pas donner à un autre utilisateur un droit que vous ne possédez pas vous?même.
Le droit de GRANT vous donne le droit de diffuser les droits dont vous disposez déjà.
Soyez bien conscient que lorsque vous donnerez le droit de GRANT à un niveau particulier, tous les
droits qu'un utilisateur possède déjà (où qui lui seront donnés dans le futur) seront alors diffusables
à d'autres individus. Supposons que vous donnez les droits de INSERT à un utilisateur, pour une
table. Si vous ajoutez le droit de WITH GRANT OPTION , cet utilisateur peut donner le droit de
SELECT mais aussi celui d' INSERT . Si vous donnez aussi le droit de UPDATE , il pourra alors
diffuser les droits de INSERT , SELECT et UPDATE .
Il est recommandé de ne pas donner les droits de ALTER à un utilisateur normal. Si vous le faites,
les utilisateurs pourront alors contourner le système de droits en renommant des tables !
Notez que si vous utilisez des droits de niveau table ou colonne même pour un utilisateur, le
serveur vérifiera alors ces droits pour tous les utilisateurs, et cela ralentira MySQL un peu.
 4.3 Gestion des comptes utilisateurs de MySQL
198

Manuel MySQL 4.1.x ? Version Française
Lorsque mysqld démarre, tous les droits sont stockés en mémoire. Les droits de bases, tables et
colonnes prennent aussitôt effet, et les droits des utilisateurs prendront effet dès leur prochaine
configuration. Les modifications sur les tables de droits que vous effectuez avec les commandes
GRANT et REVOKE sont prises en compte immédiatement par le serveur. Si vous modifiez
manuellement les tables (avec INSERT , UPDATE , etc...), vous devez exécuter la commande
FLUSH PRIVILEGES , ou la commande en ligne mysqladmin flush?privileges pour indiquer
au serveur qu'il doit recharger les droits. Quand les changements de privilèges prennent?ils effet ? .
Les différences notables entre l'ANSI SQL et MySQL pour la commande GRANT sont :
Les droits MySQL sont donnés pour une combinaison nom d'utilisateur + nom d'hôte, et non
• 
pas pour un nom d'hôte seulement.
L'ANSI SQL n'a pas de droits globaux ou de niveau base de données, et l'ANSI SQL ne
• 
supporte pas tous les types de droits que MySQL supporte. MySQL ne supporte pas le droit
ANSI SQL de TRIGGER ou UNDER .
Les droits ANSI SQL sont structurés de manière hiérarchique. Si vous supprimez un
• 
utilisateur, tous les droits donnés à cet utilisateur seront supprimés. Avec MySQL, les droits
ne sont pas automatiquement supprimés, et vous devez les supprimer manuellement, si
besoin.
Avec MySQL, si vous avez le droit de 
• 
INSERT sur uniquement quelques colonnes de la
table, vous pourrez exécuter des insertions. Les colonnes pour lesquelles vous n'avez pas
de droit prendront alors leur valeur par défaut. L'ANSI SQL vous impose d'avoir les droits d'
INSERT sur toutes les colonnes.
Lorsque vous détruisez une table avec ANSI SQL, tous les droits liés à la table sont
• 
supprimés. Si vous supprimez un droit en ANSI SQL, tous les droits qui étaient basés sur ce
droit sont supprimés. Avec MySQL, les droits peuvent être abandonnés explicitement avec
la commande REVOKE , ou en manipulant les tables de droits de MySQL.
Pour une description de l'utilisation de REQUIRE , voyez Utilisation des connexions sécurisées .
4.3.2 Nom d'utilisateurs MySQL et mots de passe
Il y a de nombreuses différences entre les utilisations des noms et mots de passe sous MySQL, et
celles qui sont faites sous Unix ou Windows :
Les noms d'utilisateurs, tels qu'utilisés pour le processus d'identification sous MySQL, n'ont
• 
rien à voir avec les noms d'utilisateurs Unix ou Windows. La plupart des clients utilisent par
défaut leur mot de passe Unix, mais c'est surtout parce que c'est pratique. Les programmes
clients permettent d'utiliser des noms d'utilisateurs différents avec les options ?u et ??user
. Cela signifie que vous ne pouvez pas rendre une base de données sécuritaire sans donner
de mots de passe à tous les clients. Tout le monde peut essayer de se connecter au serveur
sous n'importe quel nom, et il sera possible de se connecter si un nom d'utilisateur n'a pas
de mot de passe.
Les noms d'utilisateurs MySQL peuvent avoir jusqu'à 16 caractères ; les noms d'utilisateurs
• 
Unix sont généralement limités à 8 caractères.
Les mots de passe MySQL n'ont aucun rapport avec le passeport Unix. Il n'y a pas
• 
nécessairement de connexion entre le mot de passe que vous utilisez pour vous connecter
sur la machine Unix et celui que vous utilisez pour accéder au serveur MySQL.
MySQL chiffre les mots de passe avec un algorithme différent de celui qui est utilisé par
• 
Unix. Reportez?vous aux descriptions des fonctions PASSWORD() et ENCRYPT() dans
votre mot de passe 'brouillé' est suffisant pour se connecter au serveur MySQL.
 4.3.2 Nom d'utilisateurs MySQL et mots de passe
199

Manuel MySQL 4.1.x ? Version Française
Les utilisateurs MySQL et leurs droits sont généralement créés par la commande GRANTde GRANT et REVOKE .
Lorsque vous vous connectez à un serveur MySQL avec un client en ligne de commande, vous
devez spécifier le mot de passe avec l'option ??password=mot?de?passeserveur MySQL .
mysql ??user=monty ??password=devine nom_base
Si vous voulez que le client vous demande le mot de passe à la volée, vous devriez utiliser l'option
??password sans argument :
mysql ??user=monty ??password nom_base
ou la version courte :
mysql ?u monty ?p nom_base
Notez que dans le dernier exemple, le mot de passe n'est pas 'nom_base'.
Si vous voulez utiliser l'option ?p pour fournir un mot de passe, vous pouvez aussi essayer ceci :
mysql ?u monty ?pdevine nom_base
Sur certains systèmes, l'appel système que MySQL utiliser pour demander un mot de passe va
automatiquement couper le mot de passe à 8 caractères. En interne, MySQL n'a pas de limite à la
taille du mot de passe.
4.3.3 Quand les modifications de privilèges prennent?ils effets ?
Lorsque mysqld est lancé, toutes les tables de droits sont lues, et sont utilisées.
Les modifications aux tables de droits que vous faites avec GRANT , REVOKE et SET PASSWORD
sont immédiatement prises en compte par le serveur.
Si vous modifiez les tables de droits manuellement (avec INSERT , UPDATE , etc...), vous devez
exécuter la commande FLUSH PRIVILEGES ou la commande mysqladmin flush?privileges
, ou encore mysqladmin reload pour dire au serveur de relire les tables de droits. Sinon, vos
modifications n'auront aucun effet jusqu'au redémarrge du serveur. Si vous modifiez les tables de
droits manuellement, mais que vous oubliez de recharger les droits, vous vous demanderez
sûrement pourquoi vos modifications n'ont pas d'effet.
Lorsque le serveur remarque que les tables de droits ont été modifiées, les connexions existantes
avec les clients sont modifiées comme ceci :
Les droits de table et colonnes prennent effet à la prochaine requête du client.
• 
Les droits de bases prennent effet à la prochaine commande 
• 
USE nom_de_base .
Les droits globaux et les modifications de droits prennent effets lors de la prochaine
• 
connexion.
4.3.4 Création des premiers droits MySQL
Après avoir installé MySQL, vous devez configurer les premiers droits du serveur en exécutant le
script scripts/mysql_install_dbmysql_install_db démarre le serveur mysqld et initialise les tables de droits, avec les
 4.3.3 Quand les modifications de privilèges prennent?ils effets ?
200

Manuel MySQL 4.1.x ? Version Française
paramètres suivants :
L'utilisateur MySQL 
• 
root est créé en tant qu'administrateur avec tous les droits. Les
connexions doivent se faire depuis l'hôte local.
Note : Le mot de passe de l'utilisateur initial root est vide, ce qui permet à n'importe qui de
se connecter en tant que root sans mot de passe , pour profiter de tous les droits.
Un utilisateur anonyme est créé, qui peut faire ce qu'il veut avec toutes les tables dans la
• 
base de données 'test' ou commençant par 'test_' . Les connexions doivent être
faites depuis l'hôte local. Cela signifie qu'un utilisateur local peu se connecter sans mot de
passe et être traité comme un utilisateur anonyme.
Les autres droits sont réservés. Par exemple, un utilisateur normal ne peut pas utiliser les
• 
commandes mysqladmin shutdown ou mysqladmin processlist .
Note.Comme votre installation de base n'est pas du tout sécurisée, la première action que vous devez
prendre est de spécifier un mot de passe à votre utilisateur root . Vous pouvez faire cela comme
ceci (notez que vous aurez à spécifier le mot de passe en utilisant la fonction PASSWORD() ) :
shell> mysql ?u root mysql
mysql> SET PASSWORD FOR root&#64;localhost=PASSWORD('new_password');
Si vous savez ce que vous faites, vous pouvez aussi directement manipuler les tables de droits :
shell> mysql ?u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password')
    ?>     WHERE user='root';
mysql> FLUSH PRIVILEGES;
Une autre méthode pour modifier de mot de passe est d'utiliser la commande en ligne mysqladmin
:
shell> mysqladmin ?u root password new_password
Seuls les utilisateurs ayant des droits d'accès en lecture et écriture dans la base de données mysql
peuvent modifier les mots de passe des autres utilisateurs. Tous les utilisateurs normaux, à
l'exception des anonymes, peuvent uniquement modifier leur mot de passe personnel, avec l'une
des commandes ci?dessus ou avec la commande SET PASSWORD=PASSWORD('new
password') .Notez que si vous modifiez le mot de passe dans la table user en utilisant la
première méthode, vous devez indiquer au serveur qu'il doit relire les droits avec la commande
FLUSH PRIVILEGES ), sinon ces modifications ne seront pas prises en compte.
Une fois que le mot de passe root a été modifié, vous devrez le fournir pour vous connecter au
serveur en tant que root .
Vous pouvez aussi laisser le mot de passe du root vide, afin de faire des connexions facilement
lors de la configuration initiale du serveur. Mais n'oubliez pas de le spécifier lors de la mise en
production.
Voyez le script scripts/mysql_install_db pour savoir comment il configure les droits par
défaut. Vous pouvez l'utiliser comme base pour ajouter des droits à d'autres utilisateurs.
Si vous voulez que les droits initiaux soient différents, vous pouvez aussi modifier le script
mysql_install_db avant de l'exécuter.
Pour recréer complètement les tables de droits, effacez tous les fichiers .frm , .MYI et .MYD dans
le dossier contenant les tables de la base mysql . (C'est le dossier mysql dans le dossier de
données, qui est indiqué par la commande mysqld ??help .) Puis, exécutez le script
mysql_install_db , après l'avoir éventuellement modifié avec les droits que vous souhaitez.
 4.3.3 Quand les modifications de privilèges prennent?ils effets ?
201

Manuel MySQL 4.1.x ? Version Française
Note : pour les versions de MySQL antérieures à la version 3.22.10, il ne faut pas effacer les
fichiers .frm . Si vous le fait accidentellement, vous devez les copier depuis la distribution MySQL
avant d'exécuter le script mysql_install_db .
4.3.5 Ajouter de nouveaux utilisateurs à MySQL
Vous pouvez ajouter des utilisateurs de deux façons différentes : en utilisant la commande GRANT
ou en manipulant la table des droits de MySQL directement. La méthode préférée consiste à utiliser
la commande GRANTGRANT et REVOKE .
Il y'a aussi beaucoup de programmes contribués comme phpmyadmin qui peuvent être utilisés
pour créer et administrer les utilisateurs. Portails MySQL .
Les exemples suivants montrent comment utiliser le client mysql pour créer de nouveaux
utilisateurs. Ces exemples supposent que les privilèges sont attribués en accord avec les valeurs
par défaut discutées dans la section précédente. Cela signifie que pour effectuer des changements,
vous devez être sur la même machine où mysqld tourne, vous devez vous connecter en tant
qu'utilisateur MySQL root , et l'utilisateur root doit avoir le droit INSERT sur la base mysql et le
droit d'administration RELOAD . Si vous avez changé le mot de passe de l'utilisateur root , vous
devez le spécifier dans les commandes mysql ci?dessous.
Vous pouvez ajouter de nouveaux utilisateurs en utilisant des commandes GRANT :
shell> mysql ??user=root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO monty&#64;localhost
    ?>     IDENTIFIED BY 'un_mot_de_passe' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty&#64;"%"
    ?>     IDENTIFIED BY 'un_mot_de_passe' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin&#64;localhost;
mysql> GRANT USAGE ON *.* TO dummy&#64;localhost;
Ces commandes GRANT ajoutent trois nouveaux utilisateurs :
monty
Un super?utilisateur qui peut se connecter au serveur d'où il veut, mais qui doit
utiliser le mot de passe 'un_mot_de_passe' pour le faire. Notez que nous devons
exécuter une commande GRANT pour [email protected] et [email protected]"%" . Si nous
n'ajoutons pas l'entrée avec localhost , l'entrée concernant l'utilisateur anonyme
pour localhost qui est créée par mysql_install_db prendra précédence lors
de la connexion à partir de l'hôte local, car elle a une entrée plus spécifique pour la
valeur du champ Host et de plus, elle vient en premier dans l'ordre de tri de la table
user .
admin
Un utilisateur qui peut se connecter depuis localhost sans mot de passe et qui a
les droits administratifs RELOAD et PROCESS . Cela permet à cet utilisateur
d'exécuter les commandes mysqladmin reload , mysqladmin refresh , et
mysqladmin flush?* , ainsi que mysqladmin processlist . Aucun droit lié
aux bases de données n'est donné. (Ils peuvent l'êetre plus tard en utilisant d'autres
instructions GRANT .)
dummy
Un utilisateur qui peut se connecter sans mot de passe, mais seulement à partir de
l'hôte local. Les droits globaux sont tous à 'N' ?le type de droit USAGE vous permet
de créer un utilisateur démuni de privilèges. Il est supposé que vous lui assignerez
 4.3.5 Ajouter de nouveaux utilisateurs à MySQL
202

Manuel MySQL 4.1.x ? Version Française
les droits spécifiques aux bases de données plus tard.
Vous pouvez ajouter les mêmes droits d'accès aux utilisateurs en utilisant directement des requêtes
INSERT puis en demandant au serveur de recharger les tables de droits :
shell> mysql ??user=root mysql
mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('un_mot_de_passe'),
    ?>          'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user VALUES('%','monty',PASSWORD('un_mot_de_passe'),
    ?>          'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user SET Host='localhost',User='admin',
    ?>           Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
    ?>                  VALUES('localhost','dummy','');
mysql> FLUSH PRIVILEGES;
Selon votre version de MySQL, vous pouvez avoir un nombre différent de valeurs 'Y' plus haut
(les versions antérieures à la 3.22.11 possèdent moins de colonnes de privilèges). Pour l'utilisateur
admin , la syntaxe d' INSERT étendue la plus lisible disponible depuis la version 3.22.11 est
utilisée.Notez que pour ajouter un super?utilisateur, vous avez juste besoin de créer une entrée
dans la table user avec tous les champs de droits à 'Y' . Aucune entrée n'est requise dans les
tables db et host .
Les colonnes de privilèges de la table user n'étaient pas renseignées explicitement dans la
dernière requête INSERT (pour l'utilisateur dummy ), ses colonnes prennent donc la valeur par
défaut, 'N' . C'est la même chose que ce que fait GRANT USAGE .
L'exemple suivant ajoute un utilisateur custom qui peut se connecter à partir des hôtes
localhost , server.domain , et  . Il ne pourra accéder à la base de données
bankaccount qu'à partir de localhost , à la base expenses qu'à partir de  ,
et à la base customer à partir des trois hôtes. Il utilisera le mot de passe stupid pour les trois
hôtes.
Pour configurer les privilèges de cet utilisateur en utilisant des commandes GRANT , exécutez ce qui
suit :
shell> mysql ??user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ?>     ON bankaccount.*
    ?>     TO custom&#64;localhost
    ?>     IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ?>     ON expenses.*
    ?>     TO custom&#64;
    ?>     IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ?>     ON customer.*
    ?>     TO custom&#64;'%'
    ?>     IDENTIFIED BY 'stupid';
La raison pour laquelle nous faisons deux insertions pour l'utilisateur 'custom' est que nous voulons
lui donner accès à MySQL à partir de la machine locale avec les sockets Unix et à partir de la
machine distante '' via TCP/IP.
Pour régler les permissions d'accès en modifiant directement les tables de droits, exécutez ces
commandes (notez l'appel à FLUSH PRIVILEGES à la fin) :
shell> mysql ??user=root mysql
mysql> INSERT INTO user (Host,User,Password)
    ?> VALUES('localhost','custom',PASSWORD('stupid'));
 4.3.5 Ajouter de nouveaux utilisateurs à MySQL
203

Manuel MySQL 4.1.x ? Version Française
mysql> INSERT INTO user (Host,User,Password)
    ?> VALUES('server.domain','custom',PASSWORD('stupid'));
mysql> INSERT INTO user (Host,User,Password)
    ?> VALUES('','custom',PASSWORD('stupid'));
mysql> INSERT INTO db
    ?> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
    ?>  Create_priv,Drop_priv)
    ?> VALUES
    ?> ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
    ?> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
    ?>  Create_priv,Drop_priv)
    ?> VALUES
    ?> ('','expenses','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
    ?> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
    ?>  Create_priv,Drop_priv)
    ?> VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;
Les trois premières requêtes INSERT ajoute les entrées dans la table user qui permettent
l'iutilisateur custom à se connecter à partir de plusieurs hôtes avec le mot de passe donné, mais ne
lui donnent aucun droit (tous les droits sont mis à la valeur par défaut qui est 'N' ). Les trois
requêtes INSERT suivantes ajoutent des entrées dans la table db qui autorisent custom à utiliser
les bases de données bankaccount , expenses , et customer , mais seulement s'il y accède à
partir de l'hôte spécifié. Comme d'habitude, lorsqueles tables de droits sont modifiées directement,
on doit demander au serveur des les recharger (avec FLUSH PRIVILEGES ) pour que les
changements soient pris en compte.
Si vous voulez donner un accès spécifique à un utilisateur à partir de n'importe quelle machine d'un
domaine donné, vous pouvez utiliser la commande GRANT qui suit :
mysql> GRANT ...
    ?>     ON *.*
    ?>     TO monutilisateur&#64;""
    ?>     IDENTIFIED BY 'monmotdepasse';
Pour faire la même chose en modifiant directement la table de droits, faites :
mysql> INSERT INTO user VALUES ('', 'monutilisateur',
    ?>             PASSWORD('monmotdepasse'),...);
mysql> FLUSH PRIVILEGES;
Vous pouvez aussi utiliser xmysqladmin , mysql_webadmin , et même xmysql pour insérer,
changer et mettre à jour les valeurs dans les tables de droits. Vous pouvez trouver ces utilitaires
dans le dossier des contributions du site web de MySQL (
).
4.3.6 Limiter les ressources utilisateurs
Depuis MySQL 4.0.2, il est possible de limiter certaines ressources accessibles à un utilisateur
possible.
Jusqu'à présent, la seule méthode possible pour limiter l'utilisation des ressources serveurs MySQL
était de configurer la variable de démarrage max_user_connections avec une valeur non nulle.
Mais cette méthode est strictement globale, et ne permet pas de faire des aménagements
personnalisés, comme cela pourrait arriver aux fournisseurs de services internet.
 4.3.6 Limiter les ressources utilisateurs
204

Manuel MySQL 4.1.x ? Version Française
Par conséquent, un système de gestion des ressources a été introduit, au niveau des utilisateurs :
Nombre de requête par heure : Toutes les commandes qu'un utilisateur peut exécuter.
• 
Nombre de modifications par heure : Toute commande qui implique la modification d'une
• 
table ou d'une base.
Nombre de connexion réalisées par heure : Le nombre de nouvelles connexions par heure.
• 
Un utilisateur dans le contexte ci?dessus est une ligne dans la table user , qui est identifié de
manière unique par les colonnes user et host .
Par défaut, les utilisateurs ne sont pas limités dans l'utilisation des ressources ci?dessus, à moins
que des limites ne leur soient imposées. Ces limites peuvent être configurées uniquement via la
commande GRANT (*.*) , avec cette syntaxe :
GRANT ... WITH MAX_QUERIES_PER_HOUR N1
               MAX_UPDATES_PER_HOUR N2
               MAX_CONNECTIONS_PER_HOUR N3;
Il est possible de spécifier toute combinaison de clauses ci?dessus. N1, N2 et N3 sont des entiers
et représentent le compte par heure.
Si l'utilisateur atteint l'une des limites ci?dessus dans une heure, sa connexion sera interrompue ou
refusée, et un message d'erreur approprié sera émis.
Les valeurs courantes d'utilisation d'un utilisateur peuvent être remises à zéro avec la commande
GRANT , et n'importe laquelle des clauses ci?dessus, y compris une commande GRANT avec les
valeurs courantes.
De plus, les valeurs courantes de tous les utilisateurs peuvent être remises à zéro si les droits sont
rechargés (dans le serveur, ou avec la commande mysqladmin reload ) ou si la commande SQL
FLUSH USER_RESOURCES est exécutée.
Cette fonctionnalité est activée aussitôt qu'une limite est donnée à un utilisateur, avec la commande
GRANT .
Comme pré?requis à l'activation de cette fonctionnalité, la table user de la base mysql doit
contenir les colonnes additionnelles, définies dans le script de création mysql_install_db et
 , du dossier scripts .
4.3.7 Configurer les mots de passe
Dans la plupart des cas, vous devez utiliser la commande GRANT pour configurer les utilisateurs et
de GRANT et REVOKE .
Les exemples des sections précédentes illustrent un principe important : lorsque vous stockez un
mot de passe important avec les commandes INSERT ou UPDATE , vous devez utiliser la fonction
PASSWORD() pour le chiffrer. Ceci est dû au fait que la table user stocke les mots de passe sous
une forme chiffrée, et non pas en texte clair. Si vous oubliez cela, vous risquez de configurer vos
mots de passe comme ceci :
shell> mysql ?u root mysql
mysql> INSERT INTO user (Host,User,Password)
    ?> VALUES('%','jeffrey','biscuit');
 4.3.7 Configurer les mots de passe
205

Manuel MySQL 4.1.x ? Version Française
mysql> FLUSH PRIVILEGES;
Le résultat est que la valeur 'biscuit' est stockée dans la colonne de mot de passe de la table
user . Lorsque l'utilisateur jeffrey tente de se connecter au serveur avec ce mot de passe, le
client mysql chiffre ce mot de passe avec la fonction PASSWORD() , génère un vecteur
d'identification basé sur la version chiffrée du mot de passe et un nombre aléatoire, obtenu du
serveur, puis envoie le tout au serveur. Le serveur utilise la valeur du mot de passe password
dans la table user (ce qui n'est pas la valeur chiffrée de 'biscuit' ) pour effectuer la
recherche et comparer les résultats. La comparaison échoue et le serveur rejette la connexion :
shell> mysql ?u jeffrey ?pbiscuit test
Access denied
Les mots de passe doivent donc être chiffrés lors de leur insertion dans la table user . Aussi les
commandes INSERT doivent être spécifiées comme ceci :
mysql> INSERT INTO user (Host,User,Password)
    ?> VALUES('%','jeffrey',PASSWORD('biscuit'));
Vous devez aussi utiliser la fonction PASSWORD() lorsque vous utilisez la commande SET
PASSWORD :
mysql> SET PASSWORD FOR jeffrey&#64;"%" = PASSWORD('biscuit');
Si vous modifiez les mots de passe en utilisant la commande GRANT ... IDENTIFIED BY ou la
commande mysqladmin password , la fonction PASSWORD() n'est pas nécessaire. Ces
commandes assureront le chiffrement de votre mot de passe pour vous, ce qui vous permet de
spécifier le mot de passe de 'biscuit' comme ceci :
mysql> GRANT USAGE ON *.* TO jeffrey&#64;"%" IDENTIFIED BY 'biscuit';
or
shell> mysqladmin ?u jeffrey password biscuit
Note : PASSWORD() n'effectue pas le chiffrement du mot de passe de la même façon qu'Unix. Il ne
faut pas supposer que si vos mots de passe Unix et MySQL sont les mêmes, la fonction
PASSWORD() retournera la même valeur que celle qui est stockée dans le fichier de mots de passe
d'UNIX. Noms d'utilisateurs MySQL et mots de passe .
4.3.8 Garder vos mots de passe en lieu sûr
Il est recommandé de ne pas placer votre mot de passe là où il risque d'être découvert par d'autres
personnes. Les méthode que vous utiliserez pour spécifier votre mot de passe lors de la connexion
avec le client sont listées ici, avec les risques liés à chaque méthode :
Ne donnez jamais l'accès à un utilisateur normal, à la table 
• 
 . En connaissant
le mot de passe chiffré d'un utilisateur lui permettrait de se connecter sous cet utilisateur.
Les mots de passe sont chiffrés pour que personne ne puisse lire le mot de passe en clair
(ce qui arriverait si vous utilisiez le même mot de passe dans une autre application).
Utilisez l'option 
• 
?pyour_pass ou ??password=your_pass en ligne de commande. C'est
très pratique mais très peu sûr, car votre mot de passe devient visible aux programmes qui
effectuent des bilans de l'état du serveur, comme la commande ps , qui peut être invoquée
par d'autres utilisateurs pour lister les commandes qui sont exécutées : les clients MySQL
remplacent la valeur de cet argument par une série de zéro durant l'initialisation, mais il
reste tout de même une courte période où ce mot de passe est lisible en clair.
Utilisez l'option 
• 
?p ou ??password (sans la valeur du mot de passe ). Dans ce cas, le
programme client va solliciter la saisie du mot de passe depuis le terminal :
shell> mysql ?u user_name ?p
Enter password: ********
Les caractères '*' représentent votre mot de passe.
Cette méthode est bien plus sûre pour saisir votre mot de passe qu'en le spécifiant
directement en ligne de commande, car il n'est pas visible des autres utilisateurs.
Cependant, cette méthode n'est possible qu'avec les programmes que vous utilisez en
 4.3.8 Garder vos mots de passe en lieu sûr
206

Manuel MySQL 4.1.x ? Version Française
mode interactif. Si vous voulez invoquer le client depuis un script qui s'exécute de manière
non interactive, il n'y aura pas d'opportunité pour saisir ce mot de passe dans le terminal.
Sur certains systèmes, vous pourriez même voir la première ligne de votre script lue et
interprétée comme votre mot de passe, incorrectement.
Stockez votre mot de passe dans le fichier de configuration. Par exemple, vous pouvez lister
• 
votre mot de passe dans la section [client] du fichier  dans votre dossier
personnel :
[client]
password=mot_de_passe
Si vous stockez ce mot de passe dans le fichier  , le fichier ne doit pas être lisible
par le groupe ou par les autres utilisateurs, ou encore accessible en écriture : seul le
propriétaire de ce fichier doit avoir ces droits. Assurez?vous les droits d'accès au fichiers
sont 400 ou 600 . Fichier d'options  .
Vous pouvez stocker votre mot de passe dans la variable d'environnement 
• 
MYSQL_PWD ,
mais cette méthode doit être considérée comme extrêmement peu sûre, et doit être évitée
autant que possible. Certaines versions de la commande en ligne ps incluent une option
pour afficher les variables d'environnement des processus : votre mot de passe sera alors
facilement accessible, et en texte clair, si vous configurez la commande MYSQL_PWD . Même
sur les systèmes sans une telle version de la commande ps , il est peu recommandé de
supposer que les variables d'environnement sont inaccessibles par une méthode
quelconque. Variables d'environnement MySQL .
En conclusion, la méthode la plus sûre est encore de laisser le client vous demander le mot de
passe, ou de le spécifier dans le fichier de configuration  .
4.3.9 Utilisation des connexions sécurisées
4.3.9.1 Introduction aux connexions sécurisées
Disponible depuis la version 4.0.0, MySQL supporte les connexions sécurisées. Pour comprendre
comment MySQL utilise SSL, il est nécessaire de comprendre les concepts SSL et X509 de base.
Ceux qui les connaissent, peuvent aisément sauter ce chapitre.
Par défaut, MySQL utilise une connexion en clair entre le client et le serveur. Cela signifie qu'une
personne peut surveiller votre trafic, et lire les données échangées. Cette personne pourrait aussi
modifier les données qui transitent entre le client et le serveur. Parfois, vous aurez besoin
d'échanger des informations sur un réseau public, mais en sécurisant ces informations. Dans ce
cas, utiliser une connexion sans protection est inacceptable.
SSL est un protocole qui utilise différents algorithmes de chiffrement pour s'assurer que les
données qui transitent par un réseau public peuvent être considérées comme fiables. Ce protocole
dispose de méthodes pour s'assurer que les données n'ont pas été modifiées, ce que soit par une
altération, une perte ou une répétition des données. SSL inclut aussi des algorithmes pour
reconnaître et fournit des outils de vérifications d'identitée, pris en charge par le standard X509.
Le chiffrement est une méthode pour rendre des données illisibles. En fait, les pratiques actuelles
requièrent d'autres éléments de sécurité issus des algorithmes de chiffrement. Ils doivent savoir
résister à de nombreux types d'attaque, comme la modification de l'ordre des messages ou les
répétitions inopinées.
X509 est un standard qui rend possible l'identification d'une personne sur l'internet. Il est
particulièrement utilisé pour les applications e?commerce. En termes simples, il doit y avoir une
 4.3.9 Utilisation des connexions sécurisées
207

Manuel MySQL 4.1.x ? Version Française
entreprise (appelée l'``autorité de certification'') qui assigne un certificat électronique à toute
personne qui en a besoin. Ces certificats utilisent un chiffrement assymétrique qui exploitent deux
clés de chiffrement, une clé publique et une clé privée. Le propriétaire d'un certificat peut prouver
son identité en montrant son certificat à l'autre partie. Un certificat est constitué de la clé publique
du propriétaire. Toute donnée qui est chiffrée avec cette clé publique doit être déchiffrée avec la clé
secrète correspondante, qui est détenue par le propriétaire du certificat.
MySQL n'utilise pas les connexions chiffrées par défaut, car cela ralentit considérablement le
protocole de communication. Toute fonctionnalité supplémentaire requiert du travail supplémentaire
de la part du serveur, et chiffrer des données est une tâche particulièrement coûteuse, qui peut
ralentir considérablement les tâches principales de MySQL. Par défaut, MySQL est paramétré pour
être aussi rapide que possible.
Si vous avez besoin de plus d'informations sur SSL, X509 ou le chiffrement, utilisez votre moteur de
recherche préféré sur Internet, et utilisez ces mots clés pour avoir plus de détails.
4.3.9.2 Pré requis aux connexions sécurisées
Pour faire fonctionner les connexions sécurisées avec MySQL, vous devez disposer de ceci :
Installation de la librairie d'OpenSSL. Nous avons testé MySQL avec OpenSSL 0.9.6.
• 
Configuration de MySQL avec les options 
• 
??with?vio ??with?openssl .
Si vous utilisez une ancienne version de MySQL, vous devez modifier votre table
• 
 , en lui ajoutant les colonnes reliées aux notions SSL. Vous pouvez faire cela
en exécutant le script  . Ceci est nécessaire si vos
tables de droits proviennent d'un version de MySQL antérieure à la version 4.0.0.
Vous pouvez vérifier que vous posséder un serveur 
• 
mysqld qui supporte OpenSSL en
examinant le résultat de la commande SHOW VARIABLES LIKE 'have_openssl' : elle
doit retourner YES .
4.3.9.3 Options de GRANT
MySQL peut vérifier les certificats X509 en plus de la combinaisons habituelle de nom d'utilisateur
et mot de passe. Toutes les options habituelles sont toujours nécessaires (nom d'utilisateur,
masque d'adresse IP, nom de base de données, nom de table).
Voici différentes possibilités pour limiter les connexions :
Sans aucune option SSL ou X509, toutes les connexions chiffrées ou non chiffrées sont
• 
autorisées si le nom d'utilisateur et le mot de passe sont valides.
L'option 
• 
REQUIRE SSL requiert que les connexions soient chiffrées avec SSL. Notez que
cette option peut être omise si il n'y a pas de ligne ACL qui autorise une connexion sans
SSL.
mysql> GRANT ALL PRIVILEGES ON test.* TO root&#64;localhost
    ?> IDENTIFIED BY "goodsecret" REQUIRE SSL;
REQUIRE X509
• 
 impose au client d'avoir un certificat valide, mais le certificat lui même est
de peu d'importance. La seule restriction est qu'il doit être possible de vérifier la signature
avec une des autorités de certification.
mysql> GRANT ALL PRIVILEGES ON test.* TO root&#64;localhost
    ?> IDENTIFIED BY "goodsecret" REQUIRE X509;
REQUIRE ISSUER "issuer"
• 
 restreint les tentatives de connexion : le client doit se
présenter avec un certificat X509 valide, émis par l' autorité de certification "issuer" .
 4.3.9.2 Pré requis aux connexions sécurisées
208

Manuel MySQL 4.1.x ? Version Française
Utiliser un certificat X509 implique obligatoirement des chiffrements, donc l'option SSL est
sous entendue.
mysql> GRANT ALL PRIVILEGES ON test.* TO root&#64;localhost
    ?> IDENTIFIED BY "goodsecret"
    ?> REQUIRE ISSUER "C=FI, ST=Some?State, L=Helsinki,
    "> O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu&#64;";
REQUIRE SUBJECT "subject"
• 
 impose au client d'avoir un certificat X509 valide, avec le
sujet "subject" . Si le client présente un certificat valide, mais que le "subject" est
différent, la connexion est refusée.
mysql> GRANT ALL PRIVILEGES ON test.* TO root&#64;localhost
    ?> IDENTIFIED BY "goodsecret"
    ?> REQUIRE SUBJECT "C=EE, ST=Some?State, L=Tallinn,
    "> O=MySQL demo client certificate,
    "> CN=Tonu Samuel/Email=tonu&#64;";
REQUIRE CIPHER "cipher"
• 
 est utilisé pour s'assurer que les chiffrements sont
suffisamment robuste, et que la bonne longueur de clé est utilisée. SSL lui même peut être
faible si des algorithmes sont utilisés avec des clés courtes. En utilisant cette option, il est
possible d'imposer la méthode de chiffrement avec la connexion.
mysql> GRANT ALL PRIVILEGES ON test.* TO root&#64;localhost
    ?> IDENTIFIED BY "goodsecret"
    ?> REQUIRE CIPHER "EDH?RSA?DES?CBC3?SHA";
Les options SUBJECT , ISSUER et CIPHER peuvent être combinées avec la clause
REQUIRE comme ceci :
mysql> GRANT ALL PRIVILEGES ON test.* TO root&#64;localhost
    ?> IDENTIFIED BY "goodsecret"
    ?> REQUIRE SUBJECT "C=EE, ST=Some?State, L=Tallinn,
    "> O=MySQL demo client certificate,
    "> CN=Tonu Samuel/Email=tonu&#64;"
    ?> AND ISSUER "C=FI, ST=Some?State, L=Helsinki,
    "> O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu&#64;"
    ?> AND CIPHER "EDH?RSA?DES?CBC3?SHA";
Depuis MySQL 4.0.4, le mot clé AND est optionnel, entre les options REQUIRE .L'ordre de
ces options n'a pas d'importance, mais aucune option ne peut être spécifiée deux fois.
4.4 Prévention des désastres et restauration
4.4.1 Sauvegardes de base de données
Comme les tables MySQL sont stockées sous forme de fichiers, il est facile d'en faire une
sauvegarde. Pour avoir une sauvegarde consistante, faites un LOCK TABLES sur les tables
concernées suivi d'un FLUSH TABLESTABLES . Syntaxe de autre threads de continuer à effectuer des requêtes sur les tables dont vous faites la copie des
fichiers dans le dossier des bases de données. FLUSH TABLE est requise pour s'assurer que
toutes les pages d'index actifs soient écrits sur le disque avant de commencer la sauvegarde.
Si vous voulez faire une sauvegarde d'une table avec SQL, vous pouvez utiliser SELECT INTO
OUTFILE ou BACKUP TABLE . Syntaxe des SELECT . Syntaxe de BACKUP TABLE .
Une autre façon de sauvegarder une base de données est d'utiliser l'utilitaire mysqldump ou le
script mysqlhotcopy . mysqlhotcopy , copier les bases et tables MySQL .
Effectuez une sauvegarde complète de votre base de données :
• 
 4.4 Prévention des désastres et restauration
209

Manuel MySQL 4.1.x ? Version Française
shell> mysqldump ??tab=/chemin/vers/un/dossier ??opt ??all
ou
shell> mysqlhotcopy base /chemin/vers/un/dossier
Vous pouvez aussi copier tout simplement tous les fichiers de tables (les fichiers *.frm ,
*.MYD , et *.MYI ) du moment que le serveur ne met rien à jour. Le script mysqlhotcopy
utilise cette méthode.
Arrêtez 
• 
mysqld si il est en marche, puis démarrez le avec l'option
??log?update[=nom_fichier]fournissent les informations dont vous avez besoin pour répliquer les modifications de la
base de données qui sont subséquents au moment où vous avez exécuté mysqldump .
Si vous avez besoin de restaurer quelque chose, essayez d'abord de recouvrer vos tables avec
REPAIR TABLE ou myisamchk ?r en premier. Cela devrait fonctionner dans 99.9% des cas. Si
myisamchk ne réussi pas, essayez la procédure suivante (cela ne fonctionnera que si vous avez
démarré MySQL avec ??log?update , Le log des mises à jour ) :
Restorez le backup original de 
• 
mysqldump .
Exécutez la commande suivante pour remettre en marche les mises à jours dans le log
• 
binaire :
shell> mysqlbinlog hostname?bin.[0?9]* | mysql
Si vous utilisez le journal des mises à jour vous pouvez utiliser :
shell> ls ?1 ?t ?r hostname.[0?9]* | xargs cat | mysql
ls est utilisée pour avoir tous les fichiers de mise à jour dans le bon ordre.
Vous pouvez aussi faire des sauvegardes sélectives avec SELECT * INTO OUTFILE
'nom_fichier' FROM nom_de_table et restaurez avec LOAD DATA INFILE
'nom_fichier' REPLACE ... Pour éviter les lignes dupliquées, vous aurez besoin d'une
PRIMARY KEY ou une clef UNIQUE dans la table. Le mot clef REPLACE fait que les anciens
enregistrements sont remplacés par les nouveaux lorsque l'un d'eux duplique un ancien sur une
valeur de clef unique.
Si vous obtenez des problèmes de performances sur votre système, vous pouvez les contourner en
mettant en place une réplication et faisant les copies sur l'esclave au lieu du maître. Introduction .
Si vous utilisez un système de fichiers Veritas , vous pourrez faire :
A partir d'un client (ou de Perl), exécutez : 
• 
FLUSH TABLES WITH READ LOCK .
A partir d'un autre shell, exécutez : 
• 
mount vxfs snapshot .
Depuis le premier client, exécutez : 
• 
UNLOCK TABLES .
Copiez les fichiers à partir de snapshot.
• 
Démontez snapshot.
• 
4.4.2 Syntaxe de BACKUP TABLE
BACKUP TABLE nom_de_table[,nom_de_table...] TO '/chemin/vers/le/dossier/de/sauvegardes'
Cette commande copie le nombre minimal de fichiers de table dont en a besoin pour la restaurer
vers le dossier de sauvegardes après avoir rafraîchit les changements dans le disque. Cela ne
fonctione actuellement que pour les tables au format MyISAM . Pour les tables MyISAM , elle ne
copie que les fichiers .frm (définition) et .MYD (données), le fichier d'indes pouvant, lui, être
reconstruit à partir des deux autres.
 4.4.2 Syntaxe de BACKUP TABLE
210

Manuel MySQL 4.1.x ? Version Française
Avant d'utiliser cette commande, merci de lire Sauvegardes de base de données .
Pendant la sauvegarde, un verrou de lecture est posé sur chaque table, une par une, lors de leur
copie. Si vous voulez sauvegarder une image instantanée de plusieurs table, vous devez d'abord
exécuter un LOCK TABLES obtenant un verrou de lecture pour chaque table concernée.
La commande retourne une table avec les colonnes suivantes :
Colonne
Valeur
Table
Nom de la table
Op
Toujours ``backup''
Msg_type
status , error , info ou encore warning .
Msg_text
Le message.
Notez que BACKUP TABLE n'est disponible en MySQL que depuis la version 3.23.25.
4.4.3 Syntaxe de RESTORE TABLE
RESTORE TABLE nom_de_table[,nom_de_table...] FROM '/chemin/vers/le/dossier/de/sauvegardes'
Restaure la ou les tables à partir d'une sauvegarde effectuée avec BACKUP TABLE . Les tables
existantes ne seront pas écrasées et dans ce cas là, vous obtiendrez une erreur. La restauration
prendra plus de temps que la sauvegarde à cause de la reconstruction du fichier d'index. Plus vous
avez de clefs, plus la restauration sera longue. Just as BACKUP TABLE , RESTORE TABLE
currently works only for MyISAM tables.
Cette commande retourne un tableau avec les colonnes suivantes :
Colonne
Valeur
Table
Nom de la table
Op
Toujours ``restore''
Msg_type
status , error , info ou encore warning .
Msg_text
Le message.
4.4.4 Syntaxe de CHECK TABLE
CHECK TABLE tbl_name[,tbl_name...] [option [option...]]
option = QUICK | FAST | MEDIUM | EXTENDED | CHANGED
CHECK TABLE ne fonctionne qu'avec les tables MyISAM et InnoDB . Avec les tables MyISAM , c'est
l'équivalent de la commande myisamchk ?m table_name sur la défaut, l'option
MEDIUM est utilisée.
Cette commande vérifie l'intégrité des tables. Pour les tables MyISAM , des statistiques importantes
sont mises à jour. La commande retourne les infomrations suivantes sur la table dans les colonnes
suivantes :
Colonne
Valeur
Table
Nom de la table.
 4.4.3 Syntaxe de RESTORE TABLE
211

Manuel MySQL 4.1.x ? Version Française
Op
Toujours ``check''.
Msg_type
Un des statut status , error , info ou warning .
Msg_text
Le message.
Notez que vous pouvez obtenir de nombreuses lignes d'informations pour chaque table. La dernière
ligne sera du type Msg_type status et doit être normalement OK . Si vous n'obtenez pas de
statut OK ou Not checkedmyisamchk pour maintenir les tables et recouvrir les données . Not checked signifie que la table
a indiqué qu'il n'y a pas de vérification à faire.
Les différents types de vérifications sont les suivants :
Type
Signification
QUICK
N'analyse pas les lignes pour vérifier les liens erronés.
FAST
Ne vérifie que les tables qui n'ont pas été correctement fermées.
Ne vérifie que les tables qui ont changées depuis la dernière vérification, ou bien qui
CHANGED
n'ont pas été correctement fermées.
Analyse les lignes pour s'assurer que les liens effacés sont corrects. Cette option
MEDIUM
calcule aussi la somme de contrôle des lignes, et la vérifie avec la somme de contrôle
des clés.
Fait une vérification complète des liens pour chaque ligne. Cela vérifie que la table est
EXTENDED totalement cohérente, mais cela peut prendre beaucoup de temps.
Pour les tables à format de dynamique de type MyISAM , une vérifiation de table sera toujours
démarrée avec une option de niveau MEDIUM . Pour les tables à format de ligne statique, nous
évitons les niveaux de QUICK et FAST car les lignes sont rarement corrompues.
Vous pouvez combiner les options de vérification comme ceci :
CHECK TABLE test_table FAST QUICK;
L'exemple ci?dessus va simplement faire une vérification de la table, pour s'assurer qu'elle a été
correctement fermée.
Note : dans certains cas, CHECK TABLE va modifier la table! Cela arrive si la table a été marquée
comme 'corrupted' et 'not closed properly' mais CHECK TABLE n'a trouvé aucun problème dans la
table. Dans ce cas, CHECK TABLE va marquer la table comme correcte.
Si une table est corrompue, il est probable que les problèmes sont dans les fichiers d'index et non
pas dans les données. Tous les types de vérifications présentés ci?dessus vérifient les index
soigneusement, et ils devraient trouver la plupart des erreurs.
Si vous voulez simplement vérifier une table que vous supposez correcte, vous pouvez n'utiliser
aucune option, ou l'option QUICK . Cette dernière peut aussi être utilisée si vous êtes pressé, et que
vous pouvez prendre le risque minime que QUICK ne trouve pas d'erreur dans votre fichier. Dans la
plupart des cas, MySQL doit trouver toutes les erreurs de données, pour un usage normal. Si cela
arrive, alors la table est marquée comme 'corrupted', auquel cas, la table ne pourra pas être utilisée
tant qu'elle n'a pas été réparée).
FAST et CHANGED sont surtout destinées à être utilisées depuis un script : par exemple, il peut être
exécuté depuis une tâche cron , si vous voulez vérifier la table de temps en temps. Dans la plupart
des cas, l'option FAST doit être préférée à CHANGED : le seul cas ou vous pourriez préferez
CHANGED est lorsque vous soupsonnez avoir trouvé un bogue dans les tables MyISAM .
 4.4.3 Syntaxe de RESTORE TABLE
212

Manuel MySQL 4.1.x ? Version Française
EXTENDED ne doit être utilisé qu'après une vérification normale, et que vous obtenez toujours des
erreurs étranges lorsque MySQL essaie de modifier une ligne ou trouve une ligne avec clé (ce qui
est très rare, si une vérification a réussie).
Certains problèmes rapportés par la commande CHECK TABLE , ne peuvent être corrigés
automatiquement :
Found row where the auto_increment column has the value 0
• 
 .Cela signifie
que vous avez dans votre table une ligne qui contient la valeur 0 alors qu'elle est de type
AUTO_INCREMENT . (Il est possible de créer une ligne où la colonne AUTO_INCREMENT vaut
0 en spécifiant explicitement la valeur 0 dans la colonne avec la commande UPDATE .
Ce n'est pas une erreur en soit, mais cela peut poser des problèmes si vous décidez de
sauver cette table dans un fichier texte, et de la restaurer, ou encore d'appliquer la
commande ALTER TABLE sur la table. Dans ce cas, la colonne AUTO_INCREMENT va
changer automatiquement de valeur, en suivant les règles des colonnes de type
AUTO_INCREMENT , qui vont causer un problème de clé doublon.
Pour se débarasser de cette alerte, vous devez utiliser une commande UPDATE surla table,
pour mettre une valeur différente de 0 dans cette colonne.
4.4.5 Syntaxe de REPAIR TABLE
REPAIR TABLE tbl_name[,tbl_name...] [QUICK] [EXTENDED] [USE_FRM]
REPAIR TABLE ne fonctionne que les tables de type MyISAM , et c'est l'équivalent de la commande
en ligne myisamchk ?r table_name .Normalement, vous n'avez pas à exécuter cette
commande, mais si une catastrophe vous frappe, vous êtes presque assurés de retrouver vos
données dans les tables MyISAM, avec la commande REPAIR TABLE . Si vos tables sont souvent
constamment . Problèmes avec les tables MyISAM .
REPAIR TABLE répare autant que possible les tables corrompues. La commande retourne la table
suivante :
Colonne
Valeur
Table
Nom de la table
Op
Toujours ``repair''
Msg_type
Un des statut status , error , info ou warning .
Msg_text
Le message.
Notez que vous pourriez obtenir de nombreux messages pour chaque table. La dernière ligne doit
être du format Msg_type status et doit être normalement OK . Si vous n'obtenez pas OK , vous
devez essayer de réparer votre table avec la commande myisamchk ?o , car REPAIR TABLE de
supporte pas encore toutes les options de myisamchk . Dans un futur proche, nous allons rendre
cette commande encore plus souple.
Si l'option QUICK est fournie, alors MySQL va essayer de ne réparer que le fichier d'index.
Si vous utilisez l'option EXTENDED , alors MySQL va essayer de créer l'index ligne par ligne, au lieu
de créer un index à la fois, par tri. C'est une méthode qui peut s'avérer plus efficace que de trier sur
des clés de taille fixe, si vous avez des clés CHAR longues qui se compressent bien. Ce type de
 4.4.5 Syntaxe de REPAIR TABLE
213

Manuel MySQL 4.1.x ? Version Française
réparation est l'équivalent de myisamchk ??safe?recover .
Depuis MySQL 4.0.2, il existe le mode USE_FRM pour REPAIR . Utilisez?le si le fichier .MYI
manque, ou si son entête est corrompu. Avec ce mode, MySQL va recréer la table, en utilisant les
informations dans le fichier .frm . Ce type de réparation ne peut pas être fait avec myisamchk .
4.4.6 Utilisation de myisamchk pour la maintenance des tables et leur
recouvrement

A partir de la version 3.23.13 de MySQL, vous pouvez vérifier vos tables MyISAM avec la
commande CHECK TABLEcommande REPAIR TABLE . Syntaxe de REPAIR TABLE .
Pour vérifier/réparer les tables MyISAM ( .MYI et .MYD ) vous devez utiliser l'utilitaire myisamchk .
Pour vérifier/réparer les tables ISAM ( .ISM et .ISD ) vous devez utiliser l'utilitaire isamchk .
Types de tables MySQL .
Dans ce qui suit, nous allons parler de myisamchk , mais tout s'applique aussi à l'ancien isamchk
.
Vous pouvez utiliser l'utilitaire myisamchk pour obtenir des informations à propos des tables de la
base de données, les vérifier et réparer, ou les optimiser. La section suivante décrit comment
invoquer myisamchk (incluant une description de ses options), comment mettre en place un
planificateur de maintenance, et comment utiliser les différentes fonctionnalités de myisamchk .
Vous pouvez, dans la plupart des cas, utiliser la commande OPTIMIZE TABLES pour optimiser et
réparer les tables, mais ce n'est ni aussi rapide, ni aussi sûr (en cas d'erreurs fatales réelles) que
myisamchk . D'un autre côté, OPTIMIZE TABLE est plus facile à utiliser et vous n'avez pas besoin
de vous occuper de libérer les tables. Syntaxe de OPTIMIZE TABLE .
Même si la réparation de myisamchk est assez sécurisée, il est toujours bon de créer une
sauvegarde avant d'effectuer les réparations (ou quoi que ce soit qui puisse entraîner de grosses
modifications sur la table)
4.4.6.1 Syntaxe de l'utilitaire myisamchk
myisamchk s'exécute avec une commande de la forme :
shell> myisamchk [options] tbl_name
Les options spécifient ce que vous voulez que myisamchk fasse. Elles sont décrites dans ce
chapitre. Vous pouvez aussi obtenir une liste d'options en invoquant le programme avec
myisamchk ??help . Sans option, myisamchk va simplement vérifier les tables. Pour obtenir
plus d'information ou pour demander à myisamchk de prendre des mesures correctives, il faut
ajouter l'une des options listées ici. tbl_name est la table que vous voulez réparer ou vérifier. Si
vous exécutez myisamchk autre part que dans le dossier de données, vous devez spécifier le
chemin jusqu'au fichier, car sinon, myisamchk n'aura aucune idée d'où chercher les données dans
votre base. En fait, myisamchk ne se préoccupe pas du fait que le fichier que vous utilisez est dans
le dossier de base ou pas : vous pouvez copier le fichier à réparer dans un autre dossier, et y faire
les opérations d'entretien.
 4.4.6 Utilisation de myisamchk pour la maintenance des tables et leur recouvrement
214

Manuel MySQL 4.1.x ? Version Française
Vous pouvez spécifier plusieurs noms de tables à myisamchk si vous le voulez. Vous pouvez aussi
spécifier un nom sous la forme d'un fichier d'index (avec l'option .MYI ), qui vous permettra de
spécifier toutes les tables dans un dossier en utilisant le schéma *.MYI . Par exemple, si vous êtes
dans le dossier de données, vous pouvez spécifier toutes les tables dans le dossier comme ceci :
shell> myisamchk *.MYI
Si vous n'êtes pas dans le dossier de données, et que vous souhaitez vérifier toutes les tables,
vous devez ajouter le chemin jusqu'au dossier :
shell> myisamchk /path/to/database_dir/*.MYI
Vous pouvez même vérifier toutes les tables de toutes les bases avec le chemin suivant :
shell> myisamchk /path/to/datadir/*/*.MYI
La méthode recommandée pour vérifier rapidement toutes les tables est :
myisamchk ??silent ??fast /path/to/datadir/*/*.MYI
isamchk ??silent /path/to/datadir/*/*.ISM
Si vous voulez vérifier toutes les tables et réparer celles qui sont corrompues, vous pouvez utiliser
la ligne suivante :
myisamchk ??silent ??force ??fast ??update?state ?O key_buffer=64M \
          ?O sort_buffer=64M ?O read_buffer=1M ?O write_buffer=1M \
          /path/to/datadir/*/*.MYI
isamchk ??silent ??force ?O key_buffer=64M ?O sort_buffer=64M \
        ?O read_buffer=1M ?O write_buffer=1M /path/to/datadir/*/*.ISM
La commande ci?dessus suppose que vous avez plus de 64 Mo de libres.
Notez que si vous obtenez une erreur comme celle?ci :
myisamchk: warning: 1 clients is using or hasn't closed the table properly
Cela signifie que vous essayez de vérifier une table qui a été modifiée par un autre programme
(comme le serveur mysqld ) qui n'a pas encore refermé le fichier de table, ou que le fichier n'a pas
été correctement refermé.
Si mysqld fonctionne, vous devez forcer la fermeture correcte des fichiers de tables avec la
commande FLUSH TABLES , et vous assurer que personne n'utilise les tables durant vos
opérations avec myisamchk . En MySQL version 3.23, la meilleure méthode pour éviter ce
problème est d'utiliser la commande CHECK TABLE au lieu de myisamchk pour vérifier les tables.
4.4.6.2 Options générales de myisamchk
myisamchk supporte les options suivantes :
?# or ??debug=debug_options
Affiche le log de débogage. La chaîne debug_options vaut souvent :
'd:t:o,filename' .
?? or ??help
Affiche le message d'aide, et termine le programme.
?O var=option, ??set?variable var=option
Spécifie la valeur d'une variable. Notez bien que ??set?variable est obsolète
depuis MySQL 4.0, il suffit désormais d'utiliser ??var=option . Les variables
disponibles et leur valeurs par défaut sont accessibles avec la commande
myisamchk ??help :
Variable
Valeur
key_buffer_size
523264
 4.4.6.2 Options générales de myisamchk
215

Manuel MySQL 4.1.x ? Version Française
read_buffer_size
262136
write_buffer_size
262136
sort_buffer_size
2097144
sort_key_blocks
16
decode_bits
9
sort_buffer_size est utilisée pour la réparation de clés, en les triant, ce qui est
le cas par défaut avec l'option ??recover .
key_buffer_size est utilisée lorsque vous vérifiez une table avec l'option
??extended?check ou lorsque les clés sont réparées par insertion des clés ligne
par ligne (comme lors des insertions normales). La réparation via le buffer de clé est
utilisée dans les situations suivantes :
Si vous utilisez l'option ??safe?recover .
Si les fichiers temporaires où il faut trier les clés, seront deux fois plus grands
que lors de la création direct du fichier de clé. C'est souvent le cas lorsque
vous avez de grandes colonnes de type CHAR , VARCHAR ou TEXT car le tri
doit stocker la valeur totale de la colonne durant l'opération. Si vous avez
beaucoup d'espace disque temporaire, et que vous pouvez forcer
myisamchk à réparer avec la méthode de tri, vous pouvez utiliser l'option
??sort?recover .
La réparation avec la méthode du buffer de clé prend bien moins d'espace disque
que d'utiliser le tri, mais c'est aussi bien plus lent.
Si vous voulez une réparation plus rapide, donnez à la variable ci?dessus la valeur
du quart de votre mémoire disponible. Vous pouvez donner de grandes valeurs aux
deux variables, car seul un des deux tampons décrits sera utilisé.
?s or ??silent
Mode silencieux. N'affiche que les erreurs. Vous pouvez utiliser deux fois cette
option ( ?ss ) pour rendre myisamchk très silencieux.
?v or ??verbose
Mode détaillé. Affiche beaucoup de détails sur les opérations en cours. Vous pouvez
l'utiliser avec les options ?d et ?e . Utilisez ?v plusieurs fois pour avoir encore plus
d'informations ( ?vv , ?vvv )!
?V or ??version
Affiche la version de myisamchk et s'arrête.
?w or, ??wait
Au lieu d'afficher une erreur si la table est verrouillée, attend jusqu'à ce que la table
soit libre avant de continuer. Notez que si vous utilisez mysqld avec l'option
??skip?external?locking , la table ne pourra être verrouillée que par une autre
commande myisamchk .
4.4.6.3 Options de vérifications pour myisamchk
?c ou ??check
Vérifie les erreurs d'une table. Ceci est l'opération par défaut de myisamchk si vous
ne lui donnez aucune autre option.
?e ou ??extend?check
Vérifie la table minutieusement (ce qui est un peu lent si vous avez des index). Cette
option ne doit être utilisée que pour les cas extrèmes. Normalement, myisamchk ou
myisamchk ??medium?check devrait, dans la plupart des cas, être capable de
trouver s'il y'a des erreurs dans la table.
 4.4.6.3 Options de vérifications pour myisamchk
216

Manuel MySQL 4.1.x ? Version Française
Si vous utilisez ??extended?check et que vous avez beaucoup de mémoire, vous
devez augmenter de beaucoup la valeur de key_buffer_size !
?F ou ??fast
Ne vérifie que les tables qui n'ont pas été fermées proprement.
?C ou ??check?only?changed
Ne vérifie que les tables qui ont changé depuis la dernière vérification.
?f ou ??force
Redémarrez myisamchk avec ?r (répare) sur la table, si myisamchk trouve une
erreur dans la table.
?i ou ??information
Affiche des statistiques à propos de la table vérifiée.
?m ou ??medium?check
Plus rapide que extended?check, mais ne trouve que 99.99% des erreurs. Devrait,
cependant, être bon pour la plupart des cas.
?U ou ??update?state
Enregistre dans le fichier .MYI lorsque la table à été vérifiée ou a crashé. Cela
devrait être utilisé pour tirer tous les avantages de l'option
??check?only?changed , mais vous ne devez pas utiliser cette option si le
serveur mysqld utilise cette table et que vous utilisez mysqld avec
??skip?external?locking .
?T ou ??read?only
Ne marque pas la table comme vérifiée. C'est pratique si vous utilisez myisamchk
pour vérifier une table issue d'une autre application qui n'utilise pas les verrous.
(comme mysqld ??skip?external?locking ).
4.4.6.4 Options de réparation de myisamchk
Les options suivantes sont utilisées avec myisamchk et l'option de réparation ?r ou ?o :
?D # ou ??data?file?length=#
Taille maximale du fichier de données (lors de la recréation du fichier de données, et
qu'il est 'complet').
?e ou ??extend?check
Essaie de retrouver toutes les lignes possibles du fichier de données. Normalement,
cette option va aussi découvrir beaucoup de ligne erronées. N'utilisez pas cette
option si vous n'êtes pas totalement desespéré.
?f ou ??force
Ecrase les anciens fichiers temporaires (  ) au lieu d'annuler.
?k # ou keys?used=#
Si vous utilisez les tables ISAM, indique au gestionnaire de table ISAM qu'il doit
uniquement modifier les # premiers index. Si vous utilisez le gestionnaire de table
MyISAM , cette option indique quelles clés utiliser, et chaque bit binaire représente
une clé (la première clé est le bit 0). Cela permet de réaliser des insertions plus
rapides. Les index désactivés pourront être réactivés avec l'option myisamchk ?r .
?l ou ??no?symlinks
Ne pas suivre les lignes symboliques. Normalement, myisamchk répare les tables
qu'un lien symbolique représente. Cette option n'existe pas en MySQL 4.0, car
MySQL 4.0 ne va pas supprimer les liens symboliques durant la réparation.
?r ou ??recover
Peut réparer presque tout, sauf les clés uniques qui ne le sont plus (ce qui est
extrêmement rare avec les tables ISAM/MyISAM). Si vous voulez restaurer un table,
c'est l'option à utiliser en premier. Si myisamchk indique que la table ne peut pas être
corrigée avec l'option ?r , vous pouvez alors passer à l'option ?o . Notez que dans le
 4.4.6.4 Options de réparation de myisamchk
217

Manuel MySQL 4.1.x ? Version Française
cas rarissime où ?r , le fichier de données est toujours intact. Si vous avez
beaucoup de mémoire, vous pouvez augmenter la taille du buffer
sort_buffer_size !
?o ou ??safe?recover
Utilise une ancienne méthode de restauration (lit toutes les lignes dans l'ordre, et
modifie l'arbre d'index conformément pour les lignes trouvées). C'est une méthode
qui est beaucoup plus lente que l'option ?r , mais elle est capable de traiter
certaines situations exceptionnelles que ?r ne pourrait pas traiter. Cette méthode
utilise aussi moins d'espace disque que ?r . Normalement, vous devriez commencer
à réparer avec l'option ?r , et uniquement sur l'échec de cette option, passer à ?o .Si
vous avez beaucoup de mémoire, vous devriez augmenter la taille du buffer de clé !
key_buffer_size !
?n ou ??sort?recover
Force myisamchk à utiliser le tri pour résoudre les clés, même si le fichier
temporaire doit être énorme.
??character?sets?dir=...
Dossier qui contient les jeux de caractères.
??set?character?set=name
Change le jeu de caractères utilisé par l'index.
?t ou ??tmpdir=path
Chemin pour stocker les fichiers temporaires. Si cette option n'est pas fournie,
myisamchk va utiliser la variable d'environnement TMPDIR pour cela.
?q ou ??quick
Réparation rapide, sans modifier le fichier de données. Il est possible d'ajouter
l'option ?q pour forcer myisamchk à modifier le fichier original en cas de clés
doublons.
?u ou ??unpack
Décompresse des données compressées avec myisampack.
4.4.6.5 Autres options de myisamchk
Les autres actions que myisamchk peut réaliser, en dehors de vérifier et réparer une table sont :
?a or ??analyze
Analyser la distribution des clés. Cela améliore les performances des jointures en
permettant à l'optimiseur de jointure de mieux choisir l'ordre d'utilisation des clés.
myisamchk ??describe ??verbose table_name' ou SHOW KEYS dans
MySQL.
?d or ??description
Affiche des informations sur la table.
?A or ??set?auto?increment[=value]
Force AUTO_INCREMENT à commencer avec une valeur supérieure. Si aucune
valeur n'est fournie, la prochaien valeur de la colonne AUTO_INCREMENT sera la plus
grande valeur de la colonne +1.
?S or ??sort?index
Trie les blocs de l'arbre d'index dans l'ordre haut?bas. Cela va optimiser les
recherches, et les scans de tables par clés.
?R or ??sort?records=#
Trie les lignes en fonction de l'index. Cela rassemble vos données, et peut accélérer
les lectures de lignes par intervalle avec SELECT et ORDER BY sur cet index (ce tri
peut être TRES lent la première fois). Pour connaitre les numéros d'index de tables,
utilisez la commande SHOW INDEX , qui affiche les index dans le même ordre que
myisamchk ne les voit. Les index sont numérotés à partir de 1.
 4.4.6.5 Autres options de myisamchk
218

Manuel MySQL 4.1.x ? Version Française
4.4.6.6 Utilisation de la mémoire par myisamchk
L'espace mémoire est très important quand vous utilisez myisamchk . myisamchk n'utilise pas
plus de mémoire que ce que vous spécifiez avec les options ?O . Si vous pensez utiliser
myisamchk sur des fichiers très grands, vous devez d'abord décider la quantité de mémoire que
vous souhaitez utiliser. Avec des valeurs plus grandes, vous pouvez accélérer myisamchk . Par
exemple, si vous avez plus de 32 Mo de RAM, vous pourriez utiliser les options suivantes (en plus
des autres options que vous pourriez spécifier) :
shell> myisamchk ?O sort=16M ?O key=16M ?O read=1M ?O write=1M ...
Utiliser ?O sort=16M sera probablement suffisant pour la plupart des cas.Soyez conscient que
myisamchk utilise des fichiers temporaires dans le dossier TMPDIR . Si TMPDIR est un fichier en
mémoire, vous pourriez facilement rencontrer des erreurs de mémoire. Si cela arrive, choisissez
une autre valeur pour TMPDIR , avec plus d'espace disque, et redémarrez myisamchk .
Lors de la réparation, myisamchk va aussi avoir besoin d'espace disque :
Doublez la taille du fichier de données (l'original plus une copie). Cet espace n'est pas
• 
nécessaire si vous faites des réparations de type ??quick , car dans ce cas, seul le fichier
d'index sera recréé. Cet espace est nécessaire sur le même disque que l'original !
De l'espace pour le nouveau fichier d'index qui remplacera l'ancien. L'ancien fichier d'index
• 
est réduit dès le démarrage, ce qui vous permet généralement d'ignorer cet espace. Cet
espace est nécessaire sur le même disque que l'original !
Lorsque vous utilisez les options 
• 
??recover ou ??sort?recover (mais pas lorsque vous
utilisez ??safe?recover ), vous aurez besoin d'espace pour le buffer de tri :
(plus_grande_cle + taille_du_pointeur_de_ligne)*nombre_de_lignes * 2
. Vous pouvez vérifier la taille des clés et la taille du pointeur de ligne avec la commande
myisamchk ?dv table . Cet espace est alloué sur le disque temporaire (spécifié par
TMPDIR par ??tmpdir=# ).
Si vous avez des problèmes avec l'espace disque durant la réparation, vous pouvez utiliser l'option
??safe?recover au lieu de ??recover .
4.4.6.7 Utiliser myisamchk pour restaurer une table
Si vous utilisez mysqld avec l'option ??skip?external?locking (qui est la configuration par
défaut pour certains systèmes, comme Linux), vous ne pouvez pas utiliser myisamchk pour vérifier
une table, lorsque mysqld utilise aussi la table. Si vous pouvez être sûr que personne n'utilise cette
table via mysqld lorsque vous utilisez myisamchk , vous n'aurez qu'à utiliser la commande
mysqladmin flush?tables avant de commencer à vérifier les tables. Si vous ne pouvez pas
garantir cette condition, vous devez alors éteindre le serveur mysqld pour vérifier les tables. Si
vous exécutez myisamchk alors que mysqld modifie la table, vous pourriez obtenir un diagnostic
de corruption de la table, alors que ce n'est pas le cas.
Si vous n'utilisez pas l'option ??skip?external?locking , vous pouvez vous servir de
myisamchk pour vérifier les tables à tout moment. Pendant que vous le faites, les autres clients qui
tentent de modifier la table devront attendre que myisamchk ait fini.
Si vous utilisez myisamchk pour réparer ou optimiser les tables, vous devez toujours vous assurer
que mysqld n'utilise pas cette table (ce qui s'applique aussi si vous utilisez
??skip?external?locking ). Si vous n'éteignez pas le serveur mysqld , vous devez au moins
utiliser mysqladmin flush?tables avant de lancer myisamchk . Vos tables peuvent être
corrompues
 si le serveur et myisamchk travaillent dans une même table simultanément.
 4.4.6.6 Utilisation de la mémoire par myisamchk
219

Manuel MySQL 4.1.x ? Version Française
Ce chapitre décrit comment vérifier et gérer les corruptions de données dans les bases MySQL. Si
vos tables sont fréquemment corrompues, vous devriez commencer par en rechercher la raison !
Que faire si MySQL crashe constamment .
La section sur les tables MyISAM contient différentes raisons pour lesquelles une table peut être
corrompue. Problèmes avec les tables MyISAM .
Lorsque vous effectuez une restauration de table, il est important que chaque table tbl_name dans
une base corresponde aux trois fichiers dans le dossier de base, du dossier de données :
Fichier
Utilisation
Définition de la table
Fichier de données
Fichier d'index
Chacun de ces trois fichiers est sujet à des corruptions diverses, mais les problèmes surviennent
généralement dans les fichiers de données ou d'index.
myisamchk fonctionne en créant une copie du fichier .MYD (les données), ligne par ligne. Il termine
sa réparation en supprimant l'ancien fichier .MYD et en renommant le nouveau à la place de
l'ancien. Si vous utilisez l'option ??quick , myisamchk ne crée pas de fichier temporaire mais
suppose plutôt que le fichier .MYD est correct et il génère simplement un nouveau fichier d'index
sans toucher au fichier .MYD . C'est une méthode sécuritaire, car myisamchk va automatiquement
détecter si le fichier .MYD est corrompu, et annulera alors la réparation si c'est le cas. Vous pouvez
aussi ajouter deux options ??quick à myisamchk . Dans ce cas, myisamchk ne s'interrompt pas
sur certaines erreurs (comme des clés doublons), et essaie de résoudre ce problème en modifiant
le fichier .MYD . Normalement, l'utilisation de deux options ??quick n'est utile que si vous n'avez
pas trop d'espace disque pour réaliser la réparation. Dans ce cas, vous devez au moins faire une
copie de sauvegarde avant d'utiliser myisamchk .
4.4.6.8 Comment vérifier la cohérence d'une table
Pour vérifier les tables de type MyISAM, utilisez les commandes suivantes :
myisamchk nom_de_table
Cette commande trouvera 99.99% de toutes les erreurs. Ce qu'elle ne peut pas
découvrir comme erreurs, sont celles qui impliquent uniquement le fichier de
données (ce qui est très inhabituel). Si vous voulez vérifier une table, vous devriez
utiliser l'utilitaire myisamchk sans les options ou avec les options ?s ou ??silent .
myisamchk ?m nom_de_table
Cette commande trouvera 99.999% de toutes les erreurs. Elle vérifie toutes les
entrées dans le fichier d'index, puis lit toutes les lignes. Elle calcule une somme de
contrôle pour toutes les clés et les lignes, et vérifie que les deux se correspondent
dans l'arbre d'index.
myisamchk ?e nom_de_table
Cette commande fait une vérification complète et exhaustive de toutes les données (
?e signifie ``extended check''). Elle fait une lecture de contrôle de chaque ligne, pour
vérifier qu'elle correspond bien aux index. Cette commande va prendre un long
moment sur les grosses tables. myisamchk va normalement s'arrêter dès qu'il
trouve une erreur. Si vous voulez obtenir plus d'information sur cette erreur, vous
pouvez utiliser l'option ??verbose (ou ?v ). Cela fera que myisamchk va continuer
à travailler et accumuler jusqu'à 20 erreurs. En utilisation normale, l'utilisation de cet
utilitaire sans options est suffisante.
myisamchk ?e ?i nom_de_table
 4.4.6.8 Comment vérifier la cohérence d'une table
220

Manuel MySQL 4.1.x ? Version Française
Comme les commandes précédentes, mais l'option ?i indique à myisamchk qu'il
doit afficher des informations statistiques.
4.4.6.9 Comment réparer des tables
Dans la section présente, nous allons uniquement parler de l'utilitaire myisamchk sur les tables
MyISAM (extensions .MYI et .MYD ). Si vous utilisez les tables ISAM (extensions .ISM et .ISD ),
vous devriez vous servir de isamchk à la place.
Depuis MySQL version 3.23.14, vous pouvez réparer les tables MyISAM avec la commande SQL
REPAIR TABLE . Syntaxe de REPAIR TABLE .
Les symptômes de corruption de tables sont des requêtes qui s'interrompent inopinément :
• 
 locked against change :  est verrouillée en écriture
Can't find file 
• 
 (Errcode: ###) : Impossible de trouver le fichier
 (Errcode: ###)
Unexpected end of file : Fin de fichier inattendue
• 
Record file is crashed : Fichier de données crashé
• 
Got error ### from table handler : Reception de l'erreur ### de la part du gestionnaire de
• 
tablePour obtenir plus d'informations sur l'erreur, vous pouvez exécuter la commande
perror ### . Voici les erreurs les plus courantes :
shell> perror 126 127 132 134 135 136 141 144 145
126 = Index file is crashed / Wrong file format : le fichier d'index est corrompu / le format du fichier est incorrect.
127 = Record?file is crashed : le fichier de données est corrompu.
132 = Old database file / ce fichier provient d'une vieille base de données.
134 = Record was already deleted (or record file crashed) / La ligne était déjà effacée.
135 = No more room in record file / Plus de place dans le fichier de données.
136 = No more room in index file / Plus de place dans le fichier d'index.
141 = Duplicate unique key or constraint on write or update / Doublon pour une clé unique trouvé durant la lecture ou l'écriture.
144 = Table is crashed and last repair failed / la table est corrompue et la dernière réparation a échoué.
145 = Table was marked as crashed and should be repaired / La table a été marquée comme corrompue et doit être réparée.
Notez que l'erreur 135, "no more room in record file", n'est pas une erreur qui sera facile à
corriger. Dans ce cas, vous devez utiliser la commande suivante :
ALTER TABLE table MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;
Dans d'autres cas, vous devrez réparer vos tables. myisamchk peut généralement détecter et
corriger la plupart des erreurs.
Le processus de réparation se déroule en 4 étapes décrites ici. Avant de vous lancer, vous devriez
vous placer dans le dossier de données et vérifier les permissions des fichiers de données.
Assurez?vous qu'ils sont bien lisibles par l'utilisateur Unix que MySQL utilise (et à vous aussi, car
vous aurez besoin d'accéder à ces fichiers durant la vérification. Si vous devez corriger ces fichiers,
vous aurez aussi besoin des droits d'écriture.
Si vous utilisez MySQL version 3.23.16 et plus récent, vous pouvez (et vous devriez) utiliser les
commandes CHECK et REPAIR pour réparer vos tables MyISAMSyntaxe de REPAIR TABLE .
La section du manuel sur l'entretien des tables inclut la présentation des options des utilitaires
isamchk / myisamchkdonnées .
La section suivante est destinée aux cas où les commandes ci?dessus ont échoué ou que vous
voulez exploiter les fonctionnalités avancées que isamchk / myisamchk proposent.
 4.4.6.9 Comment réparer des tables
221

Manuel MySQL 4.1.x ? Version Française
Si vous allez réparer une table en ligne de commande, il est recommandé d'arrêter le serveur
mysqld . Notez que lorque vous exécutez une commande mysqladmin shutdown sur un serveur
distant, le serveur mysqld sera encore opérationnel pendant un instant après que mysqladmin ait
terminé, jusqu'à ce que toutes les requêtes et toutes les clés aient été écrites sur le disque.
Etape 1 : Vérifier vos tables
Exécutez la commande myisamchk *.MYI ou myisamchk ?e *.MYI si vous avez plus de
temps. Utilisez ?s (silencieux) pour supprimer les informations peu pertinentes.
Si le serveur mysqld a terminé, vous devriez utiliser l'option ??update pour indiquer à myisamchk
d'enregistrer la vérification des tables ('checked').
Vous n'aurez à réparer que les tables pour lesquelles myisamchk vous annonce une erreur. Pour
de telles tables, passez à l'étape 2.
Si vous obtenez des erreurs étranges lors de la vérification, (comme, l'erreur out of memory ), ou
si myisamchk crashe, passez à l'étape 3.
Etape 2 : réparation simple et facile
Note : Si vous voulez réparer très rapidement, vous devriez ajouter ?O sort_buffer=# ?O
key_buffer=# (où # vaut environ le quart de la mémoire du serveur), à toutes les commandes
isamchk/myisamchk .
Premièrement, essayez myisamchk ?r ?q tbl_name ( ?r ?q signifie ``mode de réparation
rapide''). Cette commande va tenter de réparer le fichier d'index sans toucher au fichier de données.
Si le fichier de données contient toutess les données qu'il est sensé contenir, et que les points
d'ancrage pour les effacements sont corrects, cette commande doit réussir, et la table sera alors
réparée. Passez alors à la table suivante. Sinon, suivez la procédure suivante :
Faites une copie de sauvegarde de votre fichier de données.
• 
Utilisez la commande 
• 
myisamchk ?r tbl_name ( ?r signifie ``mode de réparation'').
Cette commande va supprimer les lignes invalides et effacer ces lignes du fichier de
données, puis reconstruire le fichier d'index.
Si l'instruction précédente a échoué, utilisez 
• 
myisamchk ??safe?recover tbl_name .
Le mode restauration sécuritaire utilise une vieille méthode de réparation qui peut gérer
certains cas rares, mais elle est bien plus lente.
Si vous obtenez des erreurs étranges lors de la répaaration (comme des erreurs de type out of
memory ), ou si myisamchk crashe, passez à l'étape 3.
Etape 3 : Réparations difficiles
Nous ne devriez atteindre cette étape que si les 16 premiers ko du fichier d'index sont détruits, ou
qu'il contient des données erronées, ou si le fichier d'index manque. Dans ce cas, il est nécessaire
de créer un nouveau fichier d'index. Faites ceci :
Déplacez le fichier de données dans une archive sûre.
• 
Utilisez le fichier description de la table pour créer de nouveaux fichiers de données et
• 
d'index vides.
shell> mysql db_name
mysql> SET AUTOCOMMIT=1;
mysql> TRUNCATE TABLE table_name;
mysql> quit
 4.4.6.9 Comment réparer des tables
222

Manuel MySQL 4.1.x ? Version Française
Si votre version SQL ne dispose pas de TRUNCATE TABLE , utilisez la commande DELETE
FROM table_name .
Copiez l'ancien fichier de données à la place du nouveau fichier de données (ne faites pas
• 
un simple déplacement de fichier. Utilisez une copie, au cas où un problème surviendrait).
Retournez à l'étape 2. myisamchk ?r ?q doit alors fonctionner (et ceci ne doit pas être une
boucle infinie).
Depuis MySQL 4.0.2, vous pouvez aussi utiliser REPAIR ... USE_FRM qui effectue toute cette
opération automatiquement.
Etape 4 : Réparation très difficiles
Vous ne devriez atteindre cette étape que si votre fichier de description a aussi crashé. Cela ne
devrait jamais arriver, car le fichier de description n'est jamais modifié une fois que la table est
créée.
Restaurez le fichier de description avec une sauvegarde, et retournez à l'étape 3. Vous
• 
pouvez aussi restaurer le fichier d'index et retourner à l'étape 2. Dans ce dernier cas, vous
pouvez démarrer avec l'option myisamchk ?r .
Si vous n'avez pas de sauvegarde, mais que vous savez exactement comment la table a été
• 
créée, vous pouvez créer une telle table dans une autre base. Supprimez alors le nouveau
fichier de données, puis déplacez les fichiers de description et d'index dans votre base de
données crashée. Cela vous donnera un nouveau fichier d'index et de description.
Retournez à l'étape 2 et essayez de reconstruire le fichier d'index.
4.4.6.10 Optimisation de tables
Pour réorganiser les lignes fragmentées et éliminer l'espace perdu par les effacements et les
modifications de lignes, vous pouvez exécuter l'utilitaire myisamchk en mode de restauration :
shell> myisamchk ?r tbl_name
Vous pouvez optimiser une table de la même façon que vous le faîtes avec la commande SQL
OPTIMIZE TABLE . OPTIMIZE TABLE effectue une réparation de la table, et une analyse des
index, puis trie l'arbre d'index pour accélérer les recherches de clés. L'utilisation de la commande
réduit aussi les interférences entre le serveur et l'utilitaire car c'est le serveur lui?même qui fait le
travail. Syntaxe de OPTIMIZE TABLE .
myisamchk dispose aussi d'un grand nombre d'options que vous pouvez utiliser pour améliorer les
performances de la table :
?S
•   , ??sort?index
?R index_num
• 
 , ??sort?records=index_num
?a
•   , ??analyze
Pour une description complète de ces options, Syntaxe d'invocation de myisamchk .
4.4.7 Mettre en place un régime d'entretien de MySQL
Depuis MySQL version 3.23.13, vous pouvez vérifier les tables de type MyISAM avec la commande
CHECK TABLE . Syntaxe de CHECK TABLE . Vous pouvez aussi réparer les tables avec la
 4.4.6.10 Optimisation de tables
223

Manuel MySQL 4.1.x ? Version Française
commande REPAIR TABLE . Syntaxe de REPAIR TABLE .
C'est une bonne idée que d'effectuer des vérifications des tables régulièrement, plutôt que
d'attendre qu'un problème survienne. Pour faire ces vérifications, vous pouvez utiliser la commande
myisamchk ?s . L'option ?s (raccourci pour ??silent ) fait que myisamchk s'exécute en mode
silencieux, et n'affiche que les messages d'erreurs.
C'est aussi une bonne idée que de vérifier les tables lorsque le serveur démarre. Par exemple, à
chaque fois qu'une machine redémarre au milieu d'une modification de table, vous devrez faire une
vérification de toutes les tables qui pourraient être affectées : c'est une ``table supposéement
corrompue''. Vous pouvez ajouter un test à safe_mysqld pour qu'il exécute myisamchk , afin de
vérifier toutes les tables qui ont été modifiées dans les 24 dernières heures, si il reste un vieux
fichier .pid (identifiant de processus) après un redémarrage : le fichier .pid est créé par le
serveur mysqld lorsqu'il démarre, et il est supprimé lorsque le serveur s'arrête dans des conditions
normales. La présence d'un fichier .pid au démarrage indique que le serveur s'est arrêté
anormalement.
Un test encore meilleur serait de vérifier toutes les tables dont la date de modification est plus
récente que celle du fichier .pid .
Vous devriez aussi vérifiez vos tables régulièrement durant les opérations normales. Chez MySQL
AB, nous utilisons une tâche en cron pour vérifier toutes nos tables importantes au moins une fois
par semaine, avec une ligne comme celle?ci dans le fichier crontab :
35 0 * * 0 /path/to/myisamchk ??fast ??silent /path/to/datadir/*/*.MYI
Cela nous affiche les informations sur les tables qui ont été corrompues, de façon à ce que nous
puissions les examiner et les réparer.
Comme nous n'avons jamais eu de table qui se soit corrompue inopinément (des tables qui se
corrompent pour d'autres raisons que des problèmes matériels) depuis quelques années (ce qui est
véridique), une fois par semaine est un bon rythme pour nous.
Nous recommandons que vous commenciez par exécuter la commande myisamchk ?s chaque
nuit, sur toutes les tables qui ont été modifiées dans les 24 dernières heures, jusqu'à ce que vous
preniez confiance en MySQL.
Normalement, vous n'avez pas à maintenir autant les tables MySQL. Si vous changez les tables
avec un format de ligne dynamique (les tables avec des colonnes VARCHAR , BLOB ou TEXT ) ou
que vous avez des tables avec de nombreuses lignes effacées, vous pouvez envisager de faire des
défragmentations du fichier, pour récupérer cet espace. Une fois par mois est un bon rythme.
Vous pouvez faire cela avec la commande SQL OPTIMIZE TABLE sur les tables en question, ou
bien, si vous avez éteint le serveur mysqld , faites :
isamchk ?r ??silent ??sort?index ?O sort_buffer_size=16M */*.ISM
myisamchk ?r ??silent ??sort?index  ?O sort_buffer_size=16M */*.MYI
4.4.8 Obtenir des informations sur une table
Pour obtenir la description d'une table ou des statistiques à son sujet, utiliser les commandes
affichées ici. Nous allons expliquer certains de leurs détails ultérieurement.
myisamchk ?d nom_de_table Exécute 
• 
myisamchk en ``mode description'' pour produire
 4.4.8 Obtenir des informations sur une table
224

Manuel MySQL 4.1.x ? Version Française
une description de votre table. Si vous démarrez le serveur MySQL en utilisant l'option
??skip?external?locking , myisamchk va rapporter une erreur si la table est modifiée
durant l'exécution de la commande. Cependant, comme myisamchk ne modifie pas les
tables, durant le mode description, il n'y a pas de risque de perte de données.
myisamchk ?d ?v nom_de_table Pour produire plus d'informations durant l'exécution de
• 
myisamchk , ajoutez l'option ?v pour indiquer qu'elle doit fonctionner en mode détaillé.
myisamchk ?eis nom_de_table Affiche les informations les plus importantes pour une table.
• 
C'est une commande lente, car elle doit lire toute la table.
myisamchk ?eiv nom_de_table C'est l'équivalent de 
• 
?eis , mais qui vous indique ce qui se
passe.
Exemple d'affichage résultant de myisamchk ?d :
MyISAM file:    
Record format:   Fixed length
Data records:    1403698  Deleted blocks:         0
Recordlength:    226
table description:
Key Start Len Index   Type
1   2     8   unique  double
2   15    10  multip. text packed stripped
3   219   8   multip. double
4   63    10  multip. text packed stripped
5   167   2   multip. unsigned short
6   177   4   multip. unsigned long
7   155   4   multip. text
8   138   4   multip. unsigned long
9   177   4   multip. unsigned long
    193   1           text
Exemple d'affichage résultant de myisamchk ?d ?v :
MyISAM file:         company
Record format:       Fixed length
File?version:        1
Creation time:       1999?10?30 12:12:51
Recover time:        1999?10?31 19:13:01
Status:              checked
Data records:           1403698  Deleted blocks:              0
Datafile parts:         1403698  Deleted data:                0
Datafilepointer (bytes):      3  Keyfile pointer (bytes):     3
Max datafile length: 3791650815  Max keyfile length: 4294967294
Recordlength:               226
table description:
Key Start Len Index   Type                  Rec/key     Root Blocksize
1   2     8   unique  double                      1 15845376      1024
2   15    10  multip. text packed stripped        2 25062400      1024
3   219   8   multip. double                     73 40907776      1024
4   63    10  multip. text packed stripped        5 48097280      1024
5   167   2   multip. unsigned short           4840 55200768      1024
6   177   4   multip. unsigned long            1346 65145856      1024
7   155   4   multip. text                     4995 75090944      1024
8   138   4   multip. unsigned long              87 85036032      1024
9   177   4   multip. unsigned long             178 96481280      1024
    193   1           text
Exemple d'affichage résultant de myisamchk ?eis :
Checking MyISAM file: company
Key:  1:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
Key:  2:  Keyblocks used:  98%  Packed:   50%  Max levels:  4
Key:  3:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
Key:  4:  Keyblocks used:  99%  Packed:   60%  Max levels:  3
Key:  5:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  6:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
 4.4.8 Obtenir des informations sur une table
225

Manuel MySQL 4.1.x ? Version Française
Key:  7:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  8:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  9:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
Total:    Keyblocks used:  98%  Packed:   17%
Records:          1403698    M.recordlength:     226
Packed:             0%
Recordspace used:     100%   Empty space:          0%
Blocks/Record:   1.00
Record blocks:    1403698    Delete blocks:        0
Recorddata:     317235748    Deleted data:         0
Lost space:             0    Linkdata:             0
User time 1626.51, System time 232.36
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 627, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 639, Involuntary context switches 28966
Exemple d'affichage résultant de myisamchk ?eiv :
Checking MyISAM file: company
Data records: 1403698   Deleted blocks:       0
? check file?size
? check delete?chain
block_size 1024:
index  1:
index  2:
index  3:
index  4:
index  5:
index  6:
index  7:
index  8:
index  9:
No recordlinks
? check index reference
? check data record references index: 1
Key:  1:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
? check data record references index: 2
Key:  2:  Keyblocks used:  98%  Packed:   50%  Max levels:  4
? check data record references index: 3
Key:  3:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
? check data record references index: 4
Key:  4:  Keyblocks used:  99%  Packed:   60%  Max levels:  3
? check data record references index: 5
Key:  5:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
? check data record references index: 6
Key:  6:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
? check data record references index: 7
Key:  7:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
? check data record references index: 8
Key:  8:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
? check data record references index: 9
Key:  9:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
Total:    Keyblocks used:   9%  Packed:   17%
? check records and index references
[LOTS OF ROW NUMBERS DELETED]
Records:          1403698    M.recordlength:     226   Packed:             0%
Recordspace used:     100%   Empty space:          0%  Blocks/Record:   1.00
Record blocks:    1403698    Delete blocks:        0
Recorddata:     317235748    Deleted data:         0
Lost space:             0    Linkdata:             0
User time 1639.63, System time 251.61
Maximum resident set size 0, Integral resident set size 0
 4.4.8 Obtenir des informations sur une table
226

Manuel MySQL 4.1.x ? Version Française
Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0
Blocks in 4 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 10604, Involuntary context switches 122798
Voici les tailles des fichiers de données et d'index utilisés dans les tables précédentes :
?rw?rw?r??   1 monty    tcx     317235748 Jan 12 17:30
?rw?rw?r??   1 davida   tcx      96482304 Jan 12 18:35
Des détails sur les types d'informations retournés par myisamchk sont listés ici. Le ``keyfile'' est le
fichier d'index. ``Record'' et ``row'' sont synonymes de ligne :
ISAM file Nom du fichier d'index ISAM.
• 
Isam?version Version du format ISAM. Actuellement, c'est toujours 2.
• 
Creation time Date de création du fichier de données.
• 
Recover time Date de dernière reconstruction du fichier de données ou d'index.
• 
Data records Combien de lignes sont stockées dans la table.
• 
Deleted blocks Combien de blocs effacés occupent toujours de l'espace. Vous pouvez
• 
Data file: Parts Pour les tables au format de ligne dynamique, ceci indique combien de blocs
• 
de données sont présents. Pour une table optimisée sans lignes fragmentées, la valeur doit
être égale à Data records .
Deleted data Combien d'octets de données effacées et non réutilisées sont présents dans la
• 
Data file pointer La taille du pointeur de fichier de données, en octets. C'est généralement 2,
• 
3, 4, ou 5 octets. La plupart des tables peuvent se gérer avec 2 octets, mais ceci ne peut
être contrôlé par MySQL actuellement. Pour les tables à format de ligne fixe, c'est une
adresse de ligne. Pour les tables dynamiques, c'est une adresse d'octet.
Keyfile pointer La taille du pointeur de fichier d'index, en octets. C'est généralement 1, 2 ou
• 
3 octets. La plupart des tables supportent 2 octets, mais cela est calculé automatiquement
par MySQL. C'est toujours une adresse de bloc.
Max datafile length Taille maximale du fichier de données ( 
• 
.MYD file), en octets.
Max keyfile length Taille maximale du fichier d'index ( 
• 
.MYI file), en octets.
Recordlength Taille occupée par chaque ligne, en octets.
• 
Record format Le format utilisé pour stocker les lignes de la table. Les exemples ci?dessus
• 
utilisaient Fixed length . Les autres valeurs possibles sont Compressed et Packed .
table description Une liste de toutes les clés de la table. Pour chaque clé, des informations
• 
de bas niveau sont présentées :
Key Le numéro d'index.

Start Où, dans la ligne, l'index débute.

Len Taille de cette partie d'index. Pour les nombres compactés, c'est toujours la taille

maximale de la colonne. Pour les chaînes, c'est plus petit que la taille maximale de la
colonne index, car vous pouvez indexer un préfixe de la chaîne.
Index 

unique et multip. (multiple). Indique si une valeur peut exister plusieurs fois
dans cet index.
Type De quel type de données cet index est. C'est un type de données ISAM avec

les options packed , stripped ou empty .
Root Adresse du premier bloc d'index.

Blocksize La taille de chaque bloc d'index. Par défaut, c'est 1024, mais cette valeur

peut être modifiée lors de la compilation.
Rec/key C'est une valeur statistique, utilisée par l'optimisateur. Il indique combien de

lignes sont disponibles par valeur de cette clé. Une clé unique aura toujours une
valeur de 1. Cela peut être modifié une fois que la table est chargée (ou modifiée de
façon majeure), avec la commande myisamchk ?a . Si ce n'est pas mis à jour, une
valeur par défaut de 30 est utilisée.
Dans le premier exemple ci?dessus, la neuvième clé est une clé multi?partie, avec deux
• 
parties.
 4.4.8 Obtenir des informations sur une table
227

Manuel MySQL 4.1.x ? Version Française
Keyblocks used Quel pourcentage des blocs de clé est utilisé. Comme les tables utilisées
• 
dans les exemples ont tout juste été réorganisées avec myisamchk , ces valeurs sont très
grandes (très proches du maximum théorique).
Packed MySQL essaie de compacter les clés ayant un préfixe commun. Cela ne peut être
• 
utilisé que pour les colonnes de type CHAR / VARCHAR / DECIMAL . Pour les longues chaînes
comme des noms, cette technique va significativement réduire l'espace utilisé. Dans le
troisième exemple ci?dessus, la quatrième clé fait 10 caractères de long et a une réduction
de 60 % dans l'espace utilisé effectivement.
Max levels La profondeur du B?tree. Les grandes tables avec de longues clés peuvent
• 
obtenir de grandes valeurs.
Records Combien de lignes sont enregistrées dans la table.
• 
M.recordlength La taille moyenne d'une ligne. Pour les tables avec un format de ligne
• 
statique, c'est la taille de chaque ligne.
Packed MySQL efface les espaces à la fin des chaînes. 
• 
Packed indique le pourcentage
d'économie d'espace réalisé.
Recordspace used Quel est le pourcentage d'utilisation du fichier de données.
• 
Empty space Quel est le pourcentage d'utilisation du fichier d'index.
• 
Blocks/Record Le nombre moyen de blocs par enregistrements (c'est à dire, de combien de
• 
liens une ligne fragmentées est constituée). C'est toujours 1.0 pour les tables à format de
ligne statique. Cette valeur doit être aussi proche que possible de 1.0. Si elle grossit trop,
vous pouvez réorganiser la table avec myisamchkRecordblocks Combien de blocs sont utilisés. Pour les tables à format de ligne fixe, c'est le
• 
même nombre que le nombre de lignes.
Deleteblocks Combien de blocs (liens) sont effacés.
• 
Recorddata Combien d'octets sont utilisés dans le fichier.
• 
Deleted data Combien d'octets dans le fichier de données sont effacés (inutilisés).
• 
Lost space Si une ligne est modifiée, et réduite en taille, de l'espace est perdu. Ce chiffre est
• 
la somme de ces espaces perdus, en octets.
Linkdata Lorsque le format de ligne dynamique est utilisé, les fragments de lignes sont liés
• 
avec des pointeurs de (4 à 7 octets chacun). Linkdata est la somme du stockage utilisé
par ces pointeurs.
Si une table a été compressée avec myisampack , myisamchk ?d affiche des informations
signification.
4.5 Référence de langage d'administration de la base de
données

4.5.1 Syntaxe de OPTIMIZE TABLE
OPTIMIZE TABLE tbl_name[,tbl_name]...
OPTIMIZE TABLE doit être utilisée si une grande partie de la base a été effacée, ou si vous avez
fait de nombreuses modificaitons dans une table à format de ligne dynamique (des tables qui ont
des colonnes de type VARCHAR , BLOB et TEXT ). Les lignes effacées sont conservées dans une
liste, et les prochaines opérations d' INSERT réutilisent les vieilles positions de lignes. Vous pouvez
vous servir de la commande OPTIMIZE TABLE pour récupérer l'espace utilisé et défragmenter le
fichier de donné le moment, OPTIMIZE TABLE fonctionne uniquement avec les tables de
type MyISAM et BDB . Pour les tables BDB , OPTIMIZE TABLE est actuellement l'équivalent de
 4.5 Référence de langage d'administration de la base de données
228

Manuel MySQL 4.1.x ? Version Française
ANALYZE TABLE . Syntaxe de ANALYZE TABLE .
Vous pouvez vous arranger pour que OPTIMIZE TABLE fonctionne sur d'autres types de tables, en
démarrant mysqld avec ??skip?new ou ??safe?mode , mais dans ce cas, OPTIMIZE TABLE
est simplement l'équivalent de ALTER TABLE .
OPTIMIZE TABLE fonctionne comme ceci :
Si la table contient des lignes effacées ou des lignes fragmentées, la table est compactée.
• 
Si les pages d'index ne sont pas triées, 
• 
OPTIMIZE TABLE les trie. Si les statistiques ne
sont pas à jour (et que la table n'a pas pu effectuer de réparation en triant l'index), elles sont
mises à jour.
OPTIMIZE TABLE pour les tables MyISAM est l'équivalent de la commande myisamchk ??quick
??check?only?changed ??sort?index ??analyze sur la table.
Notez que la table est verrouilée durant la commande OPTIMIZE TABLE .
4.5.2 Syntaxe de ANALYZE TABLE
ANALYZE TABLE nom_de_table[,nom_de_table...]
Cette commande analyse et stocke la clé de distribution de la table. Durant l'analyse, la table est
verrouilée en lecture. Cette commande fonctionne avec les tables MyISAM et BDB .
C'est l'équivalent de la commande en ligne myisamchk ?a .
MySQL utilise les clés de distribution pour décider dans quel ordre les tables doivent être
rassemblées lors des jointures qui ne s'effectuent pas sur une constante.
La commande retourne une table avec les colonnes suivantes :
Colonne
Valeur
Table
Nom de la table
Op
``analyze'' (toujours)
Msg_type
Un des status , error , info ou warning .
Msg_text
Le message.
Vous pouvez vérifier la clé de distribution stockée avec la commande SHOW INDEXinformations sur les bases, colonnes, tables ou index .
Si la table n'a pas changé depuis la dernière commande ANALYZE TABLE , elle ne sera pas
analysée à nouveau.
4.5.3 Syntaxe de FLUSH
FLUSH flush_option [,flush_option] ...
Vous devez utiliser la commande FLUSH si vous voulez effacer certains caches internes de MySQL.
Pour exécuter FLUSH , vous devez avoir le droit RELOAD .
 4.5.2 Syntaxe de ANALYZE TABLE
229

Manuel MySQL 4.1.x ? Version Française
flush_option peut être l'une des suivantes :
Option
Description
Vide le cache des hôtes. Vous devez vider ce cache si certaines des
adresses IP de vos clients changent, ou si vous obtenez des erreurs
du type Host ... is blocked . Lorsque plus de
max_connect_errors erreurs successives surviennent pour un
HOSTS
hôte, lors des connexions au serveur MySQL, MySQL suppose qu'il y
blocked . Vous pouvez démarrer mysqld avec ?O
max_connect_errors=999999999 pour éviter ce message.
Recharge les clés DES depuis le fichier de stockage spécifié par
DES_KEY_FILE
??des?key?file lors du démarrage du serveur.
Ferme et réouvre tous les fichiers de log. Si vous avez spécifié un
fichier de log de mise à jour, ou un fichier de log binaire sans
extension, le numéro d'extension du fichier de log sera incrémenté
LOGS
d'une unité. Si vous avez utilisé une extension dans le nom du fichier,
Ceci est la même chose que d'envoyer le signal SIGHUP au serveur
mysqld .
PRIVILEGES
Recharge les privilèges des tables de droits dans la base mysql .
Défragmente le cache des requêtes pour mieux en utiliser la
QUERY CACHE
mémoire. Cette commande n'effacera aucune requête du cache, à la
différence de RESET QUERY CACHE .
Ferme toutes les tables ouvertes, et force les tables utilisées à se
TABLES
refermer. Cela vide aussi le cache de requêtes.
[TABLE | TABLES]
nom_de_table
Vide du cache uniquement les tables nommées.
[,nom_de_table...]
Ferme toutes les tables ouvertes, et verrouille en lecture toute les
tables et bases, jusqu'à ce que vous exécutiez une commande
TABLES WITH READ LOCK UNLOCK TABLES . C'est très pratique pour générer des sauvegardes,
si vous avez un système de fichiers comme Veritas, qui peut prendre
des photos du système.
Remet la plupart des variables de statut à zéro. A n'utiliser que pour
STATUS
corriger une requête.
Remet toutes les ressources à zéro. Cela va autoriser de nouveau les
USER_RESOURCES
utilisateurs qui ont été bloqués. Limiter les ressources utilisateur.
Vous pouvez aussi accéder à toutes les commandes décrites plus haut en les donnant en
arguments à mysqladmin (exemple : flush?hosts , flush?logs , reload , ou encore
flush?tables ).
Reportez?vous aussi à la commande RESET avec la réplication. Syntaxe de RESET .
4.5.4 Syntaxe de la commande RESET
RESET reset_option [,reset_option] ...
La commande RESET sert à remettre à zéro des données. C'est aussi une version plus puissante
de la commande FLUSH . Syntaxe de FLUSH .
 4.5.4 Syntaxe de la commande RESET
230

Manuel MySQL 4.1.x ? Version Française
Pour exécuter la commande RESET , vous devez avoir les droits RELOAD .
Option
Description
Efface tous les logs binaires listés dans le fichier d'index, et l'index binlog est vidé.
MASTER
Dans les version antérieures à la version 3.23.26, cette commande s'appelait FLUSH
MASTER (Master)
Annule la position de réplication de l'esclave dans les historiques du maître. Dans les
SLAVE
version antérieures à la version 3.23.26, cette commande s'appelait FLUSH SLAVE
(Slave)
QUERY
Supprime tous les résultats de requêtes du cache de requête.
CACHE
4.5.5 Syntaxe de KILL
KILL thread_id
Chaque connexion à mysqld utilise un thread unique. Vous pouvez voir les threads en cours
d'exécution en utilisant la commande SHOW PROCESSLIST et en terminer un avec la commande
KILL thread_id .Si vous avez le droit PROCESS , vous pouvez voir tous les threads. Si vous
avez le droit SUPER , vous pouvez terminer tout les threads. Sinon, vous ne pouvez terminer que
vos propres threads.
Vous pouvez aussi utiliser les commandes mysqladmin processlist et mysqladmin kill
pour examiner et terminer les threads.
Quand vous exécutez un KILL , un thread spécifique est crée pour ce thread.
Dans la plupart des cas, la terminaison du thread pourra prendre un certain temps vu que le thread
de terminaison est invoqué à intervalles spécifiques.
Pour les boucles de 
• 
SELECT , ORDER BY et GROUP BY , le thread de terminaison est vérifié
après avoir lu un enregistrement. S'il est activé la requête est abandonnée.
Lors d'un 
• 
ALTER TABLE le thread de terminaison est vérifié avant la lecture de chacune des
colonnes de la table d'origine. S'il est activé, la commande est abandonnée et la table
temporaire effacée.
Lors d'un 
• 
UPDATE TABLE ou d'un DELETE TABLE , le thread de terminaison est vérifié
après chaque lecture de bloc et chaque mise à jour ou suppression de ligne. S'il est activé,
la requête est abandonnée. Notez que si vous utilisez les transactions, les modifications ne
seront pas perdues !
GET_LOCK()
• 
 stoppera avec NULL .
Un thread 
• 
INSERT DELAYED videra rapidement toutes les lignes en mémoire et se
terminera.
Si le thread est dans le gestionnaire des verrous de tables (état : 
• 
Locked ), le verrou sur la
table sera vite enlevé.
Si le thread est en attente de libération d'espace disque lors d'un appel à 
• 
write , l'opération
est avortée avec un message d'erreur indiquant que le disque est plein.
4.5.6 Syntaxe de SHOW
   SHOW DATABASES [LIKE wild]
ou SHOW [OPEN] TABLES [FROM nom_base] [LIKE wild]
ou SHOW [FULL] COLUMNS FROM nom_de_table [FROM nom_base] [LIKE wild]
 4.5.5 Syntaxe de KILL
231

Manuel MySQL 4.1.x ? Version Française
ou SHOW INDEX FROM nom_de_table [FROM nom_base]
ou SHOW TABLE STATUS [FROM nom_base] [LIKE wild]
ou SHOW STATUS [LIKE wild]
ou SHOW VARIABLES [LIKE wild]
ou SHOW LOGS
ou SHOW [FULL] PROCESSLIST
ou SHOW GRANTS FOR user
ou SHOW CREATE TABLE table_name
ou SHOW MASTER STATUS
ou SHOW MASTER LOGS
ou SHOW SLAVE STATUS
SHOW fournit des informations sur les bases de données, les colonnes, les tables, ou l'état du
serveur. Si la clause LIKE wild est utilisée, la chaîne wild peut être une chaîne qui utilise les
caractères SQL joker '%' et '_' .
4.5.6.1 Obtenir des informations sur les bases, tables, colonnes et index
Vous pouvez utiliser la syntaxe alternative db_name.tbl_name à la syntaxe tbl_name FROM
db_name . Ces deux commandes sont équivalentes :
mysql> SHOW INDEX FROM mytable FROM mydb;
mysql> SHOW INDEX FROM mydb.mytable;
SHOW DATABASES liste les bases que le serveur MySQL héberge. Vous pouvez aussi obtenir cette
liste en utilisant la commande mysqlshow . Depuis la version 4.0.2, vous ne verrez que les bases
pour lesquelles vous avez des droits, à moins que vous n'ayez le droit global de SHOW DATABASES
.
SHOW TABLES liste les tables d'une base de données. Vous pouvez aussi accéder à cette liste
avec la commande mysqlshow db_name .
Note : si un utilisateur n'a aucun droit sur une table, la table ne sera pas affichée dans le résultat de
SHOW TABLES et mysqlshow db_name .
SHOW OPEN TABLES liste les tables qui sont actuellement ouvertes dans le cache de table.
Comment MySQL ouvre et ferme les tables . Le champs Comment indique combien de fois la table
a été mise en cache ( cached ) et utilisée ( in_use ).
SHOW COLUMNS liste les colonnes d'une table données. Si vous spécifiez l'option FULL , vous
obtiendrez aussi les droits dont vous disposez sur chaque colonne. Si les types de colonnes sont
différents de ce à quoi vous vous attendiez après votre requête CREATE TABLE , notez que MySQL
change parfois les types de colonnes. Silent column changes .
La requête DESCRIBE fournit des informations similaires à SHOW COLUMNS(Obtenir des informations sur les colonnes) .
SHOW FIELDS est un synonyme de SHOW COLUMNS , et SHOW KEYS est un synonyme de SHOW
INDEX . Vous pouvez aussi lister les colonnes d'une table ou ses index avec les commandes en
ligne mysqlshow db_name tbl_name et mysqlshow ?k db_name tbl_name .
SHOW INDEX retourne le détails sur les index, dans un format qui ressemble vaguement à
l'affichage obtenu par la commande SQLStatistics de ODBC. Les colonnes suivantes sont
disponibles :
 4.5.6.1 Obtenir des informations sur les bases, tables, colonnes et index
232

Manuel MySQL 4.1.x ? Version Française
Colonne
Signification
Table
Nom de la table.
Non_unique
0 si l'index ne peut pas contenir de doublons.
Key_name
Nom de l'index.
Seq_in_index Numéro de séquence de la colonne dans l'index, commençant à 1.
Column_name
Nom de la colonne.
Comment la colonne est placée dans l'index. Avec MySQL, les valeurs peuvent
Collation
être 'A' (Ascending) ou NULL (Non trié).
Nombre de valeurs uniques dans l'index. Ceci est mis à jour en exécutant la
Cardinality
commande isamchk ?a .
Numbre de caractères indexés si la colonne est partiellement indexée. NULL
Sub_part
siginifie que la clée entière est indexée.
Null
Contient 'YES' si la colonne peut contenir la valeur NULL .
Index_type
La méthode d'indexation utilisée.
Différentes remarques. Actuellement, il indique si l'index est FULLTEXT ou non
Comment
(MySQL < 4.0.2).
Notez que la cardinalité ( Cardinality ) est comptée grâce à des statistiques stockées sous
forme d'entier. Ce n'est peut être pas très précis pour les petites tables.
Les colonnes Null et Index_type ont été ajoutées en MySQL 4.0.2.
4.5.6.2 SHOW TABLE STATUS
SHOW TABLE STATUS [FROM db_name] [LIKE wild]
SHOW TABLE STATUS (nouveau en version 3.23) fonctionne comme SHOW STATUS , mais fournit
des informations sur les tables. Vous pouvez aussi obtenir ces informations en utilisant la
commande en ligne mysqlshow ??status db_name . Les données suivantes sont retournées :
Colonne
Signification
Name
Nom de la table.
Type
Type de table. Types de tables MySQL.
Row_format
Le format de stockage de ligne (Fixed, Dynamic ou Compressed).
Rows
Nombre de lignes.
Avg_row_length
Taille moyenne d'une ligne.
Data_length
Taille du fichier de données.
Max_data_length Taille maximale du fichier de données.
Index_length
Taille du fichier d'index.
Data_free
Nombre d'octets alloués mais non utilisés.
Auto_increment
Prochaine valeur d'autoincrement.
Create_time
Date de création de la table.
Update_time
Date de dernière modification de la table.
Check_time
Date de dernier entretien de la table.
Create_options
Options supplémentaires utilisées avec CREATE TABLE .
Le commentaire utilisé lors de la création de la table (ou des informations sur
Comment
pourquoi MySQL n'a pu accéder aux informations de la table).
 4.5.6.2 SHOW TABLE STATUS
233

Manuel MySQL 4.1.x ? Version Française
Les tables InnoDB indiqueront l'espace disque libre dans le commentaire de table.
4.5.6.3 Syntaxe de SHOW STATUS
SHOW STATUS affiche des informations sur le statut du serveur (comme par exemple, mysqladmin
extended?status ). L'affichage ressemble à ce qui est affiché ci?dessous, mais les valeurs
différeront sûrement de votre propre serveur.
+??????????????????????????+????????????+
| Variable_name            | Value      |
+??????????????????????????+????????????+
| Aborted_clients          | 0          |
| Aborted_connects         | 0          |
| Bytes_received           | 155372598  |
| Bytes_sent               | 1176560426 |
| Connections              | 30023      |
| Created_tmp_disk_tables  | 0          |
| Created_tmp_tables       | 8340       |
| Created_tmp_files        | 60         |
| Delayed_insert_threads   | 0          |
| Delayed_writes           | 0          |
| Delayed_errors           | 0          |
| Flush_commands           | 1          |
| Handler_delete           | 462604     |
| Handler_read_first       | 105881     |
| Handler_read_key         | 27820558   |
| Handler_read_next        | 390681754  |
| Handler_read_prev        | 6022500    |
| Handler_read_rnd         | 30546748   |
| Handler_read_rnd_next    | 246216530  |
| Handler_update           | 16945404   |
| Handler_write            | 60356676   |
| Key_blocks_used          | 14955      |
| Key_read_requests        | 96854827   |
| Key_reads                | 162040     |
| Key_write_requests       | 7589728    |
| Key_writes               | 3813196    |
| Max_used_connections     | 0          |
| Not_flushed_key_blocks   | 0          |
| Not_flushed_delayed_rows | 0          |
| Open_tables              | 1          |
| Open_files               | 2          |
| Open_streams             | 0          |
| Opened_tables            | 44600      |
| Questions                | 2026873    |
| Select_full_join         | 0          |
| Select_full_range_join   | 0          |
| Select_range             | 99646      |
| Select_range_check       | 0          |
| Select_scan              | 30802      |
| Slave_running            | OFF        |
| Slave_open_temp_tables   | 0          |
| Slow_launch_threads      | 0          |
| Slow_queries             | 0          |
| Sort_merge_passes        | 30         |
| Sort_range               | 500        |
| Sort_rows                | 30296250   |
| Sort_scan                | 4650       |
| Table_locks_immediate    | 1920382    |
| Table_locks_waited       | 0          |
| Threads_cached           | 0          |
| Threads_created          | 30022      |
| Threads_connected        | 1          |
| Threads_running          | 1          |
 4.5.6.3 Syntaxe de SHOW STATUS
234

Manuel MySQL 4.1.x ? Version Française
| Uptime                   | 80380      |
+??????????????????????????+????????????+
Les variables de statut listées ci?dessus ont la signification suivante :
Variable
Signification
Nombre de connexions annulées parce que le client est mort
Aborted_clients
connexion annulée.
Nombre de tentatives de connexions au serveur MySQL qui ont
Aborted_connects
échouées. Erreurs de communication / connexion annulée.
Bytes_received
Nombre d'octets reçu de tous les clients.
Bytes_sent
Nombre d'octets envoyés à tous les clients.
Com_xxx
Nombre d'exécution de chaque commande.
Connections
Nombre de tentatives de connexions au serveur MySQL.
Nombre de tables temporaires implicites créées sur le disque lors
Created_tmp_disk_tables
d'exécutions de commandes.
Nombre de tables temporaires implicites créées en mémoire lors
Created_tmp_tables
d'exécutions de commandes.
Created_tmp_files
Combien de fichiers temporaires mysqld a créé.
Nombre de gestionnaires d'insertion retardées sont en cours
Delayed_insert_threads
d'utilisation.
Delayed_writes
Nombre de lignes écrites avec INSERT DELAYED .
Nombre de lignes écrites avec INSERT DELAYED pour lesquelles
Delayed_errors
des erreurs sont survenues (probablement une erreur de
doublons ( duplicate key )).
Flush_commands
Nombre de commandes FLUSH .
Handler_commit
Nombre de commandes internes COMMIT .
Handler_delete
Nombre de fois qu'une ligne a été effacées dans une table.
Nombre de fois que la première ligne a été lue dans un index. Si
ce chiffre est haut, c'est que le serveur fait de nombreuses
Handler_read_first
recherches par analyse complète de la table, par exemple
SELECT col1 FROM foo , en supposant que col1 est indexé.
Nombre de requête de lecture de ligne basées sur une clé. Si ce
Handler_read_key
chiffre est grand, c'est une bonne indication de l'indexation
correcte de vos tables.
Nombre de requête de lecture de la ligne suivante en ordre. Cela
sera augmenté si vous listez une colonne avec une contrainte
Handler_read_next
d'intervalle. Cette valeur sera aussi incrémentée si vous effectuez
un scan d'index.
Nombre de requête de lecture de la clé précédente, dans l'ordre.
Handler_read_prev
C'est souvent utilisé pour optimiser les clauses ORDER BY ...
DESC .
Nombre de lecture d'une ligne basée sur une position fixe. Ce
Handler_read_rnd
chiffre sera grand si vous effectuez de nombreuses requêtes qui
réclament le tri du résultat.
Handler_read_rnd_next
Nombre de requêtes de lecture de la prochaine ligne dans le
fichier de données. Ce chiffre sera grand si vous faîtes de
nombreux scans de tables. Généralement, cela indique que vos
requêtes ne sont pas écrites pour profiter des index que vous
 4.5.6.3 Syntaxe de SHOW STATUS
235

Manuel MySQL 4.1.x ? Version Française
avez mis en place.
Handler_rollback
Nombre de commandes internes ROLLBACK .
Handler_update
Nombre de requête de modification d'une ligne dans une table.
Handler_write
Nombre de requête pour insérer une ligne dans une table.
Key_blocks_used
The Nombre de blocs utilisés dans un cache de clé.
The Nombre de requêtes de lecture d'un bloc de clé dans le
Key_read_requests
cache.
Key_reads
Nombre de lecture physique d'un bloc de clé sur le disque.
Key_write_requests
Nombre de requêtes d'écriture d'un bloc de clé dans le cache.
Key_writes
Nombre d'écriture physiques de bloc de clé sur le disque.
Max_used_connections
Nombre maximum de connexions utilisées simultanément.
Nombre de blocs de clés dans le cache de clés, qui ont été
Not_flushed_key_blocks
modifiées, mais pas encore écrites sur le disque.
Nombre de lignes en attente d'écriture dans les listes INSERT
Not_flushed_delayed_rows DELAY .
Open_tables
Nombre de tables ouvertes.
Open_files
Nombre de fichiers ouverts.
Open_streams
Nombre de flôts ouverts (utilisés généralement pour les logs).
Opened_tables
Nombre de tables qui ont été ouvertes.
Statut de la réplication sans erreur (réservé pour utilisation
Rpl_status
ultérieure).
Nombre de jointures sans clé (si cette variable vaut 0, vous
Select_full_join
devriez vérifier soigneusement les index de vos tables).
Select_full_range_join
Nombre de jointures où une recherche d'intervalle a été utilisée.
Nombre de jointures où une rercherche d'intervalle a été utilisée
Select_range
sur la première table. (Ce n'est généralement pas important,
même si cette valeur est importante).
Nombre de jointures où la première table a été totalement
Select_scan
scannée.
Nombre de jointures sans clé, où l'utilisation de clé a été vérifiée
Select_range_check
après chaque ligne (si cette variable vaut 0, vous devriez vérifier
soigneusement les index de vos tables).
Questions
Nombre de requêtes envoyées au serveur.
Nombre de tables temporaires actuellement utilisée par le thread
Slave_open_temp_tables
esclave.
Cette variable vaut ON si ce serveur est un esclave connecté au
Slave_running
maître.
Nombre de threads qui ont pris plus de slow_launch_time
Slow_launch_threads
secondes pour être créés.
Nombre de requêtes qui ont pris plus de long_query_time
Slow_queries
pour s'exécuter. Le log des requêtes lentes.
Nombre de passes que l'algorithme de tri a du faire. Si cette
Sort_merge_passes
valeur est grande, vous devriez vérifier la taille de sort_buffer
.
Sort_range
Nombre de tris qui ont été fait sur des intervalles.
Sort_rows
Nombre de lignes triées.
Sort_scan
Nombre de tris qui ont été fait en scannant la table.
ssl_xxx
Variables utilisées par SSL; Réservée pour utilisation ultérieure.
 4.5.6.3 Syntaxe de SHOW STATUS
236

Manuel MySQL 4.1.x ? Version Française
Nombre de fois que la table a reçu immédiatement un verrou.
Table_locks_immediate
Disponible depuis 3.23.33.
Nombre de fois qu'une table n'a pu recevoir de verrou
immédiatement, et qu'il a fallu attendre. Si ce chiffre est haut,
Table_locks_waited
vous avez des problèmes de performance, et vous devriez
optimiser vos requêtes, couper vos tables en deux, ou utiliser la
réplication. Disponible depuis la version 3.23.33.
Threads_cached
Nombre de threads dans le cache de thread.
Threads_connected
Nombre de connexions actuellement ouvertes.
Threads_created
Nombre de threads créés pour gérer les connexions.
Threads_running
Nombre de threads qui ne dorment pas.
Uptime
Durée de vie du serveur, en secondes depuis le redémarrage.
Quelques commentaires sur les variables ci?dessus :
Si 
•  Opened_tables est grand, alors votre table_cache est probablement trop petit.
Si 
•  Key_reads est grand, alors key_buffer_size est probablement trop petit. Le taux
d'utilisation du cache peut être calculé avec le ratio Key_reads / Key_read_requests .
Si 
•  Handler_read_rnd est grand, vous avez probablement trop de requêtes qui analysent
toute la table, ou vous avez des jointures qui n'exploitent pas d'index.
Si 
•  Threads_created est grand, vous devriez augmenter la valeur de la variable
thread_cache_size . Le taux d'utilisation du cache peut être calculé avec
Threads_created / Connections .
Si 
•  Created_tmp_disk_tables est grand, vous devriez augmenter la valeur de la variable
tmp_table_size pour obtenir des tables temporaires en mémoire, et non plus sur le
disque.
4.5.6.4 Syntaxe de SHOW VARIABLES
SHOW [GLOBAL | SESSION] VARIABLES [LIKE wild]
SHOW VARIABLES affiche les valeurs des variables systèmes de MySQL. Vous pouvez aussi
obtenir ces informations avec la commande mysqladmin variables . Si les valeurs par défaut
ne vous conviennent pas, vous pouvez modifier la plupart de ces variables, en ligne de commande,
lorsque mysqld est lancé. Options en ligne de commande de mysqld .Les options GLOBAL et
SESSION sont nouvelles depuis MySQL 4.0.3. Avec GLOBAL vous allez lister les variables qui sont
utilisées pour les nouvelles connexions à MySQL. Avec SESSION , vous allez lister les valeurs qui
ont actuellement cours pour la connexion courante. Si vous n'utilisez ni l'une, ni l'autre des options,
SESSION sera utilisée.
Vous pouvez changer la plupart des options avec la commande SET . Syntaxe de SET .
Le résultat de cette commande ressemble à la table ci?dessous, même si les nombres et formats
diffèrent un peu :
+?????????????????????????????????+??????????????????????????????+
| Variable_name                   | Value                        |
+?????????????????????????????????+??????????????????????????????|
| back_log                        | 50                           |
| basedir                         | /usr/local/mysql             |
| bdb_cache_size                  | 8388572                      |
| bdb_log_buffer_size             | 32768                        |
| bdb_home                        | /usr/local/mysql             |
| bdb_max_lock                    | 10000                        |
| bdb_logdir                      |                              |
 4.5.6.4 Syntaxe de SHOW VARIABLES
237

Manuel MySQL 4.1.x ? Version Française
| bdb_shared_data                 | OFF                          |
| bdb_tmpdir                      | /tmp/                        |
| bdb_version                     | Sleepycat Software: ...     |
| binlog_cache_size               | 32768                        |
| bulk_insert_buffer_size         | 8388608                      |
| character_set                   | latin1                       |
| character_sets                  | latin1 big5 czech euc_kr     |
| concurrent_insert               | ON                           |
| connect_timeout                 | 5                            |
| convert_character_set           |                              |
| datadir                         | /usr/local/mysql/data/       |
| delay_key_write                 | ON                           |
| delayed_insert_limit            | 100                          |
| delayed_insert_timeout          | 300                          |
| delayed_queue_size              | 1000                         |
| flush                           | OFF                          |
| flush_time                      | 0                            |
| ft_min_word_len                 | 4                            |
| ft_max_word_len                 | 254                          |
| ft_max_word_len_for_sort        | 20                           |
| ft_boolean_syntax               | + ?><()~*:""&|               |
| have_bdb                        | YES                          |
| have_innodb                     | YES                          |
| have_isam                       | YES                          |
| have_raid                       | NO                           |
| have_symlink                    | DISABLED                     |
| have_openssl                    | YES                          |
| have_query_cache                | YES                          |
| init_file                       |                              |
| innodb_additional_mem_pool_size | 1048576                      |
| innodb_buffer_pool_size         | 8388608                      |
| innodb_data_file_path           | ibdata1:10M:autoextend       |
| innodb_data_home_dir            |                              |
| innodb_file_io_threads          | 4                            |
| innodb_force_recovery           | 0                            |
| innodb_thread_concurrency       | 8                            |
| innodb_flush_log_at_trx_commit  | 0                            |
| innodb_fast_shutdown            | ON                           |
| innodb_flush_method             |                              |
| innodb_lock_wait_timeout        | 50                           |
| innodb_log_arch_dir             |                              |
| innodb_log_archive              | OFF                          |
| innodb_log_buffer_size          | 1048576                      |
| innodb_log_file_size            | 5242880                      |
| innodb_log_files_in_group       | 2                            |
| innodb_log_group_home_dir       | ./                           |
| innodb_mirrored_log_groups      | 1                            |
| interactive_timeout             | 28800                        |
| join_buffer_size                | 131072                       |
| key_buffer_size                 | 16773120                     |
| language                        | /usr/local/mysql/share/...   |
| large_files_support             | ON                           |
| local_infile                    | ON                           |
| locked_in_memory                | OFF                          |
| log                             | OFF                          |
| log_update                      | OFF                          |
| log_bin                         | OFF                          |
| log_slave_updates               | OFF                          |
| log_slow_queries                | OFF                          |
| log_warnings                    | OFF                          |
| long_query_time                 | 10                           |
| low_priority_updates            | OFF                          |
| lower_case_table_names          | OFF                          |
| max_allowed_packet              | 1047552                      |
| max_binlog_cache_size           | 4294967295                   |
| max_binlog_size                 | 1073741824                   |
| max_connections                 | 100                          |
 4.5.6.4 Syntaxe de SHOW VARIABLES
238

Manuel MySQL 4.1.x ? Version Française
| max_connect_errors              | 10                           |
| max_delayed_threads             | 20                           |
| max_heap_table_size             | 16777216                     |
| max_join_size                   | 4294967295                   |
| max_sort_length                 | 1024                         |
| max_user_connections            | 0                            |
| max_tmp_tables                  | 32                           |
| max_write_lock_count            | 4294967295                   |
| myisam_max_extra_sort_file_size | 268435456                    |
| myisam_max_sort_file_size       | 2147483647                   |
| myisam_recover_options          | force                        |
| myisam_sort_buffer_size         | 8388608                      |
| net_buffer_length               | 16384                        |
| net_read_timeout                | 30                           |
| net_retry_count                 | 10                           |
| net_write_timeout               | 60                           |
| open_files_limit                | 0                            |
| pid_file                        |    |
| port                            | 3306                         |
| protocol_version                | 10                           |
| read_buffer_size                | 131072                       |
| read_rnd_buffer_size            | 262144                       |
| rpl_recovery_rank               | 0                            |
| query_cache_limit               | 1048576                      |
| query_cache_size                | 0                            |
| query_cache_type                | ON                           |
| safe_show_database              | OFF                          |
| server_id                       | 0                            |
| slave_net_timeout               | 3600                         |
| skip_external_locking           | ON                           |
| skip_networking                 | OFF                          |
| skip_show_database              | OFF                          |
| slow_launch_time                | 2                            |
| socket                          |              |
| sort_buffer_size                | 2097116                      |
| sql_mode                        | 0                            |
| table_cache                     | 64                           |
| table_type                      | MYISAM                       |
| thread_cache_size               | 3                            |
| thread_stack                    | 131072                       |
| tx_isolation                    | READ?COMMITTED               |
| timezone                        | EEST                         |
| tmp_table_size                  | 33554432                     |
| tmpdir                          | /tmp/                        |
| version                         | 4.0.4?beta                   |
| wait_timeout                    | 28800                        |
+?????????????????????????????????+??????????????????????????????+
Tous les options sont décrites ici. Les tailles de buffer, les longueurs et piles sont données en
octets. Vous pouvez spécifier ces valeurs avec le suffixe 'K' ou 'M' pour indiquer respectivement
kilo?octets ou méga?octets. Par 16M représente 16 mégaoctets. Le suffixe peut être en majuscule
ou en minuscule. 16M et 16m sont équivalents :
ansi_mode
• 
 . Vaut ON si mysqld a été démarré en mode ??ansi . Exécuter MySQL en
back_log
• 
 Le nombre de connexions sortantes que MySQL peut supporter. Cette valeur
entre en jeu lorsque le thread principal MySQL reçoit de très nombreuses requêtes de
connexions en très peu de temps. MySQL prend un peu de temps (même si c'est très peu
de temps), pour vérifier la connexion et démarrer un nouveau thread. La valeur de
back_log indique combien de requête seront mises en attente durant ce temps. Vous
devrez augmenter ce nombre si vous voulez mettre en attente plus de requêtes durant une
courte période de d'autres termes, cette valeur est la taille de la queue d'attente
pour les connexions TCP/IP entrantes. Votre système d'exploitation a ses propres limites
pour ce type de queue. La page du manuel Unix listen(2) doit contenir plus de détails.
 4.5.6.4 Syntaxe de SHOW VARIABLES
239

Manuel MySQL 4.1.x ? Version Française
Vérifiez la documentation de votre OS pour connaître la valeur maximale de votre système.
Si vous donne une valeur à back_log qui est plus grande que celle que votre système
supporte, cela restera sans effet.
basedir
• 
 La valeur de l'option ??basedir .
bdb_cache_size
• 
 Le buffer qui est alloué pour mettre en cache des lignes et des index
pour les tables BDB . Si vous n'utilisez pas la tables BDB , vous devriez démarrer mysqld
avec l'option ??skip?bdb pour ne pas gaspiller de mémoire.
bdb_log_buffer_size
• 
 Le buffer qui est alloué pour mettre en cache des lignes et des
index pour les tables BDB . Si vous n'utilisez pas la tables BDB , vous devriez démarrer
mysqld avec l'option ??skip?bdb pour ne pas gaspiller de mémoire.
bdb_home
• 
 La valeur de l'option ??bdb?home .
bdb_max_lock
• 
 Le nombre maximum de verrous (par défaut 10 000) que vous pouvez
activer simultanément dans une table BDB . Vous devriez augmenter cette valeur si vous
obtenez des erreurs du type bdb: Lock table is out of available locks ou Got
error 12 from ... lorsque vous avez de longues transactions ou que mysqld doit
examiner de nombreuses lignes pour calculer la requête.
bdb_logdir
• 
 La valeur de l'option ??bdb?logdir .
bdb_shared_data
• 
 Vaut ON si vous utilisez l'option ??bdb?shared?data .
bdb_tmpdir
• 
 La valeur de l'option ??bdb?tmpdir .
binlog_cache_size
• 
 . La taille du cache qui contient les requêtes SQL destinées au log
binaire, durant une transaction. Si vous utilisez souvent de longues transactions
multi?requêtes, vous devriez augmenter cette valeur pour améliorer les performances.
Syntaxe des BEGIN/COMMIT/ROLLBACK .
bulk_insert_buffer_size
• 
 (était myisam_bulk_insert_tree_size ) MyISAM utilise
une cache hiérarchisé pour les insertions de masses (c'est à dire INSERT ... SELECT ,
INSERT ... VALUES (...), (...), ... , et LOAD DATA INFILE ). Cette variable
limite la taille du cache en octets, par threads. Utiliser la valeur de 0 va désactiver cette
optimisation. Note : ce cache est uniquement utilisé lorsque vous ajoutez des données dans
une table non?vide. Par défaut, cette option vaut 8 Mo.
character_set
• 
 Le jeu de caractères par défaut.
character_sets
• 
 Les jeux de caractères supportés.
concurrent_inserts
• 
 Si cette option vaut ON , MySQL va vous permettre de réaliser des
commandes INSERT sur les tables MyISAM en même temps que d'autres commandes
SELECT seront exécutées. Vous pouvez désactiver cette option en démarrant mysqld avec
l'option ??safe or ??skip?new .
connect_timeout
• 
 Le nombre de secondes d'attente d'un paquet de connexion avant de
conclure avec une erreur Bad handshake .
datadir
• 
 La valeur de l'option ??datadir .
delay_key_write
• 
 Les options pour les tables MyISAM . Elles peuvent prendre l'une des
valeurs suivantes :
Toutes les commandes CREATE TABLE ... DELAYED_KEY_WRITES
OFF
sont ignorés.
(par défaut) MySQL va honorer l'option DELAY_KEY_WRITE de CREATE
ON
TABLE .
Toutes les nouvelles tables ouvertes sont traitées comme si elles étaient
ALL
créées avec l'option DELAY_KEY_WRITE .
Si DELAY_KEY_WRITE est activé, cela signifie que le buffer de clé des tables ayant cette
option ne seront pas écrit sur le disque dès la fin de la modification de la table, mais
attendrons que la table soit écrite. Cela accélère notablement les écritures des
modifications, mais il faut penser à ajouter une vérification automatique des tables au
démarrage avec myisamchk ??fast ??force .
delayed_insert_limit
• 
 Après avoir inséré delayed_insert_limit lignes, le
gestionnaire de INSERT DELAYED va vérifiez si il n'y a pas de commande SELECT en
attente. Si c'est le cas, il va autoriser ces commandes avant de continuer.
 4.5.6.4 Syntaxe de SHOW VARIABLES
240

Manuel MySQL 4.1.x ? Version Française
delayed_insert_timeout
• 
 Combien de temps le thread INSERT DELAYED doit attendre
les commandes INSERT avant de s'achever.
delayed_queue_size
• 
 Quelle taille de file (en lignes) doit être allouée pour gérer les
commandes INSERT DELAYED . Si la file se remplit, tous les clients qui émettent des
commandes INSERT DELAYED devront attendre un peu de place avant de pouvoir
continuer.
flush
• 
 Cette option vaut ON si vous avez démarré MySQL avec l'option ??flush .
flush_time
• 
 Si cette option a une valeur non nulle, toutes les flush_time secondes,
toutes les tables seront fermées (pour libérez des ressources et synchroniser les index sur
le disque). Nous ne recommandons cette option que sur les systèmes Windows 9x/Me, ou
les systèmes qui ont très peu de ressource.
ft_min_word_len
• 
 La taille minimale d'un mot inclus dans un index FULLTEXT . Note : les
index FULLTEXT doivent être reconstruit après avoir modifié cette variable. (Cette
option est nouvelle en MySQL 4.0.)
ft_max_word_len
• 
 La taille maximale d'un mot inclus dans un index FULLTEXT . Note :
les index FULLTEXT doivent être reconstruit après avoir modifié cette variable. (Cette
option est nouvelle en MySQL 4.0.)
ft_max_word_len_for_sort
• 
 La taille maximale d'un mot dans un index FULLTEXT ,
pour qu'il soit inclus dans la méthode de recréation rapide de l'index, avec la commande
REPAIR , CREATE INDEX , ou ALTER TABLE . Les mots longs sont insérés par une
méthode plus lente. La règle idéale est la suivante : avec ft_max_word_len_for_sort
qui croit, MySQL va créer des fichiers temporaires plus grand, et donc, ralentir le processus,
à cause des accès disques, et cela va mettre moins de clés dans un bloc de tri (encore une
fois, limitant la vitesse). Lorsque ft_max_word_len_for_sort est plus petit, MySQL va
insérer un grand nombre de mot avec la méthode lente, mais les mots courts seront insérés
très vite.
ft_boolean_syntax
• 
 Liste des opérateurs supportés par MATCH ... AGAINST(... IN
BOOLEAN MODE)have_innodb
• 
YES si mysqld supporte les tables InnoDB. DISABLED si ??skip?innodb
est utilisée.
have_bdb
• 
YES si mysqld supporte les tables Berkeley. DISABLED si ??skip?bdb est
utilisée.
have_raid
• 
YES si mysqld supporte l'option RAID .
have_openssl
• 
YES si mysqld supporte le chiffrement SSL entre le client et le serveur.
init_file
• 
 Le nom du fichier spécifié avec l'option ??init?file lorsque vous démarrez
le serveur. C'est un fichier qui contient les requêtes SQL que vous voulez voir exécutées
dès le démarrage.
interactive_timeout
• 
 Le nombre de secondes durant lequel le serveur attend une
activité de la part de la connexion avant de la fermée. Un client interactif est un client qui
utilise l'option CLIENT_INTERACTIVE avec mysql_real_connect() . Voir aussi
wait_timeout .
join_buffer_size
• 
 La taille du buffer qui est utilisée pour les jointures complètes (les
jointures qui n'utilisent pas d'index). Ce buffer est alloué une fois pour chaque jointure entre
deux tables. Augmentez cette valeur si vous voulez obtenir des jointures plus rapides,
lorsque l'ajout d'index n'est pas possible. Normalement, le mieux est d'ajouter de bons
index.
key_buffer_size
• 
 Les blocs d'index sont mis en buffer et partagés par tous les threads.
key_buffer_size est la taille du buffer utilisé.
Augmentez cette valeur pour obtenir une meilleure gestion des index (pour les lectures et
écritures multiples), autant que vous le pouvez : 64Mo sur une machine de 256Mo est une
valeur répandue. Toutefois, si vous utilisez une valeur trop grande (par exemple, plus de
50% de votre mémoire totale), votre système risque de commencer à utiliser sa mémoire
swap, et devenir très lent. N'oubliez pas que MySQL ne met pas en cache les données lues,
 4.5.6.4 Syntaxe de SHOW VARIABLES
241

Manuel MySQL 4.1.x ? Version Française
et il faut laisser le système d'exploitation respirer.
Vous pouvez vérifier les performances du buffer de clés avec la commande show status
et en examinant les variables Key_read_requests , Key_reads ,
Key_write_requests et Key_writes . Le ratio Key_reads/Key_read_request doit
être normalement < 0.01. Le ratio Key_write/Key_write_requests est généralement
proche de 1 si vous utilisez principalement des modifications et effacement, mais il peut être
bien plus petit si vous faites des modifications qui affectent de nombreuses lignes en même
temps, ou si vous utilisez l'option DELAY_KEY_WRITE . Syntaxe de SHOW .
Pour obtenir encore plus de vitesse lors de l'écriture de plusieurs lignes en même temps,
utilisez LOCK TABLES . Syntaxe des LOCK TABLES/UNLOCK TABLES .
language
• 
 La langue utilisée pour les message d'erreurs.
large_file_support
• 
 Si mysqld a été compilé avec le support des grands fichiers.
locked_in_memory
• 
 Si mysqld a été verrouillé en mémoire avec ??memlock
log
• 
 Si le log de toutes les requêtes est désactivé.
log_update
• 
 Si le log de modification est activé.
log_bin
• 
 Si le log binaire est activé.
log_slave_updates
• 
 Si les modifications des esclaves doivent être enregistrées.
long_query_time
• 
 Si une requête prend plus de
long_query_time
• 
 secondes, le compteur de requêtes lentes Slow_queries sera
incrémenté. Si vous utilisez l'option ??log?slow?queries , ces requêtes seront
enregistrées dans un historique de requêtes lentes. Cette durée est mesurée en temps réel,
et non pas en temps processus, ce qui fait que les requêtes qui seraient juste sous la limite
avec un système légèrement chargé, pourrait être au dessus avec le même système, mais
lower_case_table_names
• 
 Si cette option vaut 1, les noms de tables sont stockées en
minuscules sur le disque, et les comparaisons de nom de tables seront insensibles à la
max_allowed_packet
• 
 La taille maximale d'un paquet. Le buffer de message est initialisé
avec net_buffer_length octets, mais peut grandir jusqu'à max_allowed_packet
octets lorsque nécessaire. Cette valeur est par défaut petit, pour intercepter les gros
paquets, probablement erronés. Vous devez augmenter cette valeur si vous utilisez de
grandes colonnes BLOB . Cette valeur doit être aussi grande que le plus grand BLOB que
vous utiliserez. Le protocole limite actuellement max_allowed_packet à 16Mo en MySQL
3.23 et 1Go en MySQL 4.0.
max_binlog_cache_size
• 
 Si une transaction multi?requête requiert plus que cette
quantité de mémoire, vous obtiendrez une erreur "Multi?statement transaction
required more than 'max_binlog_cache_size' bytes of storage" .
max_binlog_size
• 
 Disponible depuis la version 3.23.33. Si vous écrivez dans le log
binaire (de réplication) et que cela dépasse la taille de max_binlog_size , une erreur sera
indiquée. Vous ne pouvez pas donner à max_binlog_size une valeur inférieure à 1024
octets, ou plus grande que 1 Go.
max_connections
• 
 Le nombre maximal de clients simultanés accepté. En augmentant
cette valeur, vous augmentez le nombre de pointeur de fichier que requiert mysqld . Voyez
max_connect_errors
• 
 Si il y a plus que max_connect_errors connexion interrompues
depuis un même hôte, cet hôte sera bloqué dans ses prochaines tentatives de connexions.
Vous pouvez débloquer un hôte avec la commande FLUSH HOSTS .
max_delayed_threads
• 
 Ne pas lancer plus que max_delayed_threads threads pour
gérer les insertions INSERT DELAYED . Si vous essayez d'insérer des données dans une
nouvelle table alors que tous les gestionnaires INSERT DELAYED sont utilisés, la ligne sera
insérée comme si l'option DELAYED n'avait pas été spécifiée.
 4.5.6.4 Syntaxe de SHOW VARIABLES
242

Manuel MySQL 4.1.x ? Version Française
max_heap_table_size
• 
 Ne pas autoriser la création de tables de type HEAP plus grande
que max_heap_table_size .
max_join_size
• 
 Les jointures qui liront probablement plus de max_join_size lignes,
retourneront une erreur. Utilisez cette valeur si vos utilisateurs font des jointures avec de
mauvaises clauses WHERE , qui prennent trop de temps, et retournent des millions de lignes.
max_sort_length
• 
 Le nombre d'octets à utiliser lors du tri des colonnes de type BLOB et
TEXT . Seuls les max_sort_length octets de chaque valeur seront utilisés pour le tri. Le
reste est ignoré.
max_user_connections
• 
 Le nombre maximum de connexions actives pour un utilisateur
particulier (0 = pas de limite).
max_tmp_tables
• 
 (Cette option ne fait actuellement rien du tout). Le nombre maximum de
tables temporaires qu'un client peut garder ouvertes en même temps.
max_write_lock_count
• 
 Après max_write_lock_count pose de verrou en écriture,
autorise quelques verrous en lecture.
myisam_recover_options
• 
 La valeur de l'option ??myisam?recover .
myisam_sort_buffer_size
• 
 Le buffer qui est alloués lors du tri d'index avec la
commande REPAIR ou lors de la création d'index avec CREATE INDEX ou ALTER TABLE .
myisam_max_extra_sort_file_size
• 
 . Si un fichier temporaire utilisé pour la création
rapide d'index devient plus grand que le cache de clé spécifié ici, la méthode utilisant le
cache de clé sera utilisé. C'est principalement utilisé pour forcer les index longs de grandes
tables à utiliser une méthode plus lente pour écrire l'index. Notez que ce paramètre est
spécifié en mégaoctets avant la version 4.0.3 et en octets depuis cette version.
myisam_max_sort_file_size
• 
 La taille maximale du fichier temporaire que MySQL est
autorisé à utiliser durant la recréation des fichiers d'index (avec REPAIR , ALTER TABLE ou
LOAD DATA INFILE ). Si la taille du fichier dépasse myisam_max_sort_file_size ,
l'index sera créé avec un cache de clé (plus lent). Notez que ce paramètre est spécifié en
mégaoctets avant la version 4.0.3 et en octets depuis.
net_buffer_length
• 
 Le buffer de communication est remis à zéro entre deux requêtes.
Cela ne devrait pas être modifié, mais si vous avez très peu de mémoire, vous pouvez le
remettre à la taille présumée de la requête (c'est à dire, la taille de requête envoyé par le
client. Si la requête dépasse cette taille, le buffer est automatiquement agrandi jusqu'à
max_allowed_packet octets).
net_read_timeout
• 
 Nombre de secondes d'attente des dernières données, avant
d'annuler la lecture. Notez que lorsque nous n'attendons pas de données d'une connexion,
le délai d'expiration est donné par write_timeout . Voir aussi slave_net_timeout .
net_retry_count
• 
 Si une lecture sur une port de communication est interrompu,
net_retry_count tentatives sont faites avant d'abandonner. Cette valeur doit être
particulièrement grande pour FreeBSD car les interruptions internes sont envoyés à tous les
threads.
net_write_timeout
• 
 Nombre de secondes d'attente pour qu'un bloc soit envoyé à une
connexion, avant d'annuler l'écriture.
open_files_limit
• 
 Si open_files_limit ne vaut pas 0, alors mysqld va utiliser cette
valeur pour réserver des pointeurs de fichiers à utiliser avec setrlimit() . Si cette valeur
est 0, alors mysqld va réserver max_connections*5 ou max_connections +
table_cache*2 (le plus grand des deux) pointeurs de fichiers. Vous devriez augmenter
cette valeur si mysqld vous donne des erreurs du type 'Too many open files' .
pid_file
• 
 La valeur de l'option ??pid?file .
port
• 
 La valeur de l'option ??port .
protocol_version
• 
 La version du protocole utilisé par le serveur MySQL.
read_buffer_size
• 
 (was record_buffer ) Chaque thread qui doit faire une recherche
séquentielle alloue une buffer de cette taille pour chaque table qu'il scanne. Si vous faîtes de
nombreuses recherches séquentielles, vous devriez augmenter cette valeur.
record_rnd_buffer_size
• 
 Lors de la lecture de lignes qui sont placées dans un ordre
trié, les lignes sont lues via ce buffer pour éviter les recherches sur le disque.
 4.5.6.4 Syntaxe de SHOW VARIABLES
243

Manuel MySQL 4.1.x ? Version Française
record_rnd_buffer_size peut améliorer grandement les performances de la clause
ORDER BY si cette valeur est grande. Comme c'est une variable qui est spécifique pour les
threads, il ne faut pas trop l'augmenter, mais simplement la modifier lorsque de grandes
requêtes sont exécutées.
query_cache_limit
• 
 Ne met pas en cache les résultats qui sont plus grands que
query_cache_limit . Par défaut, 1 Mo.
query_cache_size
• 
 La mémoire allouée pour stocker les résultats des vieilles requêtes. Si
query_cache_size vaut 0, le cache de requête est désactivé (par défaut).
• query_cache_type query_cache_type peut prendre les valeurs numériques suivantes
:
Valeur Alias
Commentaire
0
OFF
Ne met pas en cache les résultats.
Met en cache tous les résultats exceptés les requêtes SELECT
1
ON ,
SQL_NO_CACHE ... .
2
DEMAND Met en cache uniquement les requêtes SELECT SQL_CACHE ... .
safe_show_database
• 
 Ne montre pas les bases pour lesquelles un utilisateur n'a pas des
droits de bases ou de tables. Cela peut améliorer considérablement la sécurité si vous
craignez de voir les utilisateurs découvrir ce que les autres ont mis en place. Voir aussi
skip_show_database .
server_id
• 
 La valeur de l'option ??server?id .
skip_locking
• 
skip_locking vaut OFF si mysqld utilise le verrouillage externe.
skip_networking
• 
skip_networking vaut ON si seules les connexions locales (via
socket) sont autorisées.
• skip_show_database skip_show_database empêche les utilisateurs d'exécuter des
commandes SHOW DATABASES si ils n'ont pas les droits de PROCESS . Cela peut améliorer
la sécurité si vous craignez de voir les utilisateurs découvrir ce que les autres ont mis en
place. Voir aussi safe_show_database .
slave_net_timeout
• 
 Nombre de secondes d'attente de données en lecture ou écriture sur
une connexion maître / esclave avant d'annuler.
slow_launch_time
• 
 Si la création du thread prend plus de slow_launch_time
secondes, le compteur de threads lents Slow_launch_threads sera incrémenté.
socket
• 
 La socket Unix utilisé par le serveur.
sort_buffer
• 
 Chaque thread qui doit faire un tri alloue un buffer de cette taille. Augmentez
cette taille pour accélérer les clauses ORDER BY ou GROUP BYtable_cache
• 
 Le nombre de tables ouvertes pour tous les threads réunis. En augmentant
cette valeur, vous augmentez le nombre de pointeurs de fichiers que mysqld utilise. Vous
pouvez vérifier si vous avez besoin de plus de cache de tables en étudiant la valeur de la
variable Opened_tables . Syntaxe de SHOW . Si cette variable est grande, est que vous ne
faites pas souvent de commande FLUSH TABLES (qui force les tables à se recharger), vous
devrez alors augmenter cette plus d'informations sur le cache de table, voyez
table_type
• 
 Le type de table par défaut.
thread_cache_size
• 
 Combien de threads nous allons conserver en cache pour
réutilisation. Lorsqu'un client se déconnecte, les threads du client sont mis en cache s'il n'y
en a pas déjà thread_cache_size de conservé. Tous les nouveaux threads sont d'abord
prélevé dans le cache, et uniquement lorsque le cache est vide, un nouveau thread est créé.
Cette variable peut vous permettre d'améliorer les performances si vous avez de
nombreuses connexions. Normalement, thread_cache_size ne donne pas d'amélioration
notable si vous avez une bonne implémentation des threads. En examinant la différence
entre les variables de statut Connections et Threads_created vous pouvez voir
comment votre système de cache de threads est efficace.
thread_concurrency
• 
 Sous Solaris, mysqld va appeler thr_setconcurrency() avec
cette valeur. thr_setconcurrency() permet à l'application de donner au système de
 4.5.6.4 Syntaxe de SHOW VARIABLES
244

Manuel MySQL 4.1.x ? Version Française
threads une indication sur le nombre de threads qui seront exécutés en même temps.
thread_stack
• 
 La taille de la pile pour chaque thread. De nombreuses limites détectées
par crash?me sont dépendantes de cette valeur. La valeur par défaut est suffisamment
timezone
• 
 Le fuseau horaire du serveur.
tmp_table_size
• 
 Si une table temporaire en mémoire excède cette taille, MySQL va
automatiquement la convertir en une table MyISAM sur le disque. Augmentez la valeur de
tmp_table_size si vous faites un usage intensif de la clause GROUP BY et que vous avez
beaucoup de mémoire.
tmpdir
• 
 Le dossier utilisé pour les fichiers temporaires et les tables temporaires.
version
• 
 Le numéro de version du serveur.
wait_timeout
• 
 Le nombre de secondes d'attente du serveur sur une connexion non
interactive avant de la du démarrage du thread, SESSION.WAIT_TIMEOUT
est initialisé avec GLOBAL.WAIT_TIMEOUT ou GLOBAL.INTERACTIVE_TIMEOUT , suivant
le type de client (tel que défini par l'option de connexion CLIENT_INTERACTIVE ). Voir
aussi interactive_timeout .
La section du manuel qui est consacrée à l'optimisation de MySQL contient des informations sur
l'utilisation des variables ci?dessus. Choix des paramètres du serveur .
4.5.6.5 Syntaxe de SHOW LOGS
La commande SHOW LOGS affiche les informations d'état de vos fichiers de logs. Actuellement, elle
n'affiche que les informations pour les fichiers de log des tables Berkeley DB.
File
• 
 affiche le chemin complet jusqu'au fichier de log.
Type
• 
 affiche le type de fichier de log ( BDB pour les tables de types Berkeley DB)
Status
• 
 affiche le status du fichier de log ( FREE si le fichier peut être supprimé, ou IN USE
si le fichier est utilisé par une transaction en cours)
4.5.6.6 Syntaxe de SHOW PROCESSLIST
SHOW [FULL] PROCESSLIST affiche la liste de processus qui sont en cours d'exécution. Vous
pouvez aussi obtenir ces informations avec la commande en ligne mysqladmin processlist .
Si vous avez les droits de SUPER , vous pourrez aussi voir les autres threads. Sinon, vous ne
pourrez voir que les votre. Syntaxe de KILL . Si vous n'utilisez pas l'option FULL , seuls les 100
premiers caractères de chaque requête seront affichés.
Cette commande est très pratique si vous obtenez trop d'erreurs 'too many connections' et que
vous voulez savoir ce qui se passe. MySQL réserve une connexion supplémentaire pour un client
ayant les droits de SUPER , de façon à ce qu'il y ait toujours la possibilité de se connecter et de
vérifier le système (en supposant que vous ne donnez pas ce droit à tous vos utilisateurs).
Certains états sont souvent disponible dans le résultat de mysqladmin processlist
Checking table
• 
 Le thread fait une vérification (automatique) de la table.
Closing tables
• 
 Le thread est en train d'écrire les données modifiées sur le disque, et il
va fermer les tables. Cela doit être une opération très rapide. Si ce n'est pas le cas, vous
devriez vérifier si vous n'avez pas un disque plein, ou que le disque est sous haute charge.
Connect Out
• 
 Connexion d'un esclave sur le maître.
Copying to tmp table on disk
• 
 Le résultat temporaire était plus grand que
tmp_table_size et le thread passe d'une table en mémoire à une table sur disque.
 4.5.6.5 Syntaxe de SHOW LOGS
245

Manuel MySQL 4.1.x ? Version Française
Creating tmp table
• 
 Le thread est en train de créer une table temporaire pour contenir
le résultat d'une requête.
deleting from main table
• 
 Lors de l'exécution de la première partie d'une requête
d'effacement multi?table, et que MySQL n'a commencé à effacer que dans la première
table.
deleting from reference tables
• 
 Lors de l'exécution de la deuxième partie d'une
requête d'effacement multi?table, et que MySQL a commencé à effacer dans les autres
tables.
Flushing tables
• 
 Le thread exécute la commande FLUSH TABLES et il attend que tous
les threads ferme leur tables.
Killed
• 
 Quelqu'un a envoyé une commande KILL et le thread s'annuler la prochaine fois
qu'il vérifie l'option de kill. Cette option est vérifiée dans chaque boucle majeure de MySQL,
mais dans certains cas, il peut lui prendre un court instant avant de s'arrêter. Si le thread est
verrouillé par un autre thread, l'arrêt va prendre effet aussitôt que l'autre thread lève son
verrou.
Sending data
• 
 Le thread traite des lignes pour une commande SELECT et il envoie les
données au client.
Sorting for group
• 
 Le thread est en train de faire un tri pour satisfaire une clause GROUP
BY .
Sorting for order
• 
 Le thread est en train de faire un tri pour satisfaire une clause ORDER
BY .
Opening tables
• 
 Cela signifie simplement que le thread essaie d'ouvrir une table. Ce doit
être une opération très rapide, à moins que quelque chose ne retarde l'ouverture. Par
exemple, une commande ALTER TABLE ou LOCK TABLE peut empêcher l'ouverture de
table, jusqu'à l'achèvement de la commande.
Removing duplicates
• 
 La requête utilisait SELECT DISTINCT de telle manière que
MySQL ne pouvait pas optimiser les lignes distinctes au début du traitement. A cause de
cela, MySQL doit effectuer une opération de plus pour supprimer toutes les lignes en
doubles, avant d'envoyer les lignes au client.
Reopen table
• 
 Le thread a reçu un verrou pour une table, mais a noté après l'avoir reçu
que la structure de la table a changé. Il a libéré le verrou, fermé la table, et maintenant il
essaie de la réouvrir.
Repair by sorting
• 
 Le thread répare la table en utilisant la méthode de tri pour créer
l'index.
Repair with keycache
• 
 Le thread répare la table en utilisant la méthode de création des
clés à partir du cache de clé. C'est bien plus lent que la réparation par tri .
Searching rows for update
• 
 Le thread effectue une première phase pour trouver
toutes les lignes qui satisfont les critères avant de les modifier. Cela doit être fait si UPDATE
modifie l'index qui sera utilisé pour trouver les lignes.
Sleeping
• 
 Le thread attend que le client envoie une nouvelle commande.
System lock
• 
 Le thread attend le verrou externe pour la table. Si vous n'utilisez pas de
serveurs MySQL multiples qui exploitent les mêmes tables, vous pouvez désactiver les
verrous systèmes avec l'option ??skip?external?locking .
Upgrading lock
• 
 Le gestionnaire de INSERT DELAYED essaie d'obtenir un verrou pour
insérer des lignes.
Updating
• 
 Le thread recherche des lignes pour les modifier.
User Lock
• 
 Le thread attend un GET_LOCK() .
Waiting for tables
• 
 Le thread a reçu l'annonce que la structure de table a été modifiée,
et il doit réouvrir la table pour obtenir une nouvelle structure. Pour être capable de réouvrir la
table, il doit attendre que les autres threads aient fermé la table en question.Cette annonce
survient lorsqu'un autre autre thread a été utilisé avec la commande FLUSH TABLES ou une
des commandes suivantes, appliquées à la table en question : FLUSH TABLES
table_name , ALTER TABLE , RENAME TABLE , REPAIR TABLE , ANALYZE TABLE ou
OPTIMIZE TABLE .
 4.5.6.5 Syntaxe de SHOW LOGS
246

Manuel MySQL 4.1.x ? Version Française
waiting for handler insert
• 
 Le gestionnaire de INSERT DELAYED a traité toutes
insertions, et en attend de nouvelles.
La plupart des états sont des opérations très rapides. Si le thread s'attarde dans un de ces états
pour plusieurs secondes, il doit y avoir un problème qui mérite d'être étudié.Il existe encore d'autres
états qui ne sont pas mentionné ci?dessus, mais la majorité sont utilisés pour trouver des bogues
dans mysqld .
4.5.6.7 SHOW GRANTS
SHOW GRANTS FOR user affiche la commande nécessaire pour donner les même droits qu'un
utilisateur existant.
mysql> SHOW GRANTS FOR root&#64;localhost;
+?????????????????????????????????????????????????????????????????????+
| Grants for root&#64;localhost                                           |
+?????????????????????????????????????????????????????????????????????+
| GRANT ALL PRIVILEGES ON *.* TO 'root'&#64;'localhost' WITH GRANT OPTION |
+?????????????????????????????????????????????????????????????????????+
4.5.6.8 Syntaxe de SHOW CREATE TABLE
Affiche la commande CREATE TABLE nécessaire pour créer une table donnée.
mysql> SHOW CREATE TABLE t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE t (
  id int(11) default NULL auto_increment,
  s char(60) default NULL,
  PRIMARY KEY (id)
) TYPE=MyISAM
SHOW CREATE TABLE va protéger le nom de la table et des colonnes selon l'option
SQL_QUOTE_SHOW_CREATE . Syntaxe de SET .
4.6 Localisation de MySQL et utilisation internationale
4.6.1 Le jeu de caractères utilisé pour les données et le stockage
Par défaut, MySQL utilise le jeu de caractères ISO?8859?1 (Latin1) avec tri en accord au
Suédois/Finnois. C'est le jeu de caractère le mieux adapté pour les USA et l'Europe de l'ouest.
Tous les binaires standards MySQL sont compilés avec ??with?extra?charsets=complex .
Cela ajoutera du code à tous les programmes standards pour qu'ils puissent gérer latin1 et tous
les jeux de caractères multi?octets compris dans le binaire. Les autres jeux de caractères seront
chargés à partir d'un fichier de définition de jeu si besoin.
Le jeu de caractères détermine quels caractères sont autorisés dans les noms et comment
s'effectuent les tris dans les clauses ORDER BY et GROUP BY de la commande SELECT .
 4.5.6.7 SHOW GRANTS
247

Manuel MySQL 4.1.x ? Version Française
Vous pouvez changer le jeu de caractères avec l'option de démarrage du serveur
??default?character?set . Les jeux de caractères disponibles dépendent des options
??with?charset=charset et ??with?extra?charsets= list?of?charset | complex
| all de configure , et des fichiers de configuration de jeux de caractères situés dans
SHAREDIR/charsets/Index . Les options habituelles de configure .
Si vous changez le jeu de caractères lors de l'utilisation de MySQL (ce qui pourra aussi changer
l'ordre de tri), vous devez exécuter myisamchk ?r ?q ??set?character?set=charset sur
toutes les tables. Sinon, vos index pourront ne pas être ordonnés correctement.
Lorsqu'un client se connecte à un serveur MySQL, le serveur envoie le jeu de caractères utilisé par
défaut au client. Le client changera de jeu de caractères pour cette connexion.
Vous devez utiliser mysql_real_escape_string() pour protéger les chaînes pour une requête
SQL. mysql_real_escape_string() est identique à l'ancienne fonction
mysql_escape_string() , excepté qu'elle prend le gestionnaire de connexion MYSQL en tant
que premier paramètre.
Si le client est compilé avec d'autres chemins que ceux où le serveur est installé et que la personne
qui a configuré MySQL n'a pas inclut tous les jeux de caractères dans le binaire MySQL, vous
devez indiquer au client où il peut trouver les jeux de caractères additionnels dont il aura besoin si
le serveur utilise un autre jeu de caractères que le client.
On peut le spécifier en plaçant dans un fichier d'options MySQL :
[client]
character?sets?dir=/usr/local/mysql/share/mysql/charsets
où le chemin pointe vers le répertoire où les jeux de caractères dynamiques de MySQL sont
stockés.
On peut forcer le client à utiliser un jeu de caractères spécifique en précisant :
[client]
default?character?set=character?set?name
mais on n'en a normalement jamais besoin. b
4.6.1.1 Jeu de caractères allemand
Pour obtenir l'ordre de tri Allemand, vous devez démarrer mysqld avec
??default?character?set=latin1_de . Cela vous donnera les caractéristiques différentes.
Lors du tri et de la comparaison des chaînes, les remplacements suivants sont faits dans la chaîne
avant d'effectuer la comparaison :
ä  ?>  ae
ö  ?>  oe
ü  ?>  ue
ß  ?>  ss
Tous les caractères accentués sont convertis en leur majuscule non?accentuée. Toutes les lettres
sont transformées en majuscules.
 4.6.1.1 Jeu de caractères allemand
248

Manuel MySQL 4.1.x ? Version Française
Lors de la comparaison des chaînes de caractères avec LIKE le conversion un ?> deux caractères
n'est pas effectuée. Toutes les lettres sont transformées en majuscules. Les accents sont
supprimés de toutes les lettres, à l'exception de : Ü , ü , Ö , ö , Ä et ä .
4.6.2 Langue des messages d'erreurs
mysqld peut émettre des messages d'erreurs dans les langues suivantes : Tchèque, Danois,
Néerlandais, Anglais (par défaut), Estonien, Français, Allemand, Grec, Hongrois, Italien, Japonais,
Coréen, Norvégien, Norwegian?ny, Polonais, Portugais, Roumain, Russe, Slovaque, Espagnol et
Suédois.
Pour démarrer mysqld avec une langue particulière, utilisez soit l'option ??language=lang , soit
?L lang . Par exemple :
shell> mysqld ??language=french
ou :
shell> mysqld ??language=/usr/local/share/french
Notez que tout les noms de langue sont spécifiés en fichiers de langue sont situés
(par défaut) dans Array .
Pour modifier le fichier de messages d'erreurs, vous devez éditer le fichier  et exécuter
la commande suivante pour générer le fichier  :
shell> comp_err
Si vous changez de version de MySQL, pensez à modifier le nouveau fichier  .
4.6.3 Ajouter un nouveau jeu de caractères
Pour ajouter un autre jeu de caractères à MySQL, utilisez la procédure suivante.
Décidez s'il s'agit d'un jeu simple ou complexe. Si le jeu de caractères n'a pas besoin d'utiliser des
routines d'assemblage de chaînes spéciales pour le tri et n'a pas besoin du support des jeux de
caractères multi?octets, il est simple. S'il a besoin de l'une de ces deux fonctionnalités, il est
complexe.
Par exemple, latin1 et danish sont des jeux de caractères simples tandis que big5 et czech
sont complexes.
Dans la section suivante, nous supposons que vous nommez votre jeu de caractères MONJEU .
Pour un jeu de caractères simple, effectuez ce qui suit :
Ajoutez MONJEU à la fin du fichier 
• 
sql/share/charsets/Index Assignez?lui un
nombre unique.
Créez le fichier 
• 
 . (Vous pouvez vous inspirer de
 .)La syntaxe pour le fichier est très simple :
Les commentaires commencent avec le caractère '#' et se terminent à la fin de la

ligne.
Les mots sont séparés par un nombre changeant d'espaces blancs.

 4.6.2 Langue des messages d'erreurs
249

Manuel MySQL 4.1.x ? Version Française
Lors de la définition d'un jeu de caractères, chaque mot doit être un nombre au

format hexadécimal.
Le tableau 

ctype prends les 257 premiers mots. Les tableaux to_lower[] ,
to_upper[] et sort_order[] prennent chacun 256 mots après cela.
Ajoutez le nom du jeu de caractères aux listes 
• 
CHARSETS_AVAILABLE et
COMPILED_CHARSETS dans  .
Reconfigurez, recompilez et testez.
• 
Pour un jeu de caractères complexe faites ce qui suit :
Créez le fichier 
• 
strings/ctype?MONJEU.c dans la distribution des sources MySQL.
Ajoutez MONJEU à la fin du fichier 
• 
sql/share/charsets/Index . Assignez?lui un
nombre unique.
Regardez un des fichiers 
• 
ctype?*.c existant pour voir ce qui doit être défini, par exemple,
strings/ctype?big5.c . Notez que les tableaux dans votre fichier doivent avoir des
noms tels que ctype_MONJEU , to_lower_MONJEU , etc. Cela correspond aux tableaux
de caractère complexe
Au début du fichier, placez un commentaire spécial comme celui?ci :
• 
/*
 * This comment is parsed by configure to create ctype.c,
 * so don't change it unless you know what you are doing.
 *
 * .configure. number_MONJEU=MYNUMBER
 * .configure. strxfrm_multiply_MONJEU=N
 * .configure. mbmaxlen_MONJEU=N
 */
Le programme configure utilise ce commentaire pour inclure automatiquement le jeu de
caractères dans la librairie MySQL.
Les lignes strxfrm_multiply et mbmaxlen seront expliquées dans les sections suivantes. Ne
les incluez que si vous avez besoin des fonctions d'assemblage des chaînes ou des
fonctions de jeu de caractères multi?octets, respectivement.
Vous devez alors créer les fonctions suivantes :
• 
my_strncoll_MONJEU()

my_strcoll_MONJEU()

my_strxfrm_MONJEU()

my_like_range_MONJEU()

Ajoutez le nom du jeu de caractères aux listes 
• 
CHARSETS_AVAILABLE et
COMPILED_CHARSETS dans  .
Reconfigurez, recompilez et testez.
• 
Le fichier sql/share/charsets/README fournit plus d' vous voulez qu'un jeu de
caractères soit ajouté dans la distribution MySQL, envoyez un patch à .
4.6.4 Le tableau de définition des caractères
to_lower[] et to_upper[] sont de simples tableaux qui contiennent les caractères minuscules
et majuscules correspondant à chaque membre du jeu de caractère. Par exemple :
to_lower['A'] doit contenir 'a'
to_upper['a'] doit contenir 'A'
 4.6.4 Le tableau de définition des caractères
250

Manuel MySQL 4.1.x ? Version Française
sort_order[] est une carte indiquant comment les caractères doivent être ordonnés pour les
comparaisons et les tris. Pour beaucoup de jeux de caractères, c'est la même chose que
to_upper[] (ce qui signifie que le tri sera insensible à la casse). MySQL triera les caractères en
se basant sur la valeur de sort_order[caractère] . Pour des règles de tri plus compliquées,
voyez la discussion suivante sur l'assemblage des chaînes. Support d'assemblage de chaînes .
ctype[] est un tableau de valeurs de bit, avec un élément par caractère. (Notez que to_lower[]
, to_upper[] , et sort_order[] sont indexés par la valeur du caractère, mais que ctype[] est
indexé par la valeur du caractère + 1. C'est une vielle habitude pour pouvoir gérer EOF .)
Vous pouvez trouver les définitions de bitmask suivantes dans m_ctype.h :
#define _U      01      /* Majuscule */
#define _L      02      /* Minuscule */
#define _N      04      /* Numérique (nombre) */
#define _S      010     /* Caractère d'espacement */
#define _P      020     /* Ponctuation */
#define _C      040     /* Caractère de contrôle */
#define _B      0100    /* Blanc */
#define _X      0200    /* nombre hexadecimal */
L'entrée ctype[] de chaque caractère doit être l'union des valeurs de masque de bits qui décrivent
le caractère. Par exemple, 'A' est un caractère majuscule ( _U ) autant qu'une valeur
hexadécimale ( _X ), et donc ctype['A'+1] doit contenir la valeur :
_U + _X = 01 + 0200 = 0201
4.6.5 Support d'assemblage des chaînes
Si les règles de tri de votre langue sont trop complexes pour être gérées par le simple tableau
sort_order[] , vous devez utiliser les fonctions d'assemblage de chaînes.
Jusqu'à présent, la meilleure documentation traitant de ce sujet est présente dans les jeux de
caractères implémentés eux?mêmes. Regardez les jeux de caractères big5 , czech , gbk , sjis ,
et tis160 pour des exemples.
Vous devez spécifier la valeur de strxfrm_multiply_MYSET=N dans le commentaire spécial au
début du fichier. N doit être le rationnel maximal vers lequel la chaîne pourra croître durant
my_strxfrm_MYSET (cela doit être un entier positif).
4.6.6 Support des caractères multi?octets
Si vous voulez ajouter le support de jeu de caractères incluant des caractères multi?octets, vous
devez utiliser les fonctions de caractères multi?octets.
Jusqu'à présent, la meilleure documentation traitant de ce sujet est présente dans les jeux de
caractères implémentés eux?mêmes. Regardez les jeux de caractères euc_kr , gb2312 , gbk ,
sjis , et ujis pour des exemples. Ils sont implémentés dans les fichiers ctype?'charset'.c
dans le dossier strings .
Vous devez spécifier la valeur de mbmaxlen_MYSET=N dans le commentaire spécial en haut du
fichier source. N doit être la taille en octet du caractère le plus large dans le jeu.
 4.6.5 Support d'assemblage des chaînes
251

Manuel MySQL 4.1.x ? Version Française
4.6.7 Problèmes avec les jeux de caractères
Si vous essayez d'utiliser un jeu de caractères qui n'est pas compilé dans votre exécutable, vous
pouvez rencontrer différents problèmes :
Votre programme a un chemin faux en ce qui concerne l'endroit où sont stockés les jeux de
• 
caractères. (Par défaut /usr/local/mysql/share/mysql/charsets ). Cela peut être
réparé en utilisant l'option ??character?sets?dir du programme en question.
Le jeu de caractères est un jeu de caractères multi?octets qui ne peut être chargé
• 
dynamiquement. Dans ce cas, vous devez recompiler le programme en incluant le support
du jeu de caractère.
Le jeu de caractères est un jeu de caractères dynamique, mais vous n'avez pas de fichier de
• 
configuration lui étant associé. Dans ce cas, vous devez installer le fichier de configuration
du jeu de caractères à partir d'une nouvelle distribution MySQL.
Votre fichier 
• 
Index ne contient pas le nom du jeu de caractères.
ERROR 1105: File '' not found
(Errcode: 2)
Dans ce cas, vous devez soit obtenir un nouveau fichier Index ou ajouter à la main le nom
du jeu de caractères manquant.
Pour les tables MyISAM , vous pouvez vérifier le nom du jeu de caractères et son nombre associé
d'une table avec myisamchk ?dvv nom_de_table .
4.7 Scripts serveur MySQL et utilitaires
4.7.1 Présentation des scripts serveurs et des utilitaires
Tous les programmes MySQL prennent des options différentes. Toutefois, tous les programmes
MySQL disposent de l'option ??help qui vous aidera a connaitre la liste complète des différentes
options. Essayez par exemple mysql ??help .
Vous pouvez modifier toutes les valeurs par défaut des programmes en les plaçant dans le fichier
de configuration. Fichier d'options  .
Voici la liste des programmes coté serveur de MySQL :
myisamchk
Un utilitaire pour décrire, vérifier, optimiser et réparer les tables MySQL. Comme
myisamchk a de très nombreuses fonctions, ce programme dispose de son propre
chapitre dans la documentation. Administration de la base .
make_binary_distribution
Prépare une version exécutable d'un MySQL compilé. Il doivent être envoyés par
FTP à /pub/mysql/Incoming sur  pour en faire profiter les
autres utilisateurs MySQL.
mysqlbug
Le script de rapport de bogue. Ce script doit toujours être utilisé lorsque vous devez
envoyez un rapport de bogues aux listes de diffusion de MySQL.
mysqld
Le démon SQL. Il doit toujours être en fonctionnement.
mysql_install_db
Crée les tables de droits MySQL, avec les droits par défaut. Il est généralement
exécuté une fois, lors de la première installation de MySQL.
 4.6.7 Problèmes avec les jeux de caractères
252

Manuel MySQL 4.1.x ? Version Française
4.7.2 safe_mysqld , le script père de mysqld
safe_mysqld est la méthode recommandée pour démarrer un démon mysqld sous Unix.
safe_mysqld ajoute des fonctionnalités de sécurité telles que le redémarrage automatique
lorsqu'une erreur survient et l'enregistrement d'informations d'exécution dans un fichier de log.
Si vous n'utilisez pas ??mysqld=# ou ??mysqld?version=# safe_mysqld va utiliser un
programme appelé mysqld?max s'il existe. Sinon, safe_mysqld va démarrer le démon mysqld .
Cela rend très facile le test de mysqld?max au lieu de mysqld ; copiez simplement mysqld?max à
coté de mysqld et il sera utilisé.
Normalement, vous ne devriez jamais éditer le script safe_mysqld , mais plutôt utiliser les options
de safe_mysqld dans la section [safe_mysqld] du fichier  . safe_mysqld va lire
toutes les options des sections [mysqld] , [server] et [safe_mysqld] , dans le fichier
d'options. Fichier d'options  .
Notez que toutes les options de ligne de commande passées à safe_mysqld sont transmises à
mysqld . Si vous voulez utiliser une option de safe_mysqld que mysqld ne supporte pas, vous
devez la spécifier dans le fichier d'options.
La plupart des options de safe_mysqld sont les mêmes que celles de mysqldde commande de mysqld .
safe_mysqld supporte les options suivantes :
??basedir=path
??core?file?size=#

Taille du fichier core que mysqld doit être capable de créer. Il est passé à ulimit
?c .
??datadir=path
??defaults?extra?file=path
??defaults?file=path
??err?log=path
??ledir=path

Chemin de mysqld
??log=path
??mysqld=mysqld?version

Nom de la version de mysqld dans le dossier ledir que vous voulez démarrer.
??mysqld?version=version
Similaire à ??mysqld= mais vous ne donnez que le suffixe de mysqld . Par
exemple, si vous utilisez ??mysqld?version=max , safe_mysqld va démarrer la
version ledir/mysqld?max . Si l'argument de ??mysqld?version est vide,
ledir/mysqld sera utilisé.
??no?defaults
??open?files?limit=#

Nombre de fichiers que mysqld doit être capable d'ouvrir. Passé à ulimit ?n .
Notez que vous devez démarrer safe_mysqld en tant que root pour que cette
option fonctionne correctement !
??pid?file=path
??port=#
??socket=path
??timezone=#

Configure le fuseau horaire (le TZ ).
??user=#
 4.7.2 safe_mysqld , le script père de mysqld
253

Manuel MySQL 4.1.x ? Version Française
Le script safe_mysqld a été écrit pour qu'il soit capable de démarrer le serveur qui a été installé à
partir des sources ou de la version binaire, même si l'installation de MySQL est légèrement
exotique. safe_mysqld suppose que les conditions suivantes sont remplies :
Le serveur et les bases de données sont placées dans un dossier relativement au dossier
• 
d'où safe_mysqld est appelé. safe_mysqld cherche dans les sous dossiers bin et data
(pour les distributions binaires) et, libexec et var (pour les distributions sources). Cette
condition doit être remplie si vous exécutez safe_mysqld depuis votre dossier d'installation
MySQL (par exemple, /usr/local/mysql pour une distribution binaire).
Si le serveur et les bases de données ne peuvent être trouvées dans le dossier de travail,
• 
safe_mysqld essaie de les trouver en utilisant leurs chemins absolus. Les chemin
typiquement étudiés sont /usr/local/libexec et /usr/local/var . Les chemins réels
sont déterminés lorsque la distribution est compilée, et safe_mysqld a alors aussi été
généré. Ils doivent être corrects si MySQL a été installé dans un dossier standard.
Comme safe_mysqld essaie de trouver le serveur et les bases dans un dossier situé dans le
dossier de travail, vous pouvez installer la version binaire de MySQL n'importe où, du moment que
vous démarrez le script safe_mysqld dans le dossier d'installation de MySQL :
shell> cd mysql_installation_directory
shell> bin/safe_mysqld &
Si safe_mysqld échoue, même si il est appelé depuis le dossier d'installation, vous pouvez le
modifier pour qu'il reconnaisse le chemin que vous utilisez jusqu'à mysqld . Notez que si vous
faites évoluer votre installation de MySQL, votre version de safe_mysqld sera écrasée, et vous
devrez la rééditer.
4.7.3 mysqld_multi , un programme pour gérer plusieurs serveurs
MySQL

mysqld_multi sert à gérer plusieurs serveurs mysqld qui utilisent différentes sockets Unix et
ports TCP/IP.
Le programme va rechercher les groupes nommés [mysqld#] dans le fichier  (ou le fichier
appelé ??config?file=... ), où # peut être n'importe quel nombre positif, supérieur ou égal à 1.
Ce nombre est appelé le numéro de groupe d'options. Les numéros de groupe permettent de
distinguer un groupe d'options d'un autre, et sont utilisés comme argument du script
mysqld_multi pour spécifier quel serveur vous voulez démarrer, arrêter ou examiner. Les options
listées dans ces groupes doivent être les mêmes que celle que vous utiliseriez dans une section
dédiée au démon [mysqld]Cependant, pour mysqld_multi , vous devez vous assurer que chaque groupe contient des
valeurs pour les options telles que port, socket, etc., qui seront utilisées par chaque processus
mysqld .
mysqld_multi est utilisé ave la syntaxe suivante :
Usage: mysqld_multi [OPTIONS] &#123;start|stop|report&#125; [GNR,GNR,GNR...]
or     mysqld_multi [OPTIONS] &#123;start|stop|report&#125; [GNR?GNR,GNR,GNR?GNR,...]
Chaque GNR représente un numéro de groupe d'options. Vous pouvez démarrer, arrêter ou
examiner n'importe quel numéro de groupe d'options, ou même plusieurs d'entre eux en même
temps. Pour un exemple de comment configurer le fichier d'options, utilisez cette commande :
shell> mysqld_multi ??example
Les valeurs de numéro de groupe d'options peuvent être une liste de valeurs séparées par une
virgule ou un tiret. Dans ce dernier cas, toutes les numéro de groupe d'options situés entre les deux
 4.7.3 mysqld_multi , un programme pour gérer plusieurs serveurs MySQL
254

Manuel MySQL 4.1.x ? Version Française
numéros seront alors affectés. Sans numéro de groupe d'options spécifié, tous les numéros de
groupes du fichier d'options sont affectés. Notez que vous ne devez pas avoir d'espace dans la liste
des numéros de groupe d'options. Tout ce qui est placé au?delà de l'espace sera ignoré.
mysqld_multi supporte les options suivantes :
??config?file=...
Un fichier de configuration alternatif. Note : cela ne va pas modifier les options de ce
programme ( [mysqld_multi] ), mais uniquement les groupes [mysqld#] . Sans
cette option, tout sera lu dans le fichier d'options traditionnel  .
??example
Affiche un exemple de fichier de configuration.
??help
Affiche l'aide et quitte.
??log=...
Fichier de log. Le chemin complet et le nom du fichier sont nécessaires. Note : si le
fichier existe déjà, les prochaines données seront ajoutées au fichier.
??mysqladmin=...
L'exécutable mysqladmin à utiliser lors de l'arrêt du serveur.
??mysqld=...
L'exécutable mysqld à utiliser. Notez que vous pouvez donner cette option à
safe_mysqld . Ces options sont passées à mysqld . Assurez?vous que vous avez
bien mysqld dans votre variable d'environnement PATH ou corrigez safe_mysqld .
??no?log
Affiche les données d'historique à l'écran plutôt que dans le fichier de log. Par défaut,
le fichier de log est activé.
??password=...
Le mot de passe de l'utilisateur mysqladmin .
??tcp?ip
Connexion au serveur MySQL via le port TCP/IP au lieu de la socket Unix. Cela
affecte l'arrêt et le rapport. Si le fichier de socket manque, le serveur peut continuer
de tourner, mais il n'est plus accessible que par port TCP/IP. Par défaut, les
connexions sont faites avec les sockets Unix.
??user=...
L'utilisateur MySQL pour mysqladmin .
??version
Affiche le numéro de version et quitte.
Quelques notes pour mysqld_multi :
Assurez?vous que l'utilisateur MySQL, qui stoppe les services 
• 
mysqld (e.g en utilisant la
commande mysqladmin ), a les mêmes nom d'utilisateur et mot de passe pour tous les
dossiers de données utilisés. Et assurez?vous que cet utilisateur a bien les droits de
SHUTDOWN ! Si vous avez de nombreux dossiers de données et de nombreuses bases
mysql avec différents mots de passe pour le serveur root MySQL, vous souhaiterez peut
être créer un utilisateur commun multi_admin à chaque base, avec le même mot de
passe (voir ci?dessous). Voici comment faire :
shell> mysql ?u root ?S ?proot_password ?e
"GRANT SHUTDOWN ON *.* TO multi_admin&#64;localhost IDENTIFIED BY 'multipass'"
chaque serveur mysqld qui fonctionne : changez simplement la socket, ?S=... ).
pid?file
• 
 est très important, si vous utilisez safe_mysqld pour démarrer mysqld (e.g.,
??mysqld=safe_mysqld ). Chaque mysqld doit avoir son propre fichier pid?file .
L'avantage d'utiliser safe_mysqld au lieu de mysqld est que safe_mysqld ``surveille''
tous les processus mysqld et les redémarrera si un processus mysqld s'arrête suite à la
 4.7.3 mysqld_multi , un programme pour gérer plusieurs serveurs MySQL
255

Manuel MySQL 4.1.x ? Version Française
reception d'un signal kill ?9 , ou pour toute autre raison comme une erreur de
segmentation (que MySQL ne devrait jamais faire, bien sûr !). Notez bien que le script
safe_mysqld vous imposera peut être d'être démarré depuis un dossier spécial. Cela
signifie que vous devrez probablement utiliser la commande shell cd jusqu'à un certain
dossier avant de pouvoir exécuter mysqld_multi . Si vous avez des problèmes pour
démarrer, voyez le script safe_mysqld . Vérifiez notamment ces lignes :
??????????????????????????????????????????????????????????????????????????
MY_PWD=`pwd` Check if we are starting this relative (for the binary
release) if test ?d /data/mysql ?a ?f
?a ?x ./bin/mysqld
??????????????????????????????????????????????????????????????????????????
vous rencontrerez probablement des problèmes.
N'oubliez jamais les problèmes que peut soulever le démarrage de plusieurs démons
• 
mysqld avec le même dossier de données. Utilisez des dossiers de données séparés, à
moins que vous ne sachiez bien ce que vous faites.
Le fichier de socket et le port TCP/IP doivent être différents pour chaque 
• 
mysqld .
Le premier et le cinquième groupe 
• 
mysqld on été intentionnellement ignorés dans le groupe
d'exemple. Vous pouvez laisser des trous dans le fichier de configuration. Cela vous
donnera plus de souplesse. L'ordre dans lequel les démons mysqlds sont démarrés ou
arrétés dépend de l'ordre dans lequel ils apparaissent dans le fichier de configuration.
Lorsque vous voulez faire référence à un groupe en utilisant le numéro de groupe d'options,
• 
utilisez simplement le numéro du groupe à la fin du nom du groupe. Par exemple, le numéro
de groupe de [mysqld17] est le 17.
Vous pouvez vouloir utiliser l'option 
• 
??user pour mysqld , mais afin de faire cela, vous
devez exécuter le script mysqld_multi en tant que root Unix. Placer cette option dans le
fichier de configuration ne changera rien : vous obtiendrez une alerte, si vous n'êtes pas le
super utilisateur, et les démons mysqld seront démarrés avec vos droits Unix. Important :
assurez?vous bien que le fichier de données et le fichier de pid?file sont accessibles en
lecture et écriture (et exécution pour le dernier) à l'utilisateur Unix qui lance les processus
mysqld . N'utilisez pas le compte root Unix pour cela, à moins que vous ne sachiez ce
que vous faîtes.
Très important
• 
 : assurez?vous de bien comprendre la signification des options que vous
passez à mysqld s et pourquoi vous avez besoin de plusieurs processus mysqld .
Démarrer plusieurs serveurs mysqld s dans le même dossier ne vous donnera aucun gain
de performance dans un système threadé.
configuration fourni par mysqld_multi .
# This file should probably be in your home dir () or
# Version 2.1 by Jani Tolonen
[mysqld_multi]
mysqld     = /usr/local/bin/safe_mysqld
mysqladmin = /usr/local/bin/mysqladmin
user       = multi_admin
password   = multipass
[mysqld2]
socket     = /tmp/mysql.sock2
port       = 3307
pid?file   = /usr/local/mysql/var2/hostname.pid2
datadir    = /usr/local/mysql/var2
language   = /usr/local/share/mysql/english
user       = john
[mysqld3]
socket     = /tmp/mysql.sock3
 4.7.3 mysqld_multi , un programme pour gérer plusieurs serveurs MySQL
256

Manuel MySQL 4.1.x ? Version Française
port       = 3308
pid?file   = /usr/local/mysql/var3/hostname.pid3
datadir    = /usr/local/mysql/var3
language   = /usr/local/share/mysql/swedish
user       = monty
[mysqld4]
socket     = /tmp/mysql.sock4
port       = 3309
pid?file   = /usr/local/mysql/var4/hostname.pid4
datadir    = /usr/local/mysql/var4
language   = /usr/local/share/mysql/estonia
user       = tonu
[mysqld6]
socket     = /tmp/mysql.sock6
port       = 3311
pid?file   = /usr/local/mysql/var6/hostname.pid6
datadir    = /usr/local/mysql/var6
language   = /usr/local/share/mysql/japanese
user       = jani
Fichier d'options  .
4.7.4 myisampack , le générateur de tables MySQL compressées en
lecture seule

myisampack sert à compresser des tables MyISAM et pack_isam sert à compresser les tables
ISAM. Comme les tables ISAM sont obsolètes, nous ne traiterons que de myisampack , mais tout
ce qui est dit au sujet de myisampack est aussi vrai pour pack_isam .
myisampack fonctionne en compressant séparément chaque colonne de la table. Les informations
nécessaires à la décompression sont lues en mémoire lorsque la table est ouverte. Cela donne de
bien meilleures performances lors de l'accès à des lignes individuelles, car nous n'avez qu'à
décompresser exactement une des lignes, et non pas un bloc de disque entier. Généralement,
myisampack compresse le fichier avec un gain de 40 à 70 %.
MySQL utilise la carte mémoire ( mmap() ) sur les tables compressées et utilise les outils
classiques de lecture et écriture si mmap() ne fonctionne pas.Notez bien ceci :
Après avoir compressé la table, celle?ci n'est plus accessible qu'en lecture. C'est souvent
• 
un état voulu (par exemple, pour être gravée sur un CD). De plus, autoriser les écritures
dans une table compressée fait partie de notre liste de tâche, mais avec une très faible
priorité.
myisampack
• 
 peut aussi compresser des colonnes BLOB ou TEXT . L'ancien pack_isam
(pour les tables ISAM ) ne peut le faire.
myisampack est invoqué comme ceci :
shell> myisampack [options] filename ...
Chaque nom de fichier doit être le nom d'un fichier d'index ( .MYI ). Si vous n'êtes pas dans le
dossier de données, vous devez spécifier le chemin complet jusqu'au fichier. Il est toléré que vous
omettiez l'extension du fichier .MYI .
myisampack supporte les options suivantes :
?b, ??backup
Fait une sauvegarde de la table sous le nom de  .
 4.7.4 myisampack , le générateur de tables MySQL compressées en lecture seule
257

Manuel MySQL 4.1.x ? Version Française
?#, ??debug=debug_options
Affiche le log de débogage. La chaîne debug_options vaut souvent
'd:t:o,filename' .
?f, ??force
Force la compression de la table, même si elle grossit ou si le fichier temporaire
existe déjà. myisampack crée un fichier temporaire appelé  lors de
la compression. Si vous tuez myisampack , le fichier .TMD peut ne pas être effacé.
Normalement, myisampack se termine avec une erreur s'il découvre que le fichier
 existe. Avec ??force , myisampack reprendra le travail.
??, ??help
Affiche le message d'aide et quitte.
?j big_tbl_name, ??join=big_tbl_name
Rassemble toutes les tables indiquées dans la ligne de commande dans une seule
table appelée big_tbl_name . Toutes les tables qui seront combinées doivent être
identiques (mêmes noms de colonnes, mêmes types, mêmes index, etc.)
?p #, ??packlength=#
Spécifie la taille de stockage de la longueur de ligne, en octets. Cette valeur doit être
1, 2, ou 3. ( myisampack stocke toutes les lignes avec des pointeurs de lignes de 1,
2 ou 3 octets. Dans les cas normaux, myisampack peut déterminer la taille correcte
avant de compresser le fichier, mais il peut aussi se rendre compte durant le
processus qu'une autre taille aurait été plus appropriée, ou plus courte. Dans ce cas,
myisampack va imprimer une note pour que vous le sachiez lors de la prochaine
compression du même fichier.
?s, ??silent
Mode silencieux. Seules les erreurs seront affichées.
?t, ??test
Ne compresse pas la table, mais teste juste la compression.
?T dir_name, ??tmp_dir=dir_name
Utilise le dossier indiqué comme dossier pour les fichiers temporaires.
?v, ??verbose
Mode détaillé. Toutes les informations sur la progression de la compression seront
affichées.
?V, ??version
Affiche la version et quitte.
?w, ??wait
Attend et reessaie, si la table était déjà en cours d'utilisation. Si le serveur mysqld a
été démarré avec l'option ??skip?external?locking , ce n'est pas une bonne
idée d'appeler myisampack , car la table risque d'être modifiée durant la
compression.
La séquence de commande illustre la session de compression :
shell> ls ?l station.*
?rw?rw?r??   1 monty    my         994128 Apr 17 19:00
?rw?rw?r??   1 monty    my          53248 Apr 17 19:00
?rw?rw?r??   1 monty    my           5767 Apr 17 19:00
shell> myisamchk ?dvv station
MyISAM file:     station
Isam?version:  2
Creation time: 1996?03?13 10:08:58
Recover time:  1997?02?02  3:06:43
Data records:              1192  Deleted blocks:              0
Datafile: Parts:           1192  Deleted data:                0
Datafile pointer (bytes):     2  Keyfile pointer (bytes):     2
Max datafile length:   54657023  Max keyfile length:   33554431
 4.7.4 myisampack , le générateur de tables MySQL compressées en lecture seule
258

Manuel MySQL 4.1.x ? Version Française
Recordlength:               834
Record format: Fixed length
table description:
Key Start Len Index   Type                       Root  Blocksize    Rec/key
1   2     4   unique  unsigned long              1024       1024          1
2   32    30  multip. text                      10240       1024          1
Field Start Length Type
1     1     1
2     2     4
3     6     4
4     10    1
5     11    20
6     31    1
7     32    30
8     62    35
9     97    35
10    132   35
11    167   4
12    171   16
13    187   35
14    222   4
15    226   16
16    242   20
17    262   20
18    282   20
19    302   30
20    332   4
21    336   4
22    340   1
23    341   8
24    349   8
25    357   8
26    365   2
27    367   2
28    369   4
29    373   4
30    377   1
31    378   2
32    380   8
33    388   4
34    392   4
35    396   4
36    400   4
37    404   1
38    405   4
39    409   4
40    413   4
41    417   4
42    421   4
43    425   4
44    429   20
45    449   30
46    479   1
47    480   1
48    481   79
49    560   79
50    639   79
51    718   79
52    797   8
53    805   1
54    806   1
55    807   20
56    827   4
57    831   4
 4.7.4 myisampack , le générateur de tables MySQL compressées en lecture seule
259

Manuel MySQL 4.1.x ? Version Française
shell> myisampack
Compressing : (1192 records)
? Calculating statistics
normal:     20  empty?space:      16  empty?zero:        12  empty?fill:  11
pre?space:   0  end?space:        12  table?lookups:      5  zero:         7
Original trees:  57  After join: 17
? Compressing file
87.14%
shell> ls ?l station.*
?rw?rw?r??   1 monty    my         127874 Apr 17 19:00
?rw?rw?r??   1 monty    my          55296 Apr 17 19:04
?rw?rw?r??   1 monty    my           5767 Apr 17 19:00
shell> myisamchk ?dvv station
MyISAM file:     station
Isam?version:  2
Creation time: 1996?03?13 10:08:58
Recover time:  1997?04?17 19:04:26
Data records:              1192  Deleted blocks:              0
Datafile: Parts:           1192  Deleted data:                0
Datafilepointer (bytes):      3  Keyfile pointer (bytes):     1
Max datafile length:   16777215  Max keyfile length:     131071
Recordlength:               834
Record format: Compressed
table description:
Key Start Len Index   Type                       Root  Blocksize    Rec/key
1   2     4   unique  unsigned long             10240       1024          1
2   32    30  multip. text                      54272       1024          1
Field Start Length Type                         Huff tree  Bits
1     1     1      constant                             1     0
2     2     4      zerofill(1)                          2     9
3     6     4      no zeros, zerofill(1)                2     9
4     10    1                                           3     9
5     11    20     table?lookup                         4     0
6     31    1                                           3     9
7     32    30     no endspace, not_always              5     9
8     62    35     no endspace, not_always, no empty    6     9
9     97    35     no empty                             7     9
10    132   35     no endspace, not_always, no empty    6     9
11    167   4      zerofill(1)                          2     9
12    171   16     no endspace, not_always, no empty    5     9
13    187   35     no endspace, not_always, no empty    6     9
14    222   4      zerofill(1)                          2     9
15    226   16     no endspace, not_always, no empty    5     9
16    242   20     no endspace, not_always              8     9
17    262   20     no endspace, no empty                8     9
18    282   20     no endspace, no empty                5     9
19    302   30     no endspace, no empty                6     9
20    332   4      always zero                          2     9
21    336   4      always zero                          2     9
22    340   1                                           3     9
23    341   8      table?lookup                         9     0
24    349   8      table?lookup                        10     0
25    357   8      always zero                          2     9
26    365   2                                           2     9
27    367   2      no zeros, zerofill(1)                2     9
28    369   4      no zeros, zerofill(1)                2     9
29    373   4      table?lookup                        11     0
30    377   1                                           3     9
31    378   2      no zeros, zerofill(1)                2     9
32    380   8      no zeros                             2     9
33    388   4      always zero                          2     9
 4.7.4 myisampack , le générateur de tables MySQL compressées en lecture seule
260

Manuel MySQL 4.1.x ? Version Française
34    392   4      table?lookup                        12     0
35    396   4      no zeros, zerofill(1)               13     9
36    400   4      no zeros, zerofill(1)                2     9
37    404   1                                           2     9
38    405   4      no zeros                             2     9
39    409   4      always zero                          2     9
40    413   4      no zeros                             2     9
41    417   4      always zero                          2     9
42    421   4      no zeros                             2     9
43    425   4      always zero                          2     9
44    429   20     no empty                             3     9
45    449   30     no empty                             3     9
46    479   1                                          14     4
47    480   1                                          14     4
48    481   79     no endspace, no empty               15     9
49    560   79     no empty                             2     9
50    639   79     no empty                             2     9
51    718   79     no endspace                         16     9
52    797   8      no empty                             2     9
53    805   1                                          17     1
54    806   1                                           3     9
55    807   20     no empty                             3     9
56    827   4      no zeros, zerofill(2)                2     9
57    831   4      no zeros, zerofill(1)                2     9
Les informations affichées par myisampack sont décrites ici :
normal
Le nombre de colonnes pour lesquelles aucune compression n'est utilisée.
empty?space
Le nombre de colonnes dont les valeurs ne contiennent que des octets : elles
n'occuperont plus qu'un octet.
empty?zero
Le nombre de colonnes dont les valeurs ne contiennent que des zéros : elles
n'occuperont plus qu'un octet.
empty?fill
Le nombre de colonnes de type entier qui n'occupent pas la totalité de l'espace de
leur type. Elles seront réduites en taille (par exemple, une colonne de type INTEGER
sera transformée en MEDIUMINT ).
pre?space
Le nombre de colonnes de nombres à virgule flottante qui ont des valeurs stockées
avec des espaces initiaux. Dans ce cas, chaque valeur va contenir le nombre
d'espace initiaux.
end?space
Le nombre de colonnes qui ont de nombreux espaces terminaux. Dans ce cas,
chaque valeur va contenir un compte du nombre d'espaces terminaux.
table?lookup
La colonne n'a que quelques valeurs différentes, qui seront converties en une
colonne de type ENUM avant une compression de type Huffman.
zero
Le nombre de colonnes pour lesquelles toutes les valeurs sont zéro.
Original trees
Le nombre initial d'arbres Huffman.
After join
Le nombre d'arbres Huffman distincts obtenus après avoir joint les arbres pour
économiser de l'espace d'entête.
Après la compression d'une table, myisamchk ?dvv affiche des informations supplémentaires
pour chaque champ :
 4.7.4 myisampack , le générateur de tables MySQL compressées en lecture seule
261

Manuel MySQL 4.1.x ? Version Française
Type
Le type de fichier peut contenir les informations suivantes :
constant
Toutes les lignes ont la même valeur.
no endspace
Ne stocke pas les espaces finaux.
no endspace, not_always
Ne stocke pas les espaces finaux et ne compresse pas les espaces
finaux pour toutes les valeurs.
no endspace, no empty
Ne stocke pas les espaces finaux. Ne stocke pas les valeurs vides.
table?lookup
La colonne a été convertie en ENUM .
zerofill(n)
Les n chiffres significatifs sont toujours 0, et n'ont pas été stockés.
no zeros
Ne stocke pas les zéros.
always zero
Les valeurs 0 sont stockées sur un octet.
Huff tree
L'arbre Huffman associé au champ.
Bits
Le nombre de bits utilisés par l'arbre Huffman.
Après la compression de pack_isam / myisampack vous devez exécuter la commande isamchk
/ myisamchk pour recréer l'index. A ce moment, vous pouvez aussi trier les blocs d'index et créer
des statistiques nécessaires pour l'optimisateur MySQL :
myisamchk ?rq ??analyze ??sort?index
isamchk   ?rq ??analyze ??sort?index
Après avoir installé la table compressée dans un dossier de données MysQL, vous devez exécutez
la commande mysqladmin flush?tables pour forcer mysqld à utiliser cette nouvelle table.
Si vous voulez décompresser une table compressée, vous pouvez le faire avec l'option ??unpack
de la commande isamchk ou myisamchk .
4.7.5 mysqld?max , la version étendue du serveur mysqld
mysqld?max est le serveur MySQL ( mysqld ) configuré avec les options suivantes :
Option
Comment
??with?server?suffix=?max
Ajoute un suffixe à la chaîne de version de mysqld
??with?innodb
Supporte les tables InnoDB.
??with?bdb
Supporte les tables Berkeley DB (BDB)
CFLAGS=?DUSE_SYMDIR
Support des liens symboliques sous Windows.
Vous pouvez obtenir les exécutables MySQL?max à
les deux programmes standard  et mysqld? .
tables InnoDB et Berkeley DB ne sont pas disponibles sur toutes les plate?formes, et que certaines
versions Max ne supportent pas les deux. Vous pouvez vérifier quelles tables sont supportées avec
la requête suivante :
 4.7.5 mysqld?max , la version étendue du serveur mysqld
262

Manuel MySQL 4.1.x ? Version Française
mysql> SHOW VARIABLES LIKE "have_%";
+???????????????+???????+
| Variable_name | Value |
+???????????????+???????+
| have_bdb      | YES   |
| have_innodb   | NO    |
| have_isam     | YES   |
| have_raid     | NO    |
| have_openssl  | NO    |
+???????????????+???????+
La signification des valeurs est :
Valeur
Signification
YES
L'option est activatée et utilisable.
NO
MySQL n'a pas été compilé avec le support pour cette option.
L'option xxxx est désactivée car mysqld a été lancé avec ??skip?xxxx ou parce que
DISABLED mysqld n'a pas été lancé avec les bonnes options. Dans ce cas, le fichier
 devrait contenir la raison pour laquelle l'option est désactivée.
Note : pour être capable de créer des tables InnoDB, vous devez éditer vos options de démarrage
et inclure au moins l'option innodb_data_file_path . Options de démarrage InnoDB .
Pour avoir de meilleures performances avec les tables BDB, vous devriez aussi ajouter certaines
options de configuration. Options de démarrage BDB .
safe_mysqld va automatiquement lancer tout programme mysqld avec le suffixe ?max . Cela
rend très facile les tests de mysqld , dans le cadre d'un installation existante. Il suffit d'exécuter le
programme configure avec les options que vous souhaitez, et d'installer un nouveau programme
mysqld sous le nom de mysqld?max dans le même dossier que votre ancien mysqld .
safe_mysqld , le script père de mysqld .
Les paquets RPM mysqld?max utilisent la fonctionnalité de safe_mysqld mentionnée plus tôt. Il
suffit d'installer le programme mysqld?max et safe_mysqld va automatiquement utiliser cet
exécutable lorsque safe_mysqld sera redémarré.
La table suivante illustre les types de tables que MySQL?Max inclut :
Système
BDB
InnoDB
AIX 4.3
Non
Oui
HP?UX 11.0
Non
Oui
Linux?Alpha
Non
Oui
Linux?Intel
Oui
Oui
Linux?IA64
Non
Oui
Solaris?Intel
Non
Oui
Solaris?SPARC
Oui
Oui
Caldera (SCO) OSR5
Oui
Oui
UnixWare
Oui
Oui
Windows/NT
Oui
Oui
4.8 MySQL Scripts clients et utilitaires
 4.8 MySQL Scripts clients et utilitaires
263

Manuel MySQL 4.1.x ? Version Française
4.8.1 Présentation des scripts serveurs et utilitaires
Tous les clients MySQL qui communiquent avec le serveur via la librairie mysqlclient utilisent les
variables d'environnement suivantes :
Nom
Description
MYSQL_UNIX_PORT
La socket par défaut; utilisé pour les connexions à localhost
MYSQL_TCP_PORT
Le port TCP/IP par défaut
MYSQL_PWD
Le mot de passe par défaut
MYSQL_DEBUG
Des options de débogage et de traçage
TMPDIR
Le dossier où les fichiers et tables temporaires sont écrits
L'utilisation de MYSQL_PWD n'est pas une technique sûre. Connexion au serveur MySQL .
Le client mysql utilise le fichier indiqué dans la variable d'environnement MYSQL_HISTFILE pour
sauver l'historique de la ligne de commande. La valeur par défaut pour la situation du fichier
d'historique est $HOME/.mysql_history , où $HOME est la valeur de la variable d'environnement
HOME . Variables d'environnement MySQL .
Tous les programmes MySQL utilisent différentes options. Toutefois, tous les programmes MySQL
disposent de l'option ??help pour vous donner une description complète de toutes les options du
programme. Par exemple, essayez d'utiliser mysql ??help .
Vous pouvez remplacer les valeurs par défaut des options de tous les clients standard en mettant
d'autres valeurs dans le fichier de configuration. Fichier d'options  .
Voici un bref aperçu des programmes clients MySQL :
msql2mysql
Un script shell qui convertit les programmes mSQL vers MySQL. Il ne gère pas toutes
les situations, mais c'est une très bonne base de travail.
mysqlaccess
Un script qui vérifie les droits d'accès du trio hôte, utilisateur et base de données.
mysqladmin
Un utilitaire pour réaliser des opérations d'administration de la base, telles que les
créations de bases, le rafraîchissement des tables de droits, l'écriture des tables sur
le disque et la réouverture des fichiers de log. à mysqladmin permet aussi de lire la
version, les processus et les informations de statut du serveur. administrer un serveur MySQL .
mysqldump
Exporte une base de données MySQL dans un fichier sous la forme de requêtes
SQL, ou de fichiers texte, avec la tabulation comme séparateur. Un freeware
amélioré, d'après une idée originale de Igor Romanenko. structures de tables et les données .
mysqlimport
Importe les fichiers textes dans les tables, en utilisant la commande LOAD DATA
INFILE . mysqlimport , importer des données depuis des fichiers texte .
mysqlshow
Affiche des informations sur les bases, tables, colonnes et index.
replace
Un utilitaire qui est utilisé par msql2mysql , qui a d'autres applications générales.
replace modifie des chaînes dans des fichiers, ou sur l'entrée standard. Utilise une
machine d'états pour rechercher les plus grands chaînes en premier. Sert à
 4.8.1 Présentation des scripts serveurs et utilitaires
264

Manuel MySQL 4.1.x ? Version Française
échanger des chaînes. Par exemple, cette commande échange les chaînes a et b
dans les fichiers spécifiés :
shell> replace a b b a ?? file1 file2 ...
4.8.2 mysql , The Command?line Tool
mysql est un simple script SQL (qui exploite GNU readline ). Il supporte une utilisation
interactive et non?interactive. Lorsqu'il est utilisé interactivement, les résultats des requêtes sont
présentés sous la forme d'une table au format ASCII. Lorsqu'il est utilisé non?interactivement, par
exemple, comme filtre, le résultat est fourni au format de liste avec séparation par tabulation (le
format d'affichage peut être modifié en utilisant les options de ligne de commande). Vous pouvez
exécuter le script comme ceci :
shell> mysql database < >
Si vous avez des problèmes liés à des insuffisances de mémoire avec le client, utilisez l'option
??quick ! Cela force mysql à utiliser mysql_use_result() plutôt que
mysql_store_result() pour lire les résultats.Utiliser mysql est très simple. Il suffit de le
démarrer comme ceci : mysql database ou mysql ??user=user_name
??password=your_password database . Tapez une commande SQL, puis terminez?la avec
';' , '\g' ou '\G' , et finissez avec Entrée.
mysql supports the following options:
??, ??help
Affiche cette aide et quitte.
?A, ??no?auto?rehash
Pas de rehachage automatique. Il faut utiliser la commande 'rehash' pour obtenir la
complétion des noms de tables et champs. Cela accélère le démarrage du client.
??prompt=...
Modifie l'invite de commande de MySQL.
?b, ??no?beep
Eteind le son d'erreur.
?B, ??batch
Affiche les résultats avec une tabulation comme résultat, et chaque ligne avec une
nouvelle ligne. N'utilise pas l'historique.
??character?sets?dir=...
Le dossier où les jeux de caractères sont créés.
?C, ??compress
Utilise la compression avec le protocole client?serveur.
?#, ??debug[=...]
Démarre le log de débogage. Par défaut, il vaut 'd:t:o,/tmp/mysql.trace'.
?D, ??database=...
La base de données à utiliser. C'est particulièrement pratique dans le fichier
d'options  .
??default?character?set=...
Configure le jeu de caractères par défaut.
?e, ??execute=...
Exécute une commande et quitte. Le résultat est au format de l'option ??batch
?E, ??vertical
Affiche le résultat d'une requête verticalement. Sans cette option, vous pouvez aussi
obtenir ce format en terminant votre requête avec \G .
?f, ??force
Continue même si vous obtenez une erreur SQL.
 4.8.2 mysql , The Command?line Tool
265

Manuel MySQL 4.1.x ? Version Française
?g, ??no?named?commands
Les commandes nommées sont désactivées. Utilisez la forme \* uniquement, ou
utilisez les commandes nommées au début d'une ligne se terminant par un
point?virgule ( ';' ). Depuis la version 10.9, le client démarre avec cette option
activée par défaut. Avec l'option ?g, le format long des commandes va continuer à
fonctionner.
?G, ??enable?named?commands
Les commandes nommées sont activées . Le format long est autorisé, ainsi que les
commandes courtes \*.
?i, ??ignore?space
Ignore les espaces après les noms de fonctions.
?h, ??host=...
Connexion avec l'hôte indiqué.
?H, ??html
Produit un résultat au format HTML.
?X, ??xml
Produit un résultat au format XML.
?L, ??skip?line?numbers
N'écrit pas les numéros de lignes dans les erreurs. Très pratique lorsque vous voulez
comparer des résultats qui incluent des messages d'erreurs.
??no?pager
Désactive le système de page, et affiche directement dans la sortie standard. Voyez
l'aide interactive (\h).
??no?tee
Désactive le outfile. Voyez l'aide interactive (\h).
?n, ??unbuffered
Vide le buffer de requête après chaque requête.
?N, ??skip?column?names
N'écrit pas les noms de colonnes dans les résultats.
?O, ??set?variable var=option
Spécifie la valeur d'une variable. ??help liste toutes ces variables. Notez bien que
??set?variable est obsolète depuis MySQL 4.0, et qu'il suffit désormais d'utiliser
??var=option .
?o, ??one?database
Ne modifie que la base par défaut. C'est pratique pour éviter les modifications dans
les autres bases dans le fichier de log.
??pager[=...]
Type d'affichage. Par défaut, la variable d'environnement ENV vaut PAGER . Les
paginateurs valides sont less, more, cat [> filename], etc. Voyez l'aide interactive
(\h). Cette option n'est pas effective en mode batch. Les paginateurs ne fonctionnent
qu'avec Unix.
?p[password], ??password[=...]
Le mot de passe utilisé lors de la connexion sur le serveur. S'il n'est pas donné en
ligne de commande, il sera demandé interactivement. Notez que si vous utilisez la
forme courte ?p , vous ne devez pas laisser d'espace entre l'option et le mot de
passe.
?P ??port=...
Le numéro de port TCP/IP pour la connexion.
?q, ??quick
Ne met pas en cache le résultat, et l'affiche ligne par ligne. C'est plus lent pour le
serveur, si le résultat est interrompu. N'utilise pas le fichier d'historique.
?r, ??raw
Ecrit les valeurs des colonnes sans les conversions de protections. Utilisé en mode
??batch
 4.8.2 mysql , The Command?line Tool
266

Manuel MySQL 4.1.x ? Version Française
?s, ??silent
Mode très silencieux.
?S ??socket=...
Le fichier de socket à utiliser pour la connexion.
?t ??table
Affichage au format de table. C'est le mode par défaut pour le mode non?batch.
?T, ??debug?info
Affiche des informations de débogage au moment de la fin du programme.
??tee=...
Ajoute tout dans le fichier de sortie. Voyez l'aide interactive (\h). Ne fonctionne pas
en mode batch.
?u, ??user=#
Nom d'utilisateur pour la connexion, si ce n'est pas l'utilisateur Unix courant.
?U, ??safe?updates[=#], ??i?am?a?dummy[=#]
N'autorise que les commandes UPDATE et DELETE qui utilisent des clés. Voir plus
bas pour des informations sur cette option. Vous pouvez annuler cette option si vous
l'avez dans le fichier d'option  en utilisant la syntaxe ??safe?updates=0 .
?v, ??verbose
Affichage plus détaillé (?v ?v ?v indique le format d'affichage de table).
?V, ??version
Affiche la version et quitte.
?w, ??wait
Attend et retente si la connexion s'interrompt, au lieu de quitter.
Vous pouvez aussi spécifier les variables suivantes avec l'option ?O ou ??set?variable ; notez
bien que ??set?variable est obsolète depuis MySQL 4.0, utilisez la nouvelle syntaxe
??var=option :
Nom de variable
Par défaut Description
connect_timeout
0
Nombre de secondes avant que la connexion n'expire.
max_allowed_packet 16777216
Taille maximale du paquet de communication avec le serveur.
net_buffer_length
16384
Buffer pour les communications TCP/IP et socket.
Limite automatique pour les commandes SELECT avec l'option
select_limit
1000
??i?am?a?dummy
Limite automatique pour les commandes de jointure avec
max_join_size
1000000
l'option ??i?am?a?dummy.
Si vous tapez 'help' en ligne de commande, mysql va afficher les commandes qu'il supporte :
mysql> help
MySQL commands:
help    (\h)    Display this text.
?       (\h)    Synonym for `help'.
clear   (\c)    Clear command.
connect (\r)    Reconnect to the server.
                Optional arguments are db and host.
edit    (\e)    Edit command with $EDITOR.
ego     (\G)    Send command to mysql server,
                display result vertically.
exit    (\q)    Exit mysql. Same as quit.
go      (\g)    Send command to mysql server.
nopager (\n)    Disable pager, print to stdout.
notee   (\t)    Don't write into outfile.
pager   (\P)    Set PAGER [to_pager].
                Print the query results via PAGER.
print   (\p)    Print current command.
prompt  (\R)    Change your mysql prompt.
 4.8.2 mysql , The Command?line Tool
267

Manuel MySQL 4.1.x ? Version Française
quit    (\q)    Quit mysql.
rehash  (\#)    Rebuild completion hash.
source  (\.)    Execute a SQL script file.
                Takes a file name as an argument.
status  (\s)    Get status information from the server.
tee     (\T)    Set outfile [to_outfile].
                Append everything into given outfile.
use     (\u)    Use another database.
                Takes database name as argument.
La commande pager ne fonctionne que sous Unix.
La commande status donne des détails sur la connexion et le serveur utilisés. Si vous fonctionnez
en mode ??safe?updates , status va aussi afficher les valeurs des variables de mysql qui
affectent vos requêtes.
Une option de démarrage utile pour les débutants (introduit en MySQL version 3.23.11) est
??safe?updates (ou ??i?am?a?dummy pour les utilisateurs qui ont déjà utilisé une commande
DELETE FROM table_name mais on oublié la clause WHERE . Lorsque vous utilisez cette option,
mysql envoie la commande suivante au serveur MySQL lors de l'ouverture de la connexion :
SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=#select_limit#,
    SQL_MAX_JOIN_SIZE=#max_join_size#"
où #select_limit# et #max_join_size# sont des variables qui peuvent être configurées
depuis mysql . Syntaxe de SET .L'effet de la commande ci?dessus est :
Vous n'êtes pas autorisé à faire une commande 
• 
UPDATE ou DELETE si vous n'avez pas de
contrainte de clé dans la clause WHERE . Il est possible toutefois de forcer la commande
UPDATE/DELETE en utilisant LIMIT :
UPDATE table_name SET not_key_column=# WHERE not_key_column=# LIMIT 1;
Tous les grands résultats sont automatiquement limités à 
• 
#select_limit# lignes.
Les commandes 
• 
SELECT qui vont probablement devoir examiner plus de #max_join_size
lignes seront annulées.
Quelques conseils pratiques sur le client mysql :Certaines données seront plus faciles à lire
lorsqu'affichées verticalement, au lieu d'horizontalement. Par exemple, des textes longs qui incluent
des nouvelles lignes. Il sera alors plus facile de les lire verticalement.
mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 lIMIT 300,1\G
*************************** 1. row ***************************
  msg_nro: 3068
     date: 2000?03?01 23:29:50
time_zone: +0200
mail_from: Monty
    reply: monty&#64;
  mail_to: "Thimble Smith" <tim&#64;>
      sbj: UTF?8
      txt: >>>>> "Thimble" == Thimble Smith writes:
Thimble> Hi.  I think this is a good idea.  Is anyone familiar with UTF?8
Thimble> or Unicode? Otherwise, I'll put this on my TODO list and see what
Thimble> happens.
Yes, please do that.
Regards,
Monty
     file: inbox?jani?1
     hash: 190402944
1 row in set (0.09 sec)
 4.8.2 mysql , The Command?line Tool
268

Manuel MySQL 4.1.x ? Version Française
Pour les logs, vous pouvez utiliser l'option tee . Le tee peut être démarré avec l'option
??tee=... , ou depuis la ligne de commande interactive avec la commande tee . Toutes les
données affichées sur l'écran seront enregistrées dans un fichier spécifié. Cela peut être très utile
pour pouvoir déboguer. Le tee peut être désactivé avec la commande en ligne notee . Exécuter
tee plusieurs fois va redémarrer l'enregistrement. Sans paramètre, la commande va ouvrir le
dernier fichier utilisé. Notez que tee va écrire les données après chaque requête, avant que l'invite
apparaisse, pour attendre la prochaine commande.Afficher les résultats en mode interactif avec les
programmes Unix tels que less, more ou tout autre programme similaire est actuellement possible
avec l'option ??pager[=...] . Sans argument, le client mysql va rechercher la variable
d'environnement PAGER et l'utiliser pour pager . pager peut être démarré en ligne de commande
avec pager et désactivée avec nopager . La commande prend un argument optionnel et pager
prendra alors cette valeur. La commande pager peut être appelée sans argument, mais cela
impose que l'option ??pager ait été utilisée, ou que le mode pager sera par défaut la sortie
standard. pager fonctionne uniquement sous Unix, car il utilise la fonction popen(), qui n'existe pas
sous Windows. Sous Windows, l'option tee peut être utilisée à la place, même si elle n'est pas
aussi pratique que pager dans certaines situations.Quelques conseils sur pager :
Vous pouvez l'utiliser pour écrire dans un fichier :
• 
mysql> pager cat >
et les résultats iront directement dans le fichier. Vous pouvez aussi passer des options pour
le programme que vous voulez utiliser comme pager :
mysql> pager less ?n ?i ?S
Dans la présentation ci?dessus, notez bien l'option '?S'. Vous pourriez la trouver très
• 
pratique lorsque vous étudiez des résultats : essayer l'option d'affichage horizontal (validez
vos commandes avec '\g' ou ';') et vertical (terminez vos commandes avec '\G'). Parfois, un
résultat très large est difficile à lire et avec l'option ?S dirigée vers less, vous pouvez
naviguer dans le résultat interactivement de droite à gauche, ce qui évite que les lignes les
plus longues soient coupées. Cela rend la lecture du texte bien plus facile. Vous pouvez
passer d'un mode à l'autre depuis la ligne de commande. Voyez l'aide pour plus de détails
sur less.
Vous pouvez combiner des méthodes très complexes pour gérer les résultats, comme, la
• 
possibilité d'envoyer les résultats vers deux fichiers dans deux dossiers différents, ou deux
disques différents, tout en affichant les résultats à l'écran avec less :
mysql> pager cat | tee | \
tee | less ?n ?i ?S
Vous pouvez aussi combiner les deux fonctions ci?dessus : activer le tee , spécifier le pager 'less'
et vous serez capable de naviguer dans les résultats avec le less Unix, tout en enregistrant tous les
résultats dans un fichier. La différence entre le tee d'Unix utilisé avec le pager et le tee intégré du
client mysql , est que le tee intégré fonctionne même si vous n'avez pas de tee Unix disponible.
Le tee enregistre tout ce qui est affiché à l'écran, alors que le tee Unix utilisé avec pager n'en
note pas autant. Enfin, le tee interactif est plus facile à activer et désactiver, lorsque vous
souhaitez enregistrer un résultat dans un fichier, mais que vous voulez désactiver cette
fonctionnalité à d'autres moments.
Depuis MySQL version 4.0.2, il est possible de modifier l'invite de commande de mysql .
Vous pouvez utiliser les options de prompt suivantes :
Option
Description
\v
version de mysqld
\d
database en cours
\h
hôte MySQL
 4.8.2 mysql , The Command?line Tool
269

Manuel MySQL 4.1.x ? Version Française
\p
port de connexion
\u
nom d'utilisateur
\U
Identifiant complet [email protected]
\\
'\'
\n
nouvelle ligne
\t
tabulation
\
espace
\_
espace
\R
heure 24h (0?23)
\r
heure 12h (1?12)
\m
minutes
\y
année sur deux chiffres
\Y
année sur quatre chiffres
\D
format de date complet
\s
secondes
\w
jour de la semaine en trois lettres (Mon, Tue, ...)
\P
am/pm
\o
mois au format numérique
\O
mois en trois lettres (Jan, Feb, ...)
\c
compteur du nombre de commande
'\' suivi de n'importe quelle lettre représente la lettre littéralement.
Vous pouvez modifier l'invite de commande comme ceci :
Environment Variable
Vous pouvez utiliser la variable d'environnement MYSQL_PS1 , en lui donnant la
chaîne d'invite. Par exemple :
shell> export MYSQL_PS1="(\u&#64;\h) [\d]> "
Vous pouvez configurer l'invite de commandes dans le fichier d'options MySQL. dans
le groupe mysql . Par exemple :
[mysql]
prompt=(\u&#64;\h) [\d]>\_
Command Line
Vous pouvez utiliser l'option de démarrage ??prompt en ligne de commande avec
mysql . Par exemple :
shell> mysql ??prompt="(\u&#64;\h) [\d]> "
(user&#64;host) [database]> 
Interactively
Vous pouvez aussi utiliser la commande prompt (ou \R ) depuis le client pour
modifier interactivement l'invite de commande. Par exemple :
mysql> prompt (\u&#64;\h) [\d]>\_
PROMPT set to '(\u&#64;\h) [\d]>\_'
(user&#64;host) [database]> 
(user&#64;host) [database]> prompt
Returning to default PROMPT of mysql> 
mysql> 
 4.8.2 mysql , The Command?line Tool
270

Manuel MySQL 4.1.x ? Version Française
4.8.3 mysqladmin , administrer un serveur MySQL
Un utilitaire pour exécuter des commandes d'administration. La syntaxe est :
shell> mysqladmin [OPTIONS] command [command?option] command ...
Vous pouvez obtenir une liste des options supportées par votre version de mysqladmin avec la
commande mysqladmin ??help .Le mysqladmin actuel supporte les commandes suivantes :
create databasename
Crée une nouvelle base.
drop databasename
Efface une base et toutes ces tables.
extended?status
Affiche un message de statut du serveur très complet.
flush?hosts
Vide tous les hôtes mis en cache.
flush?logs
Vide de la mémoire tous les logs.
flush?tables
Vide de la mémoire toutes les tables.
flush?privileges
Recharger les tables de droits (identique à la commande reload).
kill id,id,...
Termine un thread MySQL.
password
Spécifie un nouveau mot de passe. Modifie l'ancien mot de passe en un nouveau.
ping
Vérifie si mysqld fonctionne ou pas.
processlist
Affiche la liste des processus du serveur.
reload
Recharge les tables de droits.
refresh
Vide de la mémoire toutes les tables, puis ferme et réouvre les fichiers de logs.
shutdown
Eteind le serveur.
slave?start
Démarre l'esclave de réplication.
slave?stop
Eteind l'esclave de réplication.
status
Affiche le message de statut court du serveur.
variables
Affiche les variable disponibles.
version
Affiche la version du serveur.
Toutes les commandes peuvent être réduites à leur préfixe simple. Par exemple :
shell> mysqladmin proc stat
+????+???????+???????????+????+?????????????+??????+???????+??????+
| Id | User  | Host      | db | Command     | Time | State | Info |
+????+???????+???????????+????+?????????????+??????+???????+??????+
| 6  | monty | localhost |    | Processlist | 0    |       |      |
+????+???????+???????????+????+?????????????+??????+???????+??????+
 4.8.3 mysqladmin , administrer un serveur MySQL
271

Manuel MySQL 4.1.x ? Version Française
Uptime: 10077  Threads: 1  Questions: 9  Slow queries: 0
Opens: 6 Flush tables: 1  Open tables: 2
Memory in use: 1092K  Max memory used: 1116K
La commande mysqladmin status liste les colonnes suivantes :
Colonne
Description
Uptime
Nombre de secondes de vie du serveur MySQL.
Threads
Nombre de threads actifs (clients).
Questions
Nombre de questions reçu des clients depuis le démarrage de mysqld .
Nombre de requêtes qui ont pris plus de long_query_time secondse. Le log des
Slow queries
requêtes lentes.
Opens
Combien de tables sont ouvertes par mysqld .
Flush tables
Nombre de commandes flush ... , refresh et reload .
Open tables
Nombre de tables qui sont ouvertes actuellement.
Mémoire allouée directement par mysqld (uniquement disponible si MySQL a été
Memory in use compilé avec l'option ??with?debug=full).
Max memory
Maximum de mémoire allouée directement par mysqld (uniquement disponible si
used
MySQL a été compilé avec l'option ??with?debug=full).
Si vous exécutez une commande mysqladmin shutdown sur une socket (en d'autres termes, sur
un serveur où mysqld fonctionne ), mysqladmin va attendre que le fichier pid?file de MySQL
soit effacé pour s'assurer que le serveur mysqld a été correctement stoppé.
4.8.4 Utiliser mysqlcheck pour l'entretien et la réparation
Depuis MySQL version 3.23.38, vous pouvez utiliser un nouvel outil d'entretien et de réparation
pour les tables MyISAM . La différence avec myisamchk est que mysqlcheck doit être utilisé
lorsque le serveur mysqld fonctionne, alors que myisamchk doit être utilisé lorsque le serveur ne
fonctionne pas. L'intérêt st que vous n'avez plus besoin d'interrompre le serveur pour vérifier ou
réparer vos tables.
mysqlcheck utilise les commandes du serveur MySQL CHECK , REPAIR , ANALYZE et OPTIMIZE ,
d'une manière pratique pour l'utilisateur.
Il y a trois façons différentes d'utiliser mysqlcheck :
shell> mysqlcheck [OPTIONS] database [tables]
shell> mysqlcheck [OPTIONS] ??databases DB1 [DB2 DB3...]
shell> mysqlcheck [OPTIONS] ??all?databases
Il peut aussi être utilisé comme mysqldump lorsqu'il faut choisir les bases et tables à traiter.
mysqlcheck dispose d'une fonctionnalité spéciale, comparé aux autres clients : le comportement
par défaut, c'est à dire la vérification des tables, peut être modifiée en renommant le fichier binaire.
Si vous voulez avoir un fichier qui réparer les tables par défaut, il suffit de copier mysqlcheck sur
votre disque, et de l'appeler mysqlrepair , ou bien, de faire un lien symbolique sur l'exécutable et
de l'appeler mysqlrepair . SI vous appelez mysqlrepair , il va réparer les tables par défaut.
Les noms que vous pouvez utiliser pour que mysqlcheck réparer automatiquement les tables sont
:
mysqlrepair:   L'option par défaut est ?r
mysqlanalyze:  L'option par défaut est ?a
mysqloptimize: L'option par défaut est ?o
 4.8.4 Utiliser mysqlcheck pour l'entretien et la réparation
272

Manuel MySQL 4.1.x ? Version Française
Les options disponibles pour mysqlcheck sont listées ici. Vérifiez que votre version les supporte
avec la commande mysqlcheck ??help .
?A, ??all?databases
Vérifie toutes les bases. C'est la même chose que ??databases dans toutes les
bases sélectionnées.
?1, ??all?in?1
Au lieu de faire une requête par table, exécute toutes les requêtes dans une requête,
séparément pour chaque base. Les noms de tables seront séparés par une virgule.
?a, ??analyze
Analyse les tables indiquées.
??auto?repair
Si une table vérifiées est corrompue, la corrige automatiquement. La réparation sera
faite après la vérification de toutes les tables, si des tables corrompues ont été
découvertes.
?#, ??debug=...
Affiche le log de debug. Souvent, c'est dans 'd:t:o,filename'
??character?sets?dir=...
Dossier contenant le jeu de caractères
?c, ??check
Vérifie les tables en erreur
?C, ??check?only?changed
Vérifie uniquement les tables qui ont été modifiées depuis la dernière modification,
ou qui n'ont pas été correctement fermées.
??compress
Utiliser la compression du protocole client/serveur.
??, ??help
Affiche ce message d'aide, et termine.
?B, ??databases
Pour tester plusieurs bases de données. Notez que la différence d'utilisation : dans
ce cas, aucune table n'est précisé. Tous les arguments de noms sont considérés
comme des noms de base.
??default?character?set=...
Spécifie le jeu de caractères par défaut.
?F, ??fast
Ne vérifie que les tables qui n'ont pas été correctement fermées.
?f, ??force
Continue même si on rencontre une erreur SQL.
?e, ??extended
Si vous utilisez cette option avec CHECK TABLE, elle va s'assurer que la table est
totalement cohérente, mais prendre un très long temps.
Si vous utilisez cette option avec REPAIR TABLE, elle va réaliser une réparation
exhaustive de la table, qui peut non seulement prendre un temps très long, mais
produire de nombreuses lignes erronées.
?h, ??host=...
Connexion à l'hôte.
?m, ??medium?check
Plus rapide que la vérification complète, mais ne trouvera que 99.99 % de toutes les
erreurs. Cela devrait être la bonne option pour la plupart des situations.
?o, ??optimize
Optimise la table
?p, ??password[=...]
Le mot de passe à utiliser lors de la connexion au serveur. Si aucun mot de passe
 4.8.4 Utiliser mysqlcheck pour l'entretien et la réparation
273

Manuel MySQL 4.1.x ? Version Française
n'est fourni, il sera demandé en ligne de commande.
?P, ??port=...
Le numéro de port de la connexion.
?q, ??quick
Si vous utilisez cette option avec CHECK TABLE, elle va éviter que l'analyse ne
scanne les lignes pour vérifier les mauvais liens. C'est la méthode d'analyse la plus
vous utilisez cette option avec REPAIR TABLE, elle va essayer de ne
réparer que le fichier d'index. C'est la méthode la plus rapide pour la réparation.
?r, ??repair
Peut corriger presque tout, sauf les problèmes de doublons pour les clés uniques.
?s, ??silent
Affiche moins de messages d'erreurs.
?S, ??socket=...
Nom du fichier de socket à utiliser pour la connexion.
??tables
Remplace l'option ??databases (?B).
?u, ??user=#
Nom d'utilisateur pour la connexion, si ce n'est pas l'utilisateur courant.
?v, ??verbose
Afficher des informations sur les différentes étapes.
?V, ??version
Affiche les informations de version, et termine.
4.8.5 mysqldump , exporter les structures de tables et les données
Utilitaire qui permet d'exporter une base ou un groupe de bases vers un fichier texte, pour la
sauvegarde ou le transfert entre deux serveurs (pas nécessairement entre serveurs MySQL).
L'export contiendra les requêtes SQL nécessaires pour créer la table et la remplir.
Si vous faîtes une sauvegarde du serveur, vous devriez aussi utiliser la commande mysqlhotcopy
. mysqlhotcopy , copier les bases et tables MySQL .
shell> mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] ??databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] ??all?databases [OPTIONS]
Si vous ne spécifiez pas de table, ou si vous utilisez l'option ??databases ou ??all?databases
, la base de données complète sera exportée.Vous pouvez obtenir une liste des options valides
pour votre version de mysqldump avec la commande mysqldump ??help .
Notez que si vous exécutez mysqldump sans l'option ??quick ou ??opt , mysqldump va charger
la totalité du résultat en mémoire, avant de l'écrire. Cette option peut résoudre des problèmes de
mémoire si vous exportez de grosses tables.
Notez que si vous utilisez une nouvelles copie du programme mysqldump , et que vous allez faire
un export qui sera lu dans une vieille version de MySQL, vous ne devriez pas utiliser les options
??opt et ?e .
mysqldump supporte les options suivantes :
??add?locks
Ajoute une commande LOCK TABLES avant l'export de table et une commande
UNLOCK TABLE après(Pour accélérer les inserionts dans MySQL).
??add?drop?table
Ajoute une commande drop table avant chaque requête de création de table.
 4.8.5 mysqldump , exporter les structures de tables et les données
274

Manuel MySQL 4.1.x ? Version Française
?A, ??all?databases
Exporte toutes les tables. C'est l'équivalent de l'option ??databases avec toutes les
bases de données sélectionnées.
?a, ??all
Inclut toutes les options de créations de table spécifiques à MySQL.
??allow?keywords
Permet la création de colonnes ayant des noms de mots réservés. Cela fonctionne
en préfixant chaque nom de colonne avec le nom de la table.
?c, ??complete?insert
Utilise une commande complète d'insertion (avec les noms des colonnes).
?C, ??compress
Compresse toutes les informations entre le client et le serveur, les deux supporte la
compression.
?B, ??databases
Pour exporter plusieurs bases de données. Notez la différence d'utilisation. Dans ce
cas, aucune table n'est spécifié. Tous les arguments de noms sont considérés
comme des noms de base. Une ligne USE db_name; sera ajoutée dans l'export
avant chaque base de données.
??delayed
Les insertions se font avec la commande INSERT DELAYED .
?e, ??extended?insert
Utilise la nouvelle syntaxe multi?ligne INSERT . (Cela donne des insertions plus
courtes et plus efficaces).
?#, ??debug[=option_string]
Trace l'utilisation du programme (pour le débogage).
??help
Affiche le message d'aide et quitte.
??fields?terminated?by=...
??fields?enclosed?by=...
??fields?optionally?enclosed?by=...
??fields?escaped?by=...
??lines?terminated?by=...

Ces options sont utilisées avec l'option ?T et ont la même signification que les
clauses correspondantes de la commande LOAD DATA INFILEDATA INFILE .
?F, ??flush?logs
ƒcrit tout le fichier de log du serveur avant de commencer l'export.
?f, ??force,
Continue même si une erreur SQL survient durant l'export.
?h, ??host=..
Exporte les données depuis le serveur MySQL vers l'hôte indiqué. L'hôte par défaut
est localhost .
?l, ??lock?tables.
Verrouille toutes les tables avant de commencer l'export. Les tables sont verrouillées
avec READ LOCAL pour permettre des insertions concurentes sur les tables MyISAM
.
Notez que lorsque vous exportes des tables de bases différentes, l'option
??lock?tables va verrouiller chaque base séparément. Cette option ne vous
garantira pas que vos tables seront logiquement cohérente entre les bases. Des
tables de différentes bases pourraient être exportées dans des états très différents.
?K, ??disable?keys
/*!40000 ALTER TABLE tb_name DISABLE KEYS */; et /*!40000 ALTER
TABLE tb_name ENABLE KEYS */; seront ajoutés dans le résultat. Cela rendra
 4.8.5 mysqldump , exporter les structures de tables et les données
275

Manuel MySQL 4.1.x ? Version Française
les chargements de données plus rapides sur les serveurs MySQL 4.0 car les index
sont alors créés après l'insertion de toutes les données.
?n, ??no?create?db
CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name; ne sera pas
ajouté dans l'export. Sinon, la ligne ci?dessus sera ajoutée, si l'une des options
??databases ou ??all?databases ont été activée.
?t, ??no?create?info
N'écrit pas les informations de création de table (la requête CREATE TABLE ).
?d, ??no?data
N'écrit aucune ligne d'informations sur la atble. C'est très pratique si vous voulez
simplement exporter la structure de la table.
??opt
Identique à ??quick ??add?drop?table ??add?locks ??extended?insert
??lock?tables . Vous obtiendrez l'export le plus rapide à importer dans un
serveur MySQL.
?pyour_pass, ??password[=your_pass]
Le mot de passe à utiliser lors de la connexion au serveur. Si vous spécifiez en
omettant la partie '=your_pass' , mysqldump vous demandera le mot de passe
en ligne de commande.
?P port_num, ??port=port_num
Le port TCP/IP à utiliser avec l'hôte. Ceci sert pour les connexions d'hôte à hôte,
autre que localhost , pour lequel les sockets Unix seront utilisées).
?q, ??quick
Ne garde pas en buffer les requêtes, mais écrit immédiatement dans la sortie. Utilise
mysql_use_result() pour cela.
?Q, ??quote?names
Protège les noms des tables et colonnes avec le caractère '`' .
?r, ??result?file=...
Ecrit directemetn dans le fichier indiqué. Cette option doit être utilisé sur MSDOS, car
cela évite que la nouvelle ligne '\n' soient converties en '\n\r' (nouvelle ligne et
retour chariot).
??single?transaction
Cette option ajoute la commande SQL BEGIN avant d'exporter les données vers le
serveur. C'est généralement pratique pour les tables InnoDB et le niveau d'isolation
de transaction READ_COMMITTED , car ce mode va exporter l'état de la base au
moment de la commande BEGIN sans bloquer les autres applications.
Lorsque vous utilisez cette option, pensez bien que seules les tables
transactionnelles seront exportées dans un état cohérent, c'est à dire que les tables
MyISAM ou HEAP qui seront exportées avec cette option, pourront changer d'état.
L'option ??single?transaction a été ajoutée en version 4.0.2. Cette option est
mutuellement exclusive avec l'option ??lock?tables car LOCK TABLES va valider
une transaction interne précédente.
?S /path/to/socket, ??socket=/path/to/socket
Le fichier de socket à utiliser lors de la connexion à localhost (qui est l'hôte par
défaut).
??tables
Remplace l'option ??databases (?B).
?T, ??tab=path?to?some?directory
Crée un fichier  , qui contient les commandes SQL CREATE, et
un fichier  , qui contient les données, pour chaque table. Le format
du fichier .txt est celui qui est spécifié par les options ??fields?xxx et
??lines??xxx . Note : cette option ne fonctionne qui si mysqldump est exécuté
 4.8.5 mysqldump , exporter les structures de tables et les données
276

Manuel MySQL 4.1.x ? Version Française
sur la même machine que le démon mysqld , et que le nom d'utilisateur et le groupe
de mysqld (normalement l'utilisateur mysql , et le groupe mysql ) doivent avoir des
permission pour créer et écrire un fichier dans le dossier que vous spécifiez.
?u user_name, ??user=user_name
Le nom d'utilisateur MySQL lors de la connexion à un serveur distant. La valeur par
défaut est votre nom d'utilisateur Unix.
?O var=option, ??set?variable var=option
Spécifie la valeur d'une variable. Les noms possibles des variables sont spécifiés
ci?dessous. Notez bien que ??set?variable est obsolète depuis MySQL 4.0, il
vous suffit alors d'utiliser la syntaxe ??var=option .
?v, ??verbose
Mode détaillé. Affiche plus d'informations sur les faits et gestes du programme.
?V, ??version
Affiche la version du programme et quitte.
?w, ??where='where?condition'
Exporte uniquement les lignes sélectionnées. Notez que les guillemets sont
obligatoires.
?X, ??xml
Exporte la base au format XML.
?x, ??first?slave
Verrouille toutes les tables dans les bases.
"??where=user='jimf'" "?wuserid>1" "?wuserid<1"
?O net_buffer_length=#, where # < 16M
Lors de la création de commandes d'insertions multilignes, (comme avec l'option
??extended?insert ou ??opt ), mysqldump va créer des lignes jusqu'à la taille
de net_buffer_length . Si vous augmentez cette valeur, vous devriez aussi vous
assurer que la variable MySQL max_allowed_packet est plus grande que
net_buffer_length .
L'usage normal de mysqldumpde base de données .
mysqldump ??opt database > backup?
Vous pouvez importer les données dans la base MySQL avec :
mysql database < backup?
ou
mysql ?e "source /patch?to?backup/backup?" database
Cependant, il est très pratique pour remplir un autre serveur MySQL avec des informations depuis
une base :
mysqldump ??opt database | mysql ???host=remote?host ?C database
Il est possible d'exporter plusieurs bases de données en une seule commande :
mysqldump ??databases database1 [database2 ...] >
Si vous souhaitez exporter toutes les bases, vous pouvez utiliser :
mysqldump ??all?databases >
4.8.6 mysqlhotcopy , copier les bases et tables MySQL
mysqlhotcopy est un script Perl qui utilise LOCK TABLES , FLUSH TABLES et cp ou scp pour
faire rapidement des sauvegardes de bases. C'est la méthode la plus rapide pour faire une
sauvegarde de bas. C'est aussi le moyen le plus sûr pour copier des tables et bases, mais il ne peut
fonctionner que sur la machine qui contient les fichiers de données.
mysqlhotcopy db_name [/path/to/new_directory]
 4.8.6 mysqlhotcopy , copier les bases et tables MySQL
277

Manuel MySQL 4.1.x ? Version Française
mysqlhotcopy db_name_1 ... db_name_n /path/to/new_directory
mysqlhotcopy db_name./regex/
mysqlhotcopy supporte les options suivantes :
??, ??help
Affiche un écran d'aide et quitte.
?u, ??user=#
Nom d'utilisateur pour la connexion au serveur.
?p, ??password=#
Mot de passe utilisé pour la connexion au serveur.
?P, ??port=#
Port utilisé pour la connexion au serveur.
?S, ??socket=#
Socket utilisé pour la connexion au serveur.
??allowold
Ne pas annuler si la sauvegarde existe déjà (renomme la simplement en _old)
??keepold
Ne pas effacer une sauvegarde précédente (celle qui a été renommée) lorsque c'est
terminé.
??noindices
Ne pas inclure les fichiers d'index complet dans la copie, pour faire des fichiers de
sauvegarde plus petit et plus rapide. Les index peuvent toujours être reconstruits
plus tard avec myisamchk ?rq. .
??method=#
Méthode de copie ( cp ou scp ).
?q, ??quiet
Mode silencieux. N'affiche que les erreurs.
??debug
Active le débogage.
?n, ??dryrun
Rapporte les actions réalisées sans les faire.
??regexp=#
Copie toutes les bases dont le nom vérifie un masque d'expression régulière.
??suffix=#
Suffixe des noms des bases copiées.
??checkpoint=#
Insère un point de contrôle dans la table spécifiée (base.table)
??flushlog
Vide les logs sur le disque une fois que toutes les tables sont verrouillées.
??tmpdir=#
Dossier temporaire (au lieu de /tmp).
Vous pouvez essayer perldoc mysqlhotcopy pour avoir plus de documentation sur
mysqlhotcopy .
mysqlhotcopy lit les options du groupe [client] et [mysqlhotcopy] dans le fichier d'options.
Pour être capable d'exécuter mysqlhotcopy , vous avez besoin des droits d'écriture dans le
dossier de sauvegarde, et le droit de SELECT dans les tables que vous souhaitez copier, ainsi que
les droits MySQL de RELOAD (pour utiliser la commande FLUSH TABLES ).
 4.8.6 mysqlhotcopy , copier les bases et tables MySQL
278

Manuel MySQL 4.1.x ? Version Française
4.8.7 mysqlimport , importer des données depuis des fichiers texte
mysqlimport fournit une interface en ligne de commande à la commande SQL LOAD DATA
INFILE . La plupart des options de mysqlimport correspondent directement aux mêmes options
de LOAD DATA INFILE . Syntaxe des LOAD DATA INFILE .
mysqlimport est appelé comme ceci :
shell> mysqlimport [options] database textfile1 [textfile2 ...]
Pour chaque fichier texte indiqué dans la ligne de commande, mysqlimport supprime toute
extension du nom du fichier, et utilise le résultat pour déterminer le nom de la table qui va recevoir
le contenu du fichier. Par exemple, pour des fichiers appelés  ,  et
patient seront tous importés dans la table patient . mysqlimport supporte les options
suivantes :
?c, ??columns=...
Cette option prend une liste de noms de colonnes, séparés par des virgules. Ce
champs est utilisé pour créer une commande LOAD DATA INFILE correcte, qui
sera alors passée à MySQL. Syntaxe des LOAD DATA INFILE .
?C, ??compress
Compresse toutes les informations entre le client et le serveur, si c'est possible.
?#, ??debug[=option_string]
Trace l'utilisation du programme (pour le débogage).
?d, ??delete
Vide la table avant d'importer le fichier texte.
??fields?terminated?by=...
??fields?enclosed?by=...
??fields?optionally?enclosed?by=...
??fields?escaped?by=...
??lines?terminated?by=...

Ces options ont la même signification que les clauses correspondantes de LOAD
DATA INFILE . Syntaxe des LOAD DATA INFILE .
?f, ??force
Ignore les erreurs. Par exemple, si une table n'existe pas pour un fichier texte,
mysqlimport va continuer de traiter les autres fichiers. Sans ??force ,
mysqlimport se termine dès qu'une erreur survient.
??help
Affiche le message d'aide et quitte.
?h host_name, ??host=host_name
Importe les données sur le serveur MySQL, avec l'hôte spécifié. La valeur par défaut
est localhost .
?i, ??ignore
Voir la description de ??replace .
?l, ??lock?tables
Verrouille toutes les tables en écriture avant de ne traiter les fichiers textes. Cela
assure que toutes les tables sont synchronisée sur le serveur.
?L, ??local
Lit le fichier d'entrée dans le client. Par défaut, les fichiers textes sont supposés être
lus par le serveur, si vous vous connectez à localhost (qui l'hôte par défaut).
?pyour_pass, ??password[=your_pass]
Le mot de passe à utiliser lors de la connexion au serveur. Si vous ne spécifiez pas
la partie '=your_pass' , mysqlimport va vous demander le mot de passe en
ligne.
?P port_num, ??port=port_num
 4.8.7 mysqlimport , importer des données depuis des fichiers texte
279

Manuel MySQL 4.1.x ? Version Française
Le port TCP/IP utilisé avec l'hôte. Cela sert pour les connexions à des hôtes qui ne
sont pas localhost , pour lequel la socket Unix est utilisée.
?r, ??replace
Les options ??replace et ??ignore contrôles la gestion des lignes lues envers les
lignes qui existent déjà sur le serveur. Si vous spécifiez l'option ??replace , les
nouvelles lignes remplaceront les lignes existantes. Si vous spécifiez ??ignore , les
lignes qui sont en double dans une table qui dispose d'une colonne de type unique.
Si vous ne spécifiez pas ces options, une erreur surviendra lorsqu'une clé en double
sera trouvée, et la lecture du reste du fichier sera annulé.
?s, ??silent
Mode silencieux. N'affiche que les erreurs qui surviennent.
?S /path/to/socket, ??socket=/path/to/socket
Le fichier de socket à utiliser lors de la connexion à localhost (qui est l'hôte par
défaut).
?u user_name, ??user=user_name
Le nom de l'utilisateur MySQL à utiliser lors de la connexion au serveur MySQL. La
valeur par défaut est celui de votre utilisateur Unix.
?v, ??verbose
Mode détaillé. Affiche bien plus d'informations sur les actions du programme.
?V, ??version
Affiche la version et quitte.
Voici un exemple d'utilisation de mysqlimport :
$ mysql ??version
mysql  Ver 9.33 Distrib 3.22.25, for pc?linux?gnu (i686)
$ uname ?a
Linux 2.2.5?15 #1 Mon Apr 19 22:21:09 EDT 1999 i586 unknown
$ mysql ?e 'CREATE TABLE imptest(id INT, n VARCHAR(30))' test
$ ed
a
100     Max Sydow
101     Count Dracula
.
w
32
q
$ od ?c
0000000   1   0   0  \t   M   a   x       S   y   d   o   w  \n   1   0
0000020   1  \t   C   o   u   n   t       D   r   a   c   u   l   a  \n
0000040
$ mysqlimport ??local test
test.imptest: Records: 2  Deleted: 0  Skipped: 0  Warnings: 0
$ mysql ?e 'SELECT * FROM imptest' test
+??????+???????????????+
| id   | n             |
+??????+???????????????+
|  100 | Max Sydow     |
|  101 | Count Dracula |
+??????+???????????????+
4.8.8 Afficher les bases, tables et colonnes
mysqlshow peut être utilisé pour lister les bases qui existent, leurs tables et leurs colonnes.
Avec le programme mysql vous pouvez obtenir des informations avec la commande SHOW .
Syntaxe de SHOW .
mysqlshow est utilisé comme ceci :
 4.8.8 Afficher les bases, tables et colonnes
280

Manuel MySQL 4.1.x ? Version Française
shell> mysqlshow [OPTIONS] [database [table [column]]]
Si aucune base n'est indiquée, toutes les bases de données sont listées.
• 
Si aucune table n'est nommée, toutes les tables de la base sont affichées.
• 
Si aucune colonne n'est nommée, toutes les colonnees et leur type sont affichés.
• 
Notez que dans les nouvelles versions de MySQL, vous ne verrez que les bases de données,
tables et colonnes pour lesquelles vous avez des le dernier argument contient un caractère
joker shell ou SQL ( * , ? , % ou _ ) alors seules les entités qui valident ce masque sont affichées. Si
une base contient des caractères soulignés, ils doivent être protégés avec un anti?slash (certains
shell Unix en demande même deux), afin de lister correctement les tables et les colonnes. Les '*'
sont convertis en SQL '%' et '?' en SQL '_'. Cela peut causer des confusions lorsque vous essayez
d'afficher des colonnes qui contiennent un souligné _ , comme c'est le cas avec mysqlshow qui ne
vous affiche que les colonnes qui vérifient le masque. Ceci est facilement corrigé en ajoutant un
caractère % en plus dans la ligne de commande (comme argument séparé).
4.8.9 perror , expliquer les codes d'erreurs
Pour la plupart des erreurs système, MySQL va, en plus d'un message interne, aussi afficher un
code d'erreur, dans l'un des styles suivants : message ... (errno: #) or message ...
(Errcode: #) .
Vous pouvez découvrir ce que ce code d'erreur signifie soit en examinant la documentation de votre
système, soit en utilisant l'utilitaire perror .
perror affiche une description pour le code d'erreur, ou, pour une erreur du gestionnaire de tables
MyISAM/ISAM.
perror est appelé comme ceci :
shell> perror [OPTIONS] [ERRORCODE [ERRORCODE...]]
Example:
shell> perror 13 64
Error code  13:  Permission denied
Error code  64:  Machine is not on the network
Notez que les messages d'erreurs sont dépendants du système.
4.8.10 Comment exécuter des commandes SQL depuis un fichier texte
Le client mysql peut être utilisé en mode interactif comme ceci :
shell> mysql database
Toutefois, il est aussi possible de rassembler les commandes SQL dans un fichier, et d'indiquer à
mysql de lire les commandes dans ce fichier. Pour faire cela, créez un fichier texte
fichier_texte qui contient les commandes SQL que vous souhaitez exécuter. Puis, exécutez ce
fichier avec mysql comme ceci :
shell> mysql database < fichier_texte
 4.8.9 perror , expliquer les codes d'erreurs
281

Manuel MySQL 4.1.x ? Version Française
Vous pouvez aussi démarrer votre fichier texte avec la commande USE nom_base . Dans ce cas, il
n'est pas néeccaire de spécifier le nom de la base de données dans la ligne de commande :
shell> mysql < fichier_texte
Si vous avez déjà démarré le client mysql , vous pouvez exécuter un script SQL en utilisant la
commande source :
mysql> source nom_fichier;
Pour plus d'informations sur le mode batch, consultez Utiliser mysql en mode batch .
4.9 Les fichiers de log de MySQL
MySQL a plusieurs fichiers de log qui peuvent vous aider à savoir ce qui se passe à l'intérieur de
mysqld :
Fichier
Description
Problèmes rencontrés lors du démarrage, de l'exécution ou du stoppage de
Le log d'erreurs
mysqld .
Garde une trace des changements liés au tables ISAM. Utilisé uniquement
Le log isam
pour déboguer le code isam.
Le log de requêtes Connexions établies et requêtes exécutées.
Le log de mises à
Désapprouvé : Enregistre toutes les commandes qui changent les données.
jour
Enregistre toutes les commandes qui changent quelque chose. Utilisé pour la
Le log binaire
replication.
Le log des requêtes Enregistre toutes les requêtes qui ont pris plus de long_query_time à
lentes
s'exécuter ou celles qui n'ont pas utilisé d'index.
Tous les fichiers de log peuvent être trouvés dans le dossier de données de mysqld . Vous pouvez
forcer mysqld à réouvrir les fichiers de log (ou dans quelques cas à passer à un nouveau log) en
exécutant FLUSH LOGS . Syntaxe de FLUSH .
4.9.1 Le log d'erreurs
mysqld affiche toutes les erreurs dans stderr, le script safe_mysqld les redirige vers un fichier
nommé 'hostname'.err . (Sur Windows, mysqld les écrit directement dans
\mysql\data\ .)
Ce fichier contient des informations indiquant quand mysqld a été démarré et stoppé pour cause
d'erreurs critiques rencontré lors de son fonctionnement. Si mysqld se termine inopinément et que
safe_mysqld a besoin de redémarrer mysqld , safe_mysqld ajoutera une ligne restarted
mysqld dans ce fichier. Ce log contient aussi un avertissement si mysqld trouve une table qui a
besoin d'être automatiquement vérifiée ou réparée.
Sur quelques systèmes d'exploitation, le log d'erreurs contiendra un traçage de la pile mémoire
relatif à l'endroit où mysqld s'est terminé. Il peut être utilisé pour trouver les raisons du crash de
mysqld . Utilisation d'un traçage de la pile .
 4.9 Les fichiers de log de MySQL
282

Manuel MySQL 4.1.x ? Version Française
4.9.2 Le log général de requêtes
Si vous voulez savoir ce qui se passe à l'intérieur de mysqld , vous devez le démarrer avec
??log[=fichier] . Cela aura pour effet d'écrire toutes les connexions et les requêtes dans le
fichier de log (pas défaut nommé 'hostname'.log ). Ce log peut être très utile quand vous
suspectez une erreur dans un client et voulez savoir exactement ce que mysqld pense que le
client lui a envoyé.
Les anciennes versions du script mysql.server (de MySQL 3.23.4 à 3.23.8) passent à
safe_mysqld une option ??log (active le log général de requêtes). Si vous avez besoin de
meilleurs performances lorsque vous démarrez MySQL dans un environnement de production, vous
pouvez supprimer l'option ??log de mysql.server ou la changer en ??log?bindes mises à jour .
Les entrées dans ce log sont écrites en même temps que mysqld reçoit une question. Cela peut
être différent de l'ordre dans lequel les commandes sont exécutées. Cela est contraire au log des
mises à jour et du log binaire qui sont écrits après l'exécution de la requête, mais avant les
verrouillages.
4.9.3 Le log de modification
NoteAvec ce nouveau log, vous pouvez faire tout ce que vous faisiez avec le log de modifications.
Lors l'option ??log?update[=file_name] est utilisée au démarrage, mysqld écrit un fichier de
log contenant toutes les commandes SQL qui modifie les données. Si aucun fichier n'est spécifié, il
prendra la valeur par défaut du nom de l'hôte. Si un fichier est spécifié mais qu'aucun chemin n'est
indiqué, le fichier sera écrit dans le dossier de données. Si le fichier file_name n'a pas
d'extension, mysqld va créer un fichier de log avec ce nom : file_name.### , où ### est un
nombre qui s'incrémente à chaque vois que vous exécutez la commande mysqladmin refresh ,
mysqladmin flush?logs , FLUSH LOGS ou que vous redémarrez le serveur.
Note : pour que la technique ci?dessus fonctionne, vous ne devez pas créer de fichiers avec le nom
du fichier de log + une extension, qui pourrait être considérée comme un nombre, dans le dossier
qui contient les log de modifications.
Si vous utilisez les options ??log ou ?l , mysqld écrit un log général avec le nom de
 , et les redémarrage ou les rafraîchissements de fichiers de logs ne généreront pas
de nouveaux fichiers (même si le fichier lui même est bien refermé, puis ouvert). Dans ce cas, vous
pouvez le copier sous Unix avec :
mv hostname?
mysqladmin flush?logs
cp hostname? to?backup?directory
rm hostname?
Le fichier de log de modification est très utile, car il n'enregistre que les commandes qui modifient
les données. Ce qui fait qu'une commande UPDATE ou DELETE avec une requête WHERE qui ne
trouve pas de lignes ne seront pas écrites dans ce fichier. Il va même ignorer les requêtes UPDATE
qui modifie une colonne avec la valeur déjà présente.
L'enregistrement dans le log de modification est fait juste après l'achèvement de la requête, mais
avant la levée des verrous, et les validations. Cela garantit que la requête sera enregistrée.
 4.9.2 Le log général de requêtes
283

Manuel MySQL 4.1.x ? Version Française
Si vous voulez modifier une base grâce aux fichier de log de modification, vous pouvez utiliser la
commande suivante (en supposant que vos fichiers de log de modification porte le nom de
file_name.### ) :
shell> ls ?1 ?t ?r file_name.[0?9]* | xargs cat | mysql
ls est utilisé pour obtenir toute la liste des fichiers de logs du peut être utile si vous
devez repartir d'un fichier de sauvegarde après un crash, et que vous souhaitez réexécuter les
modifications qui ont eu lieu depuis la sauvegarde.
4.9.4 Le log binaire de modifications
Notre objectif est de remplacer l'utilisation du log de modifications par le log binaire de
modifications. Nous vous recommandons donc de changer de format de log le plus tôt possible.
Le log binaire contient toutes les informations qui sont disponibles dans le log de modifications,
dans un format bien plus efficace. Il contient aussi des informations sur le temps d'exécution de la
requête. Il ne contient pas les requêtes qui n'ont pas modifié les données. Si vous voulez
requêtes .
MySQL .
Lorsque l'option de démarrage ??log?bin[=file_name] est utilisée, mysqld écrit un fichier de
log contenant toutes les commandes SQL qui modifient les données. Si aucun nom de fichier n'est
donné, le nom de la machine hôte est utilisé, suivi de ?bin . Si un nom est donné, mais qu'il ne
contient pas de chemin, le fichier sera écrit dans le dossier de données.
Si vous fournissez une extension à ??log?bin=filename.extension , l'extension sera
automatiquement supprimée.
Au nom du fichier de log binaire, mysqld va ajouter une extension qui est un nombre
automatiquement incrémenté chaque fois que vous exécutez mysqladmin refresh ,
mysqladmin flush?logs , FLUSH LOGS ou redémarrez le serveur. Un nouveau fichier de log
sera automatiquement créé lorsque le fichier en cours atteint la taille de max_binlog_size . Vous
pouvez effacer tous les fichiers de log inactifs avec la commande RESET MASTERRESET .
Vous pouvez utiliser les options suivantes avec mysqld pour modifier ce qui est enregistré dans le
fichier de log :
Option
Description
Indique au maître qu'il doit enregistrer les modifications
binlog?do?db=database_name
des bases spécifiées, et ignorer les autres. (Example:
binlog?do?db=some_database )
Indique autre maître que les modifications des bases
binlog?ignore?db=database_name spécifiées ne doit pas être enregistrées. (Exemple :
binlog?ignore?db=some_database )
Pour être capable de connaître les différents fichiers de logs qui ont été utilisés, mysqld va aussi
créer un fichier d'index qui contient les noms des fichiers de log utilisé. Par défaut, ils ont le même
nom que le fichier de log, avec l'extension '.index' . Vous pouvez modifier le nom du fichier
d'index avec l'option ??log?bin?index=[filename] .
 4.9.4 Le log binaire de modifications
284

Manuel MySQL 4.1.x ? Version Française
Si vous utilisez la réplication, vous ne devez pas effacer les anciens log binaires jusqu'à ce que
vous soyez sûrs que les esclaves n'en auront plus besoin. Une façon de faire cela est d'utiliser la
commande mysqladmin flush?logs une fois par jour, et d'effacer les fichiers de log qui ont plus
de trois jours.
Vous pouvez examiner le fichier de log binaire avec la commande mysqlbinlog . Par exemple,
vous pouvez mettre à jour le serveur MySQL depuis la ligne de commande comme ceci :
shell> mysqlbinlog log?file | mysql ?h server_name
Vous pouvez aussi utiliser le programme mysqlbinlog pour lire le fichier de log binaire
directement dans le serveur MySQL.
mysqlbinlog ??help vous donnera plus d'informations sur comment utiliser ce programme.
Si vous utilisez BEGIN [WORK] ou SET AUTOCOMMIT=0 , vous devez utiliser le fichier de log
binaire pour les sauvegardes, plutôt que le vieux fichier de log de modifications.
L'enregistrement dans le fichier de log binaire est fait immédiatement après l'achèvement de la
requête, mais avant la libération des verrous ou la validation de la requête. Cela garantit que les
requêtes seront enregistrées dans l'ordre d'exécution.
Les modifications dans les tables non transactionnelles sont enregistrées dans le fichier de log
binaire immédiatement après exécution. Pour les tables transactionnelles comme BDB ou InnoDB ,
toutes les modifications ( UPDATE , DELETE ou INSERT ) qui modifient les tables sont mises en
cache jusqu'à ce qu'une commande COMMIT ne les envoie au serveur. A ce moment, mysqld écrit
la totalité de la transaction dans le log binaire, avant d'appliquer la commande COMMIT . Tous les
threads vont, au démarrage, allouer un buffer de la taille de binlog_cache_size octets pour
enregistrer les requêtes. Si la requête est plus grande que ce buffer, le thread va ouvrir un fichier
temporaire pour écrire la transaction. Le fichier temporaire sera supprimé dès que le thread se
termine.
L'option max_binlog_cache_size (par défaut 4Go) peut être utilisé pour limiter la taille utilisée
pour mettre en cache une transaction multi?requête. Si la transaction est plus grande que que cette
taille, elle sera annulée.
Si vous utilisez les log de modification ou binaire, les insertions concurrentes seront converties en
insertions normales lors de l'utilisation de CREATE ... SELECT ou INSERT ... SELECT . Cela
garantit que vous pourrez recréer une copie exacte de la table en appliquant les même commandes
sauvegardées.
4.9.5 Le log des requêtes lentes
Lorsqu'il est démarré avec l'option ??log?slow?queries[=file_name] , mysqld va écrire
dans un fichier les requêtes SQL qui vont mettre plus de long_query_time secondes à
s'exécuter. Le temps d'acquisition d'un verrou n'est pas compté.
Les requêtes lentes sont enregistrées après l'achèvement de l'exécution de la requête, et libération
du verrou. Cela peut être différent de l'ordre dans lequel les commandes sont exécutées.
Si aucun nom de fichier n'est donné, le fichier de log prendra par défaut le nom de la machine,
suffixé avec ? . Si un nom de fichier est donné, mais qu'il manque le chemin, le fichier
sera écrit dans le dossier de données.
 4.9.5 Le log des requêtes lentes
285

Manuel MySQL 4.1.x ? Version Française
Le log de requêtes lentes peut être utilisé pour repérer les requêtes qui prennent longtemps à
s'exécuter, et donc, qui sont candidates à l'optimisation. Avec un grand fichier de log, cela peut
devenir difficile. Vous pouvez alors passer le fichier de log à mysqldumpslow pour obtenir un
sommaire des requêtes dans ce fichier.
Si vous utilisez l'option ??log?long?format alors les requêtes qui n'utilisent pas d'index sont
aussi enregistrées. Options en ligne de commande de mysqld .
4.9.6 Entretien des fichiers de log
Le serveur MySQL peut créer un grand nombre de fichiers de logs différents, qui permettent de
pour être sûr que les logs ne prennent pas tout le disque de la machine.
Lorsque vous utilisez MySQL avec des fichiers de log, vous voudrez, de temps en temps, supprimer
base de données .
Sous une installation Linux ( Redhat ), vous pouvez utiliser le script mysql?log?rotate pour
cela. Si vous avez installé MySQL depuis une distribution RPM, le script doit avoir été installé
automatiquement. Notez que vous devez être prudent avec cette commande si vous utilisez les
logs pour la réplication.
Sur d'autres systèmes, vous devez installer un court script par vous même, qui sera exécuté via le
démon cron .
Vous pouvez forcer MySQL à utiliser de nouveaux fichiers de log en utilisant la commande
mysqladmin flush?logs ou avec la commande SQL FLUSH LOGS . Si vous utilisez MySQL
version 3.21, vous devez utiliser mysqladmin refresh .
Les commandes ci?dessus effectue les tâche suivantes :
Si le log standard ( 
• 
??log ) ou le log de requêtes lentes ( ??log?slow?queries ) est
utilisé, la commande ferme et réouvre le fichier de log (  et
`hostname`? par défaut).
Si le log de modifications est utilisé ( 
• 
??log?update ), la commande ferme le log de
modification et ouvre un nouveau fichier, avec un nouveau numéro de séquence plus grand.
Si vous utilisez uniquement le log de modification, vous pour simplement vider les logs sur le
disque, et sauver l'ancien fichier de modification dans une sauvegarde. Si vous utilisez le log
normal, vous pouvez faire ceci :
shell> cd mysql?data?directory
shell> mv
shell> mysqladmin flush?logs
puis faire une sauvegarde du fichier, et le supprimer (  ).
4.10 Réplication de MySQL
Cette section décrit les différentes fonctionnalités de la réplication MySQL. Elle sert de référence
pour les options disponibles avec la réplication. Vous y trouverez une introduction à la réplication.
Vers la fin, vous y trouverez les questions et problèmes les plus fréquents, avec leur
 4.9.6 Entretien des fichiers de log
286

Manuel MySQL 4.1.x ? Version Française
de cette section. La réplication est constamment améliorée, et nous modifions souvent le manuel.
4.10.1 Introduction à la réplication
La réplication monodirectionnelle est à améliorer la solidité et la vitesse de votre application. Pour la
solidité, vous pouvez avoir une copie sur un serveur de sauvegarde, qui prend le relais
immédiatement si le maître rencontre des problèmes. L'amélioration de la rapidité est obtenue en
envoyant les requêtes sans modification sur un serveur qui ne fait que de la lecture. Bien sur, cela
ne fonctionnera que si les lectures dominent, mais c'est le cas le plus répandu.
Depuis la version 3.23.15, MySQL supporte la réplication mono directionnelle, en interne. Un
serveur sert de maître, et les autres serveurs d'esclaves. Notez qu'un serveur peut servir de maître
pour certains, et d'esclaves pour d'autres serveurs. Le maître va conserver un log binaire des
compte. L'esclave, au moment de la connexion, informe le maître où il s'est arrêté, rattrape les
modifications qui ont eu lieux depuis, puis se bloque en attente des prochaines modifications.
Notez que si vous faites de la réplication de base, toutes les modifications de cette base devraient
être faites sur le maître !
Un autre avantage de la réplication est que vous pouvez entretenir des sauvegardes immédiates de
vos données, depuis le maître vers l'esclave. Sauvegardes de base de données .
4.10.2 Présentation de l'implémentation de la réplication
La réplication MySQL est basée sur le fait que le serveur va garder la trace de toutes les évolutions
pouvoir exécuter les mêmes requêtes sur leurs copies.
Il est très important de comprendre que le fichier de log binaire est simplement un enregistrement
des modifications depuis un point fixe dans le temps (le moment où vous activez le log binaire).
Tous les esclaves que vous activez auront besoin de la copie des données qui existaient au
moment du démarrage du log. Si vous démarrez vos esclaves sur sans qu'ils ne disposent des
données identiques à celles du maître au moment du démarrage du log binaire , votre réplication
va échouer.
Voyez dans la table suivante les indications de compatibilité entre les maîtres et les esclaves,
suivant les versions. Depuis la version 4.0, nous recommandons d'utiliser la même version pour les
maîtres et esclaves.
Maître
Maître
Maître
Maître
3.23.33 et +
4.0.0
4.0.1
4.0.3 et +
Esclave
3.23.33 et +
oui
non
non
non
Esclave
4.0.0
non
oui
non
non
Esclave
4.0.1
oui
non
oui
non
Esclave
4.0.3 et +
oui
non
non
oui
Note : MySQL version 4.0.2 n'est pas recommandé pour la réplication.
 4.10.1 Introduction à la réplication
287

Manuel MySQL 4.1.x ? Version Française
Depuis la version 4.0.0, vous pouvez utiliser la commande LOAD DATA FROM MASTER pour
configurer un esclave. Soyez bien conscient qu'actuellement, LOAD DATA FROM MASTER ne
fonctionne que si toutes les tables du maître sont du type MyISAM , et qu'il est possible d'obtenir un
verrou de lecture global, pour qu'aucune lecture ne se fasse durant le transfert des tables depuis le
maître. Cette limitation est de nature temporaire, et elle est dûe au fait que nous n'avons pas encore
programmé un système de sauvegarde des tables sans verrou. La limitation sera supprimée dans
la future version 4.0 une fois que nous aurons programmé le système de sauvegarde, qui permettra
à LOAD DATA FROM MASTER de fonctionner sans bloquer le maître.
Etant donné la limitation ci?dessus, nous vous recommandons actuellement d'utiliser la commande
LOAD DATA FROM MASTER uniquement si le jeu de données du maître est petit, ou si un verrou
prolongé sur le maître est acceptable. Suivant la vitesse de lecture de LOAD DATA FROM MASTER
en fonction des systèmes, une règle de base indique que le transfert se fera au rythme de 1 Mo par
seconde. Vous pourrez ainsi obtenir une estimation du temps qu'il vous faudra pour transférer les
données, si le maître et l'esclave sont connectés sur un réseau de 100 MBit/s, avec des
configurations à base de Pentium 700 MHz. Bien sur, votre cas particulier pourra varier en fonction
de votre système : la règle ci?dessus vous donnera une première évaluation du temps à attendre.
Une fois que l'esclave est correctement configuré, et qu'il fonctionne, il va simplement se connecter
au maître et attendre des requêtes de modifications. Si le maître est indisponible ou que l'esclave
perd la connexion avec le maître, il va essayer de se reconnecter toutes les
master?connect?retry secondes jusqu'à ce qu'il soit capable d'établir la communication, et de
recommencer à appliquer les modifications.
Chaque esclave garde la trace du point où il en était rendu. Le serveur maître n'a pas de notions du
nombre d'esclave qui se connectent, ou qui sont à jour à un moment donné.
La prochaine section explique le processus de réplication en détails.
4.10.3 Comment mettre en place la réplication
Voici les instructions pour mettre en place la réplication sur votre serveur MySQL. Nous supposons
que vous voulez répliquer toutes vos bases, et que vous ne l'avez jamais configuré auparavant.
Vous aurez besoin d'éteindre brièvement le serveur principal pour suivre toutes les instructions.
Si cette méthode n'est pas la plus simple pour configurer un esclave, ce n'est pas la seule. Par
exemple, si vous avez déjà une sauvegarde des données du maître, et que le maître a déjà un
identifiant de serveur, et le log binaire activé, vous pouvez configurer l'esclave sans éteindre le
serveur et sans bloquer les mises à jours. Pour plus de détails, voyez FAQ de la réplication .
Si vous voulez devenir un véritable gourou de la réplication MySQL, nous vous suggérons de
commencer par étudier, tester et expérimenter toutes les commandes mentionnées dans le chapitre
démarrage de  , Options de réplication dans le fichier  .
Assurez vous que vous avez une version récente de MySQL installée comme maître et
• 
comme esclave.Utilisez les versions 3.23.29 et plus récente. Les anciennes versions
utilisaient un autre format de log binaire, et avaient des bogues qui ont été corrigés dans les
nouvelles versions. Ne nous rapportez pas de bogues avant d'avoir vérifié si le problème est
encore présent dans la dernière version de MySQL.
Créez un utilisateur MySQL spécial pour la réplication sur le maître, avec les droits de 
• 
FILE
(dans les versions plus anciennes que la versions 4.0.2) ou le droit de REPLICATION
SLAVE pour les nouvelles versions. Vous devez aussi lui donner les droits de connexion
 4.10.3 Comment mettre en place la réplication
288

Manuel MySQL 4.1.x ? Version Française
depuis tous les esclaves. Si l'utilisateur ne fait que de la réplication (ce qui est
recommandé), vous n'avez pas à lui donner d'autres exemple, pour créer un
utilisateur appelé repl qui peut accéder au maître, vous pourriez utiliser une commande
comme :
mysql> GRANT FILE ON *.* TO repl&#64;"%" IDENTIFIED BY '<password>';
Eteignez le serveur MySQL maître.
• 
mysqladmin ?u root ?p<password> shutdown
Sauvegardez toutes les données de votre serveur maître.
• 
Le plus simple pour cela (sous Unix) et d'utiliser la commande tar pour produire une archive
de votre dossier de données total. Le dossier de données dépend de votre installation.
tar ?cvf /tmp/mysql? /path/to/data?dir
Les utilisateurs Windows peuvent utiliser le programme WinZIP ou un logiciel similaire pour
créer une archive du dossier de données.
Dans le fichier 
• 
 du maître, ajouter les options log?bin et server?id=unique
number à la section [mysqld] et redémarrez le serveur. Il est très important que
l'identifiant des esclaves soient différents de celui du maître. Pensez à server?id comme
à une valeur comparable à une adresse IP : elle identifie de manière unique un serveur dans
la communauté des réplicateurs.
[mysqld]
log?bin
server?id=1
Redémarrez le serveur maître MySQL.
• 
Ajoutez les lignes de configuration suivantes dans le fichier 
• 
 des esclaves :
master?host=<nom d'hôte du maître>
master?user=<nom d'utilisateur de réplication>
master?password=<mot de passe de l'utilisateur de réplication>
master?port=<port TCP/IP du maître>
server?id=<un identifiant unique, entre 2 et 2^32?1>
Remplacez les valeurs entre <> avec ce qui correspond à votre système.
server?id doit être différent pour chaque serveur qui participe à la réplication. Si vous
spécifiez pas d'identifiant server?id, il sera mis à 1 si vous n'avez pas défini de
master?host , et sinon, il vaudra 2. Notez que dans le cas où vous omettez le server?id
, le maître va refuser les connexion des esclaves, et les esclaves vont refuser de se
connecter au maître. Par conséquent, omettre server?id n'est bon que pour faire des
sauvegarde du log binaire.
Copiez la sauvegarde des données dans vos esclaves. Assurez vous que les droits sur ces
• 
données sont corrects. L'utilisateur qui fait fonctionner MySQL doit avoir les droits d'écriture
et de lecture sur ces fichiers, tout comme le maître l'avait.
Redémarrez les esclaves
• 
Après avoir suivi les instructions ci?dessus, les esclaves doivent se connecter au maître, et
rattraper les modifications qui ont eu lieu depuis la sauvegarde des données.
Si vous avez oublié de spécifier un server?id pour un esclave, vous allez obtenir l'erreur suivante
dans le fichier d'erreur :
Warning: one should set server_id to a non?0 value if master_host is set.
The server will not act as a slave.
Si vous avez oublié de le faire pour le maître, les esclaves ne pourront pas se connecter avec le
maî un esclave n'est pas capable de faire la réplication pour une raison quelconque, vous allez
trouvez le message d'erreur dans le fichier de log d'erreurs de l'esclave.
 4.10.3 Comment mettre en place la réplication
289

Manuel MySQL 4.1.x ? Version Française
Une fois qu'un esclave fonctionne, vous allez trouver un fichier appelé  dans le
même dossier que vos fichiers de logs. Le fichier  est utilisé par l'esclave pour savoir
où il en est rendu dans le log binaire du maître. Ne le supprimez pas et ne l'éditez pas, à moins
que vous ne sachiez vraiment ce que vous faites. Même dans ce cas, il est préférable d'utiliser la
commande CHANGE MASTER TO .
4.10.4 Fonctionnalités de la réplication et problèmes connus
Voici une liste des fonctionnalités supportées par la réplication de MySQL :
La réplication s'effectue correctement sur les valeurs 
• 
AUTO_INCREMENT ,
LAST_INSERT_ID() et TIMESTAMP .
RAND()
• 
 dans les commandes UPDATE ne se réplique par correctement. Utilisez
RAND(some_non_rand_expr) si vous répliquez des UPDATE avec RAND() . Vous
pourriez, par exemple, utiliser UNIX_TIMESTAMP() comme argument de RAND() .
Vous devez utiliser le même jeu de caractères ( 
• 
??default?character?set ) sur le
maître et l'esclave. Si ce n'est pas le cas, vous obtiendrez des erreurs de clés doublons
dans l'esclave, car une clé qui est indiquée comme unique sur le maître peut se révéler un
doublon pour l'esclave.
En version 3.23, 
• 
LOAD DATA INFILE sera géré proprement, tant que le fichier réside
toujours sur le maître au moment de la propagation de la réplication. Sinon, LOAD LOCAL
DATA INFILE sera ignoré. En version 4.0, cette limitation a été levée (toutes les formes de
LOAD DATA INFILE sont correctement répliquées).
Les requêtes d' 
• 
UPDATE qui utilisent des variables utilisateurs ne sont pas correctement
répliquées (pour le moment).
Les commandes 
• 
FLUSH ne sont pas enregistrées dans le fichier de log car elle ne sont pas
répliquées aux esclaves. Ce n'est pas normalement un problème, car FLUSH ne modifie pas
les tables. Cela peut signifier que vous avez modifié des droits dans les tables MySQL
directement sans la commande GRANT et que vous avez répliqué les droits de mysql sans
pouvoir faire de commande FLUSH PRIVILEGES sur vos esclaves pour les prendre en
compte.
Les tables temporaires sont répliquées depuis la version 3.23.29, à l'exception des cas où
• 
vous éteignez le serveur esclave (et pas juste le thread esclave), que vous avez des tables
temporaires ouvertes et qu'elles sont utilisées dans des modifications ultérieures. Pour
régler ce problème, utilisez la commande SLAVE STOP , vérifiez la variable de statut
Slave_open_temp_tables pour vérifier si elle vaut bien 0, puis exécutez mysqladmin
shutdown . Si le nombre n'est pas 0, redémarrez l'esclave avec la commande SLAVE
START et voyez si vous avez plus de chance la prochaine fois. Il y aura une solution plus
élégante, mais il doit attendre la version 4.0. Dans les anciennes versions, les tables
temporaires n'étaient pas répliquée : nous vous suggérons de mettre à jour votre version ou
d'exécuter la commande SET SQL_LOG_BIN=0 sur vos clients avant toute requête qui
utiliserait les tables temporaires.
MySQL ne supporte qu'un seul maître, et plusieurs esclaves. En version 4.x, nous allons
• 
ajouter un algorithme de sélection pour que le maître soit modifié si le maître initial flanche.
Nous allons aussi introduire une notion d'agent dans les processus, pour aider la répartition
de charge en répartissant les requêtes sur les esclaves.
Depuis la version 3.23.26, il est possible de connecter les serveurs MySQL en chaîne
• 
bouclée (chaque serveur est le maître du précédent et l'esclave du suivant, en boucle), avec
l'activation de l'option log?slave?updates . Notez que de nombreuses requêtes ne vont
pas fonctionner dans ce type de configuration à moins que votre code client ne soit écrit
avec beaucoup de soin, pour qu'il se charge des problèmes qui pourraient arriver dans
différentes séquences de modifications sur différents signifie que vous
pouvez réaliser une configuration comme ceci :
 4.10.4 Fonctionnalités de la réplication et problèmes connus
290

Manuel MySQL 4.1.x ? Version Française
A ?> B ?> C ?> A
Cette configuration va fonctionner si vous ne faites que des modifications non exclusives sur
les tables. En d'entre terme, si vous insérez des données dans les serveurs A et C, vous ne
devez pas insérer une valeur dans le serveur A qui pourrait être en conflit avec une ligne
insérée dans le serveur C. Vous ne devez pas non plus modifier de ligne sur deux serveurs
en même temps, pour éviter les conflits de valeurs.Notez que le format de log a été modifié
en version 3.23.26 de façon à ce que les esclaves pre?3.23.26 ne soient pas capable de les
lire.
Si la requête sur l'esclave génère une erreur, le thread esclave s'arrête, et un message sera
• 
ajouté dans le fichier d'erreurs .err . Vous devriez vous connecter pour corriger
manuellement les données de l'esclave, puis relancer l'esclave avec la commande SLAVE
START (disponible depuis la version 3.23.16. En version 3.23.15, vous devrez redémarrer le
serveur.
Si la connexion au maître est perdue, l'esclave tente de se reconnecter immédiatement, et
• 
en cas d'échec, il va retenter toutes les master?connect?retry (par défaut, 60)
secondes. A cause de cela, il est sage d'éteindre le serveur maître et de le redémarrer
réguliérement. L'esclave sera capable de gérer les problèmes réseau.
Eteindre l'esclave proprement est sûr, car il garde la trace du point où il en est rendu. Les
• 
extinctions sauvages vont produire des problèmes, surtout si le cache disque n'a pas été
écrit sur le disque avant que le système ne s'arrête. Votre niveau de tolérance aux pannes
sera grandement amélioré si vous avez de bons onduleurs.
Si le maître écoute sur un port non?standard, vous devez aussi le spécifier dans le
• 
paramètre master?port du fichier  .
En version 3.23.15, toutes les tables et bases seront répliquées. Depuis la version 3.23.16,
• 
vous pouvez limiter la réplication à certaines bases, grâce à l'option replicate?do?db du
fichier  ou simplement d'exclure des bases avec replicate?ignore?db . Notez
que jusqu'à la version 3.23.23, il y avait un bogue qui ne traitait correctement les
commandes LOAD DATA INFILE si vous les utilisiez dans une base qui étaient exclue de
la réplication.
Depuis la version 3.23.16, 
• 
SET SQL_LOG_BIN = 0 va désactiver l'enregistrement des
données de réplication (binaire) sur le maître, et SET SQL_LOG_BIN = 1 la réactivera.
Vous aurez besoin des droits de SUPER (en MySQL 4.0.2 et plus récent), ou PROCESS (dans
les anciens droits MySQL) pour faire cela.
Depuis la version 3.23.19, vous pouvez nettoyer les restes de la réplication lorqu'un
• 
problème est survenu avec les commandes FLUSH MASTER et FLUSH SLAVE . En version
3.23.26, nous avons renommé cette commande en RESET MASTER et RESET SLAVE
respectivement, pour clarifier leur action. Les anciennes variantes de FLUSH fonctionnent
encore, pour la compatibilité.
Depuis la version 3.23.23, vous pouvez modifier les maîtres et ajuster la position de log
• 
avec la commande CHANGE MASTER TO .
Depuis la version 3.23.23, vous pouvez dire au maître que les modifications de certaines
• 
bases ne doivent pas être enregistrées dans le fichier de log binaire, avec l'option
binlog?ignore?db .
Depuis la version 3.23.26, vous pouvez utiliser l'option 
• 
replicate?rewrite?db pour dire
à l'esclave d'appliquer les modifications d'une base dans une autre.
Depuis la version 3.23.28, vous pouvez utiliser la commande 
• 
PURGE MASTER LOGS TO
'log?name' pour vous débarasser des anciens logs sur l'esclave. Cela va supprimer les
vieux logs, maisp as le log appelé 'log?name' .
Etant donné la nature non transactionnelle des tables MySQL, il est possible qui va ne faire
• 
qu'une partie de la modification, et retourner une erreur. Cela peut arriver, par exemple,
dans une insertion multiple dont une des lignes viole une contrainte d'unicité, ou si un très
long UPDATE est interrompu au milieu du stock de ligne. Si cela arrive sur le maître,
l'esclave va s'arrêter et attendre que l'administrateur décide quoi faire, à moins que l'erreur
soit légitime, et que la requête arrive à la même conclusion. Si le code d'erreur n'est pas
 4.10.4 Fonctionnalités de la réplication et problèmes connus
291

Manuel MySQL 4.1.x ? Version Française
désirable, certaines erreurs (voire même toutes), peuvent être masquées avec l'option
slave?skip?errors , depuis la version 3.23.47.
Alors que des tables particulières peuvent être exclues de la réplication avec les options
• 
replicate?do?table / replicate?ignore?table ou replicate?wild?do?table /
replicate?wild?ignore?table , il y a actuellement des problèmes de conception, qui
provoque des résultats inattendus dans certains cas très rares. Le protocole de réplication
n'informe pas explicitement l'esclave quelles tables vont être modifiées par la requête :
l'esclave doit donc analyser lui?même la requête pour le savoir. Pour éviter une analyse
répétitive des requêtes qui seront finalement exécutées, l'exclusion de table est
actuellement implémentées en envoyant la requête à l'analyseur MySQL, qui va court
circuiter la requête, et qui indiquera la réussite si une table utilisée doit être ignorée. En plus
de plusieurs sources de ralentissement, cette approche va fatalement engendrer des
bogues, et il en existe dux depuis la version 3.23.49 ?? car l'analyseur ouvre
automatiquement la table lors de l'analyse de la requête, la table qui doit être ignorée doit
donc exister sur l'esclave. L'autre bogue est que si le thread esclave modifie partiellement la
table à ignorer, le thread ne va pas réaliser que la table aurait du être ignorée, et va
suspendre la réplication. Alors que le premier bogue est conceptuellement simple à corriger,
nous n'avons pas encore trouvé de moyen pour corriger le second sans intervenir
massivement dans le code, et donc, en compromettre la stabilité. Il existe un palliatif pour
les deux, dans les cas rares ou cela arrive à votre application : utilisez
slave?skip?errors .
4.10.5 Options de réplication dans le fichier
Si vos utilisez la réplication, nous vous recommandons d'utiliser MySQL version 3.23.30 ou plus
récent. Les vieilles versions fonctionneront, mais elles présentent des bogues et manquent les
nouvelles fonctionnalités. Certaines des options qui seront présentées ici ne seront pas forcément
disponibles dans votre version de MySQL, si vous n'utilisez pas la version la plus récente. Pour
toutes les options spécifiques à la version 4.0, il y a une note qui l'indique. Sinon, si vous découvrez
une option qui vous interesse mais qui n'est pas disponible dans votre version 3.23, et que vous en
avez vraiment besoin, mettez à jour votre installation.
Notez bien que la version 4.0 est toujours en phase alpha, et que certaines fonctionnalités ne
fonctionneront peut être pas aussi bien que prévu. Si vous voulez vraiment essayer de nouvelles
fonctionnalités de la version 4.0, nous vous recommandons de le faire de façon à ce que cela ne
perturbe pas vos applications critiques.
Sur le maître et l'esclave, vous devez utiliser l'option server?id . Elle doit représenter un
identifiant unique de réplication. Vous devriez choisir une valeur unique entre 1 et 2^32?1 pour
chaque maître et esclave. Example: server?id=3
La table suivante décrit les options que vous pouvez utiliser avec MASTER :
Option
Description
log?bin=filename
Ecrit le fichier de log binaire à la position indiquée.
Notez que vis vous donner un paramètre avec une
extension (par exemple,
log? ),
les versions jusqu'en 3.23.24 ne fonctionneront pas
correctement avec la réplication, si vous utilisez la
commande FLUSH LOGS . Le problème a été
corrigé avec la version 3.23.25. Si vous utilisez ce
type de nom de fichier de log, FLUSH LOGS sera
 4.10.5 Options de réplication dans le fichier
292

Manuel MySQL 4.1.x ? Version Française
ignoré sur les logs binaires. Pour nettoyer le log,
exécutez la commande FLUSH MASTER , et
n'oubliez pas la commande FLUSH SLAVE sur
chacun des esclaves. En version 3.23.26 et plus
récent, vous devriez utiliser RESET MASTER et
RESET SLAVE .
Comme l'utilisateur peut exécuter une commande
FLUSH LOGS , nous devons savoir quel fichier de
log est actuellement actif, lequels ont été déjà
utilisés, et dans quel ordre. Cette information est
log?bin?index=filename
stockée dans le fichier d'index de log. Par défaut, ce
fichier s'appelle `hostname`.index . Nous n'avez
pas à le modifier.Example:
log?bin?index=db.index
Si cette option est activée, en donnant une valeur à
sql?bin?update?same
SQL_LOG_BIN vous donnerez automatiquement la
même valeur à SQL_LOG_UPDATE et vice?versa.
Indique au maître qu'il doit mettre les modifications
dans le fichier de log binaire, si la base courante est
la base database_name . Toutes les autres bases
sont ignorées. Notez que vous si vous utilisez cette
binlog?do?db=database_name
option, vous devez vous assurer que vous ne faites
des modifications que dans la base courante.
Example: binlog?do?db=sales
Indique au maître que les modifications dont la base
courante est database_name ne doivent pas être
stockées dans le log binaire. Notez que vous si vous
binlog?ignore?db=database_name
utilisez cette option, vous devez vous assurer que
vous ne faites des modifications que dans la base
courante.Example:
binlog?ignore?db=accounting
La table suivante décrit les options que vous pouvez utiliser avec SLAVE :
Option
Description
Le nom d'hôte du maître, ou l'adresse IP de réplication. Si cette
valeur n'est pas spécifiée, l'esclave ne démarrera pas. Notez que la
configuration de master?host sera ignorée si il existe un fichier
 valide. Il est probable qu'un nom mieux choisi pour
master?host=host
cette option aurait été bootstrap?master?host , mais il est trop
tard aujourd'hui.
Example: master?host=db?
Le nom d'utilisateur que l'esclave va utiliser pour s'identifier lors de
la connexion au maître. Cet utilisateur doit avoir les droits de FILE
. S'utilisateur maître n'est pas configuré, l'utilisateur test est
master?user=username
utilisé. La valeur dans  aura priorité, si elle peut être
lue.
Example: master?user=scott
master?password=password
Le mot de passe que l'esclave va utiliser automatiquement avec le
maître. Si il n'est pas configuré, le mot de passe vide sera utilisé.
La valeur dans  aura priorité, si elle peut être lue.
 4.10.5 Options de réplication dans le fichier
293

Manuel MySQL 4.1.x ? Version Française
Example: master?password=tiger
Le port sur lequel le maître écoute. Si cette valeur n'est pas
configurée, la valeur compilée de MYSQL_PORT est utilisée. Si vous
n'avez pas joué avec les options du script configure , ce devrait
master?port=portnumber
être le port 3306. La valeur dans  aura priorité, si elle
peut être lue.
Example: master?port=3306
Le nombre de secondes que le thread esclave va attendre avant de
tenter à nouveau de se connecter au maître, dans le cas où le
master?connect?retry=seconds
maître n'est plus joignable. Par défaut, c'est 60.
Example: master?connect?retry=60
Disponible après la version 4.0.0. Active le mode SSL pour la
réplication. Soyez prévenu que c'est une fonctionnalité très récente.
master?ssl
Example: master?ssl
Disponible après la version 4.0.0. Le nom du fichier de clé maître
SSL. Uniquement valable si l'option master?ssl est active.
master?ssl?key
Example: master?ssl?key=SSL/master?
Disponible après la version 4.0.0. Le nom du fichier de certificat
master?ssl?cert
SSL. Uniquement valable si l'option master?ssl est
active.Example: master?ssl?key=SSL/master?
La position du fichier qui enregistre la dernière opération faite avec
le maître, durant la réplication. Le fichier par défaut est
master?info?file=filename
 dans le dossier de données. Vous n'avez pas
besoin de modifier cela.Example:
master?info?
Disponible après la version 4.0.0. Le nom d'hôte ou l'adresse IP de
l'esclave, qui doit être enregistrée lors de l'identification. Cette
valeur apparaîtra dans le résultat de la commande SHOW SLAVE
HOSTS . Laissez la vide si vous ne souhaitez pas que l'esclave
report?host
s'enregistre lui?même. Notez qu'il n'est pas suffisant pour le maître
de simplement lire l'IP de l'esclave dans la socket de connexion. A
cause du NAT et d'autres problèmes de routage, cette IP peut ne
pas êtra valable pour la connexion du maître sur l'esclave.Example:
report?
Disponible après la version 4.0.0. Port de connexion à l'esclave
indiqué au maître durant l'enregistrement. Utilisez cette option
report?port
uniquement si l'esclave doit écouter sur un port non standard, ou si
vous avez un tunnel particulier pour le maître. En cas de doute,
laissez le vide.
Restreint la réplication à certaines tables. Pour spécifier plus d'une
table, vous pouvez utiliser cette directive plusieurs fois, une pour
chaque table. Cette option va fonctionner pour les modifications
replicate?do?table=db_name.table_name
inter?bases, contrairement à replicate?do?db .
Example: replicate?do?table=some_db.some_table
replicate?ignore?table=db_name.table_name
Indique à l'esclave d'ignorer les commandes qui modifie les tables
spécifiées (même si d'autres tables de la même commande sont
aussi modifiées). Pour spécifier plus d'une table, vous pouvez
 4.10.5 Options de réplication dans le fichier
294

Manuel MySQL 4.1.x ? Version Française
utiliser cette directive plusieurs fois, une pour chaque table. Cette
option va fonctionner pour les modifications inter?bases,
contrairement à replicate?ignore?db .
Example: replicate?ignore?table=db_name.some_table
Restreint la réplication à certaines tables qui vérifient le masque
d'expression régulière indiqué. Pour spécifier plus d'une table, vous
pouvez utiliser cette directive plusieurs fois, une pour chaque table.
Cette option va fonctionner pour les modifications inter?bases.
replicate?wild?do?table=db_name.table_name
Example: replicate?wild?do?% va répliquer
uniquement les modifications qui utilisent une table dont le nom de
base commence par foo , et le nom de table commence par bar .
Interdit la réplication à certaines tables qui vérifient le masque
d'expression régulière indiqué. Pour spécifier plus d'une table, vous
pouvez utiliser cette directive plusieurs fois, une pour chaque table.
Cette option va fonctionner pour les modifications inter?bases.
replicate?wild?ignore?table=db_name.table_name
Example: replicate?wild?ignore?% va
ignorer la réplication des modifications qui utilisent une table dont le
nom de base commence par foo , et le nom de table commence
par bar .
Restreint la réplication aux bases de données indiquées. Pour
spécifier plus d'une base, vous pouvez utiliser cette directive
plusieurs fois, une pour chaque base. Vous ne devez pas utiliser
cette option si vous faites des modifications inter?bases et que
vous ne voulez pas que ces modifications soient prises en compte.
La principale raison de ce comportement est qu'il est difficile
d'utiliser uniquemnt la ligne de commande pour savoir si une
requête doit être répliquée ou pas. Par exemple, si vous utilisez
replicate?ignore?db=database_name
une commande d'effacement multi?table en MySQL 4.x, qui utilise
plusieurs bases. Il est aussi très facile de vérifier la base courante,
car cela ne s'applique qu'une fois au moment de la connexion, ou
d'un changement de base.
Si vous voulez que des modifications inter?bases fonctionnent,
assurez vous que vous avez la version 3.23.28 ou plus récente, et
utilisez replicate?wild?ignore?table=db_name.% .
Example: replicate?ignore?db=some_db
Restreint la réplication aux commandes dont le nom de base
courante est database_name . Pour spécifier plus d'une base,
vous pouvez utiliser cette directive plusieurs fois, une pour chaque
base. Notez que cette option ne va pas autoriser la réplication de
requêtes inter?bases telles que UPDATE some_db.some_table
SET foo='bar' lorsque vous avez sélectionné une autre base
replicate?do?db=database_name
(ou qu'aucune base n'est sélectionnée). Si vous avez besoin de
faire des modifications inter?bases, assurez vous que vous avez la
version 3.23.28 ou plus récente, et utilisez
replicate?wild?do?table=db_name.% .
Example: replicate?do?db=some_db
 4.10.5 Options de réplication dans le fichier
295

Manuel MySQL 4.1.x ? Version Française
Indique à l'esclave d'enregistrer les modifications du thread esclave
dans le log binaire. Par défaut, cette option est inactive (off). Vous
log?slave?updates
aurez besoin de cette fonctionnalité si vous installez les esclaves
en cascade.
Reporte les modifications qui ont lieu dans une base, dans une
replicate?rewrite?db=from_name?>to_name
autre.Example:
replicate?rewrite?db=master_db_name?>slave_db_name
Disponible depuis la version 3.23.47 et plus récent. Indique au
thread esclave de continuer la réplication si une requête génère
une erreur issue de la liste fournie. Normalement, la réplication va
s'arrêter dès qu'une erreur survient, pour que l'utilisateur puisse
corriger les incohérence manuellement. N'utilisez pas cette option
si nous ne comprenez pas complètement les raisons qui génèrent
ces erreurs. Si il y n'a pas de bogues dans vos configurations de
réplication, et pas de bogues dans MySQL, vous ne devriez jamais
interrompre la réplication. Utiliser cette option à tort et à travers va
désynchroniser les esclaves et vous n'aurez aucune idée des
problèmes qui sont les codes d'erreurs, vous devez
utiliser les numéros d'erreurs qui sont fournis dans le log d'erreur
de l'esclave, et dans le résultat de la commande SHOW SLAVE
slave?skip?errors= [err_code1,err_code2,... |
STATUS . La liste complète des message d'erreurs sont disponibles
all]
dans le fichier source  .
Vous pouvez (mais ne devriez pas) aussi utiliser la valeur
hautement dangeureuse de all (tous), pour ignorer toutes les
erreurs de réplication, et continuer comme si de rien n'était. Inutile
de vous dire que si vous l'utilisez, nous ne pouvons rien garantir
quand à l'intégrité de vos données. Ne venez pas vous plaindre
que les données de vos esclaves sont très différentes des données
du maître : vous aurez été prévenus.
Exemple :
slave?skip?errors=1062,1053 or
slave?skip?errors=all
Indique au serveur esclave de ne pas démarrer l'esclave au
skip?slave?start
démarrage. L'utilisateur le démarrera manuellement plus tard, avec
SLAVE START .
Si cette option vaut 1, alors le protocole compressé est utilisé entre
slave_compressed_protocol=#
le maître et l'esclave, si les deux le supporte.
Le nombre de secondes d'attente de données depuis le maître,
slave_net_timeout=#
avant d'abandonner la lecture.
4.10.6 Commandes SQL liées à la réplication
La réplication peut être contrôlée depuis l'interface SQL. Voici un résumé des commandes
disponibles :
Commande
Description
SLAVE START
Démarre le thred esclave. Depuis MySQL 4.0.2, vous
pouvez ajouter les options IO_THREAD ou SQL_THREAD à
cette commande, pour démarrer le thread I/O ou le thread
 4.10.6 Commandes SQL liées à la réplication
296

Manuel MySQL 4.1.x ? Version Française
SQL. Le thread I/O lit les requêtes depuis le maître, et les
stockent dans le log de relais. Le thread SQL lit le log de
relais, et exécute les requêtes. (Esclave)
Stoppe le thread esclave. Comme SLAVE START , cette
SLAVE STOP
commande peut être utilisée avec les options IO_THREAD et
SQL_THREAD . (Esclave)
Désactive le log binaire, si l'utilisateur a les droits de SUPER .
SET SQL_LOG_BIN=0
Ignoré sinon. (Maître)
Réactive le log binaire, si Re?enables update logging, si
SET SQL_LOG_BIN=1
l'utilisateur a les droits de SUPER . Ignoré sinon. (Maître)
Ignore les n prochains événements du maître. Uniquement
SET GLOBAL
valide lorsque le thread esclave ne fonctionne pas, sinon
SQL_SLAVE_SKIP_COUNTER=n
une erreur est affichée. Très pratique pour corriger des
petits problèmes de réplications.
Efface tous les logs binaires dans le fichier d'index, et vide le
RESET MASTER
fichier de log binaire. Dans les versions antérieures à la
3.23.26, utilisez FLUSH MASTER . (Maître)
Efface la position de réplication de l'esclave dans les logs du
maître. Makes the slave forget its replication position in the
RESET SLAVE
master logs. Dans les versions antérieures à la 3.23.26,
cette commande s'appelait FLUSH SLAVE . (Esclave)
Télécharge une copie des tables depuis le maître vers
l'esclave. Implémentée principalement pour le débogage de
LOAD TABLE tblname FROM
LOAD DATA FROM MASTER , mais certains utilisateurs
MASTER
``gourmets'' pourront la trouver pratique pour d'autres
utilisations. Ne l'utilisez pas si vous vous considérez comme
un utilisater ``non?hacker''. (Esclave)
Disponible depuis 4.0.0. Prend une copie des données du
maître et les transfère vers l'esclave. Met à jour les valeurs
de MASTER_LOG_FILE et MASTER_LOG_POS de manière à
ce que l'esclave démarre la réplication depuis la position
correcte. Cette commande respecte les règles d'exclusion
des tables et des bases spécifiées dans les options
LOAD DATA FROM MASTER
replicate?* . Actuellement fonctionne uniquement avec
les tables MyISAM et pose un verrou global en lecture sur
toutes les tables, pour faire la sauvegarde. Dans le futur, il
est prévu de rendre cette commande compatible avec les
tables InnoDB et de supprimer le besoin du verrou global
pour faire une sauvegarde non bloquante.
CHANGE MASTER TO
Change les paramètres du maître avec les valeurs
master_def_list
spécifiées dans l'argument master_def_list et
redémarre le thread esclave. master_def_list est une
liste séparée par des virgules, avec les variables suivantes :
MASTER_HOST , MASTER_USER , MASTER_PASSWORD ,
MASTER_PORT , MASTER_CONNECT_RETRY ,
MASTER_LOG_FILE et MASTER_LOG_POS . Par exemple :
CHANGE MASTER TO
  MASTER_HOST='',
  MASTER_USER='replication',
  MASTER_PASSWORD='bigs3cret',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='master2?bin.001',
  MASTER_LOG_POS=4;
 4.10.6 Commandes SQL liées à la réplication
297

Manuel MySQL 4.1.x ? Version Française
Vous n'avez pas besoin de spécifier les valeurs que vous ne
souhaitez pas changer. Les valeurs omises conserveront
leur valeur actuelle, même si vous modifiez l'hôte ou le port.
Dans ce cas, l'esclave supposer que puisque vous vous
connectez à un nouvel hôte ou un nouveau port, le maître
est différent. Par conséquent, il les anciennes valeurs de log
et position ne sont plus applicables, et il va
automatiquement leur donner la valeur de la chaîne vide, et
de 0, respectivement, qui sont les valeurs de démarrage.
Notez qui si vous redémarrez l'esclave il va se souvenir de
son ancien maître. Si vous ne le souhaitez pas, il suffit
d'effacer le fichier  avant de le redémarrer, et
l'esclave va lire la valeur depuis le fichier  ou la ligne
de commande.Cette commande est pratique pour configurer
un esclave lorsque vous avez une sauvegarde du maître, et
que vous avez sauvé la valeur du log et de son offset chez
le maître. Vous pouvez alors exécuter la commande
CHANGE MASTER TO
MASTER_LOG_FILE='log_name_on_master',
MASTER_LOG_POS=log_offset_on_master sur l'esclave
après avoir restauré la sauvegarde. (Esclave)
Fournit les informations de statut sur le point de contrôle du
SHOW MASTER STATUS
fichier de log binaire du maître. (Maître)
Disponible depuis la version 4.0.0. Cette commande liste les
SHOW SLAVE HOSTS
esclaves actuellement enregistré auprès du maître. (Maître)
Fournit les informations essentielles sur le statut de
SHOW SLAVE STATUS
l'esclave. (Esclave)
Uniquement disponible depuis la version 3.23.28. Liste les
logs binaires sur le maître. Vous devriez utiliser cette
SHOW MASTER LOGS
commande avant d'utiliser la commande PURGE MASTER
LOGS TO pour savoir lesquels vous voulez effacer. (Maître)
Affiche les événements dans le log binaire. Initialement
SHOW BINLOG EVENTS [ IN
utilisé pour le test et le débogage dans le log binaire, mais il
'logname' ] [ FROM pos ] [
peut aussi être utilisé par les clients habituels qui, pour une
LIMIT [offset,] rows ]
raison ou une autre, ont besoin de lire le contenu du log
binaire. (Maître)
Cette commande est utilisée lorsque l'esclave d'un maître
probablement mort ou indisponible doit être redirigé vers un
autre maître qui fait la réplication du même maître. La
SHOW NEW MASTER FOR SLAVE
commande va retourner les nouvelles coordonnées de
WITH
réplication (le nom du point de contrôle dans le fichier de log
MASTER_LOG_FILE='logfile'
binaire et son offset). Le résultat de la commande peut être
AND MASTER_LOG_POS=pos AND
utilisé dans un appel à la commande CHANGE MASTER TO .
MASTER_LOG_SEQ=log_seq AND
Les utilisateurs normaux ne doivent jamais exécuter cette
MASTER_SERVER_ID=server_id
commande. Elle est réservée à l'utilisation interne par le
code de réplication sans erreur. Nous risquons de changer
cette syntaxe, si vous trouvons un autre moyen plus intuitif
de faire cette opération.
PURGE MASTER LOGS TO
Disponible depuis la version 3.23.28. Efface tous les logs de
'logname'
réplication qui sont listés dansle fichier d'index de
réplication, comme étant des logs déjà utilisés. Le log qui est
spécifié devient alors log courant. Exemple :
PURGE MASTER LOGS TO 'mysql?bin.010'
 4.10.6 Commandes SQL liées à la réplication
298

Manuel MySQL 4.1.x ? Version Française
Cette commande ne fait rien et échoue avec une erreur si
vous avez un esclave actif qui est actuellement en train de
lire un des fichiers de logs que vous essayez d'effacer.
Cependant, si vous avez un esclave qui dort, et que vous
effacez un des logs qu'il voudra lire plus tard, l'esclave ne
pourra pas effectuer la réplication lorsque son temps
arrivera. La commande est sûre lorsque d'autres esclaves
effectue la réplication : vous n'aurez pas à les arrêter.
Vous devez d'abord vérifier tous les esclaves, avec la
commande SHOW SLAVE STATUS pour voir quels logs ils
utilisent, pour faire une liste des logs sur le maître avec la
commande SHOW MASTER LOGS , trouver le plus vieux log
de tous (si tous les esclaves sont mis à jours