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 23/12/2015, 18:47]
cafecho Mise en forme wiki
mysql [Le 10/01/2024, 06:35] (Version actuelle)
krodelabestiole ancienne révision (Le 28/01/2023, 13:17) restaurée
Ligne 1: Ligne 1:
-{{tag>Precise Trusty ​sgbd mysql serveur réseau}} +{{tag>Focal sgbd mysql serveur réseau}}
- +
-----+
  
 ====== MySQL ====== ====== MySQL ======
  
-**[[https://​www.mysql.com/​|MySQL]]** est un [[wpfr>​SGBD|système de gestion de bases de données relationnelles]] (SGBDR) ​libre, gratuit, performant, très populaire, multi-threadé,​ multi-utilisateurs....+**[[https://​www.mysql.com/​|MySQL]]** est un [[wpfr>​SGBD|système de gestion de bases de données relationnelles]] (SGBDR) ​propriétaire, gratuit, performant, très populaire, multi-threadé,​ multi-utilisateurs
  
-===== Pré-requis =====+<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. ​
  
-  * Disposer des [[:​sudo|droits d'​administration]]. 
-  * Disposer d'une connexion à Internet configurée et activée. 
 ===== Installation ===== ===== Installation =====
  
-[[:​tutoriel:​comment_installer_un_paquet|Installez ​le paquet]] ​**[[apt>​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>​ 
- +Sinon [[:​tutoriel:​comment_installer_un_paquet|installez ​le paquet]] [[apt>​mysql-server]].
-<​note>​Le support de l'​extension [[wpfr>​PHP_Data_Objects|PHP Data Objects]] PHP Data Objects (PDO) est installé par défaut avec php5-mysql lors de l'​installation de php5.</​note>​+
  
 ===== Utilisation ===== ===== Utilisation =====
Ligne 21: Ligne 18:
 ==== Démarrage ==== ==== Démarrage ====
  
-Pour démarrer le serveur MySQL, tapez la [[:​commande_shell|commande]] suivante dans un [[:​terminal]]:​ +Pour démarrer le serveur MySQL, tapez la [[:​commande_shell|commande]] suivante dans un [[:​terminal]] :​ 
- +<code bash>sudo systemctl ​start mysql</​code>​
-  ​sudo service mysql start+
  
  
 ==== Redémarrage ==== ==== Redémarrage ====
  
-Pour redémarrer le serveur MySQL, tapez la [[:​commande_shell|commande]] suivante dans un [[:​terminal]]:​ +Pour redémarrer le serveur MySQL, tapez la [[:​commande_shell|commande]] suivante dans un [[:​terminal]] :​ 
-  sudo service mysql restart +<​code>​sudo systemctl ​restart mysql</​code>​
- +
-==== Arrêt ==== +
- +
-Pour arrêter le serveur MySQL, tapez la [[:​commande_shell|commande]] suivante dans un [[:​terminal]]:​ +
-  sudo service ​mysql stop+
  
 ==== Rechargement de la configuration ==== ==== Rechargement de la configuration ====
  
 Pour que MySQL prenne en compte les modifications de sa configuration,​ [[:​commande_shell|commande]] suivante dans un [[:​terminal]]:​ Pour que MySQL prenne en compte les modifications de sa configuration,​ [[:​commande_shell|commande]] suivante dans un [[:​terminal]]:​
-  ​sudo service mysql reload+<​code>​sudo systemctl ​reload ​mysql</​code>​
  
 ==== Forcer la prise en compte de la nouvelle configuration ==== ==== Forcer la prise en compte de la nouvelle configuration ====
  
 Pour forcer MySQL à recharger ses fichiers de configuration,​ [[:​commande_shell|commande]] suivante dans un [[:​terminal]]:​ Pour forcer MySQL à recharger ses fichiers de configuration,​ [[:​commande_shell|commande]] suivante dans un [[:​terminal]]:​
-  ​sudo service mysql force-reload+<​code>​sudo systemctl ​force-reload ​mysql</​code>​ 
 + 
 +==== Connaître la version ==== 
 +Il est parfois utile de connaître la version installée:​\\ 
 +<​code>​mysql --version</​code>​
  
 ===== Configuration ===== ===== Configuration =====
  
-==== Lancer la console MySQL ====+==== Authentification ​====
  
-<note important>​ +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]]).
-Bogue possible rencontré avec le client texte de MySQL la touche ​[Supprdu clavier insère le tilde **~** (au lieu de supprimer).+
  
-Pour palier ce bogueinstallez le programme rlwrap (pour en savoir plus : //man rlwrap//​), ​[[:tutoriel:​comment_installer_un_paquet|installez le paquet]] **[[apt>​rlwrap]]** et ajoutez celui-ci avant la commande mysql, exemple ​:+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 comportementsdont //[[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.
  
-  rlwrap -a mysql -uroot -pvotremotdepasse votrebase+Pour choisir l'un ou l'​autre des comportement,​ on 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.
  
-</note>+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//​.))
  
-  * Si vous n'avez pas défini ​de mot de passe (déconseillé: <​code>​mysql -u root</​code>​ +==== Lancer la console MySQL ==== 
-  * Si vous avez défini un mot de passe : <​code>​mysql ​-u root -p</​code> ​et tapez votre mot de passe.+ 
 +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 77: Ligne 77:
 ==== 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 [[:​commande_shell|ligne de commande]]+Soit directement lorsque vous lancez le client MySQL en ligne de commande: 
- +<​code>​mysql -u root -D votre_base ​-p</​code>​ 
-  ​mysql -u root -D votre_base+<​code>​sudo mysql -D votre_base</​code>​ 
 +  ​
  
 Soit une fois connecté à MySQL en tapant la [[:​commande_shell|commande]] suivante dans un [[:​terminal]]:​ Soit une fois connecté à MySQL en tapant la [[:​commande_shell|commande]] suivante dans un [[:​terminal]]:​
Ligne 87: Ligne 88:
 ==== 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) ​:+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 êtes déjà connecté dans mysql :+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]].
  
-  SET password FOR "​root"​@"​localhost" ​password('​Nouveau_mot_de_passe'​);​+==== Utilisateurs ====
  
-Sinon depuis un terminal :+=== Lister les utilisateurs ===
  
-  sudo mysqladmin -u root password Nouveau_mot_de_passe -p Ancien_mot_de_passe+Vous pouvez lister les utilisateurs ainsi que leurs [[#​authentification|méthodes d'​authentification]] avec la requête suivante : 
 +<code mysql> 
 +SELECT user, host, plugin, authentication_string FROM mysql.user;​ 
 +</​code>​
  
-Vous pourrez avoir besoin de mettre votre mot de passe entre guillemet si celui ci comporte des caractères spéciaux.+=== Créer un utilisateur ===
  
-Lorsque l'utilisateur ​root ne possède aucun mot de passe, ​utiliser cette commande :+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 tempson utilisera //​mysql_native_password//​.
  
-  sudo mysqladmin -u root password Nouveau_mot_de_passe -p ""​ +Pour créer un utilisateur MySQL identifié au moyen d'​un ​mot de passe 
-   +<code mysql> 
-==== Redéfinir de force le mot de passe de root ====+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>​
  
-=== Méthode 1 === 
  
-Une méthode simple ​:+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>​
  
-  sudo service mysql reset-password+=== Modifier l'​accès d'un utilisateur ===
  
-=== Méthode 2 ===+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>​
  
-Une autre méthode simple qui fonctionne sur Ubuntu ​versions 8.04 & + :+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>​
  
-  sudo dpkg-reconfigure mysql-server-5.5+=== Supprimer un utilisateur ===
  
-=== Méthode 3 ===+Pour supprimer un utilisateur : 
 +<code mysql> 
 +DROP USER '​nom_utilisateur'​@'​localhost';​ 
 +</​code>​
  
-Une méthode plus compliquée :+==== Privilèges ====
  
-Si vous avez perdu votre mot de passe root pour MySQL, suivez ces quelques étapes :+=== Donner tous les droits sur une base de données à un utilisateur précis ===
  
-On stoppe le serveur MySQL :+<code mysql> 
 +GRANT ALL ON nom_base.* TO '​nom_utilisateur'​@'​localhost';​ 
 +</​code>​ 
 +Puis rechargez les privilèges.
  
-  sudo  service mysql stop+=== Donner tous les droits à un super-administrateur ===
  
-On se connecte au serveur sans tenir compte des privilèges ​utilisateurs :+<code mysql> 
 +GRANT ALL ON *.* TO '​nom_utilisateur'​@'​localhost';​ 
 +</​code>​ 
 +Puis rechargez les privilèges.
  
-  sudo /​usr/​bin/​mysqld_safe --skip-grant-tables & +=== Supprimer ​les droits sur une base de données à un utilisateur précis ===
-  mysql -h localhost +
- +
-Nous allons utiliser la table contenant ​les paramètres ​de MySQL :+
  
-<​code ​SQL+<​code ​mysql
-use mysql+REVOKE ALL ON nom_base.* FROM '​nom_utilisateur'​@'​localhost';​
 </​code>​ </​code>​
 +Puis rechargez les privilèges.
  
-On met en place le nouveau mot de passe :+=== Recharger les privilèges ===
  
-<​code ​SQL> +Après chacune de ces opérations il est nécessaire de recharger les privilèges des utilisateurs MySQL : 
-update `user` +<​code ​mysql
-set    password = password('<​votre_mot_de_passe>') +FLUSH PRIVILEGES;
-where  user = '​root'​ and host = '​localhost'​;+
 </​code>​ </​code>​
- 
-(Placez le nom de la table `user` entre quotes (AltGr + 7) et 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 
-  ​ 
-FIXME 
  
 ==== Connexions entrantes ==== ==== Connexions entrantes ====
Ligne 180: Ligne 174:
 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>​+<​file ​mysql>
 bind-address = x.x.x.x bind-address = x.x.x.x
 </​file>​ </​file>​
Ligne 191: Ligne 185:
  
 Redémarrez le service après avoir modifié le fichier de configuration : Redémarrez le service après avoir modifié le fichier de configuration :
-<​code>​sudo ​/​etc/​init.d/​mysql restart</​code>​ +<​code>​sudo ​systemctl restart ​mysql</​code>​
  
  
Ligne 199: Ligne 192:
 se connecter sur mysql en root : se connecter sur mysql en root :
  
-<​code>​mysql ​-u root -p</​code>​+<​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>​
  
-une fois connecté : +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.
-<​code>​grant all privileges on *.* to 'remote_user'@'123.123.123.123' ​identified by 'user_password';</​code>​+
  
-le ***.*** représente ​l'​accès ​à l'ensemble des bases de donnéessi 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.+Pour autoriser ​l'​accès ​venant de toutes machines (limité par l'authentification)remplacer ''​[adresse IP]''​ par le symbole ''​%''​.
  
-le **remote_user** ​est le nom de l'​utilisateur ​qui sera créé.+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.
  
-le **123.123.123.123** représente l'ip à partir de laquelle nous pourrons nous connecter à distance.+Pour rendre ces modifications effectives, terminez par : 
 +<code mysql>​FLUSH PRIVILEGES;</​code>​
  
-Pour autoriser ​l'accès venant de toutes machines ​(limité par l'authentification), remplacer l'ip par le symbole **'​%'​**.+Cette modification des droits de l'utilisateur ​(ou l'ajout d'un nouvel utilisateur avec des droits différentspeut aussi se faire dans [[phpmyadmin|phpMyAdmin]].
  
-Pour attribuer un mot de passe à l'​utilisateur,​ changer **user_password** par le nouveau mot de passe..+==== Configuration en UTF-8 ====
  
-Pour rendre ces privilèges effectifs ​+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** ​
-<code>​flush privileges;</​code>+<file> 
 +[client] 
 +default-character-set=utf8
  
 +[mysql]
 +default-character-set=utf8
  
-==== Configuration en UTF-==== +[mysqld] 
- +collation-server ​utf8_unicode_ci 
-Il suffit d'​ajouter les deux lignes suivantes à la fin de la section « ''​[mysqld]'' ​» du fichier **/​etc/​mysql/​my.cnf** : +init-connect='SET NAMES utf8
- +character-set-server = utf8
-<​file>​ +
-character-set-server=utf8 +
-skip-character-set-client-handshake+
 </​file>​ </​file>​
- 
-NB: en 12.04 remplacez character-set-server=utf8 par character_set_server=utf8 
  
 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 241: Ligne 235:
 Résultat : Résultat :
  
-<file>+<code mysql>
 mysqld> SHOW VARIABLES LIKE '​char%';​ mysqld> SHOW VARIABLES LIKE '​char%';​
 +--------------------------+----------------------------+ +--------------------------+----------------------------+
Ligne 256: Ligne 250:
 +--------------------------+----------------------------+ +--------------------------+----------------------------+
 8 rows in set (0.00 sec) 8 rows in set (0.00 sec)
-</file> +</code>
- +
-FIXME+
  
 ===== Quelques requêtes SQL ===== ===== Quelques requêtes SQL =====
Ligne 269: Ligne 261:
 === 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>​
    
 === 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>​
  
 === Importer une base de données située dans le répertoire courant (base de donnée exportée en .sql) === === Importer une base de données située dans le répertoire courant (base de donnée exportée en .sql) ===
  
-<​code ​SQL+<​code ​mysql
-source ​fichier.sql;​+SOURCE ​fichier.sql;​
 </​code>​ </​code>​
  
 +=== Créer une base de données et un utilisateur qui lui est associé ===
 +
 +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.
 +<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>​
 +
 +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.
 +
 +On vient de créer la base de donnée //​application//​ à laquelle l'​utilisateur //​utilisateur//​ aura accès.
  
 ==== Tables ==== ==== Tables ====
Ligne 302: Ligne 308:
 === Liste des tables de la base de données active === === Liste des tables de la base de données active ===
  
-<​code ​SQL+<​code ​mysql
-show tables;+SHOW TABLES;
 </​code>​ </​code>​
  
 === Structure d'une table === === Structure d'une table ===
  
-<​code ​SQL+<​code ​mysql
-describe ​nom_table;+DESCRIBE ​nom_table;
 </​code>​ </​code>​
  
 === Renommer une table === === Renommer une table ===
  
-<​code ​SQL+<​code ​mysql
-alter table nom_table ​rename as nouveau_nom+ALTER TABLE nom_table ​RENAME AS nouveau_nom;​
-</​code>​ +
- +
-Pour la syntaxe des requêtes SQL, reportez-vous à la [[http://​dev.mysql.com/​doc/​|documentation MySQL]]. +
- +
- +
-==== Utilisateurs ==== +
- +
-=== Créer un utilisateur === +
- +
-<code SQL> +
-create user "​nom_utilisateur"​@"​localhost";​ +
-</​code>​ +
- +
-=== Définir un mot de passe === +
- +
-<code SQL> +
-set password for "​nom_utilisateur"​@"​localhost"​ = password('​mot_de_passe'​);​ +
-</​code>​ +
- +
-=== Supprimer un utilisateur === +
- +
-<code SQL> +
-drop user "​nom_utilisateur"​@"​localhost";​ +
-</​code>​ +
- +
-=== Lister les utilisateurs === +
- +
-<​code>​ +
-select user from mysql.user;​ +
-</​code>​ +
- +
- +
-==== Privilèges ==== +
- +
-=== Donner tous les droits sur une base de données à un utilisateur précis === +
- +
-<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>​ </​code>​
  
 +Pour la syntaxe des requêtes SQL, reportez-vous à la [[https://​dev.mysql.com/​doc/​|documentation MySQL]].
  
 ===== Autres opérations ===== ===== Autres opérations =====
  
-Qt4 avec Mysql:+MySQL avec Qt5:
  
-Installer la librairie ​pour mysql afin de l'​utiliser sous QT :+Installer la bibliothèque Qt5 pour mysql afin de l'​utiliser sous Qt :
  
-<​code>​sudo apt-get install ​libqt4-sql-mysql</​code>​+<​code>​sudo apt install ​libqt5sql5-mysql</​code>​
  
  
  
 ==== 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 [[https://​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 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 ==== ==== 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.+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 : +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://​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é]] +  * [[https://​bugs.mysql.com/​bug.php?​id=1287|"​Bogue"​ associé]] 
-  * Exporter toutes les bases de données, arrêter mysql, supprimer le fichier, démarrer ​sql et importer toutes les bases.+  * Exporter toutes les bases de données, arrêter mysql, supprimer le fichier, démarrer ​mysql et importer toutes les bases.
  
  
-==== Déplacer ses bases de données MySQL ==== 
  
-=== Préambule === 
-Avant de vous lancer voir la discussion ici [[http://​forum.ubuntu-fr.org/​viewtopic.php?​id=1660321]] 
-en particulier:​ 
-<​note>​On te conseille de faire un lien symbolique ​ « afin de ne pas "​casser"​ les fichiers de configuration originel de MySQL » 
-D'​abord c'est stupide car les fichiers de configuration sont justement faits pour y personnaliser la configuration… 
-L'​auteur de cette documentation craignait sans doute que le fichier my.cnf ne soit écrasé lors d'une mise à jour. ( de toute façon il est recommendé de faire un ''​**''​ cp my.cfn my.cfn.bak ''​**''​ ainsi si il y a un problème, il suffira simplement de restaurer le backup du fichier de conf. Mais cela n'​arrivera pas, car lors d'une mise à jour le gestionnaire de paquets demande ce qu'il doit faire : remplacer, conserver, afficher les différences… 
-Si l'on a vraiment cette crainte, on ne touche pas au fichier my.cnf et on utilise le dossier conf.d qui est prévu pour y placer ses propres configurations. 
-</​note>​ 
-<​note>​ 
-Ensuite c'est en contradiction avec la manipulation suivante qui  fait modifier directement /​etc/​apparmor.d/​usr.sbin.mysqld. Là curieusement l'​auteur de la documentation ne craint plus de « casser » le fichier de configuration originel :-D. La bonne manipulation aurait été de placer la configuration supplémentaire dans /​etc/​apparmor.d/​local/​usr.sbin.mysqld et de dé-commenter la ligne du premier fichier : 
- ​**''​Code «  # Site-specific additions and overrides. See local/​README for details. 
-      #include <​local/​usr.sbin.mysqld></​note>​ »''​ **  
-</​note>​ 
-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).+   
 +===== Administrer MySQL via une une interface graphique =====
  
-Il peut donc être intéressant pour cela de déplacer ses bases de données dans la partition /home.+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]].
  
-Remarque importante : Il y a deux méthodes pour changer le dossier des données, soit par lien symbolique comme décrit ci-après, soit en modifiant le fichier de configuration my.cnf. Toutefois si les utilitaires de MySQL comme mysqldump sont utilisés, il faut préférer la méthode de modification du my.cnf, car les liens symboliques ne semblent pas pris en compte par ces utilitaires.+===== Réinstallation complète =====
  
 +De nombreux paramètres du serveur MySQL (tels que ses utilisateurs) sont stockés directement en base de données.
  
-=== Mise en place ===+Ces bases de données ne seront jamais supprimées par [[:APT]] (et heureusement : on risquerait d'y perdre de précieuses données).
  
-Arrêter ​MySQL :+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 installation. Attention cela rendra les bases de données existantes inaccessibles !
  
-  ​sudo service ​mysql stop+<​code>​sudo apt autoremove --purge ~n^mysql-server ~n^mariadb-server</​code>​
  
-Déplacer le répertoire des bases de données ​:+Puis : 
 +<​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>​
  
-  sudo mv /​var/​lib/​mysql /home/mysql+===== Problèmes courants =====
  
-Le déplacement par 'mv' permet ​de ne pas modifier les droits originaux.+==== Le server MySQL ne démarre pas ("time out") ou s'arrête au bout de quelques secondes ====
  
-Créer un lien symbolique afin de ne pas "//casser//" les fichiers de configuration originel de MySQL :+Consultez le journal ​de [[:​systemd]] : 
 +<​code>​journalctl -xe -u mysql</code> 
 +et les logs dans /var/log/mysql/​error.log
  
-  sudo ln -s /home/mysql /​var/​lib/​mysql+=== AppArmor ===
  
-S'assurer ​que l'utilisateur '​mysql'​ est bien le propriétaire ​de ce lien symbolique :+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//.
  
-  ​sudo chown -h mysql:​mysql ​/home/mysql+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).
  
-Pour les versions d'​Ubuntu utilisant [[Apparmor]] (notamment Ubuntu 10.04 LTS), il vous faut modifier le fichier ​de configuration ​MySQL dans Apparmor.+==== Installation ​de MySQL impossible ====
  
-[[:​tutoriel:​comment_modifier_un_fichier|Ouvrir le fichier]] **/​etc/​apparmor.d/​usr.sbin.mysqld** ​et trouver les deux lignes suivantes :+=== Conflit entre MySQL et MariaDB ===
  
-<file+Si vous rencontrez une erreur de ce type lors de l'​installation de MySQL : 
-  /​var/​lib/​mysql/​ r+<code>Aborting downgrade from (at least) 10.0 to 5.7. 
-  /​var/​lib/​mysql/​** rwk, +If are sure you want to downgrade to 5.7remove the file 
-</file+/​var/​lib/​mysql/​debian-*.flag and try installing again.</code
- +ou encore ​
-et de les modifier en : +<code>mysql_upgradeGot error1524Plugin ​'unix_socket' ​is not loaded while connecting to the MySQL server 
- +Upgrade process encountered error and will not continue.</code>
-<file> +
-  /​home/​mysql/​ r, +
-  /​home/​mysql/​** rwk, +
-</​file>​ +
- +
-On relance la configuration d'​Apparmor ​: +
- +
-  sudo service apparmor reload +
- +
-On relance MySql : +
- +
-  sudo service mysql start +
- +
-Et voilà. +
- +
-==== Transférer une base de données entre deux serveurs via SSH ==== +
- +
-=== Préambule === +
- +
-Dans le cadre d'une infra sans serveur spécifique de base de données, et que l'on souhaite partager une base commune. +
- +
-=== Mise en place === +
- +
-Dans un premier temps il faut remplir deux conditions ​: +
-  *  que l'utilisateur de la base de données soit reconnu par le second serveur +
-  *  que l'utilisateur de la base de données soit reconnu par les deux serveurs MySql. +
- +
-Pour une reconnaissance utilisateur d'un serveur à un autre : [[ssh#​authentification_par_un_systeme_de_cles_publiqueprivee|Authentification par clés SSH]] (sans passphrase) +
- +
-Pour que MySql reconnaisse l'​utilisateur sans devoir saisir son mot de passe à chaque commande (dans le cas d'un tâche [[cron|CRON]] par exemple), il faut ajouter un fichier dans le répertoire personnel de cet utilisateur et ce __**sur chaque serveur**__[[tutoriel:​comment_editer_un_fichier|Éditer]]/​créer le fichier **~/​.my.cnf** +
- +
-<​file>​ +
-[mysql] +
-user=nom_utilisateur +
-password=mot_de_passe_utilisateur +
- +
-[mysqldump] +
-user=nom_utilisateur +
-password=mot_de_passe_utilisateur +
-</file> +
-Protéger le : +
- +
-  chmod 600 ~/.my.cnf +
-   +
-Transférer depuis le serveur **A** vers le **B** : +
- +
-  mysqldump nom_bdd_serveur_A | ssh utilisateur_serveur_B@ip_serveur_B mysql nom_bbd_serveur_B +
-   +
-Exemple de commande en tache [[cron|CRON]] :+
  
-  10 0 * * * mysqldump nom_bdd_serveur_A | ssh utilisateur_serveur_B@ip_serveur_B mysql nom_bbd_serveur_B >/​dev/​null  ​#Mise à jour BDD +Il s'agit probablement d'un conflit entre MySQL et [[:​MariaDB]]. Le plus simple est de [[#reinstallation_complete|réinstaller complètement ​MySQL]].
-===== 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 [[:mysql_outils|Outils MySQL]].+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 =====
  
   * [[https://​www.mysql.com/​|Le site officiel de MySQL]] [en]   * [[https://​www.mysql.com/​|Le site officiel de MySQL]] [en]
-  * [[https://www-fr.mysql.com/|Le site officiel francophone]] [fr] +  * [[http://​www.mysql.fr/|Le site officiel francophone]] [fr] 
-  * [[http://​www.addedbytes.com/​cheat-sheets/​mysql-cheat-sheet/​|Memento MySQL]] [en] +  * [[https://​www.system-linux.eu/​index.php?​category/​Mysql|Aller plus loin avec MySQL]] [fr]
-  * [[http://​www.system-linux.eu/​index.php?​category/​Mysql|Aller plus loin avec MySQL]] [fr] +
-  * [[http://​www.generation-linux.fr/​index.php?​post/​2007/​12/​17/​9-cours-mysql|En savoir plus sur les commandes Mysql]] [fr] -> 3 petits cours sur MySQL à télécharger (PDF) +
-  * [[http://​www.system-linux.eu/​index.php?​post/​2008/​12/​29/​Configure-et-Installation-de-mysql|Installation à la main]] [fr]+
   * La page dédiée aux [[:​mysql_outils|outils MySQL]]   * La page dédiée aux [[:​mysql_outils|outils MySQL]]
   * [[:​greensql|GreenSQL : Pare-feu applicatif SQL]]   * [[:​greensql|GreenSQL : Pare-feu applicatif SQL]]
-  * [[http://​www.system-linux.eu/​index.php?​post/​2009/​06/​28/​Proteger-son-server-Mysql-avec-GreenSQL|Protéger son serveur MySQL avec GreenSQL]] [fr] +  * [[https://​mysql.developpez.com/​|La section dédiée à MySQL sur Developpez.com]] [fr] 
-  * [[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]]
-  * La page des [[:SGBD]].+
   * [[:​MariaDB]] -> Le serveur alternatif 100% compatible MySQL   * [[:​MariaDB]] -> Le serveur alternatif 100% compatible MySQL
-  * [[http://​www.it-connect.fr/​tutoriels/​stockage/​bdd/​mysql-bdd/​|Plusieurs tutoriels dédiés à MySQL sur IT-Connect]]  ​ 
-  * [[http://​www.it-connect.fr/​sauvegarder-une-base-de-donnees-rapidement-sous-mysql-avec-mysqldump/​|Sauvegarder une base de données rapidement sous MySQL avec mysqldump]] 
   * [[.:?​do=showtag&​tag=mysql|La liste des pages taguées avec MySQL]]   * [[.:?​do=showtag&​tag=mysql|La liste des pages taguées avec MySQL]]
  
 ---- ----
  
-//​Contributeurs : [[utilisateurs:​_Enchained]],​ Hugo, Oscar Nsarhaza, [[utilisateurs:​Ner0lph]],​ [[:​utilisateurs:​david96|david96]],​ 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.1450892874.txt.gz
  • Dernière modification: Le 23/12/2015, 18:47
  • par cafecho