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

Les deux paragraphes vides sont déjà traités dans le livre MySQL
(Les deux paragraphes vides sont déjà traités dans le livre MySQL)
== Moteurs de stockage ==
 
Par défaut, MysqlMySQL utilise le moteur de stockage '''MyISAM'''.
 
Toutefois, MysqlMySQL propose d'autres moteurs de stockage :
 
* '''InnoDB''' : support des transactions (compatible ACID), des clés étrangères et de l'intégrité différentielle
* '''BDB''' : Berkeley DB est un format de stockage très répandu (utilisé par exemple par OpenLDAP) et supporte les transactions (compatible ACID)
 
* '''HEAP''' ou '''MEMORY''' : ces tables sont stockées en mémoire vive (RAM), elles sont très rapides mais ne survivent pas à un redémarrage de MysqlMySQL
 
* '''CSV''' : les données sont stockées dans des fichiers au format CSV ('''C'''omma '''S'''eparated '''V'''alues)
== 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
# EviteÉvite le blockageblocage 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 requetesrequê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 sotckéesstocké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 re-créerrecré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}}
 
== Tests de performance ==
{{...}}
 
=== MyISAM vs Innodb ===
{{...}}
 
[[Catégorie:MySQL|Linux]]