« Bases de données » : différence entre les versions

De Justine's wiki
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 191 : Ligne 191 :
Le but final de ce travail sera de mettre en place une plateforme Debian, avec un serveur LAMP. On y ajoutera MySQL, un CMS, avant de migrer vers MariaDB et même de migrer vers un cluster MariaDB. Des sauvegardes et restaurations automatiques et incrémentales seront mises en place.
Le but final de ce travail sera de mettre en place une plateforme Debian, avec un serveur LAMP. On y ajoutera MySQL, un CMS, avant de migrer vers MariaDB et même de migrer vers un cluster MariaDB. Des sauvegardes et restaurations automatiques et incrémentales seront mises en place.


== Installation de la machine de base ==
À chacun des étapes, il est important de faire un snapshot.


Le système de base sera une Debian 9.5, dotée d'un serveur SHS et des composants habituels du système. Je pars d'une machine de base que je clone dans Virtualbox pour ne pas avoir à recommencer l'installation à chaque fois (je les range dans le groupe "machines fraîches"): il faut bien penser à changer les adresses MAC ainsi que les noms d'hôtes. Les machines seront reliées entre elles en mode "réseau NAT".
== Installation de la machine de base et configuration du réseau ==


=== Redirection de ports : ===
Le système de base sera une Debian 9.5, dotée d'un serveur SSH et des composants habituels du système. Je pars d'une machine de base que je clone dans Virtualbox pour ne pas avoir à recommencer l'installation à chaque fois (je les range dans le groupe "machines fraîches"): il faut bien penser à changer les adresses MAC ainsi que les noms d'hôtes. Les machines seront reliées entre elles en mode "réseau NAT". Au passage, je clone aussi une Debian avec interface graphique que j'avais de côté et qui me servira de navigateur web, et qui sera aussi dans le réseau NAT.


La redirection de ports en mode "Réseau NAT" sur Virtualbox se fait via les paramètres de la machine > Réseau > Avancé > Redirection de ports. Il faut utiliser des ports supérieurs à 1024 côté hôte, sinon cela ne fonctionnera pas (Virtualbox n'as pas le droit d'accéder aux ports statiques). On est sensé avoir une connexion immédiate, ce qui n'est pas mon cas ici.
=== Réseau NAT: ===


 
Le réseau NAT crée un réseau similaire à un réseau domestique, Virtualbox agissant comme une box (routeur + DHCP). Il faut pour cela:
 
*Aller dans les paramètres virtualbox > réseau > créer un réseau NAT, et choisir les paramètres.
*On peut créer des redirections de ports à cet endroit : ce paramètre agit comme n'importe quel PAT sur un routeur (le principe est le même que sur PfSense).
*Se rendre dans les paramètres de la / des VMs et choisir l'option "Réseau NAT" avec ce réseau.
 
==== Résolution de problème: ====
 
Ça ne fonctionne pas sur la version "dépôt" de virtualbox sur Ubuntu 18.10. Les étapes que j'ai suivies:
 
*Télécharger Virtualbox depuis le site officiel dans sa dernière version.
 
Après un plantage à l'installation, apt me bloquait avec le message "Virtualbox-5.2 doit être réinstallé, mais impossible de trouver son archive":
 
*sudo dpkg --configure -a
*relancer l'installation avec dpkg -i (et non pas avec gdebi !) sur le .deb précédemment téléchargé.   
 
=== Redirection de port : ===
 
La règle que j'ai créée est la suivante :
 
[[File:RedirSSH.png]]
 
J'ai ensuite ouvert le port via UFW.
 
La redirection fonctionne ensuite en lancant la commande suivante depuis ma machine hôte :
 
<code>ssh justine@127.0.0.1 -p 2222</code>
 
== Installation de la plateforme LAMP ==
 
À ce stade, je commence par installer sudo et vim, ce qui sera plus simple pour la suite :
<div style="background:#eeeeee; border:1px solid #cccccc; padding:5px 10px">su<br/> apt update<br/> apt install sudo<br/> apt install vim<br/> ###Je rajoute mon utilisateur justine en éditant le fichier /etc/sudoers<br/> visudo<br/> exit</div>
On installe ensuite mysql:
<div style="background:#eeeeee; border:1px solid #cccccc; padding:5px 10px">sudo apt install mysql-server mysql-client<br/> ###J'ai déjà update juste avant, pas besoin de recommencer<br/> ###MariaDB ne demande pas de mot de passe pour le root mysql (il n'en a pas!)<br/> ###Comme je suis sous Debian, cette commande installe MariaDB</div> <blockquote>
Avec MariaDB, le root n'as pas de mot de passe. Je peux voir ça avec :
<div style="background:#eeeeee; border:1px solid #cccccc; padding:5px 10px">sudo mysql -u root -p<br/> #Rentrer n'importe quel mdp<br/> use mysql;<br/> select User,Password,Plugin from user where User='root';<br/> #Je vois bien le champ "Password" vide !!!! et le Plugin "unix_socket"</div>
En effet,&nbsp; avec MariaDB, le root mysql utilise le root Linux !
</blockquote>
On modifie le fichier de configuration du serveur dans le cadre du TP et on redémarre:
<div style="background:#eeeeee; border:1px solid #cccccc; padding:5px 10px">
sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf<br/> ###Utiliser la recherche pour remplacer bind-address par 0.0.0.0<br/> sudo service mysql restart
</div> 
&nbsp;Installation du serveur web et des composants PHP:
<div style="background:#eeeeee; border:1px solid #cccccc; padding:5px 10px">sudo apt install apache2<br/> ###Vérifier qu'il fonctionne avec la machine "navigateur"<br/> sudo apt install php libapache2-mod-php<br/> sudo /etc/init.d/apache2 restart<br/> ###Le serveur est redémarré !</div>
Test de la configuration PHP: on va créer un fichier servant à tester que PHP fonctionne.
<div style="background:#eeeeee; border:1px solid #cccccc; padding:5px 10px">sudo vim /var/www/html/test.php<br/> ###Contrairement à ce que dit le TP, il faut mettre notre fichier php dans le dossier html, qui est la racine du serveur de base<br/> ###Je peux ensuite vérifier en allant sur http://10.0.2.15/test.php qu'il s'affiche bien</div>
&nbsp;On installe le support mysql de php:
<div style="background:#eeeeee; border:1px solid #cccccc; padding:5px 10px">sudo apt install php-mysql<br/> ###Redémarrage d'Apache<br/> sudo /etc/init.d/apache2 restart<br/> ###Retourner voir la page de test php en la rafraîchissant que les modules mysql se sont ajoutés (dans les .ini)</div>
NOTE : une petite liste des paquets php qui pourraient s'avérér utiles par la suite: php-curl php-pear php-gd php-intl php-imagick php-imap php-mcrypt php-memcache php-pspell php-recode php-snmp php-sqlite php-tidy php-xmlrpc php-xs
 
=== Installation de phpmyadmin ===
<div style="background:#eeeeee; border:1px solid #cccccc; padding:5px 10px">sudo apt install phpmyadmin<br/> ###Choisir le serveur apache<br/> ###Choisir la base de données db-common et entrer un mot de passe<br/> ###Une fois installé, je peux me connecter via http://10.0.2.15/phpmyadmin<br/> ###Identifiants : phpmyadmin et mot de passe précédemment entré</div>
Les informations sur les utilisateurs et les privilèges sont stockés dans la base de données "mysql".&nbsp; Ses 4 tables importantes pour les privilèges:
 
*db : privilèges sur les bdd
*tables_priv : privilèges sur les tables
*columns_priv : privilèges sur les colonnes
*procs_priv : privilèges sur les routines

Version du 12 décembre 2018 à 02:07

Introduction

Cette introduction est tirée de  : https://openclassrooms.com/fr/courses/1959476-administrez-vos-bases-de-donnees-avec-mysql/1959710-introduction

Concepts de base

Une base de données informatique est un ensemble de données qui ont été stockées sur un support informatique, organisées et structurées de manière à pouvoir facilement consulter et modifier leur contenu.

Ainsi, la base de données d'un site web pourrait contenir la liste des membres, les articles, etc... Cette abse de données doit non suelement exister, mais on doit pouvoir interagir avec et la gérer : on doit pouvoir utiliser des requêtes MySQL pour pouvoir modifier cette base. Nous avons donc besoin de :

  • Une base de données
  • un système pour la gérer
  • Un langage pour transmettre des instructions

SGBD

Un SGBD est un logiciel permettant de manipuler les données d'une base de données, c'est-à-dire les sélectionner, les afficher, les modifier, en ajouter ou en supprimer (CRUD : Create, Read, Update, Delete). MySQL est un SGBD. Les SGBD suivent en général le modèle client-serveur.

SGBDR

Le R en plus signifie "Relationnel". C'est un SGBD qui implémente la théorie relationnelle. La théorie relationnelle c'est compliqué, mais cela signifie en gros que les données sont contenues dans des relations, représentées sous forme de tables. Une relation est composée d'une en-tête et d'un corps. L'en-tête contient plusieurs attributs (pour un client on aura par exemple nom, prénom, adresse...). Le corps est quant à lui un ensemble de lignes (ou n-uplets) composé d'autant d'éléments qu'il y'a de d'attributs dans le corps. Exemple avec 4 lignes pour la relation client :

Numéro

Prénom

Nom

Email

1

Jean

Dupont

jdupont@email.com

2

Marie

Malherbe

mama@email.com

3

Nicolas

Jacques

Jacques.nicolas@email.com

4

Hadrien

Piroux

happi@email.com

Les opérations :

Différentes opérations peuvent être appliquées à ces relations pour en tirer des des informations (issues de la logique formelle et de la théorie des ensembles, apparement):

OperSGBD.png

 

Exemple de la jointure :

 

RTENOTITLE

Ici, on relie les deux tables par le numéro de client.

Quelques SGBDR

  • MySQL : L'un des plus utilisés, il utilise SQL. Il est open source. Il a été créé en 1994 par Widenius et Axmark, mais a depuis été racheté par Oracle, et a forké pour devenir MariaDB dans sa version Open source. Il est très utilisé mais a de nombreux défauts, car il ne suit pas toujours les normes officielles, et peux parfois manquer de certaines fonctions avancées.
  • PostGreSQL : Il est open source, lui aussi. Moins connu, il semble cependant actuellement équivalent à MySQL en termes de ressources. Le langage procédural qu'il utilise s'appelle le PL/pgSQL.
  • Access : propriété de Microsoft, il n'est pas du tout adapté aux gros volumes de données. Il a cependant une interface graphique ! :D
  • SQLite : Pas en client-serveur, il stocke les données dans de simples fichiers. Il est adapté quand on a pas la possibilité d'installer un serveur de base de données. Il est très performant pour les tout petits volumes de données, mais difficile à sécuriser.

Organisation d'une base de données relationnelle

Comme nous dans la vie courante, une base de données classe les informations d'une façon logique. Les données sont représentées sous forme de tables : une base de données contiendra plusieurs tables. Dans chaque table se trouveront un certain nombre de colonnes. Ainsi, les données seront introduites sous formes de lignes dans la table. C'est tout simplement : UN TABLEAU ! Comme ça :

Numéro

Prénom

Nom

Email

1

Jean

Dupont

jdupont@email.com

2

Marie

Malherbe

mama@email.com

3

Nicolas

Jacques

Jacques.nicolas@email.com

4

Hadrien

Piroux

happi@email.com

 

Premier TP : MySQL/MariaDB

Le but final de ce travail sera de mettre en place une plateforme Debian, avec un serveur LAMP. On y ajoutera MySQL, un CMS, avant de migrer vers MariaDB et même de migrer vers un cluster MariaDB. Des sauvegardes et restaurations automatiques et incrémentales seront mises en place.

À chacun des étapes, il est important de faire un snapshot.

Installation de la machine de base et configuration du réseau

Le système de base sera une Debian 9.5, dotée d'un serveur SSH et des composants habituels du système. Je pars d'une machine de base que je clone dans Virtualbox pour ne pas avoir à recommencer l'installation à chaque fois (je les range dans le groupe "machines fraîches"): il faut bien penser à changer les adresses MAC ainsi que les noms d'hôtes. Les machines seront reliées entre elles en mode "réseau NAT". Au passage, je clone aussi une Debian avec interface graphique que j'avais de côté et qui me servira de navigateur web, et qui sera aussi dans le réseau NAT.

Réseau NAT:

Le réseau NAT crée un réseau similaire à un réseau domestique, Virtualbox agissant comme une box (routeur + DHCP). Il faut pour cela:

  • Aller dans les paramètres virtualbox > réseau > créer un réseau NAT, et choisir les paramètres.
  • On peut créer des redirections de ports à cet endroit : ce paramètre agit comme n'importe quel PAT sur un routeur (le principe est le même que sur PfSense).
  • Se rendre dans les paramètres de la / des VMs et choisir l'option "Réseau NAT" avec ce réseau.

Résolution de problème:

Ça ne fonctionne pas sur la version "dépôt" de virtualbox sur Ubuntu 18.10. Les étapes que j'ai suivies:

  • Télécharger Virtualbox depuis le site officiel dans sa dernière version.

Après un plantage à l'installation, apt me bloquait avec le message "Virtualbox-5.2 doit être réinstallé, mais impossible de trouver son archive":

  • sudo dpkg --configure -a
  • relancer l'installation avec dpkg -i (et non pas avec gdebi !) sur le .deb précédemment téléchargé. 

Redirection de port :

La règle que j'ai créée est la suivante :

J'ai ensuite ouvert le port via UFW.

La redirection fonctionne ensuite en lancant la commande suivante depuis ma machine hôte :

ssh justine@127.0.0.1 -p 2222

Installation de la plateforme LAMP

À ce stade, je commence par installer sudo et vim, ce qui sera plus simple pour la suite :

su
apt update
apt install sudo
apt install vim
###Je rajoute mon utilisateur justine en éditant le fichier /etc/sudoers
visudo
exit

On installe ensuite mysql:

sudo apt install mysql-server mysql-client
###J'ai déjà update juste avant, pas besoin de recommencer
###MariaDB ne demande pas de mot de passe pour le root mysql (il n'en a pas!)
###Comme je suis sous Debian, cette commande installe MariaDB

Avec MariaDB, le root n'as pas de mot de passe. Je peux voir ça avec :

sudo mysql -u root -p
#Rentrer n'importe quel mdp
use mysql;
select User,Password,Plugin from user where User='root';
#Je vois bien le champ "Password" vide !!!! et le Plugin "unix_socket"

En effet,  avec MariaDB, le root mysql utilise le root Linux !

On modifie le fichier de configuration du serveur dans le cadre du TP et on redémarre:

sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
###Utiliser la recherche pour remplacer bind-address par 0.0.0.0
sudo service mysql restart

 Installation du serveur web et des composants PHP:

sudo apt install apache2
###Vérifier qu'il fonctionne avec la machine "navigateur"
sudo apt install php libapache2-mod-php
sudo /etc/init.d/apache2 restart
###Le serveur est redémarré !

Test de la configuration PHP: on va créer un fichier servant à tester que PHP fonctionne.

sudo vim /var/www/html/test.php
###Contrairement à ce que dit le TP, il faut mettre notre fichier php dans le dossier html, qui est la racine du serveur de base
###Je peux ensuite vérifier en allant sur http://10.0.2.15/test.php qu'il s'affiche bien

 On installe le support mysql de php:

sudo apt install php-mysql
###Redémarrage d'Apache
sudo /etc/init.d/apache2 restart
###Retourner voir la page de test php en la rafraîchissant que les modules mysql se sont ajoutés (dans les .ini)

NOTE : une petite liste des paquets php qui pourraient s'avérér utiles par la suite: php-curl php-pear php-gd php-intl php-imagick php-imap php-mcrypt php-memcache php-pspell php-recode php-snmp php-sqlite php-tidy php-xmlrpc php-xs

Installation de phpmyadmin

sudo apt install phpmyadmin
###Choisir le serveur apache
###Choisir la base de données db-common et entrer un mot de passe
###Une fois installé, je peux me connecter via http://10.0.2.15/phpmyadmin
###Identifiants : phpmyadmin et mot de passe précédemment entré

Les informations sur les utilisateurs et les privilèges sont stockés dans la base de données "mysql".  Ses 4 tables importantes pour les privilèges:

  • db : privilèges sur les bdd
  • tables_priv : privilèges sur les tables
  • columns_priv : privilèges sur les colonnes
  • procs_priv : privilèges sur les routines