mysqldDans 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
-b, --basedir=path
--big-tables
--bind-address=IP
--character-sets-dir=path
--chroot=path
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
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
--debug[...]=
--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
--default-table-type=type
--delay-key-write[= OFF | ON | ALL]
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.
MyISAM.
See section 5.5.2 Réglage des paramètres du serveur.
--des-key-file=filename
DES_ENCRYPT() et DES_DECRYPT()
dans ce fichier.
--enable-external-locking (was --enable-locking)
lockd ne fonctionne pas (comme Linux), vous
allez bloquer rapidement mysqld avec les verrous.
--enable-named-pipe
-T, --exit-info
--flush
-?, --help
--init-file=file
-L, --language=...
-l, --log[=file]
--log-isam[=file]
--log-slow-queries[=file]
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]
file.# où # est un
nombre unique si il n'est pas précisé. See section 4.9.3 Le log de modification.
--log-long-format
--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
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
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...]]]
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. |
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
safe_mysqld.
-P, --port=...
-o, --old-protocol
--one-thread
-O, --set-variable var=option
--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
--safe-show-database
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
INSERT dans la table mysql.user ou dans aucune colonne de
cette table.
--skip-bdb
--skip-concurrent-insert
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 de toutes les
tables. See section 5.5.2 Réglage des paramètres du serveur.
--skip-grant-tables
mysqladmin flush-privileges ou mysqladmin reload).
--skip-host-cache
--skip-innodb
InnoDB. Cela va économiser de la mémoire et
accélérer le serveur un peu.
--skip-external-locking (ancien --skip-locking)
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
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
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
--skip-symlink
--skip-safemalloc
--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
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
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
--socket=path
/tmp/mysql.sock.
--sql-mode=option[,option[,option...]]
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
--transaction-isolation= { READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE }
SET TRANSACTION.
-t, --tmpdir=path
/tmp réside dans une partition qui est trop petite
pour absorber les tables temporaires.
-u, --user= [user_name | userid]
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
-W, --log-warnings (Was --warnings)
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.
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
[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
--option sur la ligne de commande.
option=value
--option=value sur la ligne de commande.
set-variable = variable=value
--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'.
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.
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 :
--host 'hostname' --port=numero_port pour vous
connecter en TCP/IP, ou [--host localhost] --socket=nom_fichier pour vous connecter
via une socket Unix.
DBD::mysql, vous pouvez
lire les options des fichiers d'options MySQL. See section 4.1.2 Fichier d'options `my.cnf'.
$dsn = "DBI:mysql:test;mysql_read_default_group=client;
mysql_read_default_file=/usr/local/mysql/data/my.cnf"
$dbh = DBI->connect($dsn, $user, $password);
MYSQL_UNIX_PORT et MYSQL_TCP_PORT
pour qu'elles pointent sur la socket Unix et le port TCP/IP voulu avant de
démarrer vos clients. Si vous utilisez une socket ou un port spécifique, il est
recommandé de modifier ces variables dans votre fichier `.login'.
See section E Variables d'environnement.
MySQL est pourvu d'un système avancé mais non standard de droits. Cette section décrit son fonctionnement.
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 :
user dans la base mysql! Cette table est primordiale.
Le mot de passe chiffré stocké dans la table est le véritable mot de passe
MySQL.
Quiconque connaît le mot de passe stocké dans la table user et
a accès à la liste des hôtes d'un compte peut facilement se
connecter avec cet utilisateur.
GRANT et
REVOKE sont utilisées pour contrôler les accès à MySQL. Ne donnez pas
plus de droits que nécessaire. Ne donnez jamais des droits à tous les hôtes.
Liste de points à vérifier :
mysql -u root. Si vous êtes capable de vous connecter avec
succès au serveur sans qu'un mot de passe n'ai été demandé, vous avez un
problème. Toute personne peut se connecter au serveur MySQL en tant qu'utilisateur
root avec tous les droits !
Passez en revue votre installation MySQL, en faisant attention aux mots
de passe root.
SHOW GRANTS et vérifiez qui a accès à quoi.
Supprimez les droits qui ne sont pas nécessaires avec la commande REVOKE.
MD5(), SHA1() ou une autre fonction de hash.
nmap. MySQL utilise le port 3306 par défaut. Ce port
doit être inaccessible depuis des hôtes indus. Un autre moyen simple
de tester si votre port MySQL est accessible ou pas, est d'essayer
la commande suivante depuis une machine distante, où server_host est
l'hôte de votre serveur MySQL :
shell> telnet server_host 3306Si vous obtenez une connexion et des caractères étranges, c'est que le port est ouvert, et qu'il devrait être fermé par votre routeur ou votre pare-feu, à moins que vous n'ayez une bonne raison de le garder ouvert. Si
telnet attend ou que la connexion est refusée, c'est que tout
est bon : le port est bloqué.
; DROP DATABASE mysql;''. Ceci est un exemple extrême, mais
de grosse fuites de données ou des pertes peuvent survenir si un pirate
utilise des techniques similaires, et que vous n'êtes pas préparé pour.
Vérifiez aussi toutes les données numériques. Une erreur commune est de
protéger uniquement les chaînes. Certains pensent que si une base contient
des données publiques, elle ne doit pas être protégée. C'est totalement
faux. Au minimum, un attaque en dénis de service peut être pratiquée sur
ces bases. Le plus simple moyen pour vous protéger contre ce type d'attaque
est d'utiliser des apostrophes autour des constantes numériques :
SELECT * FROM table WHERE ID='234' plutôt que SELECT * FROM table WHERE ID=234.
MySQL convertit automatiquement la chaîne en nombre et supprime tous les caractères
non numériques avant insertion.
Point à vérifier :
%22 (`"'), %23
(`#') et %27 (`'') dedans.
addslashes().
Depuis PHP 4.0.3, la fonction mysql_escape_string() est disponible
avec la même fonctionnalité que son alter ego en API MySQL C.
mysql_real_escape_string().
escape et quote des requêtes.
quote() ou utilisez des variables liées.
PreparedStatement et les variables liées.
tcpdump et strings. Pour la plupart
des cas, vous pouvez vérifier si les flux de données MySQL sont chiffrés
en utilisant une commande telle que celle ci :
shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings(Cela fonctionne sous Linux et devrait aussi fonctionner sous les autres systèmes avec de légères adaptations). Attention : si vous ne voyez pas de données, cela ne signifie pas que vous avez des données chiffrées. Si vous avez besoin de forte sécurité, vous devriez consulter un expert de la sécurité.
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 :
mysql -u autre_utilisateur nom_de_base, si
autre_utilisateur n'a pas de mot de passe. C'est un comportement classique
pour les applications client/serveur que le client spécifie son nom
d'utilisateur. Vous pouvez modifier les mots de passe de tous les utilisateurs
en modifiant le script mysql_install_db avant de l'exécuter, ou
vous pouvez modifier seulement le mot de passe du root MySQL comme
ceci :
shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('nouveau_mot_de_passe')
-> WHERE user='root';
mysql> FLUSH PRIVILEGES;
root. C'est très dangereux,
car tout personne ayant le droit de FILE pour créer des fichiers au nom
du root (par exemple, ~root/.bashrc). Pour éviter cela,
mysqld refusera de s'exécuter au nom de root à moins que
soit précisé l'option --user=root.
mysqld peut être exécuté avec un utilisateur ordinaire sans droits
particuliers. Vous pouvez aussi créer un utilisateur Unix mysql pour rendre
cela encore plus sûr. Si vous exécutez mysqld sous un autre utilisateur Unix,
vous n'avez pas à changer le mot de passe root dans la table user,
car les noms d'utilisateurs MySQL n'ont rien à voir avec les noms d'utilisateurs
Unix. Pour démarrer mysqld sous un autre nom d'utilisateur Unix, ajoutez la ligne
user, qui spécifie le nom de l'utilisateur, dans le fichier d'options
de [mysqld] `/etc/my.cnf' ou dans le fichier `my.cnf' présent dans
le dossier de données du serveur. Par exemple :
[mysqld] user=mysqlCette ligne va forcer le serveur à démarrer en tant qu'utilisateur
mysql,
même si vous démarrez le serveur manuellement ou avec les scripts safe_mysqld,
ou mysql.server. Pour plus de détails, voyez section A.3.2 Comment exécuter MySQL comme un utilisateur normal.
--skip-symlink option). Il est généralement
important si vous exécutez mysqld en tant que root, car tout le monde aurait
accès en écriture au dossier de données de MySQL, et pourrait alors effacer
des fichiers systèmes. See section 5.6.1.2 Utiliser des liens symboliques avec les tables.
mysqld est le seul utilisateur
avec les droits de lecture et écriture dans le dossier de base de données.
PROCESS à tous les utilisateurs. La liste fournie
par mysqladmin processlist affiche le texte des requêtes actuellement exécutées,
ce qui permet à toute personne pouvant exécuter cette commande de lire des valeurs
qui seraient en clair, comme : UPDATE user SET
password=PASSWORD('not_secure').
mysqld réserve une connexion supplémentaire pour les utilisateurs qui ont
le droit de PROCESS, afin que le root MySQL puisse toujours se
connecter et vérifier que tout fonctionne bien, même s'il ne reste plus
de connexions libres pour les autres utilisateurs.
FILE à tous les utilisateurs. Tout utilisateur
qui possède ce droit peut écrire un fichier n'importe où sur le serveur, avec
les droits hérités du démon mysqld ! Pour rendre cela plus sécuritaire,
tous les fichiers générés par SELECT ... INTO OUTFILE sont lisibles
par tous, mais personne ne peut les modifier.
Le droit de FILE peut aussi être utilisé pour lire n'importe quel
fichier accessible en lecture au démon qui fait tourner MySQL. Il devient
donc possible, suivant les configurations, d'utiliser la commande
LOAD DATA sur le fichier `/etc/passwd' pour tout mettre en table,
et ensuite le relire avec la commande SELECT.
max_user_connections de
mysqld.
Les options suivantes de mysqld affectent la sécurité :
--local-infile[=(0|1)]
--local-infile=0 then one can't use LOAD DATA LOCAL
INFILE.
--safe-show-database
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
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
mysqladmin flush-privileges ou mysqladmin reload.)
--skip-name-resolve
Host
dans les tables de droits doivent être des adresses IP, ou bien localhost.
--skip-networking
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
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.
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
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.
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 :
SELECT pour cette table, ou les droits de
DROP, respectivement.
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 :
user détermine si le serveur accepte ou rejette la connexion.
Pour les connexions acceptées, tous les privilèges donnés dans la table
user indiquent des privilèges globaux. Ces droits d'appliquent
à toutes les bases du serveur.
db et host sont utilisées conjointement :
db déterminent quels utilisateurs
peuvent accéder à quelles bases, depuis quel hôte. Les champs de droits indiquent
alors les opérations permises.
host est utilisée comme extension de la table db lorsque vous
voulez qu'une ligne de la table db s'applique à plusieurs hôtes. Par exemple,
si vous voulez qu'un utilisateur soit capable d'utiliser une base depuis plusieurs
hôtes dans votre réseau, laissez la colonne Host vide dans la table db,
Ce mécanisme est décrit en détails dans section 4.2.10 Contrôle d'accès, étape 2 : Vérification de la requête.
tables_priv et columns_priv sont similaires à
la table db, mais sont plus atomiques : elle s'appliquent au niveau
des tables et des colonnes, plutôt qu'au niveau des bases.
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.
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 :
GRANT permet aux utilisateurs de donner leurs droits à d'autres
utilisateurs. Deux utilisateurs avec des droits différents et celui de GRANT
pourront combiner leurs droits respectifs pour gagner un autre niveau d'utilisation
du serveur.
ALTER peut être utilisé pour tromper le système en renommant les
tables.
FILE peut servir à lire des fichiers accessibles à tous sur le serveur,
et les placer dans une base de données. Le contenu pourra alors être lu et manipulé
avec SELECT. Cela inclus le contenu de toutes les bases actuellement
hébergées sur le serveur !
SHUTDOWN peut conduire au dénis de service, en arrêtant
le serveur.
PROCESS permet de voir en texte clair les commandes qui
s'exécutent actuellement, et notamment les changements de mot de passe.
mysql peuvent être utilisés pour changer
des mots de passe ou des droits dans la table des droits (Les mots de passe sont
stockés chiffrés, ce qui évite que les intrus ne les lisent). S'ils accèdent
à un mot de passe dans la table mysql.user, ils pourront l'utiliser
pour se connecter au serveur avec cet utilisateur (avec des droits suffisants,
le même utilisateur pourra alors remplacer un mot de passe par un autre).
Il y a des choses qui ne sont pas possibles avec le système de droits de MySQL :
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 :
localhost.
-p manque.
Par exemple, pour un utilisateur Unix joe, les commandes suivantes sont
équivalentes :
shell> mysql -h localhost -u joe shell> mysql -h localhost shell> mysql -u joe shell> mysql
Les autres clients MySQL se comportent de manière similaire.
Sous Unix, vous pouvez spécifier différentes valeurs par défaut qui seront utilisées lorsque vous établierez la connexion, de manière à ce que vous n'ayez pas à entrer ces informations en ligne de commande lorsque vous invoquez un programme client. Cela peut se faire de plusieurs façons :
[client]
du fichier de configuration `.my.cnf' de votre dossier personnel.
La section qui vous interesse ressemble à ceci :
[client] host=nom_d_hote user=nom_d'utilisateur password=votre_mot_de_passeSee section 4.1.2 Fichier d'options `my.cnf'.
mysql avec la variable
MYSQL_HOST. L'utilisateur MySQL peut être spécifié avec la
variable USER (uniquement pour Windows). Le mot de passe peut être
spécifié avec MYSQL_PWD : mais ceci est peu sécuritaire. Voir la
prochaine section See section E Variables d'environnement.
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 :
Host peut être un nom d'hôte, une adresse IP
numérique, ou encore 'localhost', qui représente l'hôte local.
Host.
'%' dans la colonne Host remplace n'importe quelle autre
valeur.
Host indique que les droits doivent être
gérés avec les entrées de la table host qui correspond à l'hôte se connectant.
Vous trouverez plus d'informations à ce sujet dans le prochain chapitre.
Host spécifiées sous la forme
d'IP numériques peuvent être complétées avec le masque de réseau qui indique
combien de bits d'adresse sont utilisés. Par exemple :
mysql> GRANT ALL PRIVILEGES ON db.*
-> TO david@'192.58.197.0/255.255.255.0';
Cela permet à toute personne se connectant depuis une adresse IP qui
satisfait la contrainte suivante :
user_ip & netmask = host_ip.Dans l'exemple ci-dessus, toutes les IP dans l'intervalle 192.58.197.0 - 192.58.197.255 pourront se connecter au serveur MySQL.
User, mais vous
pouvez spécifier une valeur vide qui remplacera tous les noms. Si l'entrée de la
table user, qui correspond à une connexion entrante, a un nom d'utilisateur
vide, l'utilisateur est alors considéré comme anonyme (c'est l'utilisateur sans
nom) et non pas le nom d'utilisateur fourni. Cela signifie qu'un utilisateur
fournissant un nom d'utilisateur vide sera utilisé pour identifier ses droits
dans les prochaines étapes.
Password peut être vide. Cela ne signifie pas que n'importe quel
mot de passe est valable, mais que l'utilisateur peut se connecter sans fournir
de mot de passe.
Les valeurs non vides du champ Password représentent des valeurs
du mot de passe chiffrées. MySQL ne stocke pas les mots de passe en
clair, à la vue de tous. Au contraire, le mot de passe fourni pas l'utilisateur
qui tente de se connecter est chiffré (avec la fonction PASSWORD()).
Le mot de passe ainsi chiffré est alors utilisé entre le client et le serveur
pour vérifier s'il est valable. Cela évite que des mots
de passe en clair circulent entre le client et le serveur, sur la connexion.
Notez que du point de vue de MySQL, le mot de passe chiffré est le vrai
mot de passe, ce qui fait que vous ne devez en aucun cas le donner à un
tiers. En particulier, ne donnez pas accès en lecture aux utilisateurs normaux
aux tables d'administration dans la base mysql!
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.
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 :
Host
et Db des deux tables. Si vous souhaitez utiliser le caractère
`_' comme nom de base, utiliser la séquence `\_' dans la commande
GRANT.
'%' dans la colonne Host de la table db signifie ``tous les hôtes''.
Une valeur vide dans la colonne Host de la table db signifie ``consulte la
table host pour plus de détails''.
'%' ou vide dans la colonne Host de la table host
signifie ``tous les hôtes''.
'%' ou vide dans la colonne Db des deux tables signifie
``toutes les bases de données''.
User de l'une des deux tables identifie
l'utilisateur anonyme.
Les tables db et host sont lues et triées par le serveur au
démarrage (en même temps que la table user. La table db
est triée suivant les valeurs des colonnes Host, Db et User,
et la table host est triée en fonction des valeurs des colonnes Host
et Db. Comme pour la table user, le tri place les entrées les plus
spécifiques au début, et les plus générales à la fin. Lorsque le serveur
recherche une ligne, il utilise la première qu'il trouve.
Les tables tables_priv et columns_priv 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 :
Host
des deux tables.
'%' dans la colonne Host des deux tables signifie ``tous les hôtes''.
Db, Table_name et Column_name ne peuvent pas contenir
de valeur vide ou de caractères jokers, dans les deux tables.
Les tables tables_priv et columns_priv sont triées en fonction
des colonnes Host, Db et User. Ce tri est similaire à
celui du tri de la table db, même si le tri est bien plus simple,
car seul le champ Host peut contenir des caractères 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 :
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.
db et que la valeur de la colonne Host
n'est pas vide, cette ligne définit les droits de l'utilisateur.
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.
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 :
mysql_install_db
pour initialiser le contenu de la table des droits ? Si tel n'est pas le cas, faites le.
See section 4.3.4 Création des premiers droits MySQL. Testez les privilèges initiaux en exécutant la commande
suivante :
shell> mysql -u root testLe serveur devrait vous laisser vous connecter sans erreurs. Vous devez aussi vous assurer que vous avez un fichier `user.MYD' dans le dossier des bases de données MySQL. Ordinairement, il s'agit de `CHEMIN/var/mysql/user.MYD', où
CHEMIN est le chemin
vers le dossier racine de l'installation MySQL.
shell> mysql -u root mysqlLe serveur devrait vous laisser vous connecter car l'utilisateur
root de MySQL
n'a pas de mot de passe initial. Ceci est aussi une faille de sécurité, et donc, vous
devez choisir un mot de passe pour l'utilisateur root en même tant que les autres
utilisateurs MySQL.
Si vous essayez de vous connecter en root et que vous rencontrez cette erreur :
Access denied for user: '@unknown' to database mysqlcela signifie que vous n'avez pas d'entrée dans la table
user avec une valeur 'root'
de la colonne User et que mysqld cne peut trouver de nom d'hôte à votre client.
Dans ce cas, vous devez redémarrer le serveur avec l'option --skip-grant-tables et éditer le fichier
`/etc/hosts' ou `\windows\hosts' pour ajouter une entrée pour votre hôte.
shell> mysqladmin -u root -pxxxx ver Access denied for user: 'root@localhost' (Using password: YES)Cela signifie que vous utilisez un mot de passe erroné. See section 4.3.7 Configurer les mots de passe. Si vous avez oublié le mot de passe root, vous pouvez redémarrer
mysqld avec
--skip-grant-tables pour changer le mot de passe.
See section A.4.2 Comment réinitialiser un mot de passe Root oublié.
Si vous obtenez l'erreur suivante même sans spécifier de mot de passe, cela signifie
que vous avez un mauvais mot de passe dans un fichier my.ini. See section 4.1.2 Fichier d'options `my.cnf'.
Vous pouvez ne pas utiliser les fichiers d'options en utilisant l'option --no-defaults,
comme suit :
shell> mysqladmin --no-defaults -u root ver
mysql_fix_privilege_tables ? Si ce n'est pas le cas,
faites le. La structure des tables de droits a changé avec la version 3.22.11
de MySQL lorsque la commande GRANT est devenue fonctionnelle.
PASSWORD() si vous le changez avec
les commandes INSERT, UPDATE, ou SET PASSWORD. L'utilisation
de la fonction PASSWORD() n'est pas nécessaire si vous spécifiez le mot
de passe en utilisant la commande GRANT ... INDENTIFIED BY ou la commande
mysqladmin password.
See section 4.3.7 Configurer les mots de passe.
localhost est un synonyme de votre nom d'hôte local, et est aussi
l'hôte par défaut auquel le client essaye de se connecter si vous n'en
spécifiez pas un explicitement. Toutefois, les connexions à localhost
ne fonctionnent pas si vous utilisez une version antérieure à la 3.23.27 qui
utilise les MIT-pthreads (les connexions à localhost sont réalisées en
utilisant les sockets Unix, qui n'étaient pas supportés par les MIT-pthreads
à ce moment). Pour contourner ce problème sur de tels systèmes, vous devez
utiliser l'option --host pour nommer l'hôte du serveur explicitement.
Cela créera une connexion TCP/IP vers le serveur mysqld. Dans ce cas,
vous devez avoir votre vrai nom d'hôte dans les entrées de la table user
du serveur hôte. (Cela est vrai même si vous utilisez un programme client sur
la même machine que le serveur.)
Access denied lorsque vous essayez de vous connecter
à la base de données avec mysql -u nom_utilisateur nom_base, vous pouvez avoir
un problème dans la table user. Vérifiez le en vous exécutant mysql -u root
mysql et entrant la commande SQL suivante :
mysql> SELECT * FROM user;Le résultat devrait comprendre une entrée avec les colonnes
Host
et User correspondate au nom d'hôte de votre ordinateur et votre
nom d'utilisateur MySQL.
Access denied vous dira en tant que qui vous
essayez de vous identifier, l'hôte à partir duquel vous voulez le faire,
et si vous utilisez ou pas un mot de passe. Normalement, vous devez avoir
une entrée dans la table user qui correspondent au nom d'hôte et
nom d'utilisateur donnés dans le message d'erreur. Par exemple, si vous
obtenez une erreur qui contient Using password: NO, cela signifie
que vous avez essayé de vous connecter sans mot de passe.
user qui correspond à cet hôte :
Host ... is not allowed to connect to this MySQL serverVous pouvez contourner le problème en utilisant l'outil en ligne de commande
mysql (sur l'hôte du serveur !) pour ajouter un enregistrement aux tables
user, db, ou host pour la combinaison utilisateur / nom
d'hôte avec laquelle vous essayez de vous connecter puis exécuter
mysqladmin flush-privileges. Si vous n'avez pas la version 3.22 de MySQL
et que vous ne connaissez ni l'IP ni le nom d'hôte à partir duquel vous essayez
de vous connecter, vous devez créer une entrée avec '%' dans la colonne
Host dans la table user et redémarrer mysqld avec l'option
--log sur la machine serveur. Après avoir essayé à nouveau de vous connecter
à partir de la machine cliente, les informations contenues dans le log de MySQL
vous apprendront comment vous vous êtes vraiment connectés. (Remplacez alors
l'entrée de la table user contenant '%' avec le nom d'hôte qui
apparait dans le log. Sinon, vous aurez un système non-sécurisé.)
Une autre raison pour cette erreur sous Linux est que vous utilisez une version binaire de
MySQL qui est compilée avec une version de glibc différente de celle que vous utilisez.
Dans ce cas, vous devez soit mettre à jour votre système d'exploitation/glibc, soit télécharger
les sources de MySQL et les compiler vous-même. Un RPM de sources est normalement facile à
compiler et installer, cela ne devrait donc pas vous poser de gros problèmes.
shell> mysqladmin -u root -pxxxx -h some-hostname ver Access denied for user: 'root@' (Using password: YES)Cela signifie que MySQL a rencontré des erreurs lors de la résolution de l'IP du nom d'hôte. Dans ce cas, vous pouvez exécuter
mysqladmin flush-hosts
pour vider le cache interne des DNS. See section 5.5.5 Comment MySQL utilise le DNS.
Les autres solutions sont :
mysqld avec --skip-name-resolve.
mysqld avec --skip-host-cache.
localhost si vous utilisez le serveur et le client sur la
même machine.
/etc/hosts.
mysql -u root test fonctionne mais que mysql -h votre_hote -u root
test provoque une erreur Access denied, il se peut que vous ayez entré de
mauvaises informations pour votre nom d'hôte dans la table user.
Un problème commun ici est que la valeur Host dans la table user spécifie
un nom d'hôte non-qualifié, mais que vos routines système de résolution de noms
retournent un nom de domaine pleinement qualifié (ou vice-versa). Par exemple, si vous avez
une entrée avec l'hôte 'tcx' dans la table user, mais que vos DNS disent à
MySQL que votre nom d'hôte est 'tcx.subnet.se', l'entrée ne fonctionnera pas. Essayez
d'ajouter une entrée dans la table user qui contient votre adresse IP en tant que valeur
de la colonne Host. (Une alternative est d'ajouter une entrée dans la table user
avec une valeur de Host qui contient un caractère spécial, par exemple, 'tcx.%'.
Toutefois, l'utilisation des noms d'hôtes se terminant par `%' est non-sécurisé
et n'est pas recommendé !)
mysql -u utilisateur test fonctionne mais que mysql -u utilisateur
autre_base ne fonctionne pas, vous n'avez pas d'entrée pour autre_base
listée dans la table db.
mysql -u utilisateur nom_base fonctionne à partir du serveur, mais que
mysql -h nom_hote -u utilisateur nom_base ne fonctionne pas à partir d'une
autre machine, cette machine n'est pas listée dans la table user ou db.
Access denied, effacez
toutes les entrées de la table user dont la valeur du champ Host contiennent des
caractères spéciaux (entrées contenant `%' ou `_'). Une erreur commune est d'insérer
une nouvelle entrée avec Host='%' et User='un utilisateur', en pensant
que cela vous permettra de spécifier localhost pour vous connecter à partir de la même
machine. La raison pour laquelle cela ne fonctionnera pas est que les droits par défaut incluent une entrée
avec Host='localhost' et User=''. Puisque cette entrée possède une valeur de
Host égale à 'localhost', qui est plus spécifique que '%', elle est utilisée de préférence
à la nouvelle entrée lors de la connexion à partir de localhost ! La procédure correcte est d'insérer une
seconde entrée avec Host='localhost' et User='un_utilisateur', ou de supprimer
l'entrée avec Host='localhost' et User=''.
db ou host :
Access to database deniedSi l'entrée sélectionnée dans la table
db possède un champ Host vide,
assurez-vous qu'il y a au moins une entrée correspondante dans la table host
spécifiant les hôtes auxquels l'entrée dans la table db s'applique.
Si vous obtenez l'erreur lors de l'utilisation des commandes SQL SELECT ...
INTO OUTFILE ou LOAD DATA INFILE, votre entrée dans la table user
ne possède probablement pas le privilège FILE.
Access denied quand vous démarrer un client
sans aucune option, assurez-vous de ne pas avoir spécifié un vieux mot de passe dans l'un de vos fichiers
d'options !
See section 4.1.2 Fichier d'options `my.cnf'.
INSERT ou UPDATE) et que vos changements semblent ignorés,
souvenez vous que vous devez exécuter une requête FLUSH PRIVILEGES ou la commande
mysqladmin flush-privileges pour demander au serveur de lire à nouveau les tables de
droits. Sinon, vos changements ne seront pris en compte qu'au prochain démarrage du serveur.
Souvenez-vous qu'après avoir choisi le mot de passe root avec une commande UPDATE,
vous n'aurez pas à le spécifier avant de recharger les privilèges, car le serveur ne sait pas que
vous l'avez modifié !
mysql -u utilisateur nom_base
ou mysql -u utilisateur -pvotre_passe nom_base. Si vous pouvez vous connecter
en utilisant le client mysql, c'est que le problème vient de votre programme
et non des droits MySQL. (Notez qu'il n'y a pas d'espace entre -p et le mot de
passe; vous pouvez aussi utiliser la syntaxe --password=votre_passe pour spécifier
le mot de passe. Si vous utilisez l'option -p toute seule, MySQL vous demandera
le mot de passe.)
mysqld avec l'option
--skip-grant-tables. Vous pourrez alors changer les tables de droits MySQL
puis utiliser le script mysqlaccess pour vérifier si vos changements ont
l'effet désiré. Lorsque vous êtes satisfait de vos modifications, exécutez
mysqladmin flush-privileges pour dire au serveur mysqld de commencer
à utiliser les nouvelles tables de droits. Note : Recharger les tables
de droits écrase l'option --skip-grant-tables. Cela vous permet de dire au
serveur de commencer à prendre en considération les droits sans avoir à le couper
et le redémarrer.
mysqld avec l'option de débogage
(par exemple, --debug=d,general,query). Cela affichera l'hôte et les
informations de l'utilisateur pour chaque tentative de connexion. Les informations
à propos de chaque commande exécutée seront aussi affichées.
See section D.1.2 Créer un fichier de traçage.
mysqldump mysql. Comme toujours, postez votre problème à l'aide du script
mysqlbug. See section 1.7.1.3 Comment rapporter un bogue ou un problème. Dans certains cas, vous aurez besoin de redémarrer
mysqld avec --skip-grant-tables pour pouvoir exécuter mysqldump.
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 :
mysql.user.
REVOKE ALL ON *.* retirera seulement les privilèges globaux.
mysql.db et mysql.host.
REVOKE ALL ON db.* retirera seulement les privilèges de base de données.
mysql.tables_priv.
REVOKE ALL ON db.table retirera seulement les privilèges de 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 :
TRIGGER ou UNDER.
INSERT sur uniquement quelques colonnes
de la table, vous pourrez exécuter des insertions. Les colonnes pour lesquelles
vous n'avez pas de droit prendront alors leur valeur par défaut.
L'ANSI SQL vous impose d'avoir les droits d'INSERT sur toutes les colonnes.
REVOKE, ou en manipulant
les tables de droits de MySQL.
Pour une description de l'utilisation de REQUIRE, voyez section 4.3.9 Utilisation des connexions sécurisées.
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 :
-u et
--user. Cela signifie que vous ne pouvez pas rendre une base de données
sécuritaire sans donner de mots de passe à tous les clients. Tout le monde peut
essayer de se connecter au serveur sous n'importe quel nom, et il sera possible
de se connecter si un nom d'utilisateur n'a pas de mot de passe.
PASSWORD() et ENCRYPT() dans section 6.3.6.2 Fonctions diverses. Notez que
même si le mot de passe est enregistré 'brouillé', connaître votre mot de passe
'brouillé' est suffisant pour se connecter au serveur MySQL.
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.
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 :
USE nom_de_base.
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 :
root est créé en tant qu'administrateur avec tous les
droits. Les connexions doivent se faire depuis l'hôte local.
Note :
Le mot de passe de l'utilisateur initial root est vide, ce qui permet
à n'importe qui de se connecter en tant que root
sans mot de passe, pour profiter de tous les droits.
'test' ou commençant par 'test_'. Les connexions
doivent être faites depuis l'hôte local. Cela signifie qu'un utilisateur local peu
se connecter sans mot de passe et être traité comme un utilisateur anonyme.
mysqladmin shutdown ou mysqladmin processlist.
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.
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_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
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
'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;
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'.
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.
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 :
mysql.user.
En connaissant le mot de passe chiffré d'un utilisateur lui permettrait
de se connecter sous cet utilisateur. Les mots de passe sont chiffrés
pour que personne ne puisse lire le mot de passe en clair (ce qui
arriverait si vous utilisiez le même mot de passe dans une autre application).
-pyour_pass ou --password=your_pass en ligne de
commande. C'est très pratique mais très peu sûr, car votre mot de passe devient
visible aux programmes qui effectuent des bilans de l'état du serveur, comme
la commande ps, qui peut être invoquée par d'autres utilisateurs
pour lister les commandes qui sont exécutées : les clients MySQL remplacent la valeur
de cet argument par une série de zéro durant l'initialisation, mais il reste
tout de même une courte période où ce mot de passe est lisible en clair.
-p ou --password (sans la valeur du mot de passe).
Dans ce cas, le programme client va solliciter la saisie du mot de passe
depuis le terminal :
shell> mysql -u user_name -p Enter password: ********Les caractères `*' représentent votre mot de passe. Cette méthode est bien plus sûre pour saisir votre mot de passe qu'en le spécifiant directement en ligne de commande, car il n'est pas visible des autres utilisateurs. Cependant, cette méthode n'est possible qu'avec les programmes que vous utilisez en mode interactif. Si vous voulez invoquer le client depuis un script qui s'exécute de manière non interactive, il n'y aura pas d'opportunité pour saisir ce mot de passe dans le terminal. Sur certains systèmes, vous pourriez même voir la première ligne de votre script lue et interprétée comme votre mot de passe, incorrectement.
[client] du fichier
`.my.cnf' dans votre dossier personnel :
[client] password=mot_de_passeSi vous stockez ce mot de passe dans le fichier `.my.cnf', le fichier ne doit pas être lisible par le groupe ou par les autres utilisateurs, ou encore accessible en écriture : seul le propriétaire de ce fichier doit avoir ces droits. Assurez-vous les droits d'accès au fichiers sont
400 ou 600.
See section 4.1.2 Fichier d'options `my.cnf'.
MYSQL_PWD, mais cette méthode doit être considérée comme extrêmement
peu sûre, et doit être évitée autant que possible. Certaines versions de la commande
en ligne ps incluent une option pour afficher les variables d'environnement
des processus : votre mot de passe sera alors facilement accessible, et en texte
clair, si vous configurez la commande MYSQL_PWD. Même sur les systèmes
sans une telle version de la commande ps, il est peu recommandé de supposer
que les variables d'environnement sont inaccessibles par une méthode quelconque.
See section E Variables d'environnement.
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'.
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.
Pour faire fonctionner les connexions sécurisées avec MySQL, vous devez disposer de ceci :
--with-vio --with-openssl.
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.
mysqld qui supporte
OpenSSL en examinant le résultat de la commande SHOW VARIABLES LIKE 'have_openssl' :
elle doit retourner YES.
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.
GRANTMySQL 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 :
REQUIRE SSL requiert que les connexions soient chiffrées
avec SSL. Notez que cette option peut être omise si il n'y a pas de
ligne ACL qui autorise une connexion sans SSL.
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
-> IDENTIFIED BY "goodsecret" REQUIRE SSL;
REQUIRE X509 impose au client d'avoir un certificat valide, mais
le certificat lui même est de peu d'importance. La seule restriction est
qu'il doit être possible de vérifier la signature avec une des autorités
de certification.
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
-> IDENTIFIED BY "goodsecret" REQUIRE X509;
REQUIRE ISSUER "issuer" restreint les tentatives de connexion :
le client doit se présenter avec un certificat X509 valide, émis par l'
autorité de certification "issuer".
Utiliser un certificat X509 implique obligatoirement des chiffrements, donc
l'option SSL est sous entendue.
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
-> IDENTIFIED BY "goodsecret"
-> REQUIRE ISSUER "C=FI, ST=Some-State, L=Helsinki,
"> O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com";
REQUIRE SUBJECT "subject" impose au client d'avoir un certificat X509
valide, avec le sujet "subject". Si le client présente un certificat
valide, mais que le "subject" est différent, la connexion est refusée.
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
-> IDENTIFIED BY "goodsecret"
-> REQUIRE SUBJECT "C=EE, ST=Some-State, L=Tallinn,
"> O=MySQL demo client certificate,
"> CN=Tonu Samuel/Email=tonu@mysql.com";
REQUIRE CIPHER "cipher" est utilisé pour s'assurer que les chiffrements
sont suffisamment robuste, et que la bonne longueur de clé est utilisée. SSL lui
même peut être faible si des algorithmes sont utilisés avec des clés courtes.
En utilisant cette option, il est possible d'imposer la méthode de chiffrement
avec la connexion.
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
-> IDENTIFIED BY "goodsecret"
-> REQUIRE CIPHER "EDH-RSA-DES-CBC3-SHA";
Les options SUBJECT, ISSUER et CIPHER peuvent être
combinées avec la clause REQUIRE comme ceci :
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
-> IDENTIFIED BY "goodsecret"
-> REQUIRE SUBJECT "C=EE, ST=Some-State, L=Tallinn,
"> O=MySQL demo client certificate,
"> CN=Tonu Samuel/Email=tonu@mysql.com"
-> AND ISSUER "C=FI, ST=Some-State, L=Helsinki,
"> O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com"
-> AND CIPHER "EDH-RSA-DES-CBC3-SHA";
Depuis MySQL 4.0.4, le mot clé AND est optionnel, entre les options
REQUIRE.
L'ordre de ces options n'a pas d'importance, mais aucune option ne peut être
spécifiée deux fois.
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.
shell> mysqldump --tab=/chemin/vers/un/dossier --opt --all ou shell> mysqlhotcopy base /chemin/vers/un/dossierVous 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.
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) :
mysqldump.
shell> mysqlbinlog hostname-bin.[0-9]* | mysqlSi 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 :
FLUSH TABLES WITH READ LOCK.
mount vxfs snapshot.
UNLOCK TABLES.
BACKUP TABLEBACKUP 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.
RESTORE TABLERESTORE 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. |
CHECK TABLECHECK 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 :
Found row where the auto_increment column has the value 0.
Cela signifie que vous avez dans votre table une ligne qui contient
la valeur 0 alors qu'elle est de type AUTO_INCREMENT.
(Il est possible de créer une ligne où la colonne AUTO_INCREMENT vaut
0 en spécifiant explicitement la valeur 0 dans la colonne avec la commande
UPDATE.
Ce n'est pas une erreur en soit, mais cela peut poser des problèmes si
vous décidez de sauver cette table dans un fichier texte, et de la restaurer,
ou encore d'appliquer la commande ALTER TABLE sur la table.
Dans ce cas, la colonne AUTO_INCREMENT va changer automatiquement
de valeur, en suivant les règles des colonnes de type AUTO_INCREMENT,
qui vont causer un problème de clé doublon.
Pour se débarasser de cette alerte, vous devez utiliser une commande
UPDATE surla table, pour mettre une valeur différente de 0 dans
cette colonne.
REPAIR TABLEREPAIR 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.
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)
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.
myisamchk
myisamchk supporte les options suivantes :
-# or --debug=debug_options
debug_options vaut souvent :
'd:t:o,filename'.
-? or --help
-O var=option, --set-variable var=option
--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 :
--safe-recover.
CHAR, VARCHAR ou TEXT
car le tri doit stocker la valeur totale de la colonne durant l'opération. Si vous avez
beaucoup d'espace disque temporaire, et que vous pouvez forcer myisamchk
à réparer avec la méthode de tri, vous pouvez utiliser l'option
--sort-recover.
-s or --silent
-ss) pour rendre
myisamchk très silencieux.
-v or --verbose
-d et -e. Utilisez -v
plusieurs fois pour avoir encore plus d'informations (-vv, -vvv)!
-V or --version
myisamchk et s'arrête.
-w or, --wait
mysqld
avec l'option --skip-external-locking, la table ne pourra être verrouillée que
par une autre commande myisamchk.
myisamchk-c ou --check
myisamchk
si vous ne lui donnez aucune autre option.
-e ou --extend-check
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
-C ou --check-only-changed
-f ou --force
myisamchk avec -r (répare) sur la table, si
myisamchk trouve une erreur dans la table.
-i ou --information
-m ou --medium-check
-U ou --update-state
--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
myisamchk
pour vérifier une table issue d'une autre application qui n'utilise pas les verrous.
(comme mysqld --skip-external-locking).
Les options suivantes sont utilisées avec myisamchk et l'option de
réparation -r ou -o:
-D # ou --data-file-length=#
-e ou --extend-check
-f ou --force
table_name.TMD) au lieu d'annuler.
-k # ou keys-used=#
# 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
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
-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
-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
myisamchk à utiliser le tri pour résoudre les clés, même
si le fichier temporaire doit être énorme.
--character-sets-dir=...
--set-character-set=name
-t ou --tmpdir=path
myisamchk va utiliser la variable d'environnement TMPDIR pour cela.
-q ou --quick
-q pour forcer myisamchk à modifier le fichier original
en cas de clés doublons.
-u ou --unpack
myisamchk
Les autres actions que myisamchk peut réaliser, en dehors de vérifier et
réparer une table sont :
-a or --analyze
myisamchk --describe --verbose table_name' ou SHOW KEYS dans MySQL.
-d or --description
-A or --set-auto-increment[=value]
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
-R or --sort-records=#
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.
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 :
--quick, car dans
ce cas, seul le fichier d'index sera recréé. Cet espace est nécessaire sur
le même disque que l'original !
--recover ou --sort-recover
(mais pas lorsque vous utilisez --safe-recover), vous aurez besoin d'espace
pour le buffer de tri :
(plus_grande_cle + taille_du_pointeur_de_ligne)*nombre_de_lignes * 2.
Vous pouvez vérifier la taille des clés et la taille du pointeur de ligne
avec la commande myisamchk -dv table.
Cet espace est alloué sur le disque temporaire (spécifié par TMPDIR par
--tmpdir=#).
Si vous avez des problèmes avec l'espace disque durant la réparation, vous
pouvez utiliser l'option --safe-recover au lieu de --recover.
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.
Pour vérifier les tables de type MyISAM, utilisez les commandes suivantes :
myisamchk nom_de_table
myisamchk sans les options
ou avec les options -s ou --silent.
myisamchk -m nom_de_table
myisamchk -e nom_de_table
-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
-i indique à myisamchk
qu'il doit afficher des informations statistiques.
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 :
perror ###. Voici les erreurs les plus courantes :
shell> perror 126 127 132 134 135 136 141 144 145 126 = Index file is crashed / Wrong file format : le fichier d'index est corrompu / le format du fichier est incorrect. 127 = Record-file is crashed : le fichier de données est corrompu. 132 = Old database file / ce fichier provient d'une vieille base de données. 134 = Record was already deleted (or record file crashed) / La ligne était déjà effacée. 135 = No more room in record file / Plus de place dans le fichier de données. 136 = No more room in index file / Plus de place dans le fichier d'index. 141 = Duplicate unique key or constraint on write or update / Doublon pour une clé unique trouvé durant la lecture ou l'écriture. 144 = Table is crashed and last repair failed / la table est corrompue et la dernière réparation a échoué. 145 = Table was marked as crashed and should be repaired / La table a été marquée comme corrompue et doit être réparée.Notez que l'erreur 135, "no more room in record file", n'est pas une erreur qui sera facile à corriger. Dans ce cas, vous devez utiliser la commande suivante :
ALTER TABLE table MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;
Dans d'autres cas, vous devrez réparer vos tables. myisamchk
peut généralement détecter et corriger la plupart des erreurs.
Le processus de réparation se déroule en 4 étapes décrites ici. Avant de vous lancer, vous devriez vous placer dans le dossier de données et vérifier les permissions des fichiers de données. Assurez-vous qu'ils sont bien lisibles par l'utilisateur Unix que MySQL utilise (et à vous aussi, car vous aurez besoin d'accéder à ces fichiers durant la vérification. Si vous devez corriger ces fichiers, vous aurez aussi besoin des droits d'écriture.
Si vous utilisez MySQL version 3.23.16 et plus récent, vous pouvez (et vous
devriez) utiliser les commandes CHECK et REPAIR pour réparer
vos tables 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 :
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.
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 :
shell> mysql db_name mysql> SET AUTOCOMMIT=1; mysql> TRUNCATE TABLE table_name; mysql> quitSi votre version SQL ne dispose pas de
TRUNCATE TABLE, utilisez
la commande DELETE FROM table_name.
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.
myisamchk -r.
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 :
-S, --sort-index
-R index_num, --sort-records=index_num
-a, --analyze
Pour une description complète de ces options, See section 4.4.6.1 Syntaxe de l'utilitaire myisamchk.
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
Pour obtenir la description d'une table ou des statistiques à son sujet, utiliser les commandes affichées ici. Nous allons expliquer certains de leurs détails ultérieurement.
myisamchk en ``mode description'' pour produire une description
de votre table. Si vous démarrez le serveur MySQL en utilisant l'option
--skip-external-locking, myisamchk va rapporter une erreur si la table
est modifiée durant l'exécution de la commande. Cependant, comme
myisamchk ne modifie pas les tables, durant le mode description, il n'y
a pas de risque de perte de données.
myisamchk, ajoutez
l'option -v pour indiquer qu'elle doit fonctionner en mode détaillé.
-eis, mais qui vous indique ce qui se passe.
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 :
Data records.
Fixed length.
Les autres valeurs possibles sont Compressed et Packed.
unique et multip. (multiple). Indique si une valeur peut exister plusieurs
fois dans cet index.
packed, stripped ou empty.
myisamchk -a. Si ce n'est pas mis à jour, une valeur par défaut de
30 est utilisée.
myisamchk, ces
valeurs sont très grandes (très proches du maximum théorique).
CHAR/VARCHAR/DECIMAL.
Pour les longues chaînes comme des noms, cette technique va significativement
réduire l'espace utilisé. Dans le troisième exemple ci-dessus, la quatrième clé
fait 10 caractères de long et a une réduction de 60 % dans l'espace utilisé effectivement.
Packed
indique le pourcentage d'économie d'espace réalisé.
myisamchk.
See section 4.4.6.10 Optimisation de tables.
Linkdata est la somme
du stockage utilisé par ces pointeurs.
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.
OPTIMIZE TABLEOPTIMIZE 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 les trie.
Si les statistiques ne sont pas à jour (et que la table n'a pas pu
effectuer de réparation en triant l'index), elles sont mises à jour.
OPTIMIZE TABLE pour les tables MyISAM est l'équivalent de
la commande myisamchk --quick --check-only-changed --sort-index --analyze
sur la table.
Notez que la table est verrouilée durant la commande OPTIMIZE TABLE.
ANALYZE TABLEANALYZE 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.
FLUSHFLUSH 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.
RESETRESET 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. |
KILLKILL 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.
SELECT, ORDER BY et GROUP BY, le
thread de terminaison est vérifié après avoir lu un enregistrement. S'il
est activé, la requête est abandonnée.
ALTER TABLE le thread de terminaison est vérifié avant la
lecture de chacune des colonnes de la table d'origine. S'il est activé, la
commande est abandonnée et la table temporaire effacée.
UPDATE ou d'un DELETE, le thread de terminaison
est vérifié après chaque lecture de bloc et chaque mise à jour ou suppression de
ligne. S'il est activé, la requête est abandonnée. Notez que si vous utilisez les
transactions, les modifications ne seront pas perdues !
GET_LOCK() stoppera avec NULL.
INSERT DELAYED videra rapidement toutes les lignes en mémoire et se
terminera.
Locked),
le verrou sur la table sera vite enlevé.
write,
l'opération est avortée avec un message d'erreur indiquant que le disque est plein.
SHOWSHOW 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 `_'.
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.
SHOW TABLE STATUSSHOW 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.
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 :
Opened_tables est grand, alors votre table_cache
est probablement trop petit.
Key_reads est grand, alors key_buffer_size est probablement trop petit. Le taux d'utilisation du cache peut être calculé avec le ratio Key_reads/Key_read_requests.
Handler_read_rnd est grand, vous avez probablement trop de requêtes qui analysent toute la table, ou vous avez des jointures qui n'exploitent pas d'index.
Threads_created est grand, vous devriez augmenter la valeur de la variable thread_cache_size. Le taux d'utilisation du cache peut être calculé avec Threads_created/Connections.
Created_tmp_disk_tables est grand, vous devriez augmenter la valeur de la variable tmp_table_size pour obtenir des tables temporaires en mémoire, et non plus sur le disque.
SHOW VARIABLESSHOW [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 :
ansi_mode.
Vaut ON si mysqld a été démarré en mode --ansi.
See section 1.8.2 Exécuter MySQL en mode ANSI.
back_log
Le nombre de connexions sortantes que MySQL peut supporter. Cette valeur
entre en jeu lorsque le thread principal MySQL reçoit de très
nombreuses requêtes de connexions en très peu de temps. MySQL prend un peu de
temps (même si c'est très peu de temps), pour vérifier la connexion et
démarrer un nouveau thread. La valeur de back_log indique combien de
requête seront mises en attente durant ce temps. Vous devrez augmenter ce nombre
si vous voulez mettre en attente plus de requêtes durant une courte période de temps.
En d'autres termes, cette valeur est la taille de la queue d'attente pour
les connexions TCP/IP entrantes. Votre système d'exploitation a ses propres
limites pour ce type de queue. La page du manuel Unix listen(2) doit
contenir plus de détails. Vérifiez la documentation de votre OS pour connaître
la valeur maximale de votre système. Si vous donne une valeur à back_log
qui est plus grande que celle que votre système supporte, cela restera sans effet.
basedir
La valeur de l'option --basedir.
bdb_cache_size
Le buffer qui est alloué pour mettre en cache des lignes et des index
pour les tables BDB. Si vous n'utilisez pas la tables
BDB, vous devriez démarrer mysqld avec l'option --skip-bdb
pour ne pas gaspiller de mémoire.
bdb_log_buffer_size
Le buffer qui est alloué pour mettre en cache des lignes et des index
pour les tables BDB. Si vous n'utilisez pas la tables
BDB, vous devriez démarrer mysqld avec l'option --skip-bdb
pour ne pas gaspiller de mémoire.
bdb_home
La valeur de l'option --bdb-home.
bdb_max_lock
Le nombre maximum de verrous (par défaut 10 000) que vous pouvez activer
simultanément dans une table BDB. Vous devriez augmenter cette valeur si
vous obtenez des erreurs du type bdb: Lock table is out of available locks ou
Got error 12 from ... lorsque vous avez de longues transactions ou que
mysqld doit examiner de nombreuses lignes pour calculer la requête.
bdb_logdir
La valeur de l'option --bdb-logdir.
bdb_shared_data
Vaut ON si vous utilisez l'option --bdb-shared-data.
bdb_tmpdir
La valeur de l'option --bdb-tmpdir.
binlog_cache_size.
La taille du cache qui contient les requêtes SQL destinées au log
binaire, durant une transaction. Si vous utilisez souvent de longues
transactions multi-requêtes, vous devriez augmenter cette valeur pour
améliorer les performances. See section 6.7.1 Syntaxe de BEGIN/COMMIT/ROLLBACK.
bulk_insert_buffer_size (était myisam_bulk_insert_tree_size)
MyISAM utilise une cache hiérarchisé pour les insertions de masses
(c'est à dire INSERT ... SELECT, INSERT ... VALUES (...), (...), ..., et
LOAD DATA INFILE). Cette variable limite la taille du cache en
octets, par threads. Utiliser la valeur de 0 va désactiver cette optimisation.
Note : ce cache est uniquement utilisé lorsque vous ajoutez des données
dans une table non-vide. Par défaut, cette option vaut 8 Mo.
character_set
Le jeu de caractères par défaut.
character_sets
Les jeux de caractères supportés.
concurrent_inserts
Si cette option vaut ON, MySQL va vous permettre de réaliser des commandes
INSERT sur les tables MyISAM en même temps que d'autres commandes
SELECT seront exécutées. Vous pouvez désactiver cette option en
démarrant mysqld avec l'option --safe or --skip-new.
connect_timeout
Le nombre de secondes d'attente d'un paquet de connexion avant de
conclure avec une erreur Bad handshake.
datadir
La valeur de l'option --datadir.
delay_key_write
Les options pour les tables MyISAM. Elles peuvent prendre l'une des valeurs suivantes :
OFF | Toutes les commandes CREATE TABLE ... DELAYED_KEY_WRITES sont ignorés. |
ON | (par défaut) MySQL va honorer l'option DELAY_KEY_WRITE de CREATE TABLE.
|
ALL | Toutes les nouvelles tables ouvertes sont traitées comme si elles étaient créées
avec l'option DELAY_KEY_WRITE.
|
DELAY_KEY_WRITE est activé, cela signifie que le buffer de clé des
tables ayant cette option ne seront pas écrit sur le disque dès la fin de la
modification de la table, mais attendrons que la table soit écrite. Cela
accélère notablement les écritures des modifications, mais il faut penser à
ajouter une vérification automatique des tables au démarrage avec
myisamchk --fast --force.
delayed_insert_limit
Après avoir inséré delayed_insert_limit lignes, le gestionnaire de
INSERT DELAYED va vérifiez si il n'y a pas de commande SELECT
en attente. Si c'est le cas, il va autoriser ces commandes avant de continuer.
delayed_insert_timeout
Combien de temps le thread INSERT DELAYED doit attendre les commandes
INSERT avant de s'achever.
delayed_queue_size
Quelle taille de file (en lignes) doit être allouée pour gérer les
commandes INSERT DELAYED. Si la file se remplit, tous les clients
qui émettent des commandes INSERT DELAYED devront attendre un peu de place
avant de pouvoir continuer.
flush
Cette option vaut ON si vous avez démarré MySQL avec l'option --flush.
flush_time
Si cette option a une valeur non nulle, toutes les flush_time secondes,
toutes les tables seront fermées (pour libérez des ressources et synchroniser les
index sur le disque). Nous ne recommandons cette option que sur les systèmes
Windows 9x/Me, ou les systèmes qui ont très peu de ressource.
ft_min_word_len
La taille minimale d'un mot inclus dans un index FULLTEXT.
Note : les index FULLTEXT doivent être reconstruit après avoir
modifié cette variable. (Cette option est nouvelle en MySQL 4.0.)
ft_max_word_len
La taille maximale d'un mot inclus dans un index FULLTEXT.
Note : les index FULLTEXT doivent être reconstruit après avoir
modifié cette variable. (Cette option est nouvelle en MySQL 4.0.)
ft_max_word_len_for_sort
La taille maximale d'un mot dans un index FULLTEXT, pour qu'il soit
inclus dans la méthode de recréation rapide de l'index, avec la commande REPAIR,
CREATE INDEX, ou ALTER TABLE. Les mots longs sont insérés par une
méthode plus lente. La règle idéale est la suivante :
avec ft_max_word_len_for_sort qui croit, MySQL va créer des
fichiers temporaires plus grand, et donc, ralentir le processus, à cause des
accès disques, et cela va mettre moins de clés dans un bloc de tri (encore une fois,
limitant la vitesse). Lorsque ft_max_word_len_for_sort est plus petit,
MySQL va insérer un grand nombre de mot avec la méthode lente, mais les
mots courts seront insérés très vite.
ft_boolean_syntax
Liste des opérateurs supportés par MATCH ... AGAINST(... IN BOOLEAN MODE).
See section 6.8 Recherche en Texte-entier (Full-text) dans MySQL.
have_innodb
YES si mysqld supporte les tables InnoDB. DISABLED
si --skip-innodb est utilisée.
have_bdb
YES si mysqld supporte les tables Berkeley. DISABLED
si --skip-bdb est utilisée.
have_raid
YES si mysqld supporte l'option RAID.
have_openssl
YES si mysqld supporte le chiffrement SSL entre le client et le serveur.
init_file
Le nom du fichier spécifié avec l'option --init-file lorsque vous
démarrez le serveur. C'est un fichier qui contient les requêtes SQL que vous
voulez voir exécutées dès le démarrage.
interactive_timeout
Le nombre de secondes durant lequel le serveur attend une activité de la
part de la connexion avant de la fermée. Un client interactif est un
client qui utilise l'option CLIENT_INTERACTIVE avec
mysql_real_connect(). Voir aussi wait_timeout.
join_buffer_size
La taille du buffer qui est utilisée pour les jointures complètes (les
jointures qui n'utilisent pas d'index). Ce buffer est alloué une fois pour
chaque jointure entre deux tables. Augmentez cette valeur si vous voulez
obtenir des jointures plus rapides, lorsque l'ajout d'index n'est pas possible.
Normalement, le mieux est d'ajouter de bons index.
key_buffer_size
Les blocs d'index sont mis en buffer et partagés par tous les threads.
key_buffer_size est la taille du buffer utilisé.
Augmentez cette valeur pour obtenir une meilleure gestion des index (pour les
lectures et écritures multiples), autant que vous le pouvez : 64Mo sur une machine
de 256Mo est une valeur répandue. Toutefois, si vous utilisez une valeur
trop grande (par exemple, plus de 50% de votre mémoire totale), votre système
risque de commencer à utiliser sa mémoire swap, et devenir très lent. N'oubliez
pas que MySQL ne met pas en cache les données lues, et il faut laisser le
système d'exploitation respirer.
Vous pouvez vérifier les performances du buffer de clés avec la commande
show status et en examinant les variables Key_read_requests,
Key_reads, Key_write_requests et Key_writes.
Le ratio Key_reads/Key_read_request doit être normalement < 0.01.
Le ratio Key_write/Key_write_requests est généralement proche de 1
si vous utilisez principalement des modifications et effacement, mais il peut
être bien plus petit si vous faites des modifications qui affectent de
nombreuses lignes en même temps, ou si vous utilisez l'option
DELAY_KEY_WRITE. See section 4.5.6 Syntaxe de SHOW.
Pour obtenir encore plus de vitesse lors de l'écriture de plusieurs
lignes en même temps, utilisez LOCK TABLES.
See section 6.7.2 Syntaxe de LOCK TABLES/UNLOCK TABLES.
language
La langue utilisée pour les message d'erreurs.
large_file_support
Si mysqld a été compilé avec le support des grands fichiers.
locked_in_memory
Si mysqld a été verrouillé en mémoire avec --memlock
log
Si le log de toutes les requêtes est désactivé.
log_update
Si le log de modification est activé.
log_bin
Si le log binaire est activé.
log_slave_updates
Si les modifications des esclaves doivent être enregistrées.
long_query_time
Si une requête prend plus de @item long_query_time secondes, le compteur
de requêtes lentes Slow_queries sera incrémenté. Si vous utilisez l'option
--log-slow-queries, ces requêtes seront enregistrées dans un historique
de requêtes lentes. Cette durée est mesurée en temps réel, et non pas en
temps processus, ce qui fait que les requêtes qui seraient juste sous la limite
avec un système légèrement chargé, pourrait être au dessus avec le même
système, mais chargé.
See section 4.9.5 Le log des requêtes lentes.
lower_case_table_names
Si cette option vaut 1, les noms de tables sont stockées en minuscules sur
le disque, et les comparaisons de nom de tables seront insensibles à la casse.
Depuis la version 4.0.2, cette option s'applique aussi aux noms de bases.
See section 6.1.3 Sensibilité à la casse pour les noms.
max_allowed_packet
La taille maximale d'un paquet. Le buffer de message est initialisé avec
net_buffer_length octets, mais peut grandir jusqu'à max_allowed_packet
octets lorsque nécessaire. Cette valeur est par défaut petit, pour intercepter
les gros paquets, probablement erronés. Vous devez augmenter cette valeur si
vous utilisez de grandes colonnes BLOB. Cette valeur doit être aussi grande
que le plus grand BLOB que vous utiliserez. Le protocole limite
actuellement max_allowed_packet à 16Mo en MySQL
3.23 et 1Go en MySQL 4.0.
max_binlog_cache_size
Si une transaction multi-requête requiert plus que cette quantité de mémoire,
vous obtiendrez une erreur
"Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage".
max_binlog_size
Disponible depuis la version 3.23.33. Si vous écrivez dans le log binaire (de réplication)
et que cela dépasse la taille de max_binlog_size, une erreur sera indiquée.
Vous ne pouvez pas donner à max_binlog_size une valeur inférieure à
1024 octets, ou plus grande que 1 Go.
max_connections
Le nombre maximal de clients simultanés accepté. En augmentant cette valeur,
vous augmentez le nombre de pointeur de fichier que requiert mysqld. Voyez
plus bas les commentaires sur les pointeurs de fichiers.
See section A.2.5 Erreur Too many connections.
max_connect_errors
Si il y a plus que max_connect_errors connexion interrompues depuis
un même hôte, cet hôte sera bloqué dans ses prochaines tentatives de
connexions. Vous pouvez débloquer un hôte avec la commande
FLUSH HOSTS.
max_delayed_threads
Ne pas lancer plus que max_delayed_threads threads pour gérer les
insertions INSERT DELAYED. Si vous essayez d'insérer des données dans
une nouvelle table alors que tous les gestionnaires INSERT DELAYED
sont utilisés, la ligne sera insérée comme si l'option DELAYED n'avait pas
été spécifiée.
max_heap_table_size
Ne pas autoriser la création de tables de type HEAP plus grande que max_heap_table_size.
max_join_size
Les jointures qui liront probablement plus de max_join_size
lignes, retourneront une erreur. Utilisez cette valeur si vos utilisateurs
font des jointures avec de mauvaises clauses WHERE, qui prennent trop
de temps, et retournent des millions de lignes.
max_sort_length
Le nombre d'octets à utiliser lors du tri des colonnes de type BLOB et TEXT.
Seuls les max_sort_length octets de chaque valeur seront utilisés pour
le tri. Le reste est ignoré.
max_user_connections
Le nombre maximum de connexions actives pour un utilisateur particulier (0 = pas de limite).
max_tmp_tables
(Cette option ne fait actuellement rien du tout).
Le nombre maximum de tables temporaires qu'un client peut garder ouvertes
en même temps.
max_write_lock_count
Après max_write_lock_count pose de verrou en écriture,
autorise quelques verrous en lecture.
myisam_recover_options
La valeur de l'option --myisam-recover.
myisam_sort_buffer_size
Le buffer qui est alloués lors du tri d'index avec la commande
REPAIR ou lors de la création d'index avec CREATE INDEX ou
ALTER TABLE.
myisam_max_extra_sort_file_size.
Si un fichier temporaire utilisé pour la création rapide d'index devient
plus grand que le cache de clé spécifié ici, la méthode utilisant le cache
de clé sera utilisé. C'est principalement utilisé pour forcer les index
longs de grandes tables à utiliser une méthode plus lente pour écrire
l'index. Notez que ce paramètre est spécifié en mégaoctets avant
la version 4.0.3 et en octets depuis cette version.
myisam_max_sort_file_size
La taille maximale du fichier temporaire que MySQL est autorisé à
utiliser durant la recréation des fichiers d'index (avec
REPAIR, ALTER TABLE ou LOAD DATA INFILE). Si la taille
du fichier dépasse myisam_max_sort_file_size, l'index sera créé avec
un cache de clé (plus lent). Notez que ce paramètre est spécifié
en mégaoctets avant la version 4.0.3 et en octets depuis.
net_buffer_length
Le buffer de communication est remis à zéro entre deux requêtes. Cela ne
devrait pas être modifié, mais si vous avez très peu de mémoire, vous pouvez
le remettre à la taille présumée de la requête (c'est à dire, la taille
de requête envoyé par le client. Si la requête dépasse cette taille,
le buffer est automatiquement agrandi jusqu'à max_allowed_packet octets).
net_read_timeout
Nombre de secondes d'attente des dernières données, avant d'annuler la lecture.
Notez que lorsque nous n'attendons pas de données d'une connexion, le
délai d'expiration est donné par write_timeout.
Voir aussi slave_net_timeout.
net_retry_count
Si une lecture sur une port de communication est interrompu, net_retry_count
tentatives sont faites avant d'abandonner. Cette valeur doit être particulièrement
grande pour FreeBSD car les interruptions internes sont envoyés à tous les
threads.
net_write_timeout
Nombre de secondes d'attente pour qu'un bloc soit envoyé à une connexion,
avant d'annuler l'écriture.
open_files_limit
Si open_files_limit ne vaut pas 0, alors mysqld va utiliser cette
valeur pour réserver des pointeurs de fichiers à utiliser avec setrlimit().
Si cette valeur est 0, alors mysqld va réserver max_connections*5 ou
max_connections + table_cache*2 (le plus grand des deux) pointeurs de
fichiers. Vous devriez augmenter cette valeur si mysqld vous donne des
erreurs du type 'Too many open files'.
pid_file
La valeur de l'option --pid-file.
port
La valeur de l'option --port.
protocol_version
La version du protocole utilisé par le serveur MySQL.
read_buffer_size (was record_buffer)
Chaque thread qui doit faire une recherche séquentielle alloue une buffer
de cette taille pour chaque table qu'il scanne. Si vous faîtes de nombreuses
recherches séquentielles, vous devriez augmenter cette valeur.
record_rnd_buffer_size
Lors de la lecture de lignes qui sont placées dans un ordre trié, les lignes
sont lues via ce buffer pour éviter les recherches sur le disque.
record_rnd_buffer_size peut améliorer grandement les performances
de la clause ORDER BY si cette valeur est grande. Comme c'est une
variable qui est spécifique pour les threads, il ne faut pas trop l'augmenter,
mais simplement la modifier lorsque de grandes requêtes sont exécutées.
query_cache_limit
Ne met pas en cache les résultats qui sont plus grands que query_cache_limit.
Par défaut, 1 Mo.
query_cache_size
La mémoire allouée pour stocker les résultats des vieilles requêtes.
Si query_cache_size vaut 0, le cache de requête est désactivé
(par défaut).
query_cache_type
query_cache_type peut prendre les valeurs numériques suivantes :
| Valeur | Alias | Commentaire |
| 0 | OFF | Ne met pas en cache les résultats. |
| 1 | ON, | Met en cache tous les résultats exceptés les requêtes SELECT SQL_NO_CACHE ....
|
| 2 | DEMAND | Met en cache uniquement les requêtes SELECT SQL_CACHE ....
|
safe_show_database
Ne montre pas les bases pour lesquelles un utilisateur n'a pas des droits
de bases ou de tables. Cela peut améliorer considérablement la sécurité
si vous craignez de voir les utilisateurs découvrir ce que les autres
ont mis en place. Voir aussi skip_show_database.
server_id
La valeur de l'option --server-id.
skip_locking
skip_locking vaut OFF si mysqld utilise le verrouillage externe.
skip_networking
skip_networking vaut ON si seules les connexions locales (via
socket) sont autorisées.
skip_show_database
skip_show_database empêche les utilisateurs d'exécuter des commandes
SHOW DATABASES si ils n'ont pas les droits de PROCESS.
Cela peut améliorer la sécurité si vous craignez de voir les utilisateurs
découvrir ce que les autres ont mis en place. Voir aussi safe_show_database.
slave_net_timeout
Nombre de secondes d'attente de données en lecture ou écriture sur une
connexion maître / esclave avant d'annuler.
slow_launch_time
Si la création du thread prend plus de slow_launch_time secondes,
le compteur de threads lents Slow_launch_threads sera incrémenté.
socket
La socket Unix utilisé par le serveur.
sort_buffer
Chaque thread qui doit faire un tri alloue un buffer de cette taille.
Augmentez cette taille pour accélérer les clauses
ORDER BY ou GROUP BY.
See section A.4.4 Où MySQL stocke les fichiers temporaires ?.
table_cache
Le nombre de tables ouvertes pour tous les threads réunis. En augmentant
cette valeur, vous augmentez le nombre de pointeurs de fichiers que
mysqld utilise. Vous pouvez vérifier si vous avez besoin de plus de
cache de tables en étudiant la valeur de la variable Opened_tables.
See section 4.5.6 Syntaxe de SHOW. Si cette variable est grande, est que vous ne
faites pas souvent de commande FLUSH TABLES (qui force les tables
à se recharger), vous devrez alors augmenter cette valeur.
Pour plus d'informations sur le cache de table, voyez section 5.4.7 Quand MySQL ouvre et ferme les tables.
table_type
Le type de table par défaut.
thread_cache_size
Combien de threads nous allons conserver en cache pour réutilisation.
Lorsqu'un client se déconnecte, les threads du client sont mis en cache
s'il n'y en a pas déjà thread_cache_size de conservé. Tous les
nouveaux threads sont d'abord prélevé dans le cache, et uniquement lorsque
le cache est vide, un nouveau thread est créé. Cette variable peut vous
permettre d'améliorer les performances si vous avez de nombreuses
connexions. Normalement, thread_cache_size ne donne pas d'amélioration
notable si vous avez une bonne implémentation des threads. En examinant la différence
entre les variables de statut Connections et Threads_created
vous pouvez voir comment votre système de cache de threads est efficace.
thread_concurrency
Sous Solaris, mysqld va appeler thr_setconcurrency() avec cette
valeur. thr_setconcurrency() permet à l'application de donner au
système de threads une indication sur le nombre de threads qui seront
exécutés en même temps.
thread_stack
La taille de la pile pour chaque thread. De nombreuses limites détectées
par crash-me sont dépendantes de cette valeur. La valeur par défaut
est suffisamment grande pour des opérations normales. See section 5.1.4 La suite de tests MySQL.
timezone
Le fuseau horaire du serveur.
tmp_table_size
Si une table temporaire en mémoire excède cette taille, MySQL
va automatiquement la convertir en une table MyISAM sur le disque.
Augmentez la valeur de tmp_table_size si vous faites un usage intensif
de la clause GROUP BY et que vous avez beaucoup de mémoire.
tmpdir
Le dossier utilisé pour les fichiers temporaires et les tables temporaires.
version
Le numéro de version du serveur.
wait_timeout
Le nombre de secondes d'attente du serveur sur une connexion non interactive
avant de la refermer.
Lors du démarrage du thread, SESSION.WAIT_TIMEOUT est initialisé avec
GLOBAL.WAIT_TIMEOUT ou GLOBAL.INTERACTIVE_TIMEOUT, suivant le type
de client (tel que défini par l'option de connexion CLIENT_INTERACTIVE).
Voir aussi interactive_timeout.
La section du manuel qui est consacrée à l'optimisation de MySQL contient des informations sur l'utilisation des variables ci-dessus. See section 5.5.2 Réglage des paramètres du serveur.
SHOW LOGS
La commande SHOW LOGS affiche les informations d'état de
vos fichiers de logs.
Actuellement, elle n'affiche que les informations pour les fichiers de
log des tables Berkeley DB.
File affiche le chemin complet jusqu'au fichier de log.
Type affiche le type de fichier de log (BDB pour les tables
de types Berkeley DB)
Status affiche le status du fichier de log (FREE si le fichier
peut être supprimé, ou IN USE si le fichier est utilisé par une transaction
en cours)
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
Checking table
Le thread fait une vérification (automatique) de la table.
Closing tables
Le thread est en train d'écrire les données modifiées sur le disque, et
il va fermer les tables. Cela doit être une opération très rapide. Si ce n'est
pas le cas, vous devriez vérifier si vous n'avez pas un disque plein, ou que
le disque est sous haute charge.
Connect Out
Connexion d'un esclave sur le maître.
Copying to tmp table on disk
Le résultat temporaire était plus grand que tmp_table_size et le
thread passe d'une table en mémoire à une table sur disque.
Creating tmp table
Le thread est en train de créer une table temporaire pour contenir le résultat
d'une requête.
deleting from main table
Lors de l'exécution de la première partie d'une requête d'effacement multi-table,
et que MySQL n'a commencé à effacer que dans la première table.
deleting from reference tables
Lors de l'exécution de la deuxième partie d'une requête d'effacement multi-table,
et que MySQL a commencé à effacer dans les autres tables.
Flushing tables
Le thread exécute la commande FLUSH TABLES et il attend que tous les threads
ferme leur tables.
Killed
Quelqu'un a envoyé une commande KILL et le thread s'annuler la prochaine
fois qu'il vérifie l'option de kill. Cette option est vérifiée dans chaque
boucle majeure de MySQL, mais dans certains cas, il peut lui prendre un court
instant avant de s'arrêter. Si le thread est verrouillé par un autre thread, l'arrêt
va prendre effet aussitôt que l'autre thread lève son verrou.
Sending data
Le thread traite des lignes pour une commande SELECT et il envoie les données
au client.
Sorting for group
Le thread est en train de faire un tri pour satisfaire une clause GROUP BY.
Sorting for order
Le thread est en train de faire un tri pour satisfaire une clause ORDER BY.
Opening tables
Cela signifie simplement que le thread essaie d'ouvrir une table. Ce doit être
une opération très rapide, à moins que quelque chose ne retarde l'ouverture.
Par exemple, une commande ALTER TABLE ou LOCK TABLE peut empêcher
l'ouverture de table, jusqu'à l'achèvement de la commande.
Removing duplicates
La requête utilisait SELECT DISTINCT de telle manière que MySQL
ne pouvait pas optimiser les lignes distinctes au début du traitement.
A cause de cela, MySQL doit effectuer une opération de plus pour supprimer
toutes les lignes en doubles, avant d'envoyer les lignes au client.
Reopen table
Le thread a reçu un verrou pour une table, mais a noté après l'avoir reçu
que la structure de la table a changé. Il a libéré le verrou, fermé la table,
et maintenant il essaie de la réouvrir.
Repair by sorting
Le thread répare la table en utilisant la méthode de tri pour créer l'index.
Repair with keycache
Le thread répare la table en utilisant la méthode de création des clés
à partir du cache de clé. C'est bien plus lent que la réparation par tri.
Searching rows for update
Le thread effectue une première phase pour trouver toutes les lignes
qui satisfont les critères avant de les modifier. Cela doit être fait
si UPDATE modifie l'index qui sera utilisé pour trouver les lignes.
Sleeping
Le thread attend que le client envoie une nouvelle commande.
System lock
Le thread attend le verrou externe pour la table. Si vous n'utilisez pas
de serveurs MySQL multiples qui exploitent les mêmes tables, vous pouvez
désactiver les verrous systèmes avec l'option --skip-external-locking.
Upgrading lock
Le gestionnaire de INSERT DELAYED essaie d'obtenir un verrou pour
insérer des lignes.
Updating
Le thread recherche des lignes pour les modifier.
User Lock
Le thread attend un GET_LOCK().
Waiting for tables
Le thread a reçu l'annonce que la structure de table a été modifiée, et il
doit réouvrir la table pour obtenir une nouvelle structure. Pour être capable
de réouvrir la table, il doit attendre que les autres threads aient fermé la
table en question.
Cette annonce survient lorsqu'un autre autre thread a été utilisé avec la
commande FLUSH TABLES ou une des commandes suivantes, appliquées à
la table en question : FLUSH TABLES table_name, ALTER TABLE, RENAME TABLE,
REPAIR TABLE, ANALYZE TABLE ou OPTIMIZE TABLE.
waiting for handler insert
Le gestionnaire de INSERT DELAYED a traité toutes insertions,
et en attend de nouvelles.
La plupart des états sont des opérations très rapides. Si le thread s'attarde dans un de ces états pour plusieurs secondes, il doit y avoir un problème qui mérite d'être étudié.
Il existe encore d'autres états qui ne sont pas mentionné ci-dessus, mais la majorité
sont utilisés pour trouver des bogues dans mysqld.
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 | +---------------------------------------------------------------------+
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.
SHOW WARNINGS | ERRORSSHOW 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' | +-------+------+-------------------------------+
SHOW TABLE TYPESSHOW 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.
SHOW PRIVILEGESSHOW 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)
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.
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
ä.
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'.
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 :
ctype prends les 257 premiers mots. Les tableaux to_lower[],
to_upper[] et sort_order[] prennent chacun 256 mots après cela.
CHARSETS_AVAILABLE et
COMPILED_CHARSETS dans configure.in.
Pour un jeu de caractères complexe faites ce qui suit :
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
/* * 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.
my_strncoll_MONJEU()
my_strcoll_MONJEU()
my_strxfrm_MONJEU()
my_like_range_MONJEU()
CHARSETS_AVAILABLE et
COMPILED_CHARSETS dans configure.in.
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.
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
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).
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.
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 :
--character-sets-dir du
programme en question.
ERROR 1105: File '/usr/local/share/mysql/charsets/?.conf' not found (Errcode: 2)Dans ce cas, vous devez soit obtenir un nouveau fichier
Index ou ajouter à la
main le nom du jeu de caractères manquant.
Pour les tables MyISAM, vous pouvez vérifier le nom du jeu de caractères et son
nombre associé d'une table avec myisamchk -dvv nom_de_table.
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
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
support.mysql.com pour en faire
profiter les autres utilisateurs MySQL.
mysqlbug
mysqld
mysql_install_db
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=#
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
mysqld
--log=path
--mysqld=mysqld-version
mysqld dans le dossier ledir que vous voulez démarrer.
--mysqld-version=version
--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=#
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=#
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 :
safe_mysqld est appelé. safe_mysqld cherche dans les
sous dossiers `bin' et `data' (pour les distributions binaires)
et, `libexec' et `var' (pour les distributions sources). Cette condition
doit être remplie si vous exécutez safe_mysqld depuis votre dossier
d'installation MySQL (par exemple, `/usr/local/mysql' pour une distribution binaire).
safe_mysqld essaie de les trouver en utilisant leurs chemins absolus.
Les chemin typiquement étudiés sont `/usr/local/libexec' et `/usr/local/var'.
Les chemins réels sont déterminés lorsque la distribution est compilée, et
safe_mysqld a alors aussi été généré. Ils doivent être corrects si
MySQL a été installé dans un dossier standard.
Comme safe_mysqld essaie de trouver le serveur et les bases dans un dossier
situé dans le dossier de travail, vous pouvez installer la version binaire de
MySQL n'importe où, du moment que vous démarrez le script safe_mysqld dans
le dossier d'installation de MySQL :
shell> cd mysql_installation_directory shell> bin/safe_mysqld &
Si safe_mysqld échoue, même si il est appelé depuis le dossier
d'installation, vous pouvez le modifier pour qu'il reconnaisse le chemin
que vous utilisez jusqu'à mysqld. Notez que si vous faites évoluer votre
installation de MySQL, votre version de safe_mysqld sera écrasée, et vous devrez
la rééditer.
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=...
[mysqld_multi]), mais uniquement les
groupes [mysqld#]. Sans cette option, tout sera lu dans le fichier
d'options traditionnel `my.cnf'.
--example
--help
--log=...
--mysqladmin=...
mysqladmin à utiliser lors de l'arrêt du serveur.
--mysqld=...
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
--password=...
mysqladmin.
--tcp-ip
--user=...
mysqladmin.
--version
Quelques notes pour mysqld_multi :
mysqld (e.g en utilisant la commande mysqladmin), a les mêmes
nom d'utilisateur et mot de passe pour tous les dossiers de données
utilisés. Et assurez-vous que cet utilisateur a bien les droits de SHUTDOWN!
Si vous avez de nombreux dossiers de données et de nombreuses bases mysql
avec différents mots de passe pour le serveur root MySQL,
vous souhaiterez peut être créer un utilisateur commun multi_admin à chaque
base, avec le même mot de passe (voir ci-dessous). Voici comment faire :
shell> mysql -u root -S /tmp/mysql.sock -proot_password -e "GRANT SHUTDOWN ON *.* TO multi_admin@localhost IDENTIFIED BY 'multipass'"See section 4.2.6 Comment fonctionne le système de droits. Vous devrez utiliser la même commande pour chaque serveur
mysqld qui fonctionne :
changez simplement la socket, -S=...).
pid-file est très important, si vous utilisez safe_mysqld
pour démarrer mysqld (e.g., --mysqld=safe_mysqld). Chaque
mysqld doit avoir son propre fichier pid-file. L'avantage
d'utiliser safe_mysqld au lieu de mysqld est que
safe_mysqld ``surveille'' tous les processus mysqld et les
redémarrera si un processus mysqld s'arrête suite à la reception
d'un signal kill -9, ou pour toute autre raison comme
une erreur de segmentation (que MySQL ne devrait jamais faire, bien sûr !).
Notez bien que le script safe_mysqld vous imposera peut être d'être
démarré depuis un dossier spécial. Cela signifie que vous devrez probablement
utiliser la commande shell cd jusqu'à un certain dossier avant de pouvoir
exécuter mysqld_multi. Si vous avez des problèmes pour démarrer, voyez
le script safe_mysqld. Vérifiez notamment ces lignes :
-------------------------------------------------------------------------- MY_PWD=`pwd` Check if we are starting this relative (for the binary release) if test -d /data/mysql -a -f ./share/mysql/english/errmsg.sys -a -x ./bin/mysqld --------------------------------------------------------------------------See section 4.7.2
safe_mysqld, le script père de mysqld.
Le test ci-dessus devrait fonctionner, ou bien vous rencontrerez probablement
des problèmes.
mysqld avec le même dossier de données. Utilisez des dossiers
de données séparés, à moins que vous ne sachiez bien ce que vous faites.
mysqld.
mysqld on été intentionnellement ignorés
dans le groupe d'exemple. Vous pouvez laisser des trous dans le fichier de configuration.
Cela vous donnera plus de souplesse. L'ordre dans lequel les démons
mysqlds sont démarrés ou arrétés dépend de l'ordre dans lequel ils apparaissent
dans le fichier de configuration.
[mysqld17] est le 17.
--user pour mysqld, mais
afin de faire cela, vous devez exécuter le script mysqld_multi en tant
que root Unix. Placer cette option dans le fichier de configuration
ne changera rien : vous obtiendrez une alerte, si vous n'êtes pas le super
utilisateur, et les démons mysqld seront démarrés avec vos droits
Unix. Important : assurez-vous bien que le fichier de données
et le fichier de pid-file sont accessibles en lecture et écriture
(et exécution pour le dernier) à l'utilisateur Unix qui lance les processus
mysqld. N'utilisez pas le compte root Unix pour cela, à moins que
vous ne sachiez ce que vous faîtes.
mysqlds et pourquoi vous avez besoin
de plusieurs processus mysqld. Démarrer plusieurs serveurs
mysqlds dans le même dossier ne vous donnera aucun gain de performance
dans un système threadé.
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'.
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 peut aussi compresser des colonnes BLOB ou TEXT.
L'ancien pack_isam (pour les tables ISAM) ne peut le faire.
myisampack est invoqué comme ceci :
shell> myisampack [options] filename ...
Chaque nom de fichier doit être le nom d'un fichier d'index (`.MYI'). Si vous n'êtes pas dans le dossier de données, vous devez spécifier le chemin complet jusqu'au fichier. Il est toléré que vous omettiez l'extension du fichier `.MYI'.
myisampack supporte les options suivantes :
-b, --backup
tbl_name.OLD.
-#, --debug=debug_options
debug_options vaut souvent
'd:t:o,filename'.
-f, --force
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
-j big_tbl_name, --join=big_tbl_name
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=#
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
-t, --test
-T dir_name, --tmp_dir=dir_name
-v, --verbose
-V, --version
-w, --wait
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
empty-space
empty-zero
empty-fill
INTEGER sera transformée en MEDIUMINT).
pre-space
end-space
table-lookup
ENUM avant une compression de type Huffman.
zero
Original trees
After join
Après la compression d'une table, myisamchk -dvv affiche des informations
supplémentaires pour chaque champ :
Type
constant
no endspace
no endspace, not_always
no endspace, no empty
table-lookup
ENUM.
zerofill(n)
n chiffres significatifs sont toujours 0, et n'ont pas été
stockés.
no zeros
always zero
Huff tree
Bits
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.
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 |
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
mSQL vers MySQL. Il ne gère
pas toutes les situations, mais c'est une très bonne base de travail.
mysqlaccess
mysqladmin
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
mysqldump, exporter les structures de tables et les données.
mysqlimport
LOAD DATA INFILE. See section 4.8.7 mysqlimport, importer des données depuis des fichiers texte.
mysqlshow
replace
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 ...
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
-A, --no-auto-rehash
--prompt=...
-b, --no-beep
-B, --batch
--character-sets-dir=...
-C, --compress
-#, --debug[=...]
-D, --database=...
--default-character-set=...
-e, --execute=...
-E, --vertical
\G.
-f, --force
-g, --no-named-commands
-G, --enable-named-commands
-i, --ignore-space
-h, --host=...
-H, --html
-X, --xml
-L, --skip-line-numbers
--no-pager
--no-tee
-n, --unbuffered
-N, --skip-column-names
-O, --set-variable var=option
--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
--pager[=...]
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[=...]
-p, vous ne devez pas laisser d'espace
entre l'option et le mot de passe.
-P --port=...
-q, --quick
-r, --raw
--batch
-s, --silent
-S --socket=...
-t --table
-T, --debug-info
--tee=...
-u, --user=#
-U, --safe-updates[=#], --i-am-a-dummy[=#]
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
-V, --version
-w, --wait
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#"
où #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 :
UPDATE ou DELETE
si vous n'avez pas de contrainte de clé dans la clause WHERE. Il est possible
toutefois de forcer la commande UPDATE/DELETE en utilisant LIMIT :
UPDATE table_name SET not_key_column=# WHERE not_key_column=# LIMIT 1;
#select_limit# lignes.
SELECT qui vont probablement devoir examiner
plus de #max_join_size lignes seront annulées.
Quelques conseils pratiques sur le client mysql :
Certaines données seront plus faciles à lire lorsqu'affichées verticalement, au lieu d'horizontalement. Par exemple, des textes longs qui incluent des nouvelles lignes. Il sera alors plus facile de les lire verticalement.
mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 lIMIT 300,1\G
*************************** 1. row ***************************
msg_nro: 3068
date: 2000-03-01 23:29:50
time_zone: +0200
mail_from: Monty
reply: monty@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 :
mysql> pager cat > /tmp/log.txtet les résultats iront directement dans le fichier. Vous pouvez aussi passer des options pour le programme que vous voulez utiliser comme
pager :
mysql> pager less -n -i -S
mysql> pager cat | tee /dr1/tmp/res.txt | \ tee /dr2/tmp/res2.txt | less -n -i -S
Vous pouvez aussi combiner les deux fonctions ci-dessus : activer le
tee, spécifier le pager 'less' et vous serez capable de
naviguer dans les résultats avec le less Unix, tout en enregistrant tous
les résultats dans un fichier. La différence entre le tee d'Unix
utilisé avec le pager et le tee intégré du client mysql,
est que le tee intégré fonctionne même si vous n'avez pas de tee
Unix disponible. Le tee enregistre tout ce qui est affiché à l'écran,
alors que le tee Unix utilisé avec pager n'en note pas autant.
Enfin, le tee interactif est plus facile à activer et désactiver, lorsque
vous souhaitez enregistrer un résultat dans un fichier, mais que vous voulez
désactiver cette fonctionnalité à d'autres moments.
Depuis MySQL version 4.0.2, il est possible de modifier l'invite de commande
de mysql.
Vous pouvez utiliser les options de prompt suivantes :
| Option | Description |
| \v | version de mysqld |
| \d | database en cours |
| \h | hôte MySQL |
| \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 :
MYSQL_PS1,
en lui donnant la chaîne d'invite. Par exemple :
shell> export MYSQL_PS1="(\u@\h) [\d]> "
mysql. Par exemple :
[mysql] prompt=(\u@\h) [\d]>\_
--prompt en ligne de commande avec
mysql. Par exemple :
shell> mysql --prompt="(\u@\h) [\d]> " (user@host) [database]>
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>
mysqladmin, administrer un serveur MySQLUn 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
drop databasename
extended-status
flush-hosts
flush-logs
flush-tables
flush-privileges
kill id,id,...
password
ping
processlist
reload
refresh
shutdown
slave-start
slave-stop
status
variables
version
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é.
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
-1, --all-in-1
-a, --analyze
--auto-repair
-#, --debug=...
--character-sets-dir=...
-c, --check
-C, --check-only-changed
--compress
-?, --help
-B, --databases
--default-character-set=...
-F, --fast
-f, --force
-e, --extended
-h, --host=...
-m, --medium-check
-o, --optimize
-p, --password[=...]
-P, --port=...
--protocol=(TCP | SOCKET | PIPE | MEMORY)
-q, --quick
-r, --repair
-s, --silent
-S, --socket=...
--tables
-u, --user=#
-v, --verbose
-V, --version
mysqldump, exporter les structures de tables et les donnéesUtilitaire 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
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
drop table avant chaque requête de création de table.
-A, --all-databases
--databases avec
toutes les bases de données sélectionnées.
-a, --all
--allow-keywords
-c, --complete-insert
-C, --compress
-B, --databases
USE db_name; sera ajoutée dans l'export avant chaque base
de données.
--delayed
INSERT DELAYED.
-e, --extended-insert
INSERT. (Cela donne des insertions
plus courtes et plus efficaces).
-#, --debug[=option_string]
--help
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--lines-terminated-by=...
-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
-f, --force,
-h, --host=..
localhost.
-l, --lock-tables.
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
CREATE TABLE).
-d, --no-data
--opt
--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]
mysqldump vous demandera le mot de passe en ligne de commande.
-P port_num, --port=port_num
localhost, pour lequel les sockets Unix seront utilisées).
-q, --quick
mysql_use_result() pour cela.
-Q, --quote-names
-r, --result-file=...
--single-transaction
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
localhost
(qui est l'hôte par défaut).
--tables
-T, --tab=path-to-some-directory
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
-O var=option, --set-variable var=option
--set-variable
est obsolète depuis MySQL 4.0, il vous suffit alors d'utiliser la
syntaxe --var=option.
-v, --verbose
-V, --version
-w, --where='where-condition'
-X, --xml
-x, --first-slave
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"
-O net_buffer_length=#, where # < 16M
--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
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
-u, --user=#
-p, --password=#
-P, --port=#
-S, --socket=#
--allowold
--keepold
--noindices
myisamchk -rq..
--method=#
cp ou scp).
-q, --quiet
--debug
-n, --dryrun
--regexp=#
--suffix=#
--checkpoint=#
--flushlog
--tmpdir=#
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).
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=...
LOAD DATA INFILE correcte,
qui sera alors passée à MySQL. See section 6.4.9 Syntaxe de LOAD DATA INFILE.
-C, --compress
-#, --debug[=option_string]
-d, --delete
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--lines-terminated-by=...
LOAD DATA INFILE. See section 6.4.9 Syntaxe de LOAD DATA INFILE.
-f, --force
mysqlimport va continuer de traiter les autres fichiers.
Sans --force, mysqlimport se termine dès qu'une erreur survient.
--help
-h host_name, --host=host_name
localhost.
-i, --ignore
--replace.
-l, --lock-tables
-L, --local
localhost (qui l'hôte par défaut).
-pyour_pass, --password[=your_pass]
mysqlimport va vous demander le mot de passe en ligne.
-P port_num, --port=port_num
localhost, pour lequel la socket Unix est utilisée.
-r, --replace
--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
-S /path/to/socket, --socket=/path/to/socket
localhost (qui
est l'hôte par défaut).
-u user_name, --user=user_name
-v, --verbose
-V, --version
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 | +------+---------------+
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é).
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
--libs
--socket
--port
--version
--libmysqld-libs
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`"
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.
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.
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.
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.
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.
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.
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.
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.
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 :
--log) ou le log de requêtes lentes
(--log-slow-queries) est utilisé, la commande ferme et réouvre
le fichier de log (`mysql.log' et ``hostname`-slow.log' par
défaut).
--log-update), la commande
ferme le log de modification et ouvre un nouveau fichier, avec un nouveau
numéro de séquence plus grand.
Si vous utilisez uniquement le log de modification, vous pour simplement vider les logs sur le disque, et sauver l'ancien fichier de modification dans une sauvegarde. Si vous utilisez le log normal, vous pouvez faire ceci :
shell> cd mysql-data-directory shell> mv mysql.log mysql.old shell> mysqladmin flush-logs
puis faire une sauvegarde du fichier, et le supprimer (`mysql.old').
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.
La réplication monodirectionnelle est à améliorer la solidit&ea