Différences entre les versions de « Le système d'exploitation GNU-Linux/La base de données MySQL »

m
oups
m (oups)
== Introduction ==
 
{{w|MySQL}} est un serveur de bases de données relationnelles SQL (OpenSourceOpen Source), fonctionnant sur le port 3306 en mode TCP.
 
''Prérequis'' : [[Apache]].
== Installation ==
 
Pour installer MySQLmysql sous Debian, on tape la commande suivante :
 
# apt-get install MySQLmysql-server MySQLmysql-client
 
== Fichier de configuration ==
 
Le fichier de configuration est '''/etc/MySQLmysql/my.cnf'''.
 
Dans ce fichier de configuration on trouve plusieurs sections :
 
# Section du client MySQLMysql
[client]
port = 3306
socket = /var/run/MySQLdmysqld/MySQLdmysqld.sock
# Section de MySQLd_safemysqld_safe
[MySQLd_safemysqld_safe]
socket = /var/run/MySQLdmysqld/MySQLdmysqld.sock
nice = 0
# Section du serveur MySQLMysql
[MySQLdmysqld]
# Utilisateur qui lance le daemon
user = MySQLmysql
# Fichier qui contient le PID du processus
pid-file = /var/run/MySQLdmysqld/MySQLdmysqld.pid
# Fichier socket qui permet une communication locale avec MySQLdMysqld (plus performant que de passer par le port 3306)
socket = /var/run/MySQLdmysqld/MySQLdmysqld.sock
# Port sur lequel écoute MySQLMysql
port = 3306
# Répertoire de base de MySQLMysql
basedir = /usr
# Répertoire contenant les bases de données
datadir = /var/lib/MySQLmysql
# Répertoire temporaire
# Permet de personnaliser le langage
language = /usr/share/MySQLmysql/english
# Évite le blocage externe
skip-external-locking
# Adresse IP sur lequel écoute MySQLMysql
bind-address = 127.0.0.1
# Taille des caches MySQLMysql : permet d'optimiser les performances de MySQLMysql
key_buffer = 16M
max_allowed_packet = 16M
# Emplacement du fichier de Log
log = /var/log/MySQLmysql/MySQLmysql.log
# On peut logger les requêtes lentes
#log_slow_queries = /var/log/MySQLmysql/MySQLmysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes
# Permet d'exécuter MySQLMysql dans une cage chroot
# chroot = /var/lib/MySQLmysql/
# Options pour définir les certificats MySQLMysql
# ssl-ca=/etc/MySQLmysql/cacert.pem
# ssl-cert=/etc/MySQLmysql/server-cert.pem
# ssl-key=/etc/MySQLmysql/server-key.pem
# Section pour MySQLdumpmysqldump
[MySQLdumpmysqldump]
quick
quote-names
# Section pour ?
[MySQLmysql]
#no-auto-rehash # faster start of MySQLmysql but no tab completition
 
 
Chaque fois que l'on modifie ce fichier, il faut relancer MySQLmysql :
 
# /etc/init.d/MySQLmysql restart
 
Les bases de données sont stockées dans le répertoire '''/var/lib/MySQLmysql/'''. Il faut donc sauvegarder ce répertoire.
 
Pour se connecter à MySQLMysql à partir du shell, on utilise le client MySQLMysql :
 
# MySQLmysql -h <host> -u <login> -p <password>
 
 
Par exemple, nous avons la table suivante :
 
MySQLmysql> DESC contacts;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
Nous voulons insérer le fichier suivant :
 
# cat /var/lib/MySQLmysql/dbalex/data.txt
Anne;Aconda
Clara;Sheller
Pour importer le fichier dans la table contact, nous tapons la commande suivante :
 
MySQLmysql> LOAD DATA INFILE 'data.txt' INTO TABLE contacts
FIELDS TERMINATED BY ";" (prenom,nom);
Query OK, 4 rows affected (0.00 sec)
Vérification :
 
MySQLmysql> SELECT * FROM contacts;
+----+---------+---------+
| id | prenom | nom |
4 rows in set (0.02 sec)
 
Pour connaître l'ensemble des options disponibles de la commande '''LOAD DATA INFILE''', voir la documentation MySQLMysql : [http://dev.MySQLmysql.com/doc/refman/5.0/fr/load-data.html Doc MySQLMysql / LOAD DATA INFILE]
 
=== SELECT INTO OUTFILE ===
La commande SQL '''SELECT INTO OUTFILE''' permet d'exporter des données de la base de données dans un fichier texte.
 
MySQLmysql> SELECT prenom,nom FROM contacts
INTO OUTFILE '/tmp/result.txt'
FIELDS TERMINATED BY ';'
 
 
Remarque : C'est l'utilisateur '''MySQLmysql''' qui crée ce fichier, il doit donc avoir les droits nécessaires :
 
# ls -l /tmp/result.txt
-rw-rw-rw- 1 {{rouge|MySQLmysql}} {{rouge|MySQLmysql}} 53 2008-11-27 09:26 /tmp/result.txt
 
== Les fichiers de données ==
 
Les fichiers contenant les données sont stockés dans '''/var/lib/MySQLmysql/'''.
 
 
'''{{rouge|/var/lib/MySQLmysql/ est donc le répertoire important à sauvegarder.}}'''
 
 
Chaque base de données dispose de son propre répertoire '''/var/lib/MySQLmysql/{{bleu|<nomdelabase>}}/'''.
 
Le fichier '''db.opt''' contient la configuration de la base de données (encodage des caractères ...).
== Les fichiers journaux ==
 
Les fichiers journaux sont contenus dans le répertoire '''/var/log/MySQLmysql/'''.
 
Il y a 3 fichiers importants :
 
* '''{{bleu|MySQLmysql.log}}''' : contient les authentifications des utilisateurs et les requêtes SQL
 
* '''{{bleu|MySQLmysql.err}}''' : contient les erreurs. Sous Debian, ce fichier n'existe pas ou est vide car les erreurs MySQLMysql sont envoyées à '''syslog''' (Debian improvement).
 
* '''{{bleu|MySQLmysql-slow.log}}''' : contient les requêtes lentes
 
 
Pour activer les fichiers log, il faut décommenter les deux lignes dans '''/etc/MySQLmysql/my.cnf''' :
 
log = /var/log/MySQLmysql/MySQLmysql.log
log_slow_queries = /var/log/MySQLmysql/MySQLmysql-slow.log
 
Puis relancer MySQLmysql :
 
/etc/init.d/MySQLmysql restart
 
== Les documentations ==
 
=== Package Debian MySQLmysql-doc-5.0 ===
 
Debian propose un package contenant les documentations MySQLMysql. Il faut pour y accéder installer le package '''MySQLmysql-doc-5.0''' :
 
# apt-get install MySQLmysql-doc-5.0
 
La documentation sur MySQLmysql est accessible dans le répertoire '''/usr/share/doc/MySQLmysql-doc-5.0'''.
 
Dans ce répertoire, on trouve des pages HTML qui contiennent toute la documentation de MySQLmysql.
 
 
=== Documentations en ligne ===
 
'''Sur le site de MySQLmysql'''
 
- [http://dev.MySQLmysql.com/doc/ Toutes les documentations]
 
- [http://dev.MySQLmysql.com/doc/refman/5.0/fr/index.html Le manuel de référence en français]
 
 
=== Listes de diffusion ===
 
'''[http://lists.MySQLmysql.com Toutes les listes de diffusion]'''
 
 
=== IRC ===
 
Canal '''#MySQLmysql''' sur [http://www.freenode.net Freenode]
 
== Modifications des privilèges ==
Il y a quatre techniques pour modifier les privilèges :
 
* modifier directement les tables '''user''' et '''db''' de la base de données '''MySQLmysql''' (ne pas oublier de faire un '''FLUSH PRIVILEGES;''' après)
 
* utiliser les instructions SQL '''GRANT''' et '''REVOKE'''
Exemple : enlever tous les droits à l'utilisateur '''alex''' sur la base de données '''dbalex''' :
 
MySQLmysql> REVOKE ALL PRIVILEGES ON dbalex.* FROM alex;
 
Exemple : donner tous les droits à l'utilisateur '''alex''' sur la base de données '''dbalex''' :
 
MySQLmysql> GRANT ALL PRIVILEGES ON dbalex.* to alex;
 
on peut également spécifier les droits à donner :
 
MySQLmysql> GRANT select,insert,update,delete ON dbalex.* to alex;
 
* utiliser la commande shell '''MySQL_setpermissionmysql_setpermission''' (cf ci-dessous)
 
* utiliser un outil graphique de type MySQLmysql-admin ou [[Phpmyadmin]]
 
== Les commandes d'administration ==
 
Utile : pour ne pas avoir à spécifier le mot de passe du root chaque fois que l'on invoque une commande '''MySQLmysql*''', il suffit de créer un fichier '''.my.cnf''' dans son répertoire de travail et qui contient le mot de passe à utiliser. Attention aux droits d'accès à ce fichier !
 
# echo -e "[client]\npassword=root" > ~/.my.cnf && chmod 600 ~/.my.cnf
password='''root'''
 
=== MySQLmysql ===
 
La commande '''MySQLmysql''' est le client MySQLMysql en ligne de commande. Il permet de se connecter à MySQLMysql et de saisir des commandes SQL.
 
Voici les options les plus courantes :
 
Options de base (communes à la plupart des commandes MySQLmysql) :
 
* -h (--host=) : définit '''l'hôte''' hébergeant la base de données
* -D (--database=) : définit '''la base''' sur laquelle l'utilisateur va se connecter.
* -u (--user=) : précise '''le nom d'utilisateur MySQLMysql''' sous lequel l'utilisateur se connecte.
* -P (--port=) : détermine le '''port à utiliser''' pour la connexion
* -p (--password=) : demande la saisie du '''mot de passe''' ''(obligatoire si l'utilisateur a été défini pour se connecter avec un mot de passe)''
Exemple :
 
$ MySQLmysql --database=dbalex -u paul -p
PASSWORD:
 
Pour aller plus loin :
 
# MySQLmysql --help
 
Donne la liste et un bref descriptif de toutes les options à utiliser avec la commande MySQLmysql
 
=== MySQLdumpmysqldump ===
 
La commande '''MySQLdumpmysqldump''' permet d'exporter des données d'une base de données.
 
Son fonctionnement est particulièrement intéressant car '''elle génère les commandes SQL permettant de recréerre-créer la base de données sur un autre serveur'''.
 
 
Pour exporter la base de donnée « myBase », on utilise la commande suivante :
 
# MySQLdumpmysqldump -u root -p myBase > myBase_backup.sql
 
Ceci fera l'export dans un fichier « myBase_backup.sql ».
 
 
Pour importer une base de données sauvegardée via '''MySQLdumpmysqldump''', on utilise la commande cliente '''MySQLmysql''' et une redirection en entrée :
 
# MySQLmysql -u root -p myBase < myBase_backup.sql
 
L'option '''--compatible''' permet de spécifier à MySQLdumpmysqldump le format à utiliser pour être compatible avec les bases de données existantes. Exemple :
 
# MySQLdumpmysqldump '''--compatible=oracle''' -u root -p myBase > myBase_backup.sql
 
Cette option peut prendre les valeurs suivantes : ansi, MySQL323mysql323, MySQL40mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, or no_field_options
 
En utilisant '''MySQLdumpmysqldump''' et '''ssh''', on peut dupliquer une base de données sur une machien distante :
 
# MySQLdumpmysqldump testdb -p''<mot de passe local>'' | ssh pc211 'echo "create database dbalex;" | MySQLmysql -p''<mot de passe distant>'' ; cat - | MySQLmysql -p''<mot de passe distant>'' dbalex'
 
=== MySQLimportmysqlimport ===
 
...
 
# MySQLimportmysqlimport -p --fields-terminated-by="\;"
--lines-terminated-by="\n"
--columns=prenom,nom
dbalex /var/lib/MySQLmysql/dbalex/contacts.txt
Enter password:
dbalex.contacts: Records: 4 Deleted: 0 Skipped: 0 Warnings: 4
Attention : le nom du fichier (sans extension) doit être le même que la table.
 
=== MySQLadminmysqladmin ===
 
La commande '''MySQLadminmysqladmin''' permet de passer des commandes à MySQLMysql.
 
$ MySQLadminmysqladmin [OPTIONS] commande [options de la commande]
 
OPTIONS :
* '''{{bleu|password}}''' : change le mot de passe
* '''{{bleu|old-password}}''' : change le mot de passe en utilisant l'ancien algorithme de chiffrement
* '''{{bleu|ping}}''' : teste si MySQLmysql fonctionne
* '''{{bleu|reload}}''' : recharge la configuration
* '''{{bleu|refresh}}''' : vide les caches
* '''{{bleu|shutdown}}''' : arrête MySQLmysql
* '''{{bleu|status}}''' : connaitre des informations sur l'état du serveur
* '''{{bleu|extended-status}}''' : connaitre des informations détaillées sur l'état du serveur
* '''{{bleu|proc}}''' ou '''{{bleu|processlist}}''' : connaitre les utilisateurs connectés
* '''{{bleu|debug}}''' : Passe MySQLMysql en mode debug
* '''{{bleu|kill}}''' : Permet d'arrêter des threads. On indique le numéro de connexion à terminer obtenu avec '''proc''' ou '''processlist'''
* '''{{bleu|start-slave}}''' : Démarre la réplication sur le serveur de réplication esclave
* '''{{bleu|stop-slave}}''' : Arrête la réplication sur le serveur de réplication esclave
* '''{{bleu|variables}}''' : Affiche les variables internes MySQLMysql
* '''{{bleu|version}}''' : Affiche le numéro de version de MySQLMysql
* ...
 
Utile : j'ai perdu le mot de passe du compte '''root''' MySQLmysql, comment le changer :
 
1. On arrête MySQLMysql :
 
# /etc/init.d/MySQLmysql stop
 
2. On relance le daemon '''MySQLdmysqld''' avec l'option '''--skip-grant-tables'''
 
# MySQLdmysqld '''--skip-grant-tables'''
 
3. Depuis une autre fenêtre, on se connecte à MySQLMysql
 
# MySQLmysql MySQLmysql
 
4. On met à jour la table '''user''' :
 
MySQLmysql> '''update user set password=PASSWORD('root') where user='root';'''
Query OK, 0 rows affected (0.00 sec)
Rows matched: 3 Changed: 0 Warnings: 0
 
MySQLmysql> '''flush privileges;'''
Query OK, 0 rows affected (0.00 sec)
 
5. On arrête proprement le daemon '''MySQLdmysqld''' :
 
# killall MySQLdmysqld
 
6. On relance MySQLMysql :
 
# /etc/init.d/MySQLmysql start
 
=== MySQLcheckmysqlcheck ===
 
La commande '''MySQLcheckmysqlcheck''' permet de vérifier l'intégrité d'une base de données. On indique la (les) base(s) de données à vérifier (et optionnellement les tables à vérifier), et la commande donne l'état : OK ou corrompue.
 
 
Exemple : vérifier l'intégrité de toutes les tables de la base de données '''testdb''' :
 
# MySQLcheckmysqlcheck '''testdb'''
testdb.client OK
testdb.client2 OK
Vérifier uniquement la table '''client''' :
 
# MySQLcheckmysqlcheck testdb '''client'''
testdb.client OK
 
Vérifier les tables '''user''' et '''db''' de la base de données '''MySQLmysql''' :
 
# MySQLcheckmysqlcheck '''MySQLmysql user db'''
MySQLmysql.user OK
MySQLmysql.db OK
 
 
'''Remarque''' : '''MySQLcheckmysqlcheck''' ne fonctionne qu'en utilisant des instructions SQL (CHECK TABLE, REPAIR TABLE, ANALYZE TABLE, et OPTIMIZE TABLE), il a donc besoin que le serveur MySQLMysql soit en train de fonctionner.
 
=== myisamchk ===
 
La commande '''myisamchk''' permet la restauration d'une table ou plusieurs tables endommagées à la suite de crash répétés du démon MySQLdmysqld.
 
'''{{rouge|Attention}}''' : {{rouge|'''myisamchk''' intervient directement sur les fichiers, il se passe de '''MySQLdmysqld''' contrairement à '''MySQLcheckmysqlcheck''' !}}
 
'''Quelques précautions d'usage:''' : Si vous utilisez {{bleu|myisamchk}} pour réparer ou optimiser les tables, vous devez toujours vous assurer que {{vert|MySQLdmysqld}} n'utilise pas cette table (ce qui s'applique aussi si vous utilisez {{vert|--skip-external-locking}} ). Si vous n'éteignez pas le serveur {{bleu|MySQLdmysqld}} , vous devez au moins utiliser {{bleu|MySQLadminmysqladmin flush-tables}} avant de lancer {{bleu|myisamchk}}.
 
'''{{rouge|Attention}}''' : '''Vos tables peuvent être corrompues si le serveur {{rouge|MySQLdmysqld}} et {{bleu|myisamchk}} travaillent dans une même table simultanément.'''
 
 
On indique à '''myisamchk''' les tables à vérifier en désignant les fichiers index '''MYI''' :
 
# myisamchk /chemin/bases/MySQLmysql/'''{{bleu|nom_de_la_bd}}'''/'''{{bleu|nom_de_table}}'''.MYI
 
On peut également spécifier toutes les tables comme ceci :
 
# myisamchk /chemin/bases/MySQLmysql/'''{{bleu|nom_de_la_bd}}'''/'''{{bleu|*}}'''.MYI
 
Voire carrément vérifier toutes les tables de toutes les bases :
 
# myisamchk /chemin/bases/MySQLmysql/'''{{bleu|*}}'''/'''{{bleu|*}}'''.MYI
 
 
La commande affiche un rapport d'analyse, et si tout est OK, ne signale pas d'erreur :
 
# myisamchk /var/lib/MySQLmysql/ampache/album.MYI
Checking MyISAM file: /var/lib/MySQLmysql/ampache/album.MYI
Data records: 542 Deleted blocks: 0
- check file-size
Si vous voulez uniquement vérifier une table sans que la commande produise un affichage, il faut utiliser l'option '''-s''' (ou '''--silent''').
 
=== MySQL_setpermissionmysql_setpermission ===
 
La commande '''MySQL_setpermissionmysql_setpermission''' permet de définir les permissions des utilisateurs MySQLMysql de manière intéractive.
 
Ecrit en Perl, ce script a besoin des modules '''DBI''' et '''DBD::MySQLmysql''' pour fonctionner.
 
# MySQL_setpermissionmysql_setpermission -p
Option p is ambiguous (password, port)
Password for user to connect to MySQL:
 
'''Les différentes options de {{vert|MySQL_setpermissionmysql_setpermission}} :'''
 
* '''{{bleu|--help}}''' (ou '''{{bleu|-h}}''') : permet d'afficher l'aide
 
* '''{{bleu|--host}}''' (ou '''{{bleu|-h}}''') : se connecte au serveur MySQLMysql donné
 
* '''{{bleu|--password}}''' (ou '''{{bleu|-p}}''') : pour qu'il demande le mot de passe à la connexion
* '''{{bleu|--user}}''' (ou '''{{bleu|-u}}''') : se connecte au serveur avec le nom de compte donné
 
=== MySQLhotcopymysqlhotcopy ===
 
La commande '''MySQLhotcopymysqlhotcopy''' permet de copier une base de données '''à chaud''', c'est à dire sans arrêter le serveur MySQLMysql.
 
Pour cela, la commande bloque les tables afin qu'il n'y ai pas de modification des tables durant la copie.
Exemple d'utilisation :
 
# MySQLhotcopymysqlhotcopy -p root testdb /tmp
Locked 2 tables in 0 seconds.
Flushed tables (`testdb`.`client`, `testdb`.`client2`) in 0 seconds.
Copying indices for 0 files...
Unlocked tables.
MySQLhotcopymysqlhotcopy copied 2 tables (8 files) in 0 seconds (1 seconds overall).
 
Vérification :
# ls -l /tmp/testdb/
total 44
-rw-rw---- 1 MySQLmysql MySQLmysql 8584 déc 2 15:08 client2.frm
-rw-rw---- 1 MySQLmysql MySQLmysql 0 déc 2 15:08 client2.MYD
-rw-rw---- 1 MySQLmysql MySQLmysql 1024 déc 4 16:23 client2.MYI
-rw-rw---- 1 MySQLmysql MySQLmysql 8618 déc 2 15:50 client.frm
-rw-rw---- 1 MySQLmysql MySQLmysql 3090 déc 4 14:01 client.MYD
-rw-rw---- 1 MySQLmysql MySQLmysql 2048 déc 4 16:23 client.MYI
-rw-rw---- 1 MySQLmysql MySQLmysql 65 déc 2 14:58 db.opt
 
== Autres programmes utiles ==
 
=== MySQLccmysqlcc ===
 
'''MySQLccmysqlcc''' est l'ancien logiciel d'administration de MySQLMysql. Il n'est plus développé actuellement, et n'est pas 100% compatible avec la version 5 de MySQLMysql. Il est désormais remplacé par '''MySQLmysql-admin''' et '''MySQLmysql-query-browser'''.
 
=== MySQLmysql-admin ===
 
[[Image:MySQLadministrator1.jpg]]
{{TODO|rajouter descriptif}}
 
=== MySQLmysql-query-browser ===
 
[[Image:MySQLQueryBrowser.jpg]]
{{TODO|rajouter descriptif et une copie écran}}
 
=== MySQLmysql-navigator ===
 
{{TODO|rajouter descriptif et une copie écran}}