LinuxPedia

Wiki libre et indépendant dédié à GNU-Linux et BSD.

Outils pour utilisateurs

Outils du site


serveurs:mysql

Serveur MySQL

MySQL est une Base de donnée Open source la plus populaire au Monde. Elle est facile à mettre en place et très utiles pour regrouper des données, par exemple pour la mise en place d'un site dynamique en PHP.


Nous allons ici mettre en place un serveur de gestion de base de donnée MySQL avec les drivers ODBC sur un poste client pour accèder aux données sur un serveur Linux. Nous n'aborderons pas ici l'architecture LAMP (Linux Apache MySQL PHP) pour la simple et bonne raison que la configuration se situe plutôt du coté d'apache…

Autrement dit l'objectif de cette activité est d'installer et configurer un serveur de gestion de base de données “MySQL” avec gestion des droits d'accès pour un utilisateur avec un accès d'un poste client pour accèder aux données via une application bureautique afin de mettre à la disposition des utilisateurs un espace pour regrouper les divers données.
NDLR: Ici nous mettons en place ce serveur de gestion de base de données sur un réseau locale, mais il peut aussi bien être adapté pour l'internet. Ce n'est peut-être pas très claire pour tout le monde, j'espère qu'avec la suite vous comprendrez.

Situation Initiale

Situation Finale


<note important> Attention ! j'estime ici que vous êtes assez grand pour configurer vous-même le réseau et donc que le “pc client” et le “serveur” se ping bien au travers de votre réseau.</note>

Installation du logiciel

Sous Gentoo Linux

[root@kazuya ~]# emerge -av mysql 

Sous Mandriva Linux

[root@kazuya ~]# urpmi mysqld-max

Vérification de l'installation

On vérifie si le logiciel c'est installé correctement (si le chemin est correctement retourné il n'y a pas de problème, sinon c'est que le logiciel n'est pas correctement installé):

[root@kazuya ~]# ls /usr/sbin/mysqld

<note> Sous Mandriva linux il faut remplacer “/usr/sbin/mysqld” par “/usr/sbin/mysqld-max”</note>

Configuration de MySQL, avant démarrage

Editer le fichier "my.cnf"

Tout d'abord, faire une sauvegarde de celui-ci:

[root@kazuya ~]# cp /etc/mysql/my.cnf /etc/mysql/my.cnf-old

<note> Le fichier se trouve à différents endroits suivant la distribution…</note> Il faut modifier le fichier afin de prendre en compte l'activation du réseau:

[mysqld]
...
#skip-networking
...

<note important> Les petits points ici servent à ne pas tous écrire dans le tutoriel…. Si vous ne savez pas de trop, et étant donné que cela peut être un peu différent suivant les distributions et versions de mysql, ne touchez à rien, ou prévoyez une sauvegarde de vos anciens fichiers de configuration, on ne le redira jamais assez.</note>

Sous Mandriva Linux, editer le fichier "/etc/sysconfig/mysqld"

<note> Bien sur faire une sauvegarde de celui-ci avant toutes modifications:

[root@kazuya ~]# cp /etc/sysconfig/mysqld /etc/sysconfig/mysqld-old

</note> Il faut modifier une directive de configuration afin de désactiver mysql-manager:

...
use_mysql_safe= "1"
...

<note important> Sous Gentoo Linux, il suffit de ne *pas* lancer “/etc/init.d/mysqlmanager”.Il n'y a rien à faire de plus. </note>

Démarrage du service MySQL

Sous Gentoo Linux

[root@kazuya ~]# /etc/init.d/mysql start

Sous Mandriva Linux

[root@kazuya ~]# service mysqld-max start

⇒ On vérifie que le processus est bien lancé:

[root@kazuya ~]# ps aux | grep mysqld

⇒On vérifie que notre serveur MySQL écoute bien le réseau sur le port 3306:

[root@kazuya ~]# netstat -natup | grep :3306

⇒ Ensuite si on veut suivre les erreurs “en direct”, il suffit de visualiser la fin des fichiers journaux (à faire dans une autre console, très optionnel):

Sous Mandriva Linux

[root@kazuya ~]# tail -f /var/lib/mysql/mandriva.err

Sous Gentoo Linux

[root@kazuya ~]# tail -f /var/log/mysql/mysqld.err

<note important> Suivant la distribution on peut avoir besoin, lorsque l'on install mysql pour la première fois d'executer le script “mysql_install_db” qui se chargera de crée la base de donnée propre à mysql. Dans une console:

[root@kazuya ~]# mysql_install_db

Sous gentoo, executez simplement: “emerge –config =dev-db/mysql-[version]” </note>

Sécurisation de base de MySQL

<note important>ATTENTION ! ici il faut bien différencier les comptes administrateurs.
En effet, MySQL possède un compte “root” qui lui est propre, MAIS qui n'a *absolument* rien à voir avec le “root” de vos distributions respective, par conséquent ne confondez pas les deux s'il vous plait. C'est peut-être bête, mais ça évite bien des problèmes avec les mots de passes érronés. </note> Il faut absolument mettre en place un mot de passe pour l'administration de MySQL ainsi que corriger divers autres problèmes sécurité, pour cela on éxécute le script MySQL suivant:

[root@kazuya ~]# mysql_secure_installation
     [...]

<note important> Après avoir exécuté cette commande l'utilitaire va vous poser tout un tas de questions auquelles il faudra apporter des réponses.(le plus généralement oui/yes, après c'est à vous de voir) </note> <note> Pour pouvoir changer de mot de passe du compte root par la suite, vous pouvez utiliser cette commande:

[root@kazuya ~]# mysqladmin -u root flush-privileges password "votre_mot_de_passe" -p 

N'oubliez pas le “-p” à la fin de celle-ci.
Bien sur cette commande vous demandera votre ancien mot de passe. Si aucune erreur n'apparait, alors tout c'est bien déroulé correctement, testez la connexion avec votre nouveau mot de passe. </note>

Tests du service MySQL

En localhost, avec le client CLI mysql:

[root@kazuya ~]# mysql -u root -p
Enter password:
     [...]

⇒Tester que l'on a bien accès à la base.

⇒Une fois ce test réussi, créer une base de données ainsi que des utilisateurs ayant certains droits sur la base à l'aide d'un script (script_bd_MABASE.sql), avec la syntaxe suivante:

[root@kazuya ~]# mysql -u root -p -v < script_bd_MABASE.sql
Enter password:
--------------
DROP DATABASES IF EXISTS MABASE
--------------
 
--------------
CREATE DATABASE MABASE
--------------
     [...]

Bien sur voici un exemple de script, si vous ne connaissez pas forcément le langage SQL:

#====================================================
# Script SQL BY Kazuya. 
# C'est simplement un vulgaire exemple. 
#====================================================
DROP DATABASE IF EXISTS MABASE;
CREATE DATABASE MABASE;
USE MABASE;
CREATE TABLE CLIENT  
  (
	ID_CLIENT   INTEGER UNSIGNED NOT NULL,
	NOM VARCHAR (200) NOT NULL,
	PRENOM VARCHAR (150) NOT NULL,
	ID_VOITURE  INTEGER UNSIGNED NOT NULL,
	PRIMARY KEY (ID_CLIENT ),
	FOREIGN KEY (ID_VOITURE) REFERENCES VOITURE (ID_VOITURE) ON DELETE CASCADE
  );
 
CREATE TABLE VOITURE 		
  (
 	ID_VOITURE  INTEGER UNSIGNED NOT NULL,
	NOM_VOITURE  VARCHAR (200) NOT NULL,
	AGE VARCHAR(200) NOT NULL,
	PRIMARY KEY (ID_VOITURE)
  );
 
CREATE TABLE LOCATION
  (
	ID_LOCATION INTEGER UNSIGNED NOT NULL,
	DUREE_LOCATION VARCHAR (200) NOT NULL,
	LIEU_LOCATION VARCHAR (200) NOT NULL,
	PRIX_LOCATION VARCHAR (200) NOT NULL
  );
 
CREATE TABLE CLIENT_LOCATION
  (
	ID_CLIENT  INTEGER UNSIGNED NOT NULL,
	ID_LOCATION INTEGER UNSIGNED NOT NULL,
	PRIMARY KEY (ID_CLIENT ,ID_LOCATION),
	FOREIGN KEY (ID_CLIENT ) REFERENCES CLIENT (ID_CLIENT ),
	FOREIGN KEY (ID_LOCATION) REFERENCES LOCATION(ID_LOCATION)
  );
 
	INSERT INTO CLIENT  VALUES ("1","DURANT","DAVID","1");
	INSERT INTO CLIENT  VALUES ("2","DUPOND","DAVID","2");
	INSERT INTO CLIENT  VALUES ("3","MOUSSE","MICKEY","3");
	INSERT INTO CLIENT  VALUES ("4","TITI","TOTO","1");
	INSERT INTO CLIENT  VALUES ("5","DOE","JOHN","2");
	INSERT INTO CLIENT  VALUES ("6","TAC","JOE","3");
	INSERT INTO CLIENT  VALUES ("7","NAUT","OUAILLE","1");
 
 
	INSERT INTO VOITURE  VALUES ("1","BMW","25 ANS");
	INSERT INTO VOITURE  VALUES ("2","Peugeot", "21 ANS");
	INSERT INTO VOITURE  VALUES ("3","Audi","20 ANS");
 
	INSERT INTO LOCATION VALUES ("1","6 HEURES","TONBOUCTOU","16euros/HEURE");
	INSERT INTO LOCATION VALUES ("2","2 HEURES","PERPETE","14euros/HEURE");
	INSERT INTO LOCATION VALUES ("3","12 HEURES","OTREPART","19euros/HEURE");
 
	INSERT INTO CLIENT_LOCATION VALUES ("1","1");
	INSERT INTO CLIENT_LOCATION VALUES ("2","1");
	INSERT INTO CLIENT_LOCATION VALUES ("3","2");
	INSERT INTO CLIENT_LOCATION VALUES ("4","2");
	INSERT INTO CLIENT_LOCATION VALUES ("5","3");
	INSERT INTO CLIENT_LOCATION VALUES ("6","3");
	INSERT INTO CLIENT_LOCATION VALUES ("7","1");
	INSERT INTO CLIENT_LOCATION VALUES ("7","2");
	INSERT INTO CLIENT_LOCATION VALUES ("7","3");

En localhost, on test l'accès aux données précédemment crées toujours à l'aide du client CLI mysql, puis on crée un utilisateur ayant les droits sur cette base:

[root@kazuya ~]# mysql -u root -p
Enter password:
     [...] 
 
mysql> GRANT ALL ON MABASE.* TO admin IDENTIFIED BY "admin";
Query OK, 0 rows affected (0.14 sec)
 
mysql>

Quelques explications: Ici on se connecte à la base de donnée avec root, on rentre le mot de passe que l'on a défini précédemment, puis on crée un utilisateur ayant tous les droits (ALL) sur la base de donnée MABASE, et ce pour toutes les tables qu'elle contient (la concaténation “.*”) avec le mot de passe “admin” <note important> Le langage SQL est un langage simple (mais qui peut facilement devenir compliqué avec d'énormes requêtes) qui sert d'interface entre l'utilisateur et la base de donnée. Pour ceux qui ne veulent pas apprendre le langage SQL vous pouvez toujours utiliser des logiciels comme PhpMyAdmin, mais il faudra connaître un minimum quand même. </note>

Configuration du poste client MS

Installer le driver ODBC en exécutant l'application « Setup.exe ». Puis allez dans « Panneau de Configuration/Source de données ODBC », créer un nouveau profile DSN (Data Source Name) ODBC associé au driver MySQL.

Puis avec Word, il faut activer la barre d'outils « base de données ». Ensuite il faut cliquer sur le bouton « insérer une base de donnée », puis dans MS-Query, choisir le profile DSN crée précédemment. On selectionne les données voulus puis on retourne les données à MS Word. Enfin nous insérons les données dans notre document. <note> je ne détaillerai pas plus volontairement cette partie, étant donnée qu'elle ne concerne pas directement le service MySQL, néanmoins je vous donne la marche à suivre. C'est également possible de le faire avec OpenOffice Base. </note>

Éffectuer une sauvegarde de la base de donnée

Pour effectuer une sauvegarde de votre base de donnée, vous pouvez utiliser la commande “mysqldump” de cette façon:

  • Pour sauvegarder une base de donnée précise:
[root@kazuya ~]# mysqldump -u root -p MABASE > script_MABASE.sql
  • Pour sauvegarder toutes les bases de données présentent:
[root@kazuya ~]# mysqldump -u root -p --all-databases > script_BDD.sql

On peut également utiliser phpMyAdmin après l'avoir préalablement installé, en utilisant la fonction “export”.

En cas de problème sans sauvegarde au préalable

Imaginons un instant le pire des scénarios possible: un petit malin (ou vous par inadvertance) s'est connecté à votre base de données et, avec une simple requête, à tout supprimer sans que vous ayez eu le temps de faire le moindre backup. Situation horrible n'est ce pas ? (du vécu pour l'auteur de cet article…) Et bien fort heureusement MySQL est bien conçu: il existe les “log binaire” depuis la version 5 de mysql, qui ont remplacé les log “texte”. Les logs contiennent l’ensemble des modifications (suppressions, modifications et ajouts d’informations, création de base de données, de tables, etc.) qui sont appliquées au serveur MySQL. Donc c'est possible de récupérer votre base si vous n'avez pas supprimé ces fameux logs (journaux) binaire.

Bon ok, ceci contient tout ce qui a été fait, y compris la requête de “suppression” malencontreuse, c'est plutôt embêtant. Donc pour cela nous allons donc passer ceci dans un fichier temporaire lisible:

[root@kazuya ~]# mysqlbinlog /var/lib/mysql/mysql-bin.00001 > temp.sql

Ensuite avec votre éditeur de texte favoris (vi evidemment ^^ ), vous analyserez (rechercherez) la maudite ligne, la supprimer, puis ensuite enregistrer le fichier. Une fois ce script “tout neuf” *sans* la fameuse ligne de supression, il suffit de le ré-injecter dans mysql de la même façon que pour n'importe quel script sql:

 [root@kazuya ~]# mysql -u root -p -v < temp.sql

<note> Si vous avez plusieurs fichier mysqld-bin.00001, mysqld-bin.00002 … vous les mettez tous les un à la suite des autres:

[root@kazuya ~]# mysqlbinlog /var/lib/mysql/mysql-bin.00001 >> temp.sql
[root@kazuya ~]# mysqlbinlog /var/lib/mysql/mysql-bin.00002 >> temp.sql
[..]

Remarquez ici l'usage du “»” et pas du simple “>”.
Vous pourriez très bien utiliser également cette unique commande:

[root@kazuya ~]# mysqlbinlog /var/lib/mysql/mysql-bin.* >> temp.sql

Mais je ne suis pas certain à 100% que les requêtes seront dans le bon ordre(l'ordre des fichier mysqld-bin) dans le fichier temp.sql, par conséquent je vous recommande plutôt l'usage des commande d'au dessus. </note>

Si vous avez oublier votre mot de passe root MySQL

Un oublie du mot de passe root de MySQL ça arrive. Pour cela, il suffit de faire ceci:

[root@kazuya ~]# /etc/init.d/mysql stop
[root@kazuya ~]# mysqld --skip-grant-tables --skip-networking &
[root@kazuya ~]# mysql mysql
 mysql>

Ici on arrete le serveur mysql, puis on le redémarre sans les privilèges sur les tables et sans le réseau. Ensuite on se connecte à mysql. Maintenant il suffit de taper cette requete dans mysql:

UPDATE user SET password=PASSWORD('le_nouveau_mot_de_passe') WHERE User="root" AND Host="localhost";

Ensuite:

 mysql> quit
[root@kazuya ~]# mysqladmin shutdown
[root@kazuya ~]# /etc/init.d/mysql restart

On sort du client mysql, puis on coupe le service mysql que l'on a lancé sans les privilèges, et on le relance “normalement”. Vous devriez pouvoir à nouveau vous connecter avec le compte root de MySQL.

Conclusion

L'intérêt d'un serveur de base de donné MySQL est de pouvoir centralisé les données d'une entreprise pour ainsi mieux les traiter et les partager. De plus, avec une application bureautique, nous pouvons utiliser la base de donnée à partir de poste distant.
MySQL est le serveur de base de données le plus utilisé dans le monde. Son architecture logicielle le rend extrêmement rapide et facile à personnaliser.
Les principaux avantages de MySQL sont sa rapidité, sa robustesse et sa facilité d'utilisation et d'administration. Un autre avantage majeur de MySQL est sa documentation très complète et bien construite. Mais pour d'énormes bases de données, celui-ci ne suffit plus il faut alors ce tourner vers d'autres bases de données comme PostgreSQL ou Oracle, qui sont assez réputé pour ne pas les citer.

serveurs/mysql.txt · Dernière modification : 2018/11/17 12:54 de 127.0.0.1