Ceci est une ancienne révision du document !
MySQL
MySQL est un système de gestion de bases de données relationnelles (SGBDR) libre, gratuit, performant, très populaire, multi-threadé, multi-utilisateurs….
Installation
L'installation de mysql peut être fait en ligne de commande avec la commande: sudo apt-get install mysql-server
ou par le lien: Installez le paquet mysql-server.
Utilisation
Démarrage
Pour démarrer le serveur MySQL, tapez la commande suivante dans un terminal :
sudo service mysql start
Redémarrage
Pour redémarrer le serveur MySQL, tapez la commande suivante dans un terminal :
sudo service mysql restart
Arrêt
Pour arrêter le serveur MySQL, tapez la commande suivante dans un terminal :
sudo service mysql stop
Rechargement de la configuration
Pour que MySQL prenne en compte les modifications de sa configuration, tapez la commande suivante dans un terminal :
sudo service mysql reload
Forcer la prise en compte de la nouvelle configuration
Pour forcer MySQL à recharger ses fichiers de configuration, tapez la commande suivante dans un terminal :
sudo service mysql force-reload
Configuration
Lancer la console MySQL
Pour palier ce bogue, installez le programme rlwrap (pour en savoir plus : man rlwrap), installez le paquet rlwrap et ajoutez celui-ci avant la commande mysql, exemple :
rlwrap -a mysql -uroot -pvotremotdepasse votrebase
- Si vous n'avez pas défini de mot de passe (déconseillé) :
mysql -u root
- Si vous avez défini un mot de passe :
mysql -u root -p
et tapez votre mot de passe.
Vous arriverez alors sur un prompt du type :
mysql>
Vous pouvez alors taper vos requêtes MySQL. N'oubliez pas le point-virgule à la fin de la requête. Si vous l'oubliez le prompt passe à la ligne.
mysql> select * from ->
Ce passage vous indique que la requête n'est pas terminée. Vous pouvez entrer vos requêtes de cette façon sur plusieurs lignes et enfin la clôturer avec le « ; ».
Sélectionner la base de données à utiliser
Soit directement lorsque vous lancez le client MySQL en ligne de commande :
mysql -u root -D votre_base
Soit une fois connecté à MySQL en tapant :
mysql> use votre_base
Ajouter ou changer le mot de passe de root
Pour changer le mot de passe de l'utilisateur root (qui n'est pas le même que l'utilisateur root du système) :
Si vous êtes déjà connecté dans mysql :
SET password FOR "root"@"localhost" = password('Nouveau_mot_de_passe');
Sinon depuis un terminal :
sudo mysqladmin -u root password Nouveau_mot_de_passe -p Ancien_mot_de_passe
Vous pourrez avoir besoin de mettre votre mot de passe entre guillemet si celui ci comporte des caractères spéciaux.
Lorsque l'utilisateur root ne possède aucun mot de passe, utiliser cette commande :
sudo mysqladmin -u root password Nouveau_mot_de_passe -p ""
Redéfinir de force le mot de passe de root
Méthode 1
Une méthode simple :
sudo service mysql reset-password
Méthode 2
Une autre méthode simple qui fonctionne sur Ubuntu versions 8.04 & + :
sudo dpkg-reconfigure mysql-server-5.5
Méthode 3
Une méthode plus compliquée :
Si vous avez perdu votre mot de passe root pour MySQL, suivez ces quelques étapes :
On stoppe le serveur MySQL :
sudo service mysql stop
On se connecte au serveur sans tenir compte des privilèges utilisateurs :
sudo /usr/bin/mysqld_safe --skip-grant-tables & mysql -h localhost
Nous allons utiliser la table contenant les paramètres de MySQL :
USE mysql
On met en place le nouveau mot de passe :
UPDATE USER SET password = password('<votre_mot_de_passe>') WHERE USER = 'root' AND host = 'localhost';
(remplacez <votre_mot_de_passe>
par le mot de passe de votre choix)
On quitte le prompt de MySQL :
quit
On stoppe totalement mysqld & mysqld_safe :
sudo mysqladmin shutdown
On redémarre le serveur MySQL en utilisation normale :
sudo service mysql start
Utiliser un autre numéro de port
Pour activer la connexion à MySQL via le port 3306, activez l’accès distant en commentant la ligne suivante dans le fichier /etc/mysql/my.cnf (en ajoutant #
au début de la ligne) :
skip-networking
ou
bind-address = 127.0.0.1
Ensuite, si vous voulez changer de port, il suffit de modifier la ligne suivante du bloc [mysqld] pour y mettre le port voulu
port = 3306
Connexions entrantes
Par défaut, MySQL n'écoute que les connexions venant de localhost (127.0.0.1), c'est-à-dire du système sur lequel il est installé.
Pour pouvoir accéder à MySQL depuis un autre ordinateur, ajoutez la ligne suivante au fichier /etc/mysql/my.cnf dans la section « [mysqld]
» :
bind-address = x.x.x.x
où x.x.x.x est l'adresse ip de l'interface sur laquelle MySQL doit écouter. Cela permet de n'écouter que sur une ip privée si vous avez plusieurs interfaces réseaux.
Pour forcer mysql à écouter sur toutes les interfaces réseau, il suffit de commenter la ligne "bind-address = 127.0.0.1" (ou écrire bind-address = 0.0.0.0) Cela peut être dangereux si votre serveur est connecté à Internet directement.
Redémarrez le service après avoir modifié le fichier de configuration :
sudo /etc/init.d/mysql restart
Pour créer un utilisateur mysql qui est autorisé à se connecter à distance :
se connecter sur mysql en root :
mysql -u root -p
une fois connecté :
grant all privileges on *.* to 'remote_user'@'123.123.123.123' identified by 'user_password';
le *.* représente l'accès à l'ensemble des bases de données, si vous voulez autoriser l'accès de l'utilisateur à une seule base de données, remplacez *.* par le nom de la base de données.
le remote_user est le nom de l'utilisateur qui sera créé.
le 123.123.123.123 représente l'ip à partir de laquelle nous pourrons nous connecter à distance.
Pour autoriser l'accès venant de toutes machines (limité par l'authentification), remplacer l'ip par le symbole '%'.
Pour attribuer un mot de passe à l'utilisateur, changer user_password par le nouveau mot de passe..
Pour rendre ces privilèges effectifs :
flush privileges;
Configuration en UTF-8
Il suffit d'ajouter les deux lignes suivantes à la fin de la section « [mysqld]
» du fichier /etc/mysql/my.cnf :
character-set-server=utf8 skip-character-set-client-handshake
NB: en 12.04 remplacez character-set-server=utf8 par character_set_server=utf8
puis de relancer le serveur mysql :
sudo service mysql restart
Vous pouvez vérifier le résultat une fois loggé dans mysql grâce à la commande suivante :
SHOW VARIABLES LIKE 'char%';
Résultat :
mysqld> SHOW VARIABLES LIKE 'char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysqld/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
Quelques requêtes SQL
Toutes ces commandes sont à entrer dans le prompt de MySQL une fois connecté au serveur. (Voir comment lancer la console MySQL ci dessus.)
Base de donnée
Utiliser une base de données existante
USE nom_de_la_base;
Créer une base de données
CREATE DATABASE nom_de_la_base;
Liste des bases de données
SHOW DATABASES ;
Supprimer une base de données
DROP DATABASE nom_de_la_base;
Importer une base de données située dans le répertoire courant (base de donnée exportée en .sql)
SOURCE fichier.sql;
Tables
Liste des tables de la base de données active
SHOW TABLES;
Structure d'une table
DESCRIBE nom_table;
Renommer une table
ALTER TABLE nom_table RENAME AS nouveau_nom;
Pour la syntaxe des requêtes SQL, reportez-vous à la documentation MySQL.
Utilisateurs
Créer un utilisateur
CREATE USER "nom_utilisateur"@"localhost";
Définir un mot de passe
SET password FOR "nom_utilisateur"@"localhost" = password('mot_de_passe');
Supprimer un utilisateur
DROP USER "nom_utilisateur"@"localhost";
Lister les utilisateurs
select user from mysql.user;
Privilèges
Donner tous les droits sur une base de données à un utilisateur précis
GRANT ALL ON nom_base.* TO "nom_utilisateur"@"localhost";
Supprimer les droits sur une base de données à un utilisateur précis
REVOKE ALL privileges ON nom_base.* FROM "nom_utilisateur"@"localhost";
Autres opérations
Qt4 avec Mysql:
Installer la librairie pour mysql afin de l'utiliser sous QT :
sudo apt-get install libqt4-sql-mysql
Sauvegarde et importation
Pour exporter la base de donnée « maBase », utilisez la commande :
mysqldump -u root -p maBase > maBase_backup.sql
Ceci fera l'export dans un fichier « maBase_backup.sql ».
Pour exporter une table (par exemple ma_table )appartenant à une base des données (par exemple maBase) :
mysqldump -u root -p maBase ma_table > ma_table.sql
Ainsi nous aurons une exportation seulement de la table ma_table sans toucher à d'autres tables de la base des données
Pour importer une base de données ou une sauvegarde sur « maBase », utilisez la commande :
mysql -u root -p maBase < maBase_backup.sql
Puis tapez votre mot de passe.
D'autres commandes telles que la suppression des tables, de la base, l'ajout des données dans la base des données, etc. peuvent être trouvées sur le site de documentation de MySQL.
Restauration à partir du dump du datadir
Si vous n'avez pas pu faire un backup pour une raison quelconque (par exemple, vous récupérez un disque dur dont le système est mort), on peut sauvegarder le répertoire « /var/lib/mysql/ » dans lequel chacune des bases est enregistrée dans un répertoire portant son nom.
Pour restaurer vos bases une par une, suivez la procédure ci-dessous (après avoir d'abord installé une version de mysql-server).
Créer une base de données du même nom que celle que vous voulez restaurer :
echo "CREATE DATABASE MaBaseDeDonnee" | mysql -u root -h localhost -p
Copier les fichiers du dump de la base de données (les *.FRM, *.MYD, *.MYI, *.opt), dans le dossier que MySQL a créé pour votre base de données :
cd ~/MonDossierContenantLeDump/MaBaseDeDonnee sudo cp * /var/lib/mysql/MaBaseDeDonnee
Changer les droits sur les fichiers copiés :
sudo chmod -R ug+rw /var/lib/mysql/MaBaseDeDonnee/ sudo chown -R mysql:mysql /var/lib/mysql/MaBaseDeDonnee/
Voilà, votre base doit correctement fonctionner à présent.
Compacter l'espace utilisé par ibdata1
Mysql stocke ses fichiers dans le dossier /var/lib/mysql. Il arrive avec le temps et l'utilisation que le fichier ibdata1 occupe un espace disque très important qui ne sera pas récupéré même en supprimant toutes les bases.
Pistes pour comprendre et corriger ce problème :
- Exporter toutes les bases de données, arrêter mysql, supprimer le fichier, démarrer sql et importer toutes les bases.
Déplacer ses bases de données MySQL
Préambule
La plupart des utilisateurs créent de 2 à 3 partitions sur leur(s) installation(s) :
- / - une partition système
- swap - une partition de de swap
- /home - une partition réservée aux utilisateurs
L'intérêt de ce partitionnement est qu'en cas de réinstallation, les données utilisateurs (données, profils, compte courrier, favoris Internet, thème de bureau, etc.) sont sauvegardées et aussitôt exploitables. Ça n'est malheureusement pas le cas pour les bases de données MySql, et un utilisateur non averti, écrasera sans le savoir ses bases de données qui sont stockées sur /var/lib/mysql (donc dans la partition '/' système).
Il peut donc être intéressant pour cela de déplacer ses bases de données dans la partition /home.
Mise en place
Arrêter MySQL :
sudo service mysql stop
Déplacer le répertoire des bases de données :
sudo mv /var/lib/mysql /home/mysql
Le déplacement par 'mv' permet de ne pas modifier les droits originaux.
Créer un lien symbolique afin de ne pas "casser" les fichiers de configuration originel de MySQL :
sudo ln -s /home/mysql /var/lib/mysql
S'assurer que l'utilisateur 'mysql' est bien le propriétaire de ce lien symbolique :
sudo chown -h mysql:mysql /home/mysql
Pour les versions d'Ubuntu utilisant Apparmor (notamment Ubuntu 10.04 LTS), il vous faut modifier le fichier de configuration MySQL dans Apparmor.
Ouvrir le fichier /etc/apparmor.d/usr.sbin.mysqld et trouver les deux lignes suivantes :
/var/lib/mysql/ r, /var/lib/mysql/** rwk,
et de les modifier en :
/home/mysql/ r, /home/mysql/** rwk,
On relance la configuration d'Apparmor :
sudo service apparmor reload
On relance MySql :
sudo service mysql start
Et voilà.
Administrer MySQL via une une interface Web
Il est possible d’administrer un serveur MySQL via une interface Web avec phpMyAdmin. D'autres outils sont également disponibles et vous en trouverez une liste non exhaustive sur la page Outils MySQL.
Liens
- Memento MySQL [en]
- En savoir plus sur les commandes Mysql [fr] → 3 petits cours sur MySQL à télécharger (PDF)
- La page dédiée aux outils MySQL
- La page des SGBD.
- MariaDB → Le serveur alternatif 100% compatible MySQL
Contributeurs : _Enchained, Hugo, Oscar Nsarhaza, Ner0lph, david96, Gounlaf, McPeter.