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 :