Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
mysql [Le 14/10/2010, 07:17]
24.201.112.22
mysql [Le 19/01/2021, 16:23] (Version actuelle)
82.64.77.142 [Compacter l'espace utilisé par ibdata1]
Ligne 1: Ligne 1:
-{{tag>​serveur réseau ​sgbd}} +{{tag>Xenial Bionic Focal sgbd mysql serveur réseau}}
- +
----- +
  
 ====== MySQL ====== ====== MySQL ======
  
-**MySQL** est un système de gestion de bases de données relationnelles (SGBDR) ​libre et gratuit. Il est performant ​et très populaire. Il est multi-threadé ​et multi-utilisateurs.+**[[https://​www.mysql.com/​|MySQL]]** est un [[wpfr>​SGBD|système de gestion de bases de données relationnelles]] (SGBDR) ​propriétaire, ​gratuitperformanttrès populairemulti-threadémulti-utilisateurs
  
 +<note tip>​MySQL appartient à [[wpfr>​Oracle_(entreprise)|Oracle]]. Il existe un fork open-source,​ plus communautaire,​ 100% compatible MySQL et a priori plus performant créé et maintenu par Michael Wideniusm fondateur de MySQL. Il s'agit de [[:​MariaDB]],​ qui est également disponible sur Ubuntu, et choisi par défaut sur [[wpfr>​Debian]].</​note>​
  
 +MySQL est principalement un //serveur// de bases de données. Pour s'y connecter localement ou à distance, on utilise un //client//. Il peut s'agir de la commande ''​mysql'',​ ou couramment d'un script [[:PHP]]. Il faudra dans ce cas installer le [[:​php#​association_avec_un_serveur_de_base_de_donnees|module]] [[apt>​php-mysql]] qui permet à PHP de communiquer avec un serveur MySQL. ​
  
 ===== Installation ===== ===== Installation =====
  
-[[:​tutoriel:​comment_installer_un_paquet|Installez le paquet]] [[apt://mysql-server|mysql-server]]. +L'​installation de ce paquet doit se faire de préférence en utilisant ​[[terminal]] via la commande :​ <​code>​sudo apt install mysql-server</​code>​ 
-[[http://www.system-linux.eu/​index.php?​post/​2008/​12/​29/​Configure-et-Installation-de-mysql|Installation à la main]] +[[apt>mysql-server]] est un [[:​tutoriel:​creer un meta paquet|méta-paquet]] qui installera MySQL 5.7 sur [[:xenial|Xenial 16.04]] et sur [[:bionic|Bionic 18.04]], MySQL 8.0 sur [[:Focal|Focal 20.04]].
-[[http://www.system-linux.eu/​index.php?​post/​2009/​06/​28/​Proteger-son-server-Mysql-avec-GreenSQL|Protéger votre mysql-server]]+
  
 ===== Utilisation ===== ===== Utilisation =====
  
-==== Savoir si MySQL est lancé ​====+==== Démarrage ​====
  
-Pour savoir si le serveur MySQL est lancé, tapez la commande suivante dans un terminal :+Pour démarrer ​le serveur MySQL, tapez la [[:​commande_shell|commande]] suivante dans un [[:terminal]]:
  
-  sudo service ​mysql status+  sudo systemctl start mysql
  
-Si MySQL est en fonctionnement,​ vous devriez obtenir une ligne semblable à : 
  
-<​file>​mysql start/​running</​file>​+==== Redémarrage ====
  
-==== Démarrage ====+Pour redémarrer le serveur MySQL, tapez la [[:​commande_shell|commande]] suivante dans un [[:​terminal]]:​
  
-Pour démarrer le serveur MySQL, tapez la commande suivante dans un terminal :+  sudo systemctl restart mysql
  
-  sudo service mysql start+==== Arrêt ====
  
-==== Redémarrage ====+Pour arrêter le serveur MySQL, tapez la [[:​commande_shell|commande]] suivante dans un [[:​terminal]]:​ 
 +  sudo systemctl stop mysql
  
-Pour redémarrer le serveur MySQL, tapez la commande suivante dans un terminal :+==== Rechargement de la configuration ====
  
-  ​sudo service ​mysql restart+Pour que MySQL prenne en compte les modifications de sa configuration,​ [[:​commande_shell|commande]] suivante dans un [[:​terminal]]:​ 
 +  ​sudo systemctl reload ​mysql
  
-==== Arrêt ​====+==== Forcer la prise en compte de la nouvelle configuration ​====
  
-Pour arrêter le serveur ​MySQL, ​tapez la commande suivante dans un terminal :+Pour forcer ​MySQL à recharger ses fichiers de configuration[[:​commande_shell|commande]] suivante dans un [[:terminal]]: 
 +  sudo systemctl force-reload mysql
  
-  sudo service ​mysql stop+==== Connaître la version ==== 
 +Il est parfois utile de connaître la version installée:​\\ 
 +<​code>​mysql --version</​code>​
  
-==== Rechargement de la configuration ​====+===== Configuration =====
  
-Pour que MySQL prenne en compte les modifications de sa configuration,​ tapez la commande suivante dans un terminal :+==== Authentification ====
  
-  sudo service ​mysql reload+L'​inscription des utilisateurs de MySQL se fait sur la table //users// de la base de données //mysql//. On peut donc les administrer manuellement depuis cette table, mais il existe des outils pour simplifier leur gestion (tels que ''​mysqladmin'',​ ''​mysql_secure_installation'',​ [[:​mysql_outils#​adminer|adminer]] ou [[:​phpMyAdmin]]).
  
-==== Forcer la prise en compte de la nouvelle configuration ====+Il existe plusieurs méthodes d'​authentifications. Nativement MySQL permet de définir ses propres couples d'​utilisateurs et de mots de passe. Mais il existe des plugins permettant d'​implémenter d'​autres comportements,​ dont //​[[https://​dev.mysql.com/​doc/​refman/​5.7/​en/​socket-pluggable-authentication.html|auth_socket]]//​ qui permet de s'​identifier au moyen de comptes UNIX (qui correspondent donc aux utilisateurs Ubuntu).\\  
 +Il faut tout de même créer le compte ​sur MySQL pour pouvoir l'​utiliser,​ mais il n'est plus nécessaire de renseigner le mot de passe. Il faut par contre lancer le client (la commande''​mysql''​ ou le script [[:PHP]]) avec l'​utilisateur correspondant.
  
-Pour forcer MySQL à recharger ses fichiers de configurationtapez la commande suivante dans un terminal ​:+Pour choisir l'un ou l'​autre des comportementon renseigne le champs //plugin// de la table //​user// ​: 
 +  * //​mysql_native_password//​ ou vide pour utiliser l'​authentification native de MySQL. 
 +  * //​auth_socket//​ pour se connecter avec un utilisateur Ubuntu.
  
-  sudo service mysql force-reload +Depuis [[:​bionic|Bionic 18.04]], Ubuntu lie par défaut le compte //root// de Ubuntu avec //​auth_socket//​ en installant MySQL. Auparavant il fallait spécifier un mot de passe lors de l'​installation. Cela a différents impacts sur les méthodes de travail. ((Voir [[https://​forum.ubuntu-fr.org/​viewtopic.php?​id=2027272|ce fil]] sur le forum pour plus d'​information au sujet des répercutions de l'​utilisation de //​auth_socket//​.))
- +
-===== Configuration =====+
  
 ==== Lancer la console MySQL ==== ==== Lancer la console MySQL ====
  
-<note important>​Bug possible rencontré avec le client text de mysql, la touche suppr du clavier insère le tilde **~** (au lieu de supprimer).  +**Avant [[:​bionic|Ubuntu 18.04 Bionic]]**\\ 
-Pour palier ce bug, installez le programme rlwrap ​(pour en savoir plus : //man rlwrap//) <​code>​sudo apt-get install rlwrap</​code>​ et ajoutez celui-ci avant la commande mysql, exemple : <​code>​rlwrap -a mysql -uroot -pvotremotdepasse votrebase</​code>​ </​note>​ +L’authentification de l'​utilisateur root de MySQL se fait par mot de passe (//mysql_native_password//).
   * Si vous n'avez pas défini de mot de passe (déconseillé) : <​code>​mysql -u root</​code>​   * Si vous n'avez pas défini de mot de passe (déconseillé) : <​code>​mysql -u root</​code>​
   * Si vous avez défini un mot de passe : <​code>​mysql -u root -p</​code>​ et tapez votre mot de passe.   * Si vous avez défini un mot de passe : <​code>​mysql -u root -p</​code>​ et tapez votre mot de passe.
  
 +**À partir de [[:​bionic|Ubuntu 18.04 Bionic]]**\\
 +À partir ce cette version l'​utilisateur root de MySQL est authentifié par son compte système (plugin //​auth_socket//​) et non plus par un mot de passe (plugin //​mysql_native_password//​).
 +<​code>​sudo mysql</​code>​
 +
 +**La console MySQL**\\
 Vous arriverez alors sur un prompt du type : Vous arriverez alors sur un prompt du type :
  
Ligne 83: Ligne 90:
 ==== Sélectionner la base de données à utiliser ==== ==== Sélectionner la base de données à utiliser ====
  
-Soit directement lorsque vous lancez le client ​mysql en ligne de commande :+Soit directement lorsque vous lancez le client ​MySQL en ligne de commande: 
 +<​code>​mysql -u root -D votre_base -p</​code>​ 
 +<​code>​sudo mysql -D votre_base</​code>​ 
 +  ​
  
-  mysql -u root -p votre_base+Soit une fois connecté à MySQL en tapant la [[:​commande_shell|commande]] suivante dans un [[:​terminal]]:​
  
-Soit une fois connecté à mysql en tapant : +  ​mysql> use votre_base
- +
-  ​mysql> use votre_base;+
  
 ==== Ajouter ou changer le mot de passe de root ==== ==== 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), tapez la commande suivante dans un terminal ​:+<note warning>​ 
 +À partir ​de [[:​bionic|Bionic 18.04]] il est vivement déconseillé ​de modifier la méthode d'[[#​authentification]] par défaut de l'​utilisateur ​//root// (//​auth_socket//​). Le système ​utilise ce compte pour effectuer des tâches de maintenance (auparavant Ubuntu créait un compte spécial //​debian-sys-maint//​ à cette fin)
 + 
 +Si vous souhaitez créer ​un accès "​super-administrateur"​ pour gérer l'​intégralité de vos bases de données et de leurs utilisateurs avec une application tierce ([[:phpMyAdmin]],​ [[mysql_outils#​adminer|Adminer]],​ ou autre), suivez [[phpmyadmin#​acces_root|cette autre procédure]]. 
 +</​note>​
  
-  sudo mysqladmin -u root password nouveau_mot_de_passe -p+Pour changer ou attribuer un mot de passe à l'​utilisateur //root// (qui n'est pas forcément le même que l'​utilisateur //root// du système) **seulement sur [[:​xenial|Xenial 16.04]] et précédents** :
  
 +Dans la console MySQL :
  
 +  ALTER USER '​root'​@'​localhost'​ IDENTIFIED WITH mysql_native_password BY '​le_mot_de_pass_choisi';​
  
 +Ou avec ''​mysqladmin''​ pour changer le mot de passe :
 +
 +  sudo mysqladmin 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.
 +
 +  ​
 ==== Redéfinir de force le mot de passe de root ==== ==== Redéfinir de force le mot de passe de root ====
-=== Méthode 1 === 
  
-Si vous avez perdu votre mot de passe Root pour MySQLsuivez ces quelques étapes ​:+<note important>​Ceci ne s'​applique que pour les versions n'​utilisant pas //​[[#​authentification|auth_socket]]//​ par défaut pour le compte //root//donc [[:​xenial|Xenial 16.04]] et les versions précédentes ([[:trusty|Trusty 14.04]]).
  
-On stoppe le serveur ​MySQL :+Sur [[:​bionic|Bionic 18.04]] ​MySQL n'​utilise pas de mot de passe pour le compte //root//. Il se sert du système d'​authentification des utilisateurs Ubuntu, et donc de [[:sudo]].</​note>​
  
-  ​sudo  ​service ​mysql stop+Deux possibilités s'​offrent à vous. Une méthode simple : <​code>​sudo dpkg-reconfigure ​mysql-server-5.7</​code>​
  
-On se connecte ​au serveur sans tenir compte ​des privilèges utilisateurs ​:+Une méthode plus compliquée,​ si vous avez perdu votre mot de passe root pour MySQL, suivez ces quelques étapes :​ 
 +  * On se connecte ​à l'aide du compte ​spécial debian-syst-maint (défini dans le fichier /​etc/​mysql/​debian.cnf) : <​code>​sudo mysql --defaults-file=/​etc/​mysql/​debian.cnf</​code>​ 
 +  * On met en place le nouveau mot de passe <code mysql> 
 +ALTER USER '​root'​@'​localhost'​ IDENTIFIED WITH mysql_native_password BY '​le_mot_de_pass_choisi';</​code><​code mysql>​FLUSH PRIVILEGES;</​code>​
  
-  ​sudo /usr/​bin/​mysqld_safe --skip-grant-tables & +  ​* On quitte le prompt de MySQL : <code mysql>​QUIT;<​/code>
-  mysql -h localhost+
  
-Nous allons utiliser la table contenant les paramètres de MySQL : 
  
-  use mysql+==== Utilisateurs ====
  
-On met en place le nouveau mot de passe :+=== Lister les utilisateurs ===
  
-  update user set password = password('<votre_mot_de_passe>') where user = '​root'​ and host='​localhost'​;+Vous pouvez lister les utilisateurs ainsi que leurs [[#​authentification|méthodes d'authentification]] avec la requête suivante : 
 +<code mysql> 
 +SELECT ​userhost, plugin, authentication_string FROM mysql.user; 
 +</​code>​
  
-(remplacez ''<​votre_mot_de_passe>''​ par le mot de passe de votre choix)+=== Créer un utilisateur ===
  
-On quitte ​le prompt ​de MySQL :+Vous avez le choix entre créer un utilisateur identifié au moyen d'un mot de passe (méthode //​mysql_native_password//,​ celle par défaut pour MySQL) ou créer un accès MySQL à un utilisateur Ubuntu existant (méthode //​auth_socket//​). 
 +La plupart du temps, on utilisera //​mysql_native_password//​.
  
-  quit+Pour créer un utilisateur MySQL identifié au moyen d'un mot de passe : 
 +<code mysql> 
 +CREATE USER '​nom_utilisateur_choisi'​@'​localhost'​ IDENTIFIED WITH mysql_native_password BY '​mot_de_passe_solide';​ 
 +</​code>​ 
 +ou si cette commande échoue avec une erreur de syntaxe : 
 +<code mysql> 
 +CREATE USER '​nom_utilisateur_choisi'​@'​localhost'​ IDENTIFIED BY '​mot_de_passe_solide';​ 
 +</​code>​
  
-On redémarre le serveur MySQL en utilisation normale : 
  
-  sudo service ​mysql restart+Ou pour créer un accès MySQL à un utilisateur Ubuntu (seulement dans le cadre d'une utilisation avancée, et si vous comprenez ce que vous faites) : 
 +<​code ​mysql
 +CREATE USER '​nom_utilisateur'​@'​localhost'​ IDENTIFIED WITH auth_socket;​ 
 +</​code>​
  
-=== Méthode 2 ===+=== Modifier l'​accès d'un utilisateur ​===
  
-Une autre méthode beaucoup plus simple ​:+Pour modifier l'​accès d'un utilisateur MySQL existant, et l'​identifier par mot de passe (ou simplement changer son mot de passe) ​: 
 +<code mysql> 
 +ALTER USER '​nom_utilisateur'​@'​localhost'​ IDENTIFIED WITH mysql_native_password BY '​mot_de_passe_solide';​ 
 +</​code>​
  
-  sudo service ​mysql reset-password+Pour lier un compte MySQL existant à un utilisateur Ubuntu (il faut que les noms d'​utilisateur soient les mêmes) : 
 +<​code ​mysql
 +ALTER USER '​nom_utilisateur'​@'​localhost'​ IDENTIFIED WITH auth_socket;​ 
 +</​code>​
  
-=== Méthode 3 ===+=== Supprimer un utilisateur ​===
  
-Une autre méthode simple qui fonctionne sur les Ubuntu récentes (7.10, 8.x,​...) ​:+Pour supprimer un utilisateur ​: 
 +<code mysql> 
 +DROP USER '​nom_utilisateur'​@'​localhost';​ 
 +</​code>​
  
-  sudo dpkg-reconfigure mysql-server-5.0+==== Privilèges ====
  
-==== Utiliser un autre numéro ​de port ====+=== Donner tous les droits sur une base de données à un utilisateur précis ​===
  
-Pour activer la connexion à MySQL via le port 3306, commentez la ligne suivante dans le fichier ''/​etc/​mysql/my.cnf'' ​(en ajoutant ​''​#''​ au début de la ligne) :+<​code ​mysql
 +GRANT ALL ON nom_base.* TO 'nom_utilisateur'@'localhost'
 +</​code>​ 
 +Puis rechargez les privilèges.
  
-  skip-networking+=== Donner tous les droits à un super-administrateur ===
  
-FIXME+<code mysql> 
 +GRANT ALL ON *.* TO '​nom_utilisateur'​@'​localhost';​ 
 +</​code>​ 
 +Puis rechargez les privilèges. 
 + 
 +=== Supprimer les droits sur une base de données à un utilisateur précis === 
 + 
 +<code mysql> 
 +REVOKE ALL ON nom_base.* FROM '​nom_utilisateur'​@'​localhost';​ 
 +</​code>​ 
 +Puis rechargez les privilèges. 
 + 
 +=== Recharger les privilèges === 
 + 
 +Après chacune de ces opérations il est nécessaire de recharger les privilèges des utilisateurs MySQL : 
 +<code mysql> 
 +FLUSH PRIVILEGES;​ 
 +</​code>​
  
 ==== Connexions entrantes ==== ==== Connexions entrantes ====
Ligne 155: Ligne 218:
 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é. 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, [[:​tutoriel:​comment_editer_un_fichier|ajoutez la ligne suivante au fichier]] **/​etc/​mysql/​my.cnf** dans la section « ''​[mysqld]''​ » :+Pour pouvoir accéder à MySQL depuis un autre ordinateur, [[:​tutoriel:​comment_editer_un_fichier|ajoutez la ligne suivante au fichier]] **/​etc/​mysql/​mysql.conf.d/​mysqld.cnf** dans la section « ''​[mysqld]''​ », sous [[Mariadb]] il s'agit du fichier **/​etc/​mysql/​mariadb.conf.d/​50-server.cnf** :
  
-<​file>​bind-address = x.x.x.x</​file>​+<​file ​mysql> 
 +bind-address = x.x.x.x 
 +</​file>​
  
 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. 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.
  
-Vous pouvez mettre ​0.0.0.0 ​si MySQL doit écouter les connexions venant de toutes les interfaces réseaux, et donc être totalement accessible. Cela peut être dangereux si votre serveur est connecté à Internet directement.+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 : 
 +<​code>​sudo systemctl restart mysql</​code>​ 
 + 
 + 
 +Pour créer un utilisateur mysql qui est autorisé à se connecter à distance : 
 + 
 +se connecter sur mysql en root : 
 + 
 +<​code>​sudo mysql</​code>​ 
 +(on ajoute //-p// si on utilise un mot de passe pour //root//) 
 +Puis une fois connecté : 
 +<code mysql>​GRANT ALL ON [base de donnée].* TO '[nom utilisateur]'​@'​[adresse IP]' IDENTIFIED WITH mysql_native_password BY '[mot de passe]';</​code>​ 
 + 
 +Dans cette requête remplacez ''​[nom utilisateur]''​ par le nom d'​utilisateur que vous souhaitez créer, ''​[base de donnée]''​ par le nom de la base de données à laquelle il aura accès, ''​[mot de passe]''​ par le mot de passe que vous souhaitez lui attribuer, et ''​[adresse IP]''​ par l'​adresse IP depuis laquelle vous souhaitez vous connecter à distance.
  
-==== Configuration en UTF-8 ====+Pour autoriser l'​accès venant de toutes machines (limité par l'​authentification),​ remplacer ''​[adresse IP]''​ par le symbole ''​%''​.
  
-Il suffit ​d'ajouter les deux lignes suivantes à la fin de la section « ''​[mysqld]'' ​» du fichier **/​etc/​mysql/​my.cnf** :+Il est fortement conseillé que le ''​[nom utilisateur]''​ soit différent du nom d'utilisateur connecté en local ''​[localhost]'' ​pour éviter les blocages de connexion.
  
 +Pour rendre ces modifications effectives, terminez par :
 +<code mysql>​FLUSH PRIVILEGES;</​code>​
 +
 +Cette modification des droits de l'​utilisateur (ou l'​ajout d'un nouvel utilisateur avec des droits différents) peut aussi se faire dans [[phpmyadmin|phpMyAdmin]].
 +
 +==== Configuration en UTF-8 ====
 +
 +Il suffit d'​ajouter avec les [[sudo|droits d'​administration]] les lignes suivantes dans les sections adéquates (ne pas hésiter à les créer si elles n'​existent pas) dans le fichier **/​etc/​mysql/​mysql.conf.d/​mysqld.cnf** :
 <​file>​ <​file>​
-character-set-server=utf8 +[client] 
-skip-character-set-client-handshake +default-character-set=utf8
-</​file>​+
  
-<note warning>​Il semble que ce soit l'​instruction ​default-character-set=utf8 ​qui produise le résultat escompté (à la place de character-set-server)</note>+[mysql] 
 +default-character-set=utf8 
 + 
 +[mysqld] 
 +collation-server = utf8_unicode_ci 
 +init-connect='​SET NAMES utf8'​ 
 +character-set-server ​= utf8 
 +</file>
  
 puis de relancer le serveur mysql : puis de relancer le serveur mysql :
- +<​code>​sudo systemctl ​restart ​mysql</​code>​
-  ​sudo service mysql restart+
  
 Vous pouvez vérifier le résultat une fois loggé dans mysql grâce à la commande suivante : Vous pouvez vérifier le résultat une fois loggé dans mysql grâce à la commande suivante :
  
-<​code ​SQL>+<​code ​mysql>
 SHOW VARIABLES LIKE '​char%';​ SHOW VARIABLES LIKE '​char%';​
 </​code>​ </​code>​
Ligne 186: Ligne 279:
 Résultat : Résultat :
  
-<​code>​+<​code ​mysql>
 mysqld> SHOW VARIABLES LIKE '​char%';​ mysqld> SHOW VARIABLES LIKE '​char%';​
 +--------------------------+----------------------------+ +--------------------------+----------------------------+
Ligne 202: Ligne 295:
 8 rows in set (0.00 sec) 8 rows in set (0.00 sec)
 </​code>​ </​code>​
-FIXME 
  
 ===== Quelques requêtes SQL ===== ===== Quelques requêtes SQL =====
  
-Toutes ces commandes sont à entrer dans le prompt de mysql une fois connecté au serveur+Toutes ces commandes sont à entrer dans le prompt de MySQL une fois connecté au serveur. (Voir comment [[#​lancer_la_console_mysql|lancer la console MySQL]] ci dessus.) 
  
 ==== Base de donnée ==== ==== Base de donnée ====
Ligne 212: Ligne 305:
 === Utiliser une base de données existante === === Utiliser une base de données existante ===
  
-<​code ​SQL>+<​code ​mysql>
 USE nom_de_la_base;​ USE nom_de_la_base;​
 </​code>​ </​code>​
Ligne 218: Ligne 311:
 === Créer une base de données === === Créer une base de données ===
  
-<​code ​SQL+<​code ​mysql
-create database ​nom_de_la_base;​+CREATE DATABASE ​nom_de_la_base;​
 </​code>​ </​code>​
  
 === Liste des bases de données === === Liste des bases de données ===
  
-<​code ​SQL+<​code ​mysql
-show databases;+SHOW DATABASES;
 </​code>​ </​code>​
  
 === Supprimer une base de données === === Supprimer une base de données ===
  
-<​code ​SQL>+<​code ​mysql>
 DROP DATABASE nom_de_la_base;​ DROP DATABASE nom_de_la_base;​
 </​code>​ </​code>​
  
-==== Tables ====+=== Importer une base de données située dans le répertoire courant (base de donnée exportée en .sql) ===
  
-=== Liste des tables de la base de données active === +<​code ​mysql
- +SOURCE fichier.sql;
-<​code ​SQL+
-show tables;+
 </​code>​ </​code>​
  
-=== Structure d'une table ===+=== Créer ​une base de données et un utilisateur qui lui est associé ​===
  
-<​code ​SQL+Cette procédure est la plus courante, c'est celle qu'on réalise lorsqu'​on installe une application web en production. Pour des raisons de sécurité chaque application doit se connecter avec un utilisateur MySQL qui lui est dédié, et qui n'a accès qu'à la base correspondante. 
-describe nom_table;+<​code ​mysql
 +CREATE DATABASE application;​ 
 +CREATE USER '​utilisateur'​@'​localhost'​ IDENTIFIED BY '​mot_de_passe';​ 
 +GRANT ALL ON application.* TO '​utilisateur'​@'​localhost';​ 
 +FLUSH PRIVILEGES;​ 
 +QUIT;
 </​code>​ </​code>​
  
-=== Renommer une table ===+Il faut remplacer dans ces requêtes ''​application''​ par le nom de l'​application web ou du site internet (sans espace ni caractère spécial) , ''​utilisateur''​ par un nom d'​utilisateur (qui peut aussi être celui de l'​application,​ pour s'y retrouver facilement) et ''​mot_de_passe''​ par un vrai mot de passe complexe qu'on note : on devra renseigner ces identifiants lors de l'​installation de l'​application.
  
-<code SQL> +On vient de créer la base de donnée ​//​application//​ à laquelle l'​utilisateur //​utilisateur//​ aura accès.
-alter table nom_table rename as nouveau_nom;​ +
-</code>+
  
 +==== Tables ====
  
-Pour la syntaxe ​des requêtes SQL, reportez-vous à la [[http://​dev.mysql.com/​doc/​refman/​5.0/​fr/​index.html|documentation MySQL]].+=== Liste des tables de la base de données active ===
  
- +<​code ​mysql
-==== Utilisateurs ==== +SHOW TABLES;
- +
-=== Créer un utilisateur === +
- +
-<​code ​SQL+
-create user "​nom_utilisateur"​@"​localhost"​;+
 </​code>​ </​code>​
  
-=== Définir un mot de passe ===+=== Structure d'une table ===
  
-<​code ​SQL+<​code ​mysql
-set password for "​nom_utilisateur"​@"​localhost"​ = password("​mot_de_passe"​);+DESCRIBE nom_table;
 </​code>​ </​code>​
  
-=== Supprimer un utilisateur ​===+=== Renommer une table ===
  
-<​code ​SQL+<​code ​mysql
-drop user "​nom_utilisateur"​@"​localhost"​;+ALTER TABLE nom_table RENAME AS nouveau_nom;
 </​code>​ </​code>​
  
-=== Lister les utilisateurs ===+Pour la syntaxe des requêtes SQL, reportez-vous à la [[http://​dev.mysql.com/​doc/​|documentation MySQL]].
  
-<code SQL> +===== Autres opérations =====
-select user from mysql.user;​ +
-</​code>​+
  
-==== Privilèges ====+Qt4 avec MySQL:
  
 +Installer la librairie pour mysql afin de l'​utiliser sous QT :
  
-=== Donner tous les droits sur une base de données à un utilisateur précis ===+<​code>​sudo apt install libqt4-sql-mysql</​code>​
  
-<code SQL> 
-grant all on nom_base.* to "​nom_utilisateur"​@"​localhost";​ 
-</​code>​ 
  
-=== Supprimer les droits sur une base de données à un utilisateur précis === 
- 
-<code SQL> 
-revoke all privileges on nom_base.* from "​nom_utilisateur"​@"​localhost";​ 
-</​code>​ 
- 
- 
- 
- 
- 
- 
-===== Autres opérations ===== 
  
 ==== Sauvegarde et importation ==== ==== Sauvegarde et importation ====
  
 +<​note>​Ajoutez //-p// à ces commandes si vous utilisez un mot de passe pour le compte //root// :</​note>​
  
 Pour **exporter** la base de donnée « maBase », utilisez la commande : Pour **exporter** la base de donnée « maBase », utilisez la commande :
- +<​code>​sudo ​mysqldump maBase > maBase_backup.sql</​code>​
-  ​mysqldump ​-u root -p maBase > maBase_backup.sql+
  
 Ceci fera l'​export dans un fichier « 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//) : Pour exporter une table (par exemple //​ma_table//​ )appartenant à une base des données (par exemple //maBase//) :
-   +<​code>​sudo ​mysqldump maBase ma_table > ma_table.sql</​code>​
-  ​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 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 : Pour **importer** une base de données ou une sauvegarde sur « maBase », utilisez la commande :
- +<​code>​sudo ​mysql maBase < maBase_backup.sql</​code>​
-  ​mysql -u root -p maBase < maBase_backup.sql +
- +
-Puis tapez votre mot de passe.+
  
 <note tip> <note tip>
-Si vous souhaitez mettre en place une solution de sauvegarde automatique de bases de données à intervalle régulier, rendez-vous sur le tutoriel traitant ​de la [[:​tutoriel:​sauvegarder_automatiquement_ses_bases_de_donnees|sauvegarde automatique de bases de données via cron]].+Si vous souhaitez mettre en place une solution de sauvegarde automatique de bases de données à intervalle régulier, rendez-vous sur la page de documentation ​de [[automysqlbackup|AutoMySQLBackup]]
 </​note>​ </​note>​
  
 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 [[http://​dev.mysql.com/​doc/​refman/​5.0/​fr/​sql-syntax.html|site de documentation de MySQL]]. 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 [[http://​dev.mysql.com/​doc/​refman/​5.0/​fr/​sql-syntax.html|site de documentation de MySQL]].
  
-==== Restauration à partir du dump du datadir ==== 
  
-<note important>​Ne fonctionne que pour les tables au format MyISAM</​note>​ 
  
-Si vous n'avez pas pu faire un backup pour une raison quelquonque (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.+==== Compacter l'espace utilisé ​par ibdata1 ====
  
-Pour restaurer vos bases une par une, suivez la procédure ci dessous (après avoir d'​abord installé une version de mysql-server).+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.
  
-Créer une base de donnée du même nom que celle que vous voulez restaurer ​:+Pistes pour comprendre et corriger ce problème ​ 
 +  * [[http://​bytes.com/​groups/​mysql/​495219-mysql-ibdata1-compact-space|Supprimer les tables InnoDB pour récupérer l'​espace]] 
 +  * [[http://​bugs.mysql.com/​bug.php?​id=1287|"​Bogue"​ associé]] 
 +  * Exporter toutes les bases de données, arrêter mysql, supprimer le fichier, démarrer mysql et importer toutes les bases.
  
-<​code>​ 
-echo "​CREATE DATABASE MaBaseDeDonnee"​ | mysql -u root -h localhost -p 
-</​code>​ 
  
-Copier les fichiers du dump de la base de donnée (les *.FRM, *.MYD, *.MYI, *.opt), dans le dossier que MySQL a créé pour votre base de donnée : 
  
-<​code>​ 
-cd ~/​MonDossierContenantLeDump/​MaBaseDeDonnee 
-sudo cp * /​var/​lib/​mysql/​MaBaseDeDonnee 
-</​code>​ 
  
-Changer les droits sur les fichiers copiés :+   
 +===== Administrer MySQL via une une interface graphique =====
  
-<​code>​ +Il est possible d'​administrer un serveur MySQL via une interface graphique avec par exemple [[:phpMyAdmin]] ou [[:​mysql_outils#​adminer|Adminer]] qui sont d'​excellentes applications web. D'​autres outils sont disponibles,​ vous en trouverez une liste non exhaustive sur la page [[:​mysql_outils|Outils MySQL]].
-sudo chmod -R ug+rw /​var/​lib/​mysql/​MaBaseDeDonnee/​ +
-sudo chown -R mysql:mysql /​var/​lib/​mysql/​MaBaseDeDonnee/​ +
-</​code>​+
  
-Voilà, votre base doit correctement fonctionné à présent.+===== Réinstallation complète =====
  
-==== Compacter l'​espace utilisé par ibdata1 ====+De nombreux paramètres du serveur MySQL (tels que ses utilisateurs) sont stockés directement en base de données.
  
-Mysql stoque 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.+Ces bases de données ne seront jamais supprimées par [[:APT]] (et heureusement : on risquerait d'y perdre de précieuses données).
  
-Pistes pour comprendre et corriger ce problème ​:  +En cas de problème ​de configuration lors d'un premier déploiement d'un serveur MySQL on doit donc effectuer un certain nombre d'​opérations manuelles afin de réinitialiser complètement son installationAttention cela rendra ​les bases de données ​existantes inaccessibles !
-  * [[http://​bytes.com/​groups/​mysql/​495219-mysql-ibdata1-compact-space|Supprimer les tables InnoDB pour récupérer l'espace]] +
-  * [[http://​bugs.mysql.com/​bug.php?​id=1287|"​Bug"​ associé]] +
-  * 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 ====+Pour Ubuntu avant 20.04 : 
 +<​code>​sudo apt autoremove --purge mysql-server\* mariadb-server\*</​code>​ 
 +À partir ​de Ubuntu 20.04 : 
 +<​code>​sudo apt autoremove --purge ~n^mysql-server ~n^mariadb-server</​code>​
  
 +Puis quelle que soit la version :
 +<​code>​
 +sudo mv /​var/​lib/​mysql /​var/​lib/​mysql.bak
 +sudo mv /etc/mysql /​etc/​mysql.bak
 +sudo mkdir -p /​etc/​mysql/​conf.d
 +sudo apt clean</​code>​
 +On peut ensuite choisir d'​installer [[:MySQL]] ou [[:​MariaDB]] :
 +<​code>​sudo apt install mysql-server</​code>​
 +**__ou__**
 +<​code>​sudo apt install mariadb-server</​code>​
  
-=== Préambule ​===+===== Problèmes courants =====
  
 +==== Le server MySQL ne démarre pas ("time out") ou s'​arrête au bout de quelques secondes ====
  
-la plupart des utilisateurs créent ​de 2 à 3 partitions sur leur(s) installation(s) +Consultez le journal ​de [[:​systemd]] : 
-  * / une partition système +<​code>​journalctl ​-xe</code>
-  * 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 exploitable. Ç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).+=== AppArmor ===
  
-Il peut donc être intéressant pour cela de déplacer ses bases de données dans la partition ​/home.+Si vous y trouvez des messages du type : 
 +<​code>​AVC apparmor="​DENIED"</​code>​ 
 +lié à votre serveur MySQL, c'est que [[:​AppArmor]] bloque l'​execution ​de //mysqld//.
  
-=== Mise en place ===+Vous pouvez corriger le problème à l'aide des commandes suivantes : 
 +<​code>​sudo apt install apparmor-utils 
 +sudo aa-complain /​usr/​sbin/​mysqld</​code>​ 
 +Il faut ensuite redémarrer l'​ordinateur (redémarrer le service //​apparmor//​ ne suffit pas).
  
-Arrêter mysql :  +==== Installation de MySQL impossible ====
-<​code>​sudo service mysql stop</​code>​+
  
-Déplacer le répertoire des bases de données : +=== Conflit entre MySQL et MariaDB ===
-<​code>​sudo mv /​var/​lib/​mysql /​home/​mysql</​code>​ +
-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 : +
-<​code>​sudo ln -s /home/mysql /​var/​lib/​mysql</​code>​ +
- +
-S'​assurer que l'​utilisateur '​mysql'​ est bien le propriétaire de ce lien symbolique:​ +
-<​code>​sudo chown -h mysql:mysql /​home/​mysql</​code>​ +
- +
-Pour les versions d'​Ubuntu utilisant [[/​apparmor|Apparmor]] (Notamment Ubuntu 10.04), il vous faut modifier le fichier de configuration mysql dans Apparmor. +
- +
-[[/​tutoriel/​comment_modifier_un_fichier|Éditer]] **/​etc/​apparmor.d/​usr.sbin.mysqld** +
- +
-Il suffit de trouver les deux lignes suivantes : +
-<​file>​ +
-  /​var/​lib/​mysql/​ r, +
-  /​var/​lib/​mysql/​** rwk, +
-</​file>​ +
-et de les modifier en : +
-<​file>​ +
-  /​home/​mysql/​ r, +
-  /​home/​mysql/​** rwk, +
-</​file>​+
  
-On relance la configuration d'Apparmor ​+Si vous rencontrez une erreur de ce type lors de l'installation de MySQL 
-<​code>​sudo service apparmor reload</​code>​+<​code>​Aborting downgrade from (at least) 10.0 to 5.7. 
 +If are sure you want to downgrade to 5.7, remove the file 
 +/​var/​lib/​mysql/​debian-*.flag and try installing again.</​code>​ 
 +ou encore : 
 +<​code>​mysql_upgrade:​ Got error: 1524: Plugin '​unix_socket'​ is not loaded while connecting to the MySQL server 
 +Upgrade process encountered error and will not continue.</​code>​
  
-On relance MySql : +Il s'agit probablement d'un conflit entre MySQL et [[:MariaDB]]. Le plus simple est de [[#​reinstallation_complete|réinstaller complètement MySQL]].
-<​code>​sudo service mysql start</​code>​+
  
-Et voilà.+Il est également possible que des fichiers [[:​systemd]] pour [[:​MariaDB]] persistent après une mauvaise désinstallation,​ et empêchent une nouvelle installation propre. Pour résoudre ce problème, suivez [[https://​askubuntu.com/​a/​1235833|cette procédure]].
  
-===== Liens =====+===== Voir aussi =====
  
-  * [[http://www.addedbytes.com/cheat-sheets/mysql-cheat-sheet/|Memento MySQL]] (en) +  * [[https://www.mysql.com/|Le site officiel de MySQL]] [en] 
-  * [[http://​www.system-linux.eu/​index.php?​category/​Mysql|Aller plus loin avec MySQL]] ​(fr) +  * [[http://www.mysql.fr/|Le site officiel francophone]] [fr] 
-  * [[http://www.generation-linux.fr/index.php?​post/​2007/​12/​17/​9-cours-mysql|En savoir plus sur les commandes Mysql]] (fr)+  * [[http://​www.system-linux.eu/​index.php?​category/​Mysql|Aller plus loin avec MySQL]] ​[fr
 +  * La page dédiée aux [[:​mysql_outils|outils MySQL]] 
 +  * [[:​greensql|GreenSQL : Pare-feu applicatif SQL]] 
 +  * [[http://mysql.developpez.com/|La section dédiée à MySQL sur Developpez.com]] [fr] 
 +  * La page des [[:​SGBD|systèmes de gestion de base de données]] 
 +  * [[:​MariaDB]] ​-> Le serveur alternatif 100% compatible MySQL 
 +  * [[.:?​do=showtag&​tag=mysql|La liste des pages taguées avec MySQL]]
  
 ---- ----
  
-//​Contributeurs : [[utilisateurs:​_Enchained]],​ Hugo, Oscar Nsarhaza, [[utilisateurs:​Ner0lph]], ​--- //[[:​utilisateurs:​david96|david96]] ​Le 06/12/2009, 23:02//, Gounlaf.//, [[utilisateurs:​McPeter]]+//​Contributeurs : [[utilisateurs:​_Enchained]],​ Hugo, Oscar Nsarhaza, [[:utilisateurs:​Ner0lph]],​ [[:​utilisateurs:​david96|david96]],​ Gounlaf, [[:utilisateurs:​McPeter]], [[:​utillisateurs:​Rewiiz]],​ ernest-le-voyage,​ [[:​utilisateurs:​krodelabestiole]]//​
  • mysql.1287033437.txt.gz
  • Dernière modification: Le 18/04/2011, 14:57
  • (modification externe)