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

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
Les deux paragraphes vides sont déjà traités dans le livre MySQL
Ligne 9 : Ligne 9 :
== Moteurs de stockage ==
== Moteurs de stockage ==


Par défaut, Mysql utilise le moteur de stockage '''MyISAM'''.
Par défaut, MySQL utilise le moteur de stockage '''MyISAM'''.


Toutefois, Mysql propose d'autres moteurs de stockage :
Toutefois, MySQL propose d'autres moteurs de stockage :


* '''InnoDB''' : support des transactions (compatible ACID), des clés étrangères et de l'intégrité différentielle
* '''InnoDB''' : support des transactions (compatible ACID), des clés étrangères et de l'intégrité différentielle
Ligne 19 : Ligne 19 :
* '''BDB''' : Berkeley DB est un format de stockage très répandu (utilisé par exemple par OpenLDAP) et supporte les transactions (compatible ACID)
* '''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 Mysql
* '''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 MySQL


* '''CSV''' : les données sont stockées dans des fichiers au format CSV ('''C'''omma '''S'''eparated '''V'''alues)
* '''CSV''' : les données sont stockées dans des fichiers au format CSV ('''C'''omma '''S'''eparated '''V'''alues)
Ligne 63 : Ligne 63 :
== Installation ==
== Installation ==


Pour installer mysql sous Debian, on tape la commande suivante :
Pour installer MySQL sous Debian, on tape la commande suivante :


# apt-get install mysql-server mysql-client
# apt-get install MySQL-server MySQL-client


== Fichier de configuration ==
== Fichier de configuration ==


Le fichier de configuration est '''/etc/mysql/my.cnf'''.
Le fichier de configuration est '''/etc/MySQL/my.cnf'''.


Dans ce fichier de configuration on trouve plusieurs sections :
Dans ce fichier de configuration on trouve plusieurs sections :


# Section du client Mysql
# Section du client MySQL
[client]
[client]
port = 3306
port = 3306
socket = /var/run/mysqld/mysqld.sock
socket = /var/run/MySQLd/MySQLd.sock
# Section de mysqld_safe
# Section de MySQLd_safe
[mysqld_safe]
[MySQLd_safe]
socket = /var/run/mysqld/mysqld.sock
socket = /var/run/MySQLd/MySQLd.sock
nice = 0
nice = 0
# Section du serveur Mysql
# Section du serveur MySQL
[mysqld]
[MySQLd]
# Utilisateur qui lance le daemon
# Utilisateur qui lance le daemon
user = mysql
user = MySQL
# Fichier qui contient le PID du processus
# Fichier qui contient le PID du processus
pid-file = /var/run/mysqld/mysqld.pid
pid-file = /var/run/MySQLd/MySQLd.pid
# Fichier socket qui permet une communication locale avec Mysqld (plus performant que de passer par le port 3306)
# Fichier socket qui permet une communication locale avec MySQLd (plus performant que de passer par le port 3306)
socket = /var/run/mysqld/mysqld.sock
socket = /var/run/MySQLd/MySQLd.sock
# Port sur lequel écoute Mysql
# Port sur lequel écoute MySQL
port = 3306
port = 3306
# Répertoire de base de Mysql
# Répertoire de base de MySQL
basedir = /usr
basedir = /usr
# Répertoire contenant les bases de données
# Répertoire contenant les bases de données
datadir = /var/lib/mysql
datadir = /var/lib/MySQL
# Répertoire temporaire
# Répertoire temporaire
Ligne 108 : Ligne 108 :
# Permet de personnaliser le langage
# Permet de personnaliser le langage
language = /usr/share/mysql/english
language = /usr/share/MySQL/english
# Evite le blockage externe
# Évite le blocage externe
skip-external-locking
skip-external-locking
# Adresse IP sur lequel écoute Mysql
# Adresse IP sur lequel écoute MySQL
bind-address = 127.0.0.1
bind-address = 127.0.0.1
# Taille des caches Mysql : permet d'optimiser les performances de Mysql
# Taille des caches MySQL : permet d'optimiser les performances de MySQL
key_buffer = 16M
key_buffer = 16M
max_allowed_packet = 16M
max_allowed_packet = 16M
Ligne 127 : Ligne 127 :
# Emplacement du fichier de Log
# Emplacement du fichier de Log
log = /var/log/mysql/mysql.log
log = /var/log/MySQL/MySQL.log
# On peut logger les requetes lentes
# On peut logger les requêtes lentes
#log_slow_queries = /var/log/mysql/mysql-slow.log
#log_slow_queries = /var/log/MySQL/MySQL-slow.log
#long_query_time = 2
#long_query_time = 2
#log-queries-not-using-indexes
#log-queries-not-using-indexes
# Permet d'exécuter Mysql dans une cage chroot
# Permet d'exécuter MySQL dans une cage chroot
# chroot = /var/lib/mysql/
# chroot = /var/lib/MySQL/
# Options pour définir les certificats Mysql
# Options pour définir les certificats MySQL
# ssl-ca=/etc/mysql/cacert.pem
# ssl-ca=/etc/MySQL/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-cert=/etc/MySQL/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
# ssl-key=/etc/MySQL/server-key.pem
# Section pour mysqldump
# Section pour MySQLdump
[mysqldump]
[MySQLdump]
quick
quick
quote-names
quote-names
Ligne 151 : Ligne 151 :
# Section pour ?
# Section pour ?
[mysql]
[MySQL]
#no-auto-rehash # faster start of mysql but no tab completition
#no-auto-rehash # faster start of MySQL but no tab completition
Ligne 160 : Ligne 160 :




Chaque fois que l'on modifie ce fichier, il faut relancer mysql :
Chaque fois que l'on modifie ce fichier, il faut relancer MySQL :


# /etc/init.d/mysql restart
# /etc/init.d/MySQL restart


Les bases de données sont sotckées dans le répertoire '''/var/lib/mysql/'''. Il faut donc sauvegarder ce répertoire.
Les bases de données sont stockées dans le répertoire '''/var/lib/MySQL/'''. Il faut donc sauvegarder ce répertoire.


Pour se connecter à Mysql à partir du shell, on utilise le client Mysql :
Pour se connecter à MySQL à partir du shell, on utilise le client MySQL :


# mysql -h <host> -u <login> -p <password>
# MySQL -h <host> -u <login> -p <password>




Ligne 180 : Ligne 180 :
Par exemple, nous avons la table suivante :
Par exemple, nous avons la table suivante :


mysql> DESC contacts;
MySQL> DESC contacts;
+--------+-------------+------+-----+---------+----------------+
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
| Field | Type | Null | Key | Default | Extra |
Ligne 192 : Ligne 192 :
Nous voulons insérer le fichier suivant :
Nous voulons insérer le fichier suivant :


# cat /var/lib/mysql/dbalex/data.txt
# cat /var/lib/MySQL/dbalex/data.txt
Anne;Aconda
Anne;Aconda
Clara;Sheller
Clara;Sheller
Ligne 200 : Ligne 200 :
Pour importer le fichier dans la table contact, nous tapons la commande suivante :
Pour importer le fichier dans la table contact, nous tapons la commande suivante :


mysql> LOAD DATA INFILE 'data.txt' INTO TABLE contacts
MySQL> LOAD DATA INFILE 'data.txt' INTO TABLE contacts
FIELDS TERMINATED BY ";" (prenom,nom);
FIELDS TERMINATED BY ";" (prenom,nom);
Query OK, 4 rows affected (0.00 sec)
Query OK, 4 rows affected (0.00 sec)
Ligne 207 : Ligne 207 :
Vérification :
Vérification :


mysql> SELECT * FROM contacts;
MySQL> SELECT * FROM contacts;
+----+---------+---------+
+----+---------+---------+
| id | prenom | nom |
| id | prenom | nom |
Ligne 218 : Ligne 218 :
4 rows in set (0.02 sec)
4 rows in set (0.02 sec)


Pour connaître l'ensemble des options disponibles de la commande '''LOAD DATA INFILE''', voir la documentation Mysql : [http://dev.mysql.com/doc/refman/5.0/fr/load-data.html Doc Mysql / LOAD DATA INFILE]
Pour connaître l'ensemble des options disponibles de la commande '''LOAD DATA INFILE''', voir la documentation MySQL : [http://dev.MySQL.com/doc/refman/5.0/fr/load-data.html Doc MySQL / LOAD DATA INFILE]


=== SELECT INTO OUTFILE ===
=== SELECT INTO OUTFILE ===
Ligne 224 : Ligne 224 :
La commande SQL '''SELECT INTO OUTFILE''' permet d'exporter des données de la base de données dans un fichier texte.
La commande SQL '''SELECT INTO OUTFILE''' permet d'exporter des données de la base de données dans un fichier texte.


mysql> SELECT prenom,nom FROM contacts
MySQL> SELECT prenom,nom FROM contacts
INTO OUTFILE '/tmp/result.txt'
INTO OUTFILE '/tmp/result.txt'
FIELDS TERMINATED BY ';'
FIELDS TERMINATED BY ';'
Ligne 236 : Ligne 236 :




Remarque : C'est l'utilisateur '''mysql''' qui crée ce fichier, il doit donc avoir les droits nécessaires :
Remarque : C'est l'utilisateur '''MySQL''' qui crée ce fichier, il doit donc avoir les droits nécessaires :


# ls -l /tmp/result.txt
# ls -l /tmp/result.txt
-rw-rw-rw- 1 {{rouge|mysql}} {{rouge|mysql}} 53 2008-11-27 09:26 /tmp/result.txt
-rw-rw-rw- 1 {{rouge|MySQL}} {{rouge|MySQL}} 53 2008-11-27 09:26 /tmp/result.txt


== Les fichiers de données ==
== Les fichiers de données ==


Les fichiers contenant les données sont stockés dans '''/var/lib/mysql/'''.
Les fichiers contenant les données sont stockés dans '''/var/lib/MySQL/'''.




'''{{rouge|/var/lib/mysql/ est donc le répertoire important à sauvegarder.}}'''
'''{{rouge|/var/lib/MySQL/ est donc le répertoire important à sauvegarder.}}'''




Chaque base de données dispose de son propre répertoire '''/var/lib/mysql/{{bleu|<nomdelabase>}}/'''.
Chaque base de données dispose de son propre répertoire '''/var/lib/MySQL/{{bleu|<nomdelabase>}}/'''.


Le fichier '''db.opt''' contient la configuration de la base de données (encodage des caractères ...).
Le fichier '''db.opt''' contient la configuration de la base de données (encodage des caractères ...).
Ligne 267 : Ligne 267 :
== Les fichiers journaux ==
== Les fichiers journaux ==


Les fichiers journaux sont contenus dans le répertoire '''/var/log/mysql/'''.
Les fichiers journaux sont contenus dans le répertoire '''/var/log/MySQL/'''.


Il y a 3 fichiers importants :
Il y a 3 fichiers importants :


* '''{{bleu|mysql.log}}''' : contient les authentifications des utilisateurs et les requêtes SQL
* '''{{bleu|MySQL.log}}''' : contient les authentifications des utilisateurs et les requêtes SQL


* '''{{bleu|mysql.err}}''' : contient les erreurs. Sous Debian, ce fichier n'existe pas ou est vide car les erreurs Mysql sont envoyées à '''syslog''' (Debian improvement).
* '''{{bleu|MySQL.err}}''' : contient les erreurs. Sous Debian, ce fichier n'existe pas ou est vide car les erreurs MySQL sont envoyées à '''syslog''' (Debian improvement).


* '''{{bleu|mysql-slow.log}}''' : contient les requêtes lentes
* '''{{bleu|MySQL-slow.log}}''' : contient les requêtes lentes




Pour activer les fichiers log, il faut décommenter les deux lignes dans '''/etc/mysql/my.cnf''' :
Pour activer les fichiers log, il faut décommenter les deux lignes dans '''/etc/MySQL/my.cnf''' :


log = /var/log/mysql/mysql.log
log = /var/log/MySQL/MySQL.log
log_slow_queries = /var/log/mysql/mysql-slow.log
log_slow_queries = /var/log/MySQL/MySQL-slow.log


Puis relancer mysql :
Puis relancer MySQL :


/etc/init.d/mysql restart
/etc/init.d/MySQL restart


== Les documentations ==
== Les documentations ==


=== Package Debian mysql-doc-5.0 ===
=== Package Debian MySQL-doc-5.0 ===


Debian propose un package contenant les documentations Mysql. Il faut pour y accéder installer le package '''mysql-doc-5.0''' :
Debian propose un package contenant les documentations MySQL. Il faut pour y accéder installer le package '''MySQL-doc-5.0''' :


# apt-get install mysql-doc-5.0
# apt-get install MySQL-doc-5.0


La documentation sur mysql est accessible dans le répertoire '''/usr/share/doc/mysql-doc-5.0'''.
La documentation sur MySQL est accessible dans le répertoire '''/usr/share/doc/MySQL-doc-5.0'''.


Dans ce répertoire, on trouve des pages HTML qui contiennent toute la documentation de mysql.
Dans ce répertoire, on trouve des pages HTML qui contiennent toute la documentation de MySQL.




=== Documentations en ligne ===
=== Documentations en ligne ===


'''Sur le site de mysql'''
'''Sur le site de MySQL'''


- [http://dev.mysql.com/doc/ Toutes les documentations]
- [http://dev.MySQL.com/doc/ Toutes les documentations]


- [http://dev.mysql.com/doc/refman/5.0/fr/index.html Le manuel de référence en français]
- [http://dev.MySQL.com/doc/refman/5.0/fr/index.html Le manuel de référence en français]




Ligne 312 : Ligne 312 :
=== Listes de diffusion ===
=== Listes de diffusion ===


'''[http://lists.mysql.com Toutes les listes de diffusion]'''
'''[http://lists.MySQL.com Toutes les listes de diffusion]'''




=== IRC ===
=== IRC ===


Canal '''#mysql''' sur [http://www.freenode.net Freenode]
Canal '''#MySQL''' sur [http://www.freenode.net Freenode]


== Modifications des privilèges ==
== Modifications des privilèges ==
Ligne 323 : Ligne 323 :
Il y a quatre techniques pour modifier les 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 '''mysql''' (ne pas oublier de faire un '''FLUSH PRIVILEGES;''' après)
* modifier directement les tables '''user''' et '''db''' de la base de données '''MySQL''' (ne pas oublier de faire un '''FLUSH PRIVILEGES;''' après)


* utiliser les instructions SQL '''GRANT''' et '''REVOKE'''
* utiliser les instructions SQL '''GRANT''' et '''REVOKE'''
Ligne 329 : Ligne 329 :
Exemple : enlever tous les droits à l'utilisateur '''alex''' sur la base de données '''dbalex''' :
Exemple : enlever tous les droits à l'utilisateur '''alex''' sur la base de données '''dbalex''' :


mysql> REVOKE ALL PRIVILEGES ON dbalex.* FROM alex;
MySQL> REVOKE ALL PRIVILEGES ON dbalex.* FROM alex;


Exemple : donner tous les droits à l'utilisateur '''alex''' sur la base de données '''dbalex''' :
Exemple : donner tous les droits à l'utilisateur '''alex''' sur la base de données '''dbalex''' :


mysql> GRANT ALL PRIVILEGES ON dbalex.* to alex;
MySQL> GRANT ALL PRIVILEGES ON dbalex.* to alex;


on peut également spécifier les droits à donner :
on peut également spécifier les droits à donner :


mysql> GRANT select,insert,update,delete ON dbalex.* to alex;
MySQL> GRANT select,insert,update,delete ON dbalex.* to alex;


* utiliser la commande shell '''mysql_setpermission''' (cf ci-dessous)
* utiliser la commande shell '''MySQL_setpermission''' (cf ci-dessous)


* utiliser un outil graphique de type mysql-admin ou [[Phpmyadmin]]
* utiliser un outil graphique de type MySQL-admin ou [[Phpmyadmin]]


== Les commandes d'administration ==
== 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 '''mysql*''', 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 !
Utile : pour ne pas avoir à spécifier le mot de passe du root chaque fois que l'on invoque une commande '''MySQL*''', 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
# echo -e "[client]\npassword=root" > ~/.my.cnf && chmod 600 ~/.my.cnf
Ligne 356 : Ligne 356 :
password='''root'''
password='''root'''


=== mysql ===
=== MySQL ===


La commande '''mysql''' est le client Mysql en ligne de commande. Il permet de se connecter à Mysql et de saisir des commandes SQL.
La commande '''MySQL''' est le client MySQL en ligne de commande. Il permet de se connecter à MySQL et de saisir des commandes SQL.


Voici les options les plus courantes :
Voici les options les plus courantes :


Options de base (communes à la plupart des commandes mysql) :
Options de base (communes à la plupart des commandes MySQL) :


* -h (--host=) : définit '''l'hôte''' hébergeant la base de données
* -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.
* -D (--database=) : définit '''la base''' sur laquelle l'utilisateur va se connecter.
* -u (--user=) : précise '''le nom d'utilisateur Mysql''' sous lequel l'utilisateur se connecte.
* -u (--user=) : précise '''le nom d'utilisateur MySQL''' sous lequel l'utilisateur se connecte.
* -P (--port=) : détermine le '''port à utiliser''' pour la connexion
* -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)''
* -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)''
Ligne 372 : Ligne 372 :
Exemple :
Exemple :


$ mysql --database=dbalex -u paul -p
$ MySQL --database=dbalex -u paul -p
PASSWORD:
PASSWORD:


Ligne 384 : Ligne 384 :
Pour aller plus loin :
Pour aller plus loin :


# mysql --help
# MySQL --help


Donne la liste et un bref descriptif de toutes les options à utiliser avec la commande mysql
Donne la liste et un bref descriptif de toutes les options à utiliser avec la commande MySQL


=== mysqldump ===
=== MySQLdump ===


La commande '''mysqldump''' permet d'exporter des données d'une base de données.
La commande '''MySQLdump''' 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éer la base de données sur un autre serveur'''.
Son fonctionnement est particulièrement intéressant car '''elle génère les commandes SQL permettant de recréer la base de données sur un autre serveur'''.




Pour exporter la base de donnée « myBase », on utilise la commande suivante :
Pour exporter la base de donnée « myBase », on utilise la commande suivante :


# mysqldump -u root -p myBase > myBase_backup.sql
# MySQLdump -u root -p myBase > myBase_backup.sql


Ceci fera l'export dans un fichier « myBase_backup.sql ».
Ceci fera l'export dans un fichier « myBase_backup.sql ».




Pour importer une base de données sauvegardée via '''mysqldump''', on utilise la commande cliente '''mysql''' et une redirection en entrée :
Pour importer une base de données sauvegardée via '''MySQLdump''', on utilise la commande cliente '''MySQL''' et une redirection en entrée :


# mysql -u root -p myBase < myBase_backup.sql
# MySQL -u root -p myBase < myBase_backup.sql


L'option '''--compatible''' permet de spécifier à mysqldump le format à utiliser pour être compatible avec les bases de données existantes. Exemple :
L'option '''--compatible''' permet de spécifier à MySQLdump le format à utiliser pour être compatible avec les bases de données existantes. Exemple :


# mysqldump '''--compatible=oracle''' -u root -p myBase > myBase_backup.sql
# MySQLdump '''--compatible=oracle''' -u root -p myBase > myBase_backup.sql


Cette option peut prendre les valeurs suivantes : ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, or no_field_options
Cette option peut prendre les valeurs suivantes : ansi, MySQL323, MySQL40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, or no_field_options


En utilisant '''mysqldump''' et '''ssh''', on peut dupliquer une base de données sur une machien distante :
En utilisant '''MySQLdump''' et '''ssh''', on peut dupliquer une base de données sur une machien distante :


# mysqldump testdb -p''<mot de passe local>'' | ssh pc211 'echo "create database dbalex;" | mysql -p''<mot de passe distant>'' ; cat - | mysql -p''<mot de passe distant>'' dbalex'
# MySQLdump testdb -p''<mot de passe local>'' | ssh pc211 'echo "create database dbalex;" | MySQL -p''<mot de passe distant>'' ; cat - | MySQL -p''<mot de passe distant>'' dbalex'


=== mysqlimport ===
=== MySQLimport ===


...
...


# mysqlimport -p --fields-terminated-by="\;"
# MySQLimport -p --fields-terminated-by="\;"
--lines-terminated-by="\n"
--lines-terminated-by="\n"
--columns=prenom,nom
--columns=prenom,nom
dbalex /var/lib/mysql/dbalex/contacts.txt
dbalex /var/lib/MySQL/dbalex/contacts.txt
Enter password:
Enter password:
dbalex.contacts: Records: 4 Deleted: 0 Skipped: 0 Warnings: 4
dbalex.contacts: Records: 4 Deleted: 0 Skipped: 0 Warnings: 4
Ligne 430 : Ligne 430 :
Attention : le nom du fichier (sans extension) doit être le même que la table.
Attention : le nom du fichier (sans extension) doit être le même que la table.


=== mysqladmin ===
=== MySQLadmin ===


La commande '''mysqladmin''' permet de passer des commandes à Mysql.
La commande '''MySQLadmin''' permet de passer des commandes à MySQL.


$ mysqladmin [OPTIONS] commande [options de la commande]
$ MySQLadmin [OPTIONS] commande [options de la commande]


OPTIONS :
OPTIONS :
Ligne 454 : Ligne 454 :
* '''{{bleu|password}}''' : change le mot de passe
* '''{{bleu|password}}''' : change le mot de passe
* '''{{bleu|old-password}}''' : change le mot de passe en utilisant l'ancien algorithme de chiffrement
* '''{{bleu|old-password}}''' : change le mot de passe en utilisant l'ancien algorithme de chiffrement
* '''{{bleu|ping}}''' : teste si mysql fonctionne
* '''{{bleu|ping}}''' : teste si MySQL fonctionne
* '''{{bleu|reload}}''' : recharge la configuration
* '''{{bleu|reload}}''' : recharge la configuration
* '''{{bleu|refresh}}''' : vide les caches
* '''{{bleu|refresh}}''' : vide les caches
* '''{{bleu|shutdown}}''' : arrête mysql
* '''{{bleu|shutdown}}''' : arrête MySQL
* '''{{bleu|status}}''' : connaitre des informations sur l'état du serveur
* '''{{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|extended-status}}''' : connaitre des informations détaillées sur l'état du serveur
* '''{{bleu|proc}}''' ou '''{{bleu|processlist}}''' : connaitre les utilisateurs connectés
* '''{{bleu|proc}}''' ou '''{{bleu|processlist}}''' : connaitre les utilisateurs connectés
* '''{{bleu|debug}}''' : Passe Mysql en mode debug
* '''{{bleu|debug}}''' : Passe MySQL 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|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|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|stop-slave}}''' : Arrête la réplication sur le serveur de réplication esclave
* '''{{bleu|variables}}''' : Affiche les variables internes Mysql
* '''{{bleu|variables}}''' : Affiche les variables internes MySQL
* '''{{bleu|version}}''' : Affiche le numéro de version de Mysql
* '''{{bleu|version}}''' : Affiche le numéro de version de MySQL
* ...
* ...


Utile : j'ai perdu le mot de passe du compte '''root''' mysql, comment le changer :
Utile : j'ai perdu le mot de passe du compte '''root''' MySQL, comment le changer :


1. On arrête Mysql :
1. On arrête MySQL :


# /etc/init.d/mysql stop
# /etc/init.d/MySQL stop


2. On relance le daemon '''mysqld''' avec l'option '''--skip-grant-tables'''
2. On relance le daemon '''MySQLd''' avec l'option '''--skip-grant-tables'''


# mysqld '''--skip-grant-tables'''
# MySQLd '''--skip-grant-tables'''


3. Depuis une autre fenêtre, on se connecte à Mysql
3. Depuis une autre fenêtre, on se connecte à MySQL


# mysql mysql
# MySQL MySQL


4. On met à jour la table '''user''' :
4. On met à jour la table '''user''' :


mysql> '''update user set password=PASSWORD('root') where user='root';'''
MySQL> '''update user set password=PASSWORD('root') where user='root';'''
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Rows matched: 3 Changed: 0 Warnings: 0
Rows matched: 3 Changed: 0 Warnings: 0


mysql> '''flush privileges;'''
MySQL> '''flush privileges;'''
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)


5. On arrête proprement le daemon '''mysqld''' :
5. On arrête proprement le daemon '''MySQLd''' :


# killall mysqld
# killall MySQLd


6. On relance Mysql :
6. On relance MySQL :


# /etc/init.d/mysql start
# /etc/init.d/MySQL start


=== mysqlcheck ===
=== MySQLcheck ===


La commande '''mysqlcheck''' 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.
La commande '''MySQLcheck''' 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.




Ligne 515 : Ligne 515 :
Exemple : vérifier l'intégrité de toutes les tables de la base de données '''testdb''' :
Exemple : vérifier l'intégrité de toutes les tables de la base de données '''testdb''' :


# mysqlcheck '''testdb'''
# MySQLcheck '''testdb'''
testdb.client OK
testdb.client OK
testdb.client2 OK
testdb.client2 OK
Ligne 521 : Ligne 521 :
Vérifier uniquement la table '''client''' :
Vérifier uniquement la table '''client''' :


# mysqlcheck testdb '''client'''
# MySQLcheck testdb '''client'''
testdb.client OK
testdb.client OK


Vérifier les tables '''user''' et '''db''' de la base de données '''mysql''' :
Vérifier les tables '''user''' et '''db''' de la base de données '''MySQL''' :


# mysqlcheck '''mysql user db'''
# MySQLcheck '''MySQL user db'''
mysql.user OK
MySQL.user OK
mysql.db OK
MySQL.db OK




'''Remarque''' : '''mysqlcheck''' ne fonctionne qu'en utilisant des instructions SQL (CHECK TABLE, REPAIR TABLE, ANALYZE TABLE, et OPTIMIZE TABLE), il a donc besoin que le serveur Mysql soit en train de fonctionner.
'''Remarque''' : '''MySQLcheck''' ne fonctionne qu'en utilisant des instructions SQL (CHECK TABLE, REPAIR TABLE, ANALYZE TABLE, et OPTIMIZE TABLE), il a donc besoin que le serveur MySQL soit en train de fonctionner.


=== myisamchk ===
=== 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 mysqld.
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 MySQLd.


'''{{rouge|Attention}}''' : {{rouge|'''myisamchk''' intervient directement sur les fichiers, il se passe de '''mysqld''' contrairement à '''mysqlcheck''' !}}
'''{{rouge|Attention}}''' : {{rouge|'''myisamchk''' intervient directement sur les fichiers, il se passe de '''MySQLd''' contrairement à '''MySQLcheck''' !}}


'''Quelques précautions d'usage:''' : Si vous utilisez {{bleu|myisamchk}} pour réparer ou optimiser les tables, vous devez toujours vous assurer que {{vert|mysqld}} 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|mysqld}} , vous devez au moins utiliser {{bleu|mysqladmin flush-tables}} avant de lancer {{bleu|myisamchk}}.
'''Quelques précautions d'usage:''' : Si vous utilisez {{bleu|myisamchk}} pour réparer ou optimiser les tables, vous devez toujours vous assurer que {{vert|MySQLd}} 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|MySQLd}} , vous devez au moins utiliser {{bleu|MySQLadmin flush-tables}} avant de lancer {{bleu|myisamchk}}.


'''{{rouge|Attention}}''' : '''Vos tables peuvent être corrompues si le serveur {{rouge|mysqld}} et {{bleu|myisamchk}} travaillent dans une même table simultanément.'''
'''{{rouge|Attention}}''' : '''Vos tables peuvent être corrompues si le serveur {{rouge|MySQLd}} et {{bleu|myisamchk}} travaillent dans une même table simultanément.'''




Ligne 548 : Ligne 548 :
On indique à '''myisamchk''' les tables à vérifier en désignant les fichiers index '''MYI''' :
On indique à '''myisamchk''' les tables à vérifier en désignant les fichiers index '''MYI''' :


# myisamchk /chemin/bases/mysql/'''{{bleu|nom_de_la_bd}}'''/'''{{bleu|nom_de_table}}'''.MYI
# myisamchk /chemin/bases/MySQL/'''{{bleu|nom_de_la_bd}}'''/'''{{bleu|nom_de_table}}'''.MYI


On peut également spécifier toutes les tables comme ceci :
On peut également spécifier toutes les tables comme ceci :


# myisamchk /chemin/bases/mysql/'''{{bleu|nom_de_la_bd}}'''/'''{{bleu|*}}'''.MYI
# myisamchk /chemin/bases/MySQL/'''{{bleu|nom_de_la_bd}}'''/'''{{bleu|*}}'''.MYI


Voire carrément vérifier toutes les tables de toutes les bases :
Voire carrément vérifier toutes les tables de toutes les bases :


# myisamchk /chemin/bases/mysql/'''{{bleu|*}}'''/'''{{bleu|*}}'''.MYI
# myisamchk /chemin/bases/MySQL/'''{{bleu|*}}'''/'''{{bleu|*}}'''.MYI




La commande affiche un rapport d'analyse, et si tout est OK, ne signale pas d'erreur :
La commande affiche un rapport d'analyse, et si tout est OK, ne signale pas d'erreur :


# myisamchk /var/lib/mysql/ampache/album.MYI
# myisamchk /var/lib/MySQL/ampache/album.MYI
Checking MyISAM file: /var/lib/mysql/ampache/album.MYI
Checking MyISAM file: /var/lib/MySQL/ampache/album.MYI
Data records: 542 Deleted blocks: 0
Data records: 542 Deleted blocks: 0
- check file-size
- check file-size
Ligne 579 : Ligne 579 :
Si vous voulez uniquement vérifier une table sans que la commande produise un affichage, il faut utiliser l'option '''-s''' (ou '''--silent''').
Si vous voulez uniquement vérifier une table sans que la commande produise un affichage, il faut utiliser l'option '''-s''' (ou '''--silent''').


=== mysql_setpermission ===
=== MySQL_setpermission ===


La commande '''mysql_setpermission''' permet de définir les permissions des utilisateurs Mysql de manière intéractive.
La commande '''MySQL_setpermission''' permet de définir les permissions des utilisateurs MySQL de manière intéractive.


Ecrit en Perl, ce script a besoin des modules '''DBI''' et '''DBD::mysql''' pour fonctionner.
Ecrit en Perl, ce script a besoin des modules '''DBI''' et '''DBD::MySQL''' pour fonctionner.


# mysql_setpermission -p
# MySQL_setpermission -p
Option p is ambiguous (password, port)
Option p is ambiguous (password, port)
Password for user to connect to MySQL:
Password for user to connect to MySQL:
Ligne 655 : Ligne 655 :


'''Les différentes options de {{vert|mysql_setpermission}} :'''
'''Les différentes options de {{vert|MySQL_setpermission}} :'''


* '''{{bleu|--help}}''' (ou '''{{bleu|-h}}''') : permet d'afficher l'aide
* '''{{bleu|--help}}''' (ou '''{{bleu|-h}}''') : permet d'afficher l'aide


* '''{{bleu|--host}}''' (ou '''{{bleu|-h}}''') : se connecte au serveur Mysql donné
* '''{{bleu|--host}}''' (ou '''{{bleu|-h}}''') : se connecte au serveur MySQL donné


* '''{{bleu|--password}}''' (ou '''{{bleu|-p}}''') : pour qu'il demande le mot de passe à la connexion
* '''{{bleu|--password}}''' (ou '''{{bleu|-p}}''') : pour qu'il demande le mot de passe à la connexion
Ligne 667 : Ligne 667 :
* '''{{bleu|--user}}''' (ou '''{{bleu|-u}}''') : se connecte au serveur avec le nom de compte donné
* '''{{bleu|--user}}''' (ou '''{{bleu|-u}}''') : se connecte au serveur avec le nom de compte donné


=== mysqlhotcopy ===
=== MySQLhotcopy ===


La commande '''mysqlhotcopy''' permet de copier une base de données '''à chaud''', c'est à dire sans arrêter le serveur Mysql.
La commande '''MySQLhotcopy''' permet de copier une base de données '''à chaud''', c'est à dire sans arrêter le serveur MySQL.


Pour cela, la commande bloque les tables afin qu'il n'y ai pas de modification des tables durant la copie.
Pour cela, la commande bloque les tables afin qu'il n'y ai pas de modification des tables durant la copie.
Ligne 677 : Ligne 677 :
Exemple d'utilisation :
Exemple d'utilisation :


# mysqlhotcopy -p root testdb /tmp
# MySQLhotcopy -p root testdb /tmp
Locked 2 tables in 0 seconds.
Locked 2 tables in 0 seconds.
Flushed tables (`testdb`.`client`, `testdb`.`client2`) in 0 seconds.
Flushed tables (`testdb`.`client`, `testdb`.`client2`) in 0 seconds.
Ligne 683 : Ligne 683 :
Copying indices for 0 files...
Copying indices for 0 files...
Unlocked tables.
Unlocked tables.
mysqlhotcopy copied 2 tables (8 files) in 0 seconds (1 seconds overall).
MySQLhotcopy copied 2 tables (8 files) in 0 seconds (1 seconds overall).


Vérification :
Vérification :
Ligne 689 : Ligne 689 :
# ls -l /tmp/testdb/
# ls -l /tmp/testdb/
total 44
total 44
-rw-rw---- 1 mysql mysql 8584 déc 2 15:08 client2.frm
-rw-rw---- 1 MySQL MySQL 8584 déc 2 15:08 client2.frm
-rw-rw---- 1 mysql mysql 0 déc 2 15:08 client2.MYD
-rw-rw---- 1 MySQL MySQL 0 déc 2 15:08 client2.MYD
-rw-rw---- 1 mysql mysql 1024 déc 4 16:23 client2.MYI
-rw-rw---- 1 MySQL MySQL 1024 déc 4 16:23 client2.MYI
-rw-rw---- 1 mysql mysql 8618 déc 2 15:50 client.frm
-rw-rw---- 1 MySQL MySQL 8618 déc 2 15:50 client.frm
-rw-rw---- 1 mysql mysql 3090 déc 4 14:01 client.MYD
-rw-rw---- 1 MySQL MySQL 3090 déc 4 14:01 client.MYD
-rw-rw---- 1 mysql mysql 2048 déc 4 16:23 client.MYI
-rw-rw---- 1 MySQL MySQL 2048 déc 4 16:23 client.MYI
-rw-rw---- 1 mysql mysql 65 déc 2 14:58 db.opt
-rw-rw---- 1 MySQL MySQL 65 déc 2 14:58 db.opt


== Autres programmes utiles ==
== Autres programmes utiles ==


=== mysqlcc ===
=== MySQLcc ===


'''mysqlcc''' est l'ancien logiciel d'administration de Mysql. Il n'est plus développé actuellement, et n'est pas 100% compatible avec la version 5 de Mysql. Il est désormais remplacé par '''mysql-admin''' et '''mysql-query-browser'''.
'''MySQLcc''' est l'ancien logiciel d'administration de MySQL. Il n'est plus développé actuellement, et n'est pas 100% compatible avec la version 5 de MySQL. Il est désormais remplacé par '''MySQL-admin''' et '''MySQL-query-browser'''.


=== mysql-admin ===
=== MySQL-admin ===


[[Image:MySQLadministrator1.jpg]]
[[Image:MySQLadministrator1.jpg]]
Ligne 709 : Ligne 709 :
{{TODO|rajouter descriptif}}
{{TODO|rajouter descriptif}}


=== mysql-query-browser ===
=== MySQL-query-browser ===


[[Image:MySQLQueryBrowser.jpg]]
[[Image:MySQLQueryBrowser.jpg]]
Ligne 715 : Ligne 715 :
{{TODO|rajouter descriptif et une copie écran}}
{{TODO|rajouter descriptif et une copie écran}}


=== mysql-navigator ===
=== MySQL-navigator ===


{{TODO|rajouter descriptif et une copie écran}}
{{TODO|rajouter descriptif et une copie écran}}

== Tests de performance ==
{{...}}

=== MyISAM vs Innodb ===
{{...}}


[[Catégorie:MySQL|Linux]]
[[Catégorie:MySQL|Linux]]

Version du 13 juillet 2015 à 16:50

Introduction

MySQL est un serveur de bases de données relationnelles SQL (OpenSource), fonctionnant sur le port 3306 en mode TCP.

Prérequis : Apache.

Moteurs de stockage

Par défaut, MySQL utilise le moteur de stockage MyISAM.

Toutefois, MySQL propose d'autres moteurs de stockage :

  • InnoDB : support des transactions (compatible ACID), des clés étrangères et de l'intégrité différentielle
  • MERGE ou MRG_MYISAM : permet de fusionner plusieurs tables de structures identiques
  • 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 MySQL
  • CSV : les données sont stockées dans des fichiers au format CSV (Comma Separated Values)
  • ARCHIVE : stocke des informations en utilisant le minimum de place disque (perte de la notion d'index)
  • BLACKHOLE : les données sont tout simplement envoyées vers /dev/null et donc perdues. Moteur utilisé pour faire des tests

Types de données

Chaque information stockée dans une table est définie par un type décrivant la nature de l'information enregistrée.

Les nombres

  • TINYINT
  • SMALLINT
  • MEDIUMINT
  • INT
  • BIGINT
  • FLOAT
  • DOUBLE
  • DECIMAL

Les chaînes de caractères

  • CHAR
  • VARCHAR
  • BINARY
  • VARBINARY
  • BLOB
  • TEXT
  • ENUM
  • SET

Les dates et heures

  • DATE
  • TIME
  • DATETIME
  • TIMESTAMP
  • YEAR

Installation

Pour installer MySQL sous Debian, on tape la commande suivante :

 # apt-get install MySQL-server MySQL-client

Fichier de configuration

Le fichier de configuration est /etc/MySQL/my.cnf.

Dans ce fichier de configuration on trouve plusieurs sections :

 # Section du client MySQL
 [client]
 port            = 3306
 socket          = /var/run/MySQLd/MySQLd.sock
 
 # Section de MySQLd_safe
 [MySQLd_safe]
 socket          = /var/run/MySQLd/MySQLd.sock
 nice            = 0
 
 
 # Section du serveur MySQL
 [MySQLd]
 # Utilisateur qui lance le daemon
 user            = MySQL
 
 # Fichier qui contient le PID du processus
 pid-file        = /var/run/MySQLd/MySQLd.pid
 
 # Fichier socket qui permet une communication locale avec MySQLd (plus performant que de passer par le port 3306)
 socket          = /var/run/MySQLd/MySQLd.sock
 
 # Port sur lequel écoute MySQL
 port            = 3306
 
 # Répertoire de base de MySQL
 basedir         = /usr
 
 # Répertoire contenant les bases de données
 datadir         = /var/lib/MySQL
 
 # Répertoire temporaire
 tmpdir          = /tmp
 
 # Permet de personnaliser le langage
 language        = /usr/share/MySQL/english
 
 # Évite le blocage externe
 skip-external-locking
 
 # Adresse IP sur lequel écoute MySQL
 bind-address            = 127.0.0.1
 
 # Taille des caches MySQL : permet d'optimiser les performances de MySQL
 key_buffer              = 16M
 max_allowed_packet      = 16M
 thread_stack            = 128K
 thread_cache_size       = 8
 #max_connections        = 100
 #table_cache            = 64
 #thread_concurrency     = 10
 query_cache_limit       = 1M
 
 # Emplacement du fichier de Log
 log            = /var/log/MySQL/MySQL.log
 
 # On peut logger les requêtes lentes
 #log_slow_queries       = /var/log/MySQL/MySQL-slow.log
 #long_query_time = 2
 #log-queries-not-using-indexes
 
 # Permet d'exécuter MySQL dans une cage chroot
 # chroot = /var/lib/MySQL/
 
 # Options pour définir les certificats MySQL
 # ssl-ca=/etc/MySQL/cacert.pem
 # ssl-cert=/etc/MySQL/server-cert.pem
 # ssl-key=/etc/MySQL/server-key.pem
 
 
 # Section pour MySQLdump
 [MySQLdump]
 quick
 quote-names
 max_allowed_packet      = 16M
 
 
 # Section pour ?
 [MySQL]
 #no-auto-rehash # faster start of MySQL but no tab completition
 
 
 # Section pour le format ISAM
 [isamchk]
 key_buffer              = 16M


Chaque fois que l'on modifie ce fichier, il faut relancer MySQL :

 # /etc/init.d/MySQL restart

Les bases de données sont stockées dans le répertoire /var/lib/MySQL/. Il faut donc sauvegarder ce répertoire.

Pour se connecter à MySQL à partir du shell, on utilise le client MySQL :

 # MySQL -h <host> -u <login> -p <password>


Commandes SQL d'importation / exportation

LOAD DATA INFILE

La commande SQL LOAD DATA INFILE permet d'importer des données dans une table SQL à partir d'un fichier texte.

Par exemple, nous avons la table suivante :

MySQL> DESC contacts;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO   | PRI | NULL    | auto_increment |
| prenom | varchar(50) | YES  |     | NULL    |                |
| nom    | varchar(50) | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

Nous voulons insérer le fichier suivant :

# cat /var/lib/MySQL/dbalex/data.txt
Anne;Aconda
Clara;Sheller
Sophie;Garo
Pauline;Machin

Pour importer le fichier dans la table contact, nous tapons la commande suivante :

MySQL> LOAD DATA INFILE 'data.txt' INTO TABLE contacts 
       FIELDS TERMINATED BY ";" (prenom,nom);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

Vérification :

MySQL> SELECT * FROM contacts;
+----+---------+---------+
| id | prenom  | nom     |
+----+---------+---------+
| 18 | Anne    | Aconda  |
| 19 | Clara   | Sheller |
| 20 | Sophie  | Garo    |
| 21 | Pauline | Machin  |
+----+---------+---------+
4 rows in set (0.02 sec)

Pour connaître l'ensemble des options disponibles de la commande LOAD DATA INFILE, voir la documentation MySQL : Doc MySQL / 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.

MySQL> SELECT prenom,nom FROM contacts
       INTO OUTFILE '/tmp/result.txt'
       FIELDS TERMINATED BY ';'
       LINES TERMINATED BY '\n';
Query OK, 4 rows affected (0.02 sec)


Dans le cas présent, les champs "prenom" et "nom" ont été sélectionnés à partir de la table "contacts" afin de pouvoir être exportés dans le fichier "result.txt" situé dans le répertoire "/tmp"

Attention, il faut penser à préciser les clauses "FIELDS" et "LINES" destinées à traiter correctement les délimitations des champs et des lignes lors de l'export !


Remarque : C'est l'utilisateur MySQL qui crée ce fichier, il doit donc avoir les droits nécessaires :

# ls -l /tmp/result.txt
-rw-rw-rw- 1 MySQL MySQL 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/MySQL/.


/var/lib/MySQL/ est donc le répertoire important à sauvegarder.


Chaque base de données dispose de son propre répertoire /var/lib/MySQL/<nomdelabase>/.

Le fichier db.opt contient la configuration de la base de données (encodage des caractères ...).


Le fichier <nomdetable>.FRM décrit la structure de la table.


Dans le cas du format MyISAM, chaque table est enregistrée dans deux fichiers :

  • <nomdetable>.MYD : contient les données
  • <nomdetable>.MYI : contient les index


Dans le cas du format Innodb, toutes les tables sont stockées dans un ou plusieurs seuls fichiers : ibdata1, ibdata2 ...

Les fichiers journaux

Les fichiers journaux sont contenus dans le répertoire /var/log/MySQL/.

Il y a 3 fichiers importants :

  • MySQL.log : contient les authentifications des utilisateurs et les requêtes SQL
  • MySQL.err : contient les erreurs. Sous Debian, ce fichier n'existe pas ou est vide car les erreurs MySQL sont envoyées à syslog (Debian improvement).
  • MySQL-slow.log : contient les requêtes lentes


Pour activer les fichiers log, il faut décommenter les deux lignes dans /etc/MySQL/my.cnf :

log = /var/log/MySQL/MySQL.log
log_slow_queries = /var/log/MySQL/MySQL-slow.log

Puis relancer MySQL :

/etc/init.d/MySQL restart

Les documentations

Package Debian MySQL-doc-5.0

Debian propose un package contenant les documentations MySQL. Il faut pour y accéder installer le package MySQL-doc-5.0 :

# apt-get install MySQL-doc-5.0

La documentation sur MySQL est accessible dans le répertoire /usr/share/doc/MySQL-doc-5.0.

Dans ce répertoire, on trouve des pages HTML qui contiennent toute la documentation de MySQL.


Documentations en ligne

Sur le site de MySQL

- Toutes les documentations

- Le manuel de référence en français


Listes de diffusion

Toutes les listes de diffusion


IRC

Canal #MySQL sur 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 MySQL (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 :

MySQL> REVOKE ALL PRIVILEGES ON dbalex.* FROM alex;

Exemple : donner tous les droits à l'utilisateur alex sur la base de données dbalex :

MySQL> GRANT ALL PRIVILEGES ON dbalex.* to alex;

on peut également spécifier les droits à donner :

MySQL> GRANT select,insert,update,delete ON dbalex.* to alex;
  • utiliser la commande shell MySQL_setpermission (cf ci-dessous)
  • utiliser un outil graphique de type MySQL-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 MySQL*, 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
# ls -l /root/.my.cnf
-rw------- 1 root root 23 déc  4 15:53 /root/.my.cnf
# cat /root/.my.cnf
[client]
password=root

MySQL

La commande MySQL est le client MySQL en ligne de commande. Il permet de se connecter à MySQL et de saisir des commandes SQL.

Voici les options les plus courantes :

Options de base (communes à la plupart des commandes MySQL) :

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

$ MySQL --database=dbalex -u paul -p
PASSWORD:

Dans cet exemple la requête demande de se connecter par mot de passe à la base dbalex en tant que paul.

Autres options intéressantes :

  • -H (--html) : permet de produire des sorties en HTML
  • -X (--xml) : permet de produire des sorties en XML

Pour aller plus loin :

# MySQL --help

Donne la liste et un bref descriptif de toutes les options à utiliser avec la commande MySQL

MySQLdump

La commande MySQLdump 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éer la base de données sur un autre serveur.


Pour exporter la base de donnée « myBase », on utilise la commande suivante :

# MySQLdump -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 MySQLdump, on utilise la commande cliente MySQL et une redirection en entrée :

# MySQL -u root -p myBase < myBase_backup.sql

L'option --compatible permet de spécifier à MySQLdump le format à utiliser pour être compatible avec les bases de données existantes. Exemple :

# MySQLdump --compatible=oracle -u root -p myBase > myBase_backup.sql

Cette option peut prendre les valeurs suivantes : ansi, MySQL323, MySQL40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, or no_field_options

En utilisant MySQLdump et ssh, on peut dupliquer une base de données sur une machien distante :

# MySQLdump testdb -p<mot de passe local> | ssh pc211 'echo "create database dbalex;" | MySQL -p<mot de passe distant> ; cat - | MySQL -p<mot de passe distant> dbalex'

MySQLimport

...

# MySQLimport -p --fields-terminated-by="\;"
              --lines-terminated-by="\n"
              --columns=prenom,nom
              dbalex /var/lib/MySQL/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.

MySQLadmin

La commande MySQLadmin permet de passer des commandes à MySQL.

$ MySQLadmin [OPTIONS] commande [options de la commande]

OPTIONS :

-h host
-u user
-p password 

Commandes :

  • create : crée une base de données
  • drop : supprime une base de données
  • flush-privileges : recharge les tables de droits
  • flush-hosts : met à jour les informations concernant les hôtes
  • flush-logs : met à jour les informations concernant les journaux
  • flush-status : efface les variables status
  • flush-tables : met à jour les informations concernant les tables
  • flush-threads : met à jour les informations concernant les threads
  • password : change le mot de passe
  • old-password : change le mot de passe en utilisant l'ancien algorithme de chiffrement
  • ping : teste si MySQL fonctionne
  • reload : recharge la configuration
  • refresh : vide les caches
  • shutdown : arrête MySQL
  • status : connaitre des informations sur l'état du serveur
  • extended-status : connaitre des informations détaillées sur l'état du serveur
  • proc ou processlist : connaitre les utilisateurs connectés
  • debug : Passe MySQL en mode debug
  • kill : Permet d'arrêter des threads. On indique le numéro de connexion à terminer obtenu avec proc ou processlist
  • start-slave : Démarre la réplication sur le serveur de réplication esclave
  • stop-slave : Arrête la réplication sur le serveur de réplication esclave
  • variables : Affiche les variables internes MySQL
  • version : Affiche le numéro de version de MySQL
  • ...

Utile : j'ai perdu le mot de passe du compte root MySQL, comment le changer :

1. On arrête MySQL :

# /etc/init.d/MySQL stop

2. On relance le daemon MySQLd avec l'option --skip-grant-tables

# MySQLd --skip-grant-tables

3. Depuis une autre fenêtre, on se connecte à MySQL

# MySQL MySQL

4. On met à jour la table user :

MySQL> update user set password=PASSWORD('root') where user='root';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 3  Changed: 0  Warnings: 0
MySQL> flush privileges;
Query OK, 0 rows affected (0.00 sec)

5. On arrête proprement le daemon MySQLd :

# killall MySQLd

6. On relance MySQL :

# /etc/init.d/MySQL start

MySQLcheck

La commande MySQLcheck 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.


Options courantes :

  • -r ou --repair  : permet de corriger presque tout, sauf les problèmes de doublons pour les clés uniques.
  • -a ou --analyse  : permet d'analyser les tables indiquées.
  • -o ou --optimize  : permet d'optimiser les tables indiquées.

Exemple : vérifier l'intégrité de toutes les tables de la base de données testdb :

# MySQLcheck testdb
testdb.client                                      OK
testdb.client2                                     OK

Vérifier uniquement la table client :

# MySQLcheck testdb client
testdb.client                                      OK

Vérifier les tables user et db de la base de données MySQL :

# MySQLcheck MySQL user db
MySQL.user                                         OK
MySQL.db                                           OK


Remarque : MySQLcheck ne fonctionne qu'en utilisant des instructions SQL (CHECK TABLE, REPAIR TABLE, ANALYZE TABLE, et OPTIMIZE TABLE), il a donc besoin que le serveur MySQL 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 MySQLd.

Attention : myisamchk intervient directement sur les fichiers, il se passe de MySQLd contrairement à MySQLcheck !

Quelques précautions d'usage: : 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.

Attention : Vos tables peuvent être corrompues si le serveur MySQLd et myisamchk travaillent dans une même table simultanément.


Vérifier la cohérence d'une table:

On indique à myisamchk les tables à vérifier en désignant les fichiers index MYI :

# myisamchk /chemin/bases/MySQL/nom_de_la_bd/nom_de_table.MYI

On peut également spécifier toutes les tables comme ceci :

# myisamchk /chemin/bases/MySQL/nom_de_la_bd/*.MYI

Voire carrément vérifier toutes les tables de toutes les bases :

# myisamchk /chemin/bases/MySQL/*/*.MYI


La commande affiche un rapport d'analyse, et si tout est OK, ne signale pas d'erreur :

# myisamchk /var/lib/MySQL/ampache/album.MYI
 
 Checking MyISAM file: /var/lib/MySQL/ampache/album.MYI
 Data records:     542   Deleted blocks:       0
 - check file-size
 - check record delete-chain
 - check key delete-chain
 - check index reference
 - check data record references index: 1
 - check data record references index: 2
 - check data record references index: 3
 - check data record references index: 4
 - check record links

Cette commande trouvera 99.99% de toutes les erreurs. Elle ne peut toutefois détecter les erreurs qui impliquent uniquement le fichier de données (ce qui est très inhabituel).

Si vous voulez uniquement vérifier une table sans que la commande produise un affichage, il faut utiliser l'option -s (ou --silent).

MySQL_setpermission

La commande MySQL_setpermission permet de définir les permissions des utilisateurs MySQL de manière intéractive.

Ecrit en Perl, ce script a besoin des modules DBI et DBD::MySQL pour fonctionner.

# MySQL_setpermission -p
Option p is ambiguous (password, port)
Password for user  to connect to MySQL:
######################################################################
## Welcome to the permission setter 1.4 for MySQL.
## made by Luuk de Boer
######################################################################
What would you like to do:
 1. Set password for an existing user.
 2. Create a database + user privilege for that database
    and host combination (user can only do SELECT)
 3. Create/append user privilege for an existing database
    and host combination (user can only do SELECT)
 4. Create/append broader user privileges for an existing
    database and host combination
    (user can do SELECT,INSERT,UPDATE,DELETE)
 5. Create/append quite extended user privileges for an
    existing database and host combination (user can do
    SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,
    LOCK TABLES,CREATE TEMPORARY TABLES)
 6. Create/append full privileges for an existing database
    and host combination (user has FULL privilege)
 7. Remove all privileges for for an existing database and
    host combination.
    (user will have all permission fields set to N)
 0. exit this program

Make your choice [1,2,3,4,5,6,7,0]:


  • 1 : Permet de modifier le mot de passe d'un utilisateur éxistant


  • 2 : Permet d'ajouter/modifier le droit SELECT d'un utilisateur sur une table en créant un utilisateur et une table :
# Make your choice [1,2,3,4,5,6,7,0]: 2


# Which database would you like to add: dbuser //On donne le nom de la base de donnée à créer.
# The new database dbuser will be created

# What username is to be created: user //On donne le nom de l'utilisateur à créer.
# Username = user

# We now need to know from what host(s) the user will connect.
# Keep in mind that % means 'from any host' ...
# The host please: % //On donne l'host
#

L'utilisateur user aura le droit SELECT sur la base de donnée dbuser


  • 3 : Même fonction que la sélection 2, sauf que l'on donne le droit SELECT sur une table existante.


  • 4 : Même fonction que la sélection 2, pour les droits SELECT,INSERT,UPDATE,DELETE.


  • 5 : Même fonction que la sélection 2, pour les droits SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,LOCK TABLES,CREATE TEMPORARY TABLES


  • 6 : Même fonction que la sélection 2, pour tous les droits.


  • 7 : Met les droits par défaut (N) pour un utilisateur existant.


  • 0 : sortir du programme


Les différentes options de MySQL_setpermission :

  • --help (ou -h) : permet d'afficher l'aide
  • --host (ou -h) : se connecte au serveur MySQL donné
  • --password (ou -p) : pour qu'il demande le mot de passe à la connexion
  • --port (ou -P) : donne le numéro de port si différent de celui par défaut
  • --user (ou -u) : se connecte au serveur avec le nom de compte donné

MySQLhotcopy

La commande MySQLhotcopy permet de copier une base de données à chaud, c'est à dire sans arrêter le serveur MySQL.

Pour cela, la commande bloque les tables afin qu'il n'y ai pas de modification des tables durant la copie.

Les tables sont ensuite débloquées.

Exemple d'utilisation :

# MySQLhotcopy -p root testdb /tmp
Locked 2 tables in 0 seconds.
Flushed tables (`testdb`.`client`, `testdb`.`client2`) in 0 seconds.
Copying 8 files...
Copying indices for 0 files...
Unlocked tables.
MySQLhotcopy copied 2 tables (8 files) in 0 seconds (1 seconds overall).

Vérification :

# ls -l /tmp/testdb/
total 44
-rw-rw---- 1 MySQL MySQL 8584 déc  2 15:08 client2.frm
-rw-rw---- 1 MySQL MySQL    0 déc  2 15:08 client2.MYD
-rw-rw---- 1 MySQL MySQL 1024 déc  4 16:23 client2.MYI
-rw-rw---- 1 MySQL MySQL 8618 déc  2 15:50 client.frm
-rw-rw---- 1 MySQL MySQL 3090 déc  4 14:01 client.MYD
-rw-rw---- 1 MySQL MySQL 2048 déc  4 16:23 client.MYI
-rw-rw---- 1 MySQL MySQL   65 déc  2 14:58 db.opt

Autres programmes utiles

MySQLcc

MySQLcc est l'ancien logiciel d'administration de MySQL. Il n'est plus développé actuellement, et n'est pas 100% compatible avec la version 5 de MySQL. Il est désormais remplacé par MySQL-admin et MySQL-query-browser.

MySQL-admin

À faire...link={{{link}}}

rajouter descriptif

MySQL-query-browser

À faire...link={{{link}}}

rajouter descriptif et une copie écran

MySQL-navigator

À faire...link={{{link}}}

rajouter descriptif et une copie écran