Go to the first, previous, next, last section, table of contents.


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. See section 4.1.2 Fichier d'options `my.cnf'.

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
Utilise la syntaxe ANSI SQL au lieu de la syntaxe MySQL. See section 1.8.2 Exécuter MySQL en mode 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
Dossier contenant les jeux de caractères. See section 4.6.1 Le jeu de caractères utilisé pour les 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_mysqld. See section 4.7.2 safe_mysqld, le script père de mysqld. Notez que sur certains systèmes, comme Solaris, vous n'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. See section D.1.2 Créer un fichier de traçage.
--default-character-set=charset
Spécifie le jeu de caractères par défaut. See section 4.6.1 Le jeu de caractères utilisé pour les données et le stockage.
--default-table-type=type
Spécifie le type de table par défaut. See section 7 Types de tables MySQL.
--delay-key-write[= OFF | ON | ALL]
Comment l'option des tables MyISAM DELAYED KEYS doit être utilisé. See section 5.5.2 Réglage des paramè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 MyISAM. See section 5.5.2 Réglage des 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 d'exploitation assurer la synchronisation avec le disque. See section A.4.1 Que faire si MySQL crashe 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é. See section 4.6.2 Langue des messages d'erreurs.
-l, --log[=file]
Enregistre les connexions et les requêtes dans ce fichier. See section 4.9.2 Le log général de requêtes.
--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. See section 4.9.5 Le log des requêtes lentes.
--log-update[=file]
Enregistre les modifications dans le fichier file.## est un nombre unique si il n'est pas précisé. See section 4.9.3 Le log de modification.
--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é dans plus d'un thread. See section 5.3.2 Problème de 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.
BACKUP Si la table a été modifiée durant la réparation, sauver une copie du fichier `table_name.MYD', sous le nom de `table_name-datetime.BAK'.
FORCE Exécute une réparation même si nous allons perdre une ou plusieurs 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
Utilise le protocole 3.20, pour la compatibilité avec de très vieux clients. See section 2.5.6 Passer de la version 3.20 à la version 3.21.
--one-thread
Utilise uniquement un thread (pour débogage sous Linux). See section D.1 Déboguer un serveur 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. See section 4.5.6.4 Syntaxe de 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. See section 5.5.2 Réglage 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. 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. See section 5.5.6 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. See section 4.3.1 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 mysql.user 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. See section 5.5.2 Réglage 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, mais interroger le serveur DNS à chaque connexion. See section 5.5.5 Comment MySQL utilise le 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 myisamchk vous devez alors éteindre le système. See section 1.2.3 Jusqu'à quel point MySQL est il stable ?. Notez 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 localhost. See section 5.5.5 Comment MySQL utilise le 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. See section 5.5.5 Comment MySQL utilise le 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. See section D.1 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 /tmp/mysql.sock.
--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. See section 1.8.2 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. See section 6.7.3 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'. See section A.2.9 Erreurs de communication / Connexion annulée.

Il est possible de modifier la plupart des valeurs durant l'exécution, avec la commande SET command. See section 5.5.6 Syntaxe de SET.

4.1.2 Fichier d'options `my.cnf'

MySQL peut, 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
/etc/my.cnf Options globales
DATADIR/my.cnf Options spécifiques au serveur
defaults-extra-file Le fichier spécifié par --defaults-extra-file=#
~/.my.cnf 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\my.ini Options globales
C:\my.cnf 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. See section E Variables d'environnement.

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]
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
socket=/tmp/mysql.sock

[mysqld]
port=3306
socket=/tmp/mysql.sock
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-xxxx.cnf' 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-xxxx.cnf' dans votre dossier utilisateur (renommez le fichier en `.my.cnf') pour le tester.

Tous les clients MySQL qui supportent les fichiers d'options, acceptent les options suivantes :

Option Description
--no-defaults Ne lire aucun fichier d'options.
--print-defaults Affiche le nom du programme et toutes les options qui s'y trouvent.
--defaults-file=full-path-to-default-file Utilise uniquement le fichier de configuraiton donné.
--defaults-extra-file=full-path-to-default-file Lit ce fichier de configuration après le fichier de configuration global, mais avant le fichier de configuration utilisateur.

Notez que 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
--socket=/tmp/mysql.sock
--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-new.sock
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 mysqld. See section E Variables d'environnement.

La méthode ci-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.

Si vous avez besoin d'une méthode plus permanente, il est recommandé de créer un fichier d'options pour chaque serveur. See section 4.1.2 Fichier d'options `my.cnf'. 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 :

Les options suivantes doivent être différentes, si elles sont utilisées :

Si vous voulez plus de performances, vous pouvez aussi configurer différemment les options suivantes :

See section 4.1.1 Options de 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.

See section 4.1.4 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. See section 4.7.3 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

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.

Lorsque 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 :

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 :

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 ssh sur le site http://www.openssh.org/, et une version commerciale du client ssh sur le site de http://www.ssh.com/. Avec eux, vous pouvez mettre en place une connexion TCP/IP chiffrée entre le serveur et le client MySQL.

Si vous utilisez MySQL 4.0, vous pouvez aussi utiliser le support OpenSSL interne. See section 4.3.9 Utilisation des connexions sécurisées.

Pour rendre le système MySQL encore plus sûr, nous vous recommandons de suivre les suggestions suivantes :

4.2.3 Options de démarrage qui concernent la sécurité

Les options suivantes de mysqld affectent la sécurité :

--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. See section 4.3.1 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 mysql.user. 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 mysql.user TO 'user'@'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 :

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. See section 8.4.3.39 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 office.com n'est pas forcément la même personne que joe qui se connecte depuis elsewhere.com. 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 office.com, et un autre jeu de droits lorsqu'il se connecte depuis elsewhere.com.

Le contrôle d'accès de MySQL se fait en deux étapes :

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 'thomas.loc.gov' et 'bob' servira à identifier les connexions qui sont faites par l'utilisateur bob depuis l'hôte thomas.loc.gov. De même, une ligne dans la table db avec les valeurs des colonnes Host, User et Db de 'thomas.loc.gov', 'bob' et 'reports' sera utilisée lorsque l'utilisateur bob se connecte depuis l'hôte thomas.loc.gov 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 à 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 complète de l'utilisateur. Les règles utilisées sont décrites dans section 4.2.10 Contrôle d'accès, étape 2 : Vérification de la requête.

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 de la table Nom du champs Valeurs possibles
tables_priv Table_priv 'Select', 'Insert', 'Update', 'Delete', '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 :

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'administration.

Le 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 modifications dans les tables, elles prennent effet tel qu'indiqué dans section 4.3.3 Quand les modifications de privilèges prennent-ils effets ?.

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 section 4.2.11 Causes des erreurs Access denied. Pour des conseils sur les aspects sécurité, voyez section 4.2.2 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 ces tables au démarrage, et dans les circonstances indiquées dans la section section 4.3.3 Quand les modifications de privilèges prennent-ils effets ?.

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
CREATE Create_priv bases de données, tables ou index
DROP Drop_priv bases de données ou tables
GRANT Grant_priv bases de données ou tables
REFERENCES References_priv bases de données ou 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 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 table.

Le 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 reload, refresh, flush-privileges, flush-hosts, flush-logs 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, 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. See section 4.5.5 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 :

Il y a des choses qui ne sont pas possibles avec le système de droits de MySQL :

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 auxww. See section 4.1.2 Fichier d'options `my.cnf'.

mysql utilise des valeurs par défaut pour chacun des paramètes qui manquent en ligne de commande :

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 :

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 :

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 correspond.

Les valeurs de la table user peuvent être paramétrées comme ceci :

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! A partir de sa version 4.1, MySQL utilise un mécanisme différent pour les logins, mots de passes qui est sécurisé même si les paquets TCP/IP sont sniffés et/ou que la base de données mysql est capturée.

Les exemples ci-dessous illustrent comment différentes variantes de Host et User dans la table user s'appliquent aux connexion entrantes :

Host value User value Connexions autorisées
'thomas.loc.gov' 'fred' fred, se connectant depuis thomas.loc.gov
'thomas.loc.gov' '' N'importe quel utilisateur, se connectant depuis thomas.loc.gov
'%' 'fred' fred, se connectant depuis n'importe quel hôte
'%' '' N'importe quel utilisateur, se connectant depuis n'importe quel hôte
'%.loc.gov' 'fred' fred, se connectant depuis n'importe quel hôte dans le domaine loc.gov
'x.y.%' 'fred' fred, se connectant depuis x.y.net, x.y.com,x.y.edu, etc. (Ceci n'est probablement pas très utilisé)
'144.155.166.177' 'fred' fred, se connectant depuis l'hôte d'IP 144.155.166.177
'144.155.166.%' 'fred' fred, se connectant depuis un hôte d'IP dans la classe C 144.155.166
'144.155.166.0/255.255.255.0' 'fred' Identique à l'exemple précédent

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 144.155.166.kekpart.com. 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 1.2.foo.com, 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 thomas.loc.gov 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  | ...
| thomas.loc.gov |          | ...
+----------------+----------+-

La table triée ressemble à ceci :

+----------------+----------+-
| Host           | User     | ...
+----------------+----------+-
| thomas.loc.gov |          | ...
| %              | jeffrey  | ...
+----------------+----------+-

Une connexion depuis l'hôte thomas.loc.gov avec jeffrey satisfait les conditions de la première ligne, tandis qu'une connexion depuis whitehouse.gov avec jeffrey satisfait la seconde ligne.

Une 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 thomas.loc.gov 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'utilisateur.

Si 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.

Si la connexion s'est bien passée, mais que vos privilèges vous semblent faux, utilisez la fonction CURRENT_USER() (ajoutée en version 4.0.6) pour voir quel combinaison d'utilisateur/hôte votre connexion a utilisé. See section 6.3.6.2 Fonctions diverses.

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. See section 4.3.1 Syntaxe de GRANT et REVOKE. (Vous pouvez aussi vous reporter à la section section 4.2.6 Comment fonctionne le système de droits qui liste les champs présents dans chaque 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 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 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 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 jokers.

Le 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 :

  1. 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.
  2. 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.
  3. 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 :

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 | ...
+--------------------+----+-
| public.your.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 :

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 {nom_de_table | * | *.* | nom_base.*}
    TO nom_utilisateur [IDENTIFIED BY [PASSWORD] 'password']
        [, nom_utilisateur [IDENTIFIED BY 'password'] ...]
    [REQUIRE
        NONE |
    	[{SSL| X509}]
	[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 {nom_de_table | * | *.* | nom_base.*}
    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 rien.

Les 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 mysql.user. REVOKE ALL ON *.* retirera seulement les privilèges globaux.
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 mysql.db et mysql.host. REVOKE ALL ON db.* retirera seulement les privilèges de base de données.
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. REVOKE ALL ON db.table retirera seulement les privilèges de table.
Niveau 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. Quand vous utilisez REVOKE vous devez spécifier les mêmes colonnes qui s'étaient vues accorder des privilèges.

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 GRANT, voyez section 4.3.5 Ajouter de nouveaux utilisateurs à MySQL.

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 TABLES Autorise l'utilisation de CREATE TEMPORARY TABLE.
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).
FILE Autorise l'utilisation de SELECT ... INTO OUTFILE et LOAD DATA INFILE.
INDEX Autorise l'utilisation de CREATE INDEX et DROP INDEX.
INSERT Autorise l'utilisation de INSERT.
LOCK TABLES Autorise l'utilisation de LOCK TABLES sur les tables pour lesquelles 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 CLIENT Donne le droit à l'utilisateur de savoir où sont les maîtres et esclaves.
REPLICATION SLAVE Nécessaire pour les esclaves de réplication (pour lire les historiques 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.
SUPER Autorise une connexion unique même si max_connections est atteind, et 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''.
GRANT OPTION Synonyme pour WITH GRANT OPTION

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 OPTION, INDEX et ALTER.

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 user@host. 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, user@'%.loc.gov' fait correspondre l'utilisateur user de n'importe quel hôte du domaine loc.gov, et user@'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 user@"%".

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 mysql.user, 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 user@localhost car sinon, la ligne dans la table mysql.user 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 mysql.user 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 mysql.user 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

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 vérification des droits et disponible dans section 4.2 Règles de sécurité et droits d'accès au serveur MySQL.

Si vous donnez des droits à une paire utilisateur/hôte qui n'existe pas dans la table mysql.user, 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. See section 5.5.6 Syntaxe de SET.

Si vous donnez les droits de base, une ligne sera ajoutée dans la table mysql.db. 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. See section 4.3.6 Limiter les ressources utilisateurs. Note: pour spécifier l'une de ces options pour un utilisateur existant sans ajouter d'autres privilèges additionels, utilisez GRANT USAGE ... WITH MAX_....

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.

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. See section 4.3.3 Quand les modifications de privilèges prennent-ils effets ?.

Les différences notables entre l'ANSI SQL et MySQL pour la commande GRANT sont :

Pour une description de l'utilisation de REQUIRE, voyez section 4.3.9 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 utilisateurs MySQL et leurs droits sont généralement créés par la commande GRANT. See section 4.3.1 Syntaxe de 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-passe. See section 4.2.8 Se connecter au serveur 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 :

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_db. See section 2.3.1 Vue d'ensemble de l'installation rapide. Le script mysql_install_db démarre le serveur mysqld et initialise les tables de droits, avec les paramètres suivants :

Note : les droits par défaut sont différents sous Unix. See section 2.6.2.3 Faire fonctionner MySQL sous Windows.

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@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.

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 GRANT, car elle est plus concise et qu'il y a moins de risques d'erreur. See section 4.3.1 Syntaxe de GRANT 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.

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@localhost
    ->     IDENTIFIED BY 'un_mot_de_passe' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"
    ->     IDENTIFIED BY 'un_mot_de_passe' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO dummy@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 monty@localhost et monty@"%". 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 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 whitehouse.gov. Il ne pourra accéder à la base de données bankaccount qu'à partir de localhost, à la base expenses qu'à partir de whitehouse.gov, 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@localhost
    ->     IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ->     ON expenses.*
    ->     TO custom@whitehouse.gov
    ->     IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ->     ON customer.*
    ->     TO custom@'%'
    ->     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 'whitehouse.gov' 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'));
mysql> INSERT INTO user (Host,User,Password)
    -> VALUES('server.domain','custom',PASSWORD('stupid'));
mysql> INSERT INTO user (Host,User,Password)
    -> VALUES('whitehouse.gov','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
    -> ('whitehouse.gov','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@"%.mondomaine.com"
    ->     IDENTIFIED BY 'monmotdepasse';

Pour faire la même chose en modifiant directement la table de droits, faites :

mysql> INSERT INTO user VALUES ('%.mondomaine.com', 'monutilisateur',
    ->             PASSWORD('monmotdepasse'),...);
mysql> FLUSH PRIVILEGES;

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.

Par conséquent, un système de gestion des ressources a été introduit, au niveau des utilisateurs :

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 mysql_install_db.sh, 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 leur mot de passe. Les explications suivantes s'adressent donc aux utilisateurs avancés. See section 4.3.1 Syntaxe 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');
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@"%" = 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@"%" 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. See section 4.3.2 Nom 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 :

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 `.my.cnf'.

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 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 :

  1. Installation de la librairie d'OpenSSL. Nous avons testé MySQL avec OpenSSL 0.9.6. http://www.openssl.org/.
  2. Configuration de MySQL avec les options --with-vio --with-openssl.
  3. Si vous utilisez une ancienne version de MySQL, vous devez modifier votre table mysql.user, en lui ajoutant les colonnes reliées aux notions SSL. Vous pouvez faire cela en exécutant le script mysql_fix_privilege_tables.sh. Ceci est nécessaire si vos tables de droits proviennent d'un version de MySQL antérieure à la version 4.0.0.
  4. 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 Configurer les certificats SSL pour MySQL

Voici un exemple de configuration de certificats SSL pour MySQL :

DIR=`pwd`/openssl
PRIV=$DIR/private

mkdir $DIR $PRIV $DIR/newcerts
cp /usr/share/ssl/openssl.cnf $DIR
replace ./demoCA $DIR -- $DIR/openssl.cnf

# Créez les dossiers nécessaires : $database, $serial et $new_certs_dir 
# optionnel

touch $DIR/index.txt
echo "01" > $DIR/serial

#
# Génération du cerificat d'autorité (CA)
#

openssl req -new -x509 -keyout $PRIV/cakey.pem -out $DIR/cacert.pem \
    -config $DIR/openssl.cnf

# Exemple de résultat :
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# ................++++++
# .........++++++
# writing new private key to '/home/monty/openssl/private/cakey.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be incorporated
# into your certificate request.
# What you are about to enter is what is called a Distinguished Name or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL admin
# Email Address []:

#
# Création des clé et requêtes serveur
#
openssl req -new -keyout $DIR/server-key.pem -out \
    $DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf

# Exemple de résultat :
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# ..++++++
# ..........++++++
# writing new private key to '/home/monty/openssl/server-key.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be incorporated
# into your certificate request.
# What you are about to enter is what is called a Distinguished Name or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL server
# Email Address []:
# 
# Please enter the following 'extra' attributes
# to be sent with your certificate request
# A challenge password []:
# An optional company name []:

#
# Supprimez la passe-phrase de la clé (optionnel)
#

openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem

#
# Signez le certificat serveur
#
openssl ca  -policy policy_anything -out $DIR/server-cert.pem \
    -config $DIR/openssl.cnf -infiles $DIR/server-req.pem

# Exemple de résultat :
# Using configuration from /home/monty/openssl/openssl.cnf
# Enter PEM pass phrase:
# Check that the request matches the signature
# Signature ok
# The Subjects Distinguished Name is as follows
# countryName           :PRINTABLE:'FI'
# organizationName      :PRINTABLE:'MySQL AB'
# commonName            :PRINTABLE:'MySQL admin'
# Certificate is to be certified until Sep 13 14:22:46 2003 GMT (365 days)
# Sign the certificate? [y/n]:y
# 
# 
# 1 out of 1 certificate requests certified, commit? [y/n]y
# Write out database with 1 new entries
# Data Base Updated

#
# Créez les clé et requêtes client
#
openssl req -new -keyout $DIR/client-key.pem -out \
    $DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf

# Exemple de résultat :
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# .....................................++++++
# .............................................++++++
# writing new private key to '/home/monty/openssl/client-key.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be incorporated
# into your certificate request.
# What you are about to enter is what is called a Distinguished Name or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL user
# Email Address []:
# 
# Please enter the following 'extra' attributes
# to be sent with your certificate request
# A challenge password []:
# An optional company name []:

#
# Supprimez la passe-phrase de la clé (optionnel)
#
openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem

#
# Signez le cerficat client
#

openssl ca  -policy policy_anything -out $DIR/client-cert.pem \
    -config $DIR/openssl.cnf -infiles $DIR/client-req.pem

# Exemple de résultat :
# Using configuration from /home/monty/openssl/openssl.cnf
# Enter PEM pass phrase:
# Check that the request matches the signature
# Signature ok
# The Subjects Distinguished Name is as follows
# countryName           :PRINTABLE:'FI'
# organizationName      :PRINTABLE:'MySQL AB'
# commonName            :PRINTABLE:'MySQL user'
# Certificate is to be certified until Sep 13 16:45:17 2003 GMT (365 days)
# Sign the certificate? [y/n]:y
# 
# 
# 1 out of 1 certificate requests certified, commit? [y/n]y
# Write out database with 1 new entries
# Data Base Updated

#
# Créez le fichier my.cnf que vous pourrez utiliser pour tester les différents certificats
#

cnf=""
cnf="$cnf [client]"
cnf="$cnf ssl-ca=$DIR/cacert.pem"
cnf="$cnf ssl-cert=$DIR/client-cert.pem"
cnf="$cnf ssl-key=$DIR/client-key.pem"
cnf="$cnf [mysqld]"
cnf="$cnf ssl-ca=$DIR/cacert.pem"
cnf="$cnf ssl-cert=$DIR/server-cert.pem"
cnf="$cnf ssl-key=$DIR/server-key.pem"
echo $cnf | replace " " '
' > $DIR/my.cnf

#
# To test MySQL

mysqld --defaults-file=$DIR/my.cnf &

mysql --defaults-file=$DIR/my.cnf

Vous pouvez aussi tester votre configuration en modificant le fichier `my.cnf' ci-dessuss pour le faire pointer sur les certificats de démonstration dans le dossier mysql-source-distribution/SSL.

4.3.9.4 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 :

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 TABLES pour celles-ci. See section 6.7.2 Syntaxe de LOCK TABLES/UNLOCK TABLES. See section 4.5.3 Syntaxe de FLUSH. Vous n'avez besoin que d'un verrou en lecture; cela permet aux 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. See section 6.4.1 Syntaxe de SELECT. See section 4.4.2 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. See section 4.8.5 mysqldump, exporter les structures de tables et les données. See section 4.8.6 mysqlhotcopy, copier les bases et tables MySQL.

  1. Effectuez une sauvegarde complète de votre base de données :
    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.
  2. Arrêtez mysqld si il est en marche, puis démarrez le avec l'option --log-update[=nom_fichier]. See section 4.9.3 Le log de modification. Le ou les fichiers de log 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, see section 4.9.3 Le log de modification) :

  1. Restorez le backup original de mysqldump.
  2. 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. See section 4.10.1 Introduction à la réplication.

Si vous utilisez un système de fichiers Veritas , vous pourrez faire :

  1. A partir d'un client (ou de Perl), exécutez : FLUSH TABLES WITH READ LOCK.
  2. A partir d'un autre shell, exécutez : mount vxfs snapshot.
  3. Depuis le premier client, exécutez : UNLOCK TABLES.
  4. Copiez les fichiers à partir de snapshot.
  5. 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.

Avant d'utiliser cette commande, merci de lire section 4.4.1 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 table.

Par 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.
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 checked, il vous faudra exécuter une réparation de la table. See section 4.4.6 Utilisation de myisamchk pour la maintenance des tables et leur recouvrement. 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.
CHANGED Ne vérifie que les tables qui ont changées depuis la dernière vérification, ou bien qui n'ont pas été correctement fermées.
MEDIUM Analyse les lignes pour s'assurer que les liens effacés sont corrects. Cette option calcule aussi la somme de contrôle des lignes, et la vérifie avec la somme de contrôle des clés.
EXTENDED Fait une vérification complète des liens pour chaque ligne. Cela vérifie que la table est 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.

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 :

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 corrompues, vous devrie toutefois rechercher la cause de ce problème! See section A.4.1 Que faire si MySQL crashe constamment ?. See section 7.1.3 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 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 TABLE. See section 4.4.4 Syntaxe de CHECK TABLE. Vous pouvez les réparer avec la commande REPAIR TABLE. See section 4.4.5 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. See section 7 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. See section 4.5.1 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.

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
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 : 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. 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 (table_name.TMD) 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 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.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 :

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.

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 ! See section A.4.1 Que faire si MySQL crashe constamment ?.

La section sur les tables MyISAM contient différentes raisons pour lesquelles une table peut être corrompue. See section 7.1.3 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
`tbl_name.frm' Définition de la table
`tbl_name.MYD' Fichier de données
`tbl_name.MYI' 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 `.MYD' 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
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. See section 4.4.5 Syntaxe de REPAIR TABLE.

Les symptômes de corruption de tables sont des requêtes qui s'interrompent inopinément :

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 MyISAM. See section 4.4.4 Syntaxe de CHECK TABLE. See section 4.4.5 Syntaxe de REPAIR TABLE.

La section du manuel sur l'entretien des tables inclut la présentation des options des utilitaires isamchk/myisamchk. See section 4.4.6 Utilisation de myisamchk pour la maintenance des tables et leur recouvrement.

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.

Si vous allez réparer une table en ligne de commande, il est recommandé d'arrêter le serveur mysqld. Notez que lorsque 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 :

  1. Faites une copie de sauvegarde de votre fichier de données.
  2. 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.
  3. 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 :

  1. Déplacez le fichier de données dans une archive sûre.
  2. 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
    
    Si votre version SQL ne dispose pas de TRUNCATE TABLE, utilisez la commande DELETE FROM table_name.
  3. 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.

  1. 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.
  2. 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. See section 4.5.1 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 :

Pour une description complète de ces options, See section 4.4.6.1 Syntaxe de l'utilitaire 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. See section 4.4.4 Syntaxe de CHECK TABLE. Vous pouvez aussi réparer les tables avec la commande REPAIR TABLE. See section 4.4.5 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.

Exemple d'affichage résultant de myisamchk -d :

MyISAM file:     company.MYI
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
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
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 company.MYD
-rw-rw-r--   1 davida   tcx      96482304 Jan 12 18:35 company.MYM

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 :

Si une table a été compressée avec myisampack, myisamchk -d affiche des informations supplémentaires à propos de chaque colonne. Voir section 4.7.4 myisampack, le générateur de tables MySQL compressées en lecture seule, pour un exemple de ces informations, et une description de leur 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ées.

Pour 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 ANALYZE TABLE. See section 4.5.2 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 :

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 INDEX. See section 4.5.6.1 Obtenir des informations sur les bases, tables, colonnes et 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.

flush_option peut être l'une des suivantes :

Option Description
HOSTS 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 hôte, lors des connexions au serveur MySQL, MySQL suppose qu'il y a un problème, et interdit l'accès à l'hôte. See section A.2.4 Host '...' is blocked Error. Vous pouvez démarrer mysqld avec -O max_connect_errors=999999999 pour éviter ce message.
DES_KEY_FILE Recharge les clés DES depuis le fichier de stockage spécifié par --des-key-file lors du démarrage du serveur.
LOGS 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é d'une unité. Si vous avez utilisé une extension dans le nom du fichier, MySQL va fermer et réouvrir le même fichier. See section 4.9.3 Le log de modification. 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.
QUERY CACHE Défragmente le cache des requêtes pour mieux en utiliser la mémoire. Cette commande n'effacera aucune requête du cache, à la différence de RESET QUERY CACHE.
TABLES Ferme toutes les tables ouvertes, et force les tables utilisées à se refermer. Cela vide aussi le cache de requêtes.
[TABLE | TABLES] nom_de_table [,nom_de_table...] Vide du cache uniquement les tables nommées.
TABLES WITH READ LOCK Ferme toutes les tables ouvertes, et verrouille en lecture toute les tables et bases, jusqu'à ce que vous exécutiez une commande 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.
STATUS Remet la plupart des variables de statut à zéro. A n'utiliser que pour corriger une requête.
USER_RESOURCES Remet toutes les ressources à zéro. Cela va autoriser de nouveau les utilisateurs qui ont été bloqués. See section 4.3.6 Limiter les ressources utilisateurs.

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. See section 4.5.4 Syntaxe de la commande 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. See section 4.5.3 Syntaxe de FLUSH.

Pour exécuter la commande RESET, vous devez avoir les droits RELOAD.

Option Description
MASTER Efface tous les logs binaires listés dans le fichier d'index, et l'index binlog est vidé. Dans les version antérieures à la version 3.23.26, cette commande s'appelait FLUSH MASTER (Master)
SLAVE Annule la position de réplication de l'esclave dans les historiques du maître. Dans les version antérieures à la version 3.23.26, cette commande s'appelait FLUSH SLAVE(Slave)
QUERY CACHE Supprime tous les résultats de requêtes du cache de requête.

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.

Note: Vous ne pouvez actuellement pas utiliser KILL avec la librairie du serveur embarqué, car celui-ci utilise les threads de l'application hôte, il ne crée pas ses propres 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.

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]
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 utilisateur
ou SHOW CREATE TABLE nom_de_table
ou SHOW MASTER STATUS
ou SHOW MASTER LOGS
ou SHOW SLAVE STATUS
ou SHOW WARNINGS [LIMIT #]
ou SHOW ERRORS [LIMIT #]
ou SHOW TABLE TYPES

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. See section 5.4.7 Quand 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. See section 6.5.3.1 Modification automatique du type de colonnes.

La requête DESCRIBE fournit des informations similaires à SHOW COLUMNS. See section 6.6.2 Syntaxe de DESCRIBE (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 :

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.
Collation Comment la colonne est placée dans l'index. Avec MySQL, les valeurs peuvent être `A' (Ascending) ou NULL (Non trié).
Cardinality Nombre de valeurs uniques dans l'index. Ceci est mis à jour en exécutant la commande isamchk -a.
Sub_part Numbre de caractères indexés si la colonne est partiellement indexée. NULL 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.
Comment Différentes remarques. Actuellement, il indique si l'index est FULLTEXT ou non (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. See section 7 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.
Comment Le commentaire utilisé lors de la création de la table (ou des informations sur pourquoi MySQL n'a pu accéder aux informations de la table).

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          |
| Uptime                   | 80380      |
+--------------------------+------------+

Les variables de statut listées ci-dessus ont la signification suivante :

Variable Signification
Aborted_clients Nombre de connexions annulées parce que le client est mort sans se déconnecter correctement. See section A.2.9 Erreurs de communication / Connexion annulée.
Aborted_connects Nombre de tentatives de connexions au serveur MySQL qui ont échouées. See section A.2.9 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.
Created_tmp_disk_tables Nombre de tables temporaires implicites créées sur le disque lors d'exécutions de commandes.
Created_tmp_tables Nombre de tables temporaires implicites créées en mémoire lors d'exécutions de commandes.
Created_tmp_files Combien de fichiers temporaires mysqld a créé.
Delayed_insert_threads Nombre de gestionnaires d'insertion retardées sont en cours d'utilisation.
Delayed_writes Nombre de lignes écrites avec INSERT DELAYED.
Delayed_errors Nombre de lignes écrites avec INSERT DELAYED pour lesquelles 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.
Handler_read_first 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 recherches par analyse complète de la table, par exemple SELECT col1 FROM foo, en supposant que col1 est indexé.
Handler_read_key Nombre de requête de lecture de ligne basées sur une clé. Si ce chiffre est grand, c'est une bonne indication de l'indexation correcte de vos tables.
Handler_read_next Nombre de requête de lecture de la ligne suivante en ordre. Cela sera augmenté si vous listez une colonne avec une contrainte d'intervalle. Cette valeur sera aussi incrémentée si vous effectuez un scan d'index.
Handler_read_prev Nombre de requête de lecture de la clé précédente, dans l'ordre. C'est souvent utilisé pour optimiser les clauses ORDER BY ... DESC.
Handler_read_rnd Nombre de lecture d'une ligne basée sur une position fixe. Ce 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 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é.
Key_read_requests The Nombre de requêtes de lecture d'un bloc de clé dans le 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.
Not_flushed_key_blocks Nombre de blocs de clés dans le cache de clés, qui ont été modifiées, mais pas encore écrites sur le disque.
Not_flushed_delayed_rows Nombre de lignes en attente d'écriture dans les listes INSERT 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.
Rpl_status Statut de la réplication sans erreur (réservé pour utilisation ultérieure).
Select_full_join Nombre de jointures sans clé (si cette variable vaut 0, vous 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.
Select_range Nombre de jointures où une rercherche d'intervalle a été utilisée sur la première table. (Ce n'est généralement pas important, même si cette valeur est importante).
Select_scan Nombre de jointures où la première table a été totalement scannée.
Select_range_check Nombre de jointures sans clé, où l'utilisation de clé a été vérifiée 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.
Slave_open_temp_tables Nombre de tables temporaires actuellement utilisée par le thread esclave.
Slave_running Cette variable vaut ON si ce serveur est un esclave connecté au maître.
Slow_launch_threads Nombre de threads qui ont pris plus de slow_launch_time secondes pour être créés.
Slow_queries Nombre de requêtes qui ont pris plus de long_query_time pour s'exécuter. See section 4.9.5 Le log des requêtes lentes.
Sort_merge_passes Nombre de passes que l'algorithme de tri a du faire. Si cette 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.
Table_locks_immediate Nombre de fois que la table a reçu immédiatement un verrou. Disponible depuis 3.23.33.
Table_locks_waited 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, 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 :

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é. See section 4.1.1 Options de 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. See section 5.5.6 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                      |                              |
| 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                          |
| 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                        | /usr/local/mysql/name.pid    |
| 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                          | /tmp/mysql.sock              |
| 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 :

La section du manuel qui est consacrée à l'optimisation de MySQL contient des informations sur l'utilisation des variables ci-dessus. See section 5.5.2 Réglage 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.

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. See section 4.5.5 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

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@localhost;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'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. section 5.5.6 Syntaxe de SET.

4.5.6.9 SHOW WARNINGS | ERRORS

SHOW WARNINGS [LIMIT #]
SHOW ERRORS [LIMIT #]

Cette commande est implementée en MySQL 4.1.0.

Cette commande affiche les erreurs, alertes et notes qui ont été générées par la dernière commande. Les erreurs et alertes sont remises à zéro pour chaque nouvelle commande qui utilisent une table.

Le serveur MySQL retourne le nombre total d'alertes et d'erreurs que vous avez obtenu lors de la dernière commande. Ils sont disponibles avec la fonction mysql_warning_count().

Jusqu'à max_error_count messages peuvent être stockés (variable globale et spécique aux threads).

Vous povez lire le nombre d'erreurs dans @error_count et le nombre d'alertes dans @warning_count.

SHOW WARNINGS affiche aussi toutes les erreurs, alertes et notes de la dernière commande, alors que SHOW ERRORS ne montre que les erreurs.

mysql> DROP TABLE IF EXISTS no_such_table;
mysql> SHOW WARNINGS;

+-------+------+-------------------------------+
| Level | Code | Message                       |
+-------+------+-------------------------------+
| Note  | 1051 | Unknown table 'no_such_table' |
+-------+------+-------------------------------+

4.5.6.10 SHOW TABLE TYPES

SHOW TABLE TYPES

Cette commande est implementée en MySQL 4.1.0.

SHOW TABLE TYPES affiche les informations de statut concernant les types de tables. Ceci est particulièrement utilise pour vérifier si un type de table est supporté, ou pour savoir quel est le type de table par défaut.

mysql> SHOW TABLE TYPES;

+--------+---------+-----------------------------------------------------------+
| Type   | Support | Comment                                                   |
+--------+---------+-----------------------------------------------------------+
| MyISAM | DEFAULT | Type par défaut depuis 3.23, à hautes performances        |
| HEAP   | YES     | Basé sur des hashs, stockés en mémoire, temporaires       |
| MERGE  | YES     | Collection de tables MyISAM identiques                    |
| ISAM   | YES     | Type de table obsolète. Remplacé par MyISAM               |
| InnoDB | YES     | Supporte les transactions, le verrouillage de ligne, et   |
|        |         | les clés étrangères.                                      |
| BDB    | NO      | Supporte les transactions et le verrouillage de pages     |
+--------+---------+-----------------------------------------------------------+
6 rows in set (0.00 sec)

L'option 'Support' DEFAULT indique si ce type de table est supporté, et dans ce cas, c'est le type par défaut. Si le serveur est démarré avec l'option --default-table-type=InnoDB, alors le support InnoDB contiendra la valeur DEFAULT.

4.5.6.11 SHOW PRIVILEGES

SHOW PRIVILEGES

Cette commande est implementée en MySQL 4.1.0.

SHOW PRIVILEGES affiche la liste des droits que le serveur MySQL supporte.

mysql> show privileges;
+------------+--------------------------+-------------------------------------------------------+
| Privilege  | Context                  | Comment                                               |
+------------+--------------------------+-------------------------------------------------------+
| Select     | Tables                   | Lire des lignes d'une table                           |
| Insert     | Tables                   | Insérer des lignes dans une table                     |
| Update     | Tables                   | Modifier les lignes existantes                        |
| Delete     | Tables                   | Effacer des lignes existantes                         |
| Index      | Tables                   | Créer ou effacer des indexs                           |
| Alter      | Tables                   | Modifier la structure d'une table                     |
| Create     | Databases,Tables,Indexes | Créer une nouvelle base ou table                      |
| Drop       | Databases,Tables         | Effacer une base ou table                             |
| Grant      | Databases,Tables         | Donner à d'autres les droits courants                 |
| References | Databases,Tables         | Avoir des références sur les tables                   |
| Reload     | Server Admin             | Rafraîchir les droits, tables et logs                 |
| Shutdown   | Server Admin             | Eteindre le serveurver                                |
| Process    | Server Admin             | Voir la version texte des requêtes en cours           |
| File       | File access on server    | Lire et écrire des fichiers sur le serveur            |
+------------+--------------------------+-------------------------------------------------------+
14 rows in set (0.00 sec)

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.

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'. See section 2.3.3 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.

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.

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 minuscule.

Les fichiers de langue sont situés (par défaut) dans `mysql_base_dir/share/LANGUAGE/'.

Pour modifier le fichier de messages d'erreurs, vous devez éditer le fichier `errmsg.txt' et exécuter la commande suivante pour générer le fichier `errmsg.sys' :

shell> comp_err errmsg.txt errmsg.sys

Si vous changez de version de MySQL, pensez à modifier le nouveau fichier `errmsg.txt'.

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 :

  1. Ajoutez MONJEU à la fin du fichier `sql/share/charsets/Index' Assignez-lui un nombre unique.
  2. Créez le fichier `sql/share/charsets/MONJEU.conf'. (Vous pouvez vous inspirer de `sql/share/charsets/latin1.conf'.) La syntaxe pour le fichier est très simple : See section 4.6.4 Le tableau de définition des caractères.
  3. Ajoutez le nom du jeu de caractères aux listes CHARSETS_AVAILABLE et COMPILED_CHARSETS dans configure.in.
  4. Reconfigurez, recompilez et testez.

Pour un jeu de caractères complexe faites ce qui suit :

  1. Créez le fichier `strings/ctype-MONJEU.c' dans la distribution des sources MySQL.
  2. Ajoutez MONJEU à la fin du fichier `sql/share/charsets/Index'. Assignez-lui un nombre unique.
  3. 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 dans les jeux de caractères simples. See section 4.6.4 Le tableau de définition des caractères. Pour un jeu de caractère complexe
  4. 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.
  5. Vous devez alors créer les fonctions suivantes : See section 4.6.5 Support d'assemblage des chaînes.
  6. Ajoutez le nom du jeu de caractères aux listes CHARSETS_AVAILABLE et COMPILED_CHARSETS dans configure.in.
  7. Reconfigurez, recompilez et testez.

Le fichier `sql/share/charsets/README' fournit plus d'instructions.

Si vous voulez qu'un jeu de caractères soit ajouté dans la distribution MySQL, envoyez un patch à internals@lists.mysql.com.

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'

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. See section 4.6.5 Support d'assemblage des 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.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 :

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. section 4.1.2 Fichier d'options `my.cnf'.

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. See section 4 Administration du serveur.
make_binary_distribution
Prépare une version exécutable d'un MySQL compilé. Il doivent être envoyés par FTP à `/pub/mysql/Incoming' sur support.mysql.com 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.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 `my.cnf'. safe_mysqld va lire toutes les options des sections [mysqld], [server] et [safe_mysqld], dans le fichier d'options. See section 4.1.2 Fichier d'options `my.cnf'.

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 mysqld. See section 4.1.1 Options de ligne de 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=#

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 :

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 `my.cnf' (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]. Voyez, par exemple, section 2.4.3 Lancer et arrêter MySQL automatiquement.. 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] {start|stop|report} [GNR,GNR,GNR...]
or     mysqld_multi [OPTIONS] {start|stop|report} [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 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 `my.cnf'.
--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 :

See section 4.1.4 Faire fonctionner plusieurs serveurs MySQL sur la même machine.

Voici un exemple de fichier de configuration fourni par mysqld_multi.

# This file should probably be in your home dir (~/.my.cnf) or /etc/my.cnf
# 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
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

See section 4.1.2 Fichier d'options `my.cnf'.

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 :

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 tbl_name.OLD.
-#, --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é `tbl_name.TMD' 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 `tbl_name.TMD' 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 station.MYD
-rw-rw-r--   1 monty    my          53248 Apr 17 19:00 station.MYI
-rw-rw-r--   1 monty    my           5767 Apr 17 19:00 station.frm

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
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

shell> myisampack station.MYI
Compressing station.MYI: (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 station.MYD
-rw-rw-r--   1 monty    my          55296 Apr 17 19:04 station.MYI
-rw-rw-r--   1 monty    my           5767 Apr 17 19:00 station.frm

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
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 :

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 table_name.MYI
isamchk   -rq --analyze --sort-index table_name.ISM

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 à http://www.mysql.com/downloads/mysql-max-3.23.html.

La distribution Windows de MySQL inclut les deux programmes standard mysqld.exe et mysqld-max.exe. http://www.mysql.com/downloads/mysql-3.23.html. See section 2.1.2 Installer MySQL sous Windows.

Notez que les 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 :

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.
DISABLED L'option xxxx est désactivée car mysqld a été lancé avec --skip-xxxx ou parce que mysqld n'a pas été lancé avec les bonnes options. Dans ce cas, le fichier hostname.err 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. See section 7.5.2 Options de démarrage InnoDB.

Pour avoir de meilleures performances avec les tables BDB, vous devriez aussi ajouter certaines options de configuration. See section 7.6.3 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. See section 4.7.2 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.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. See section 4.2.8 Se connecter 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. See section E Variables d'environnement.

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. section 4.1.2 Fichier d'options `my.cnf'.

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. See section 4.8.3 mysqladmin, 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. See section 4.8.5 mysqldump, exporter les structures de tables et les données.
mysqlimport
Importe les fichiers textes dans les tables, en utilisant la commande LOAD DATA INFILE. See section 4.8.7 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 à é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, l'outil en ligne de commande

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 < script.sql > output.tab

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 `my.cnf'.
--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.
-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
-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 `my.cnf' 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.
select_limit 1000 Limite automatique pour les commandes SELECT avec l'option --i-am-a-dummy
max_join_size 1000000 Limite automatique pour les commandes de jointure avec 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.
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#"

#select_limit# et #max_join_size# sont des variables qui peuvent être configurées depuis mysql. See section 5.5.6 Syntaxe de SET.

L'effet de la commande ci-dessus est :

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@no.spam.com
  mail_to: "Thimble Smith" <tim@no.spam.com>
      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)

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 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
\p port de connexion
\u nom d'utilisateur
\U Identifiant complet username@host
\\ `\'
\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@\h) [\d]> "
`my.cnf'
`.my.cnf'
Vous pouvez configurer l'invite de commandes dans le fichier d'options MySQL. dans le groupe mysql. Par exemple :
[mysql]
prompt=(\u@\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@\h) [\d]> "

(user@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@\h) [\d]>\_
PROMPT set to '(\u@\h) [\d]>\_'
(user@host) [database]> 
(user@host) [database]> prompt
Returning to default PROMPT of mysql> 
mysql> 

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    |       |      |
+----+-------+-----------+----+-------------+------+-------+------+
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.
Slow queries Nombre de requêtes qui ont pris plus de long_query_time secondse. See section 4.9.5 Le log des 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.
Memory in use Mémoire allouée directement par mysqld (uniquement disponible si MySQL a été compilé avec l'option --with-debug=full).
Max memory used Maximum de mémoire allouée directement par mysqld (uniquement disponible si 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

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 n'est fourni, il sera demandé en ligne de commande.
-P, --port=...
Le numéro de port de la connexion.
--protocol=(TCP | SOCKET | PIPE | MEMORY)
Pour spŽcifier le protocole ˆ utiliser pour la connexion. Nouveau en MySQL 4.1.
-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 rapide. Si 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. See section 4.8.6 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.
-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 INFILE. See section 6.4.9 Syntaxe de LOAD DATA 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 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 table_name.sql, qui contient les commandes SQL CREATE, et un fichier table_name.txt, 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é 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 mysqldump est probablement de faire des sauvegardes de bases. See section 4.4.1 Sauvegardes de base de données.

mysqldump --opt database > backup-file.sql

Vous pouvez importer les données dans la base MySQL avec :

mysql database < backup-file.sql

ou

mysql -e "source /patch-to-backup/backup-file.sql" 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 ...] > my_databases.sql

Si vous souhaitez exporter toutes les bases, vous pouvez utiliser :

mysqldump --all-databases > all_databases.sql

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]

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.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. See section 6.4.9 Syntaxe de 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 `patient.txt', `patient.text' 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. See section 6.4.9 Syntaxe de 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. See section 6.4.9 Syntaxe de 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
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 xxx.com 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 imptest.txt
32
q
$ od -c imptest.txt
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 imptest.txt
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. See section 4.5.6 Syntaxe de SHOW.

mysqlshow est utilisé comme ceci :

shell> mysqlshow [OPTIONS] [database [table [column]]]

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 droits.

Si 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 mysql_config lit les options de compilations du client MySQL

mysql_config vous indique des informations pratiques pour compiler votre client MySQL et le connecter au serveur.

mysql_config supporte les options suivantes :

--cflags
Options de compilations utilisées pour trouver les fichiers inclus.
--libs
Les librairies et options requises pour compiler avec la librairie client MySQL.
--socket
Le nom par défaut de la socket, défini lors de la configuration de MySQL.
--port
Le numéro de port par défaut, défini lors de la configuration de MySQL.
--version
Le numéro de version et la version de la distribution MySQL.
--libmysqld-libs
Les librairies et options requises pour compiler avec la librairie intégrée MySQL.

Si vous exécutez mysql_config sans aucune option, il va afficher toutes les options qu'il supporte, ainsi que la valeur de toutes les options :

shell> mysql_config
sage: /usr/local/mysql/bin/mysql_config [OPTIONS]
Options:
        --cflags         [-I'/usr/local/mysql/include/mysql']
        --libs           [-L'/usr/local/mysql/lib/mysql' -lmysqlclient -lz -lcrypt -lnsl -lm -L/usr/lib -lssl -lcrypto]
        --socket         [/tmp/mysql.sock]
        --port           [3306]
        --version        [4.0.8-gamma]
        --libmysqld-libs [ -L'/usr/local/mysql/lib/mysql' -lmysqld -lpthread -lz -lcrypt -lnsl -lm  -lpthread  -lrt]

Vous pouvez utiliser le résultat, pour compiler un client MySQL comme ceci :

CFG=/usr/local/mysql/bin/mysql_config
sh -c "gcc -o progname `$CFG --cflags` progname.c `$CFG --libs`"

4.8.10 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.11 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

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 section 3.6 Utilisation de 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
Le log d'erreurs Problèmes rencontrés lors du démarrage, de l'exécution ou du stoppage de mysqld.
Le log isam Garde une trace des changements liés au tables ISAM. Utilisé uniquement pour déboguer le code isam.
Le log de requêtes Connexions établies et requêtes exécutées.
Le log de mises à jour Désapprouvé : Enregistre toutes les commandes qui changent les données.
Le log binaire Enregistre toutes les commandes qui changent quelque chose. Utilisé pour la replication.
Le log des requêtes lentes Enregistre toutes les requêtes qui ont pris plus de long_query_time à 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. See section 4.5.3 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\mysql.err'.)

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. See section D.1.4 Utilisation d'un traçage de pile mémoire.

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-bin. See section 4.9.4 Le log binaire.

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

Note : le log de modifications a été remplacé par le log binaire. See section 4.9.4 Le log binaire. Avec 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 `hostname.log', 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.log hostname-old.log
mysqladmin flush-logs
cp hostname-old.log to-backup-directory
rm hostname-old.log

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.

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 dossier.

Ceci 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

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 enregistrer toutes les requêtes, vous devez utiliser le fichier de log général. See section 4.9.2 Le log général de requêtes.

Le log binaire est aussi utilisé lorsque de la réplication d'un maître par un esclave. See section 4.10 Réplication de 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 MASTER. See section 4.5.4 Syntaxe de la commande RESET.

Vous pouvez utiliser les options suivantes avec mysqld pour modifier ce qui est enregistré dans le fichier de log :

Option Description
binlog-do-db=database_name Indique au maître qu'il doit enregistrer les modifications des bases spécifiées, et ignorer les autres. (Example: binlog-do-db=some_database)
binlog-ignore-db=database_name Indique autre maître que les modifications des bases 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].

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 les supprimer manuellement, ou utilisez de prŽfŽrence la commande PURGE MASTER LOGS TO (see section 4.10.6 Commandes SQL liées à la réplication) qui va aussi modifier le fichier de log binaires pour vous.

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 -slow.log. Si un nom de fichier est donné, mais qu'il manque le chemin, le fichier sera écrit dans le dossier de données.

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. See section 4.1.1 Options de 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 suivre ce qui se passe. See section 4.9 Les fichiers de log de MySQL. Vous devez toutefois nettoyer régulièrement ces fichiers, 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 ou sauvegarder les fichiers, et demander à MySQL d'utiliser de nouveaux fichiers. See section 4.4.1 Sauvegardes de 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 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 mysql.log mysql.old
shell> mysqladmin flush-logs

puis faire une sauvegarde du fichier, et le supprimer (`mysql.old').

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 solution.

Nous vous suggérons de visiter notre site web http://www.mysql.com/ souvent pour y lire les mises à jour 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&ea