Académique Documents
Professionnel Documents
Culture Documents
MYSQL
MARCHE N°19/00033/M/MINFI/SG/DRF/SDBM/SM/IPPM DU 08 OCTOBRE 2019 PASSE SUIVANT
AUTORISATION N° 004857/L/MINMAP/SG/DGMAS/DMSPI/CE2 DU 16 SEPTEMBRE 2019
RELATIF A LA SECURISATION DES RECETTES DE L’ETAT PAR AGREGATION DES MOYENS DE
PAIEMENTS AU CAMEROUN
2
4.2 Les Moteurs de Stockage
• Un moteur de stockage détermine la manière dont les données sont
stockées dans les tables
• Il existe plusieurs moteurs de stockage dans MySQL dont : MyISAM,
InnoDB, CSV, ISAM. Chaque table peut utiliser un moteur différent
au sein d’une base. Ceci afin d’optimiser l’utilisation de chaque table.
• Pour voir les différents moteurs de stockage utilisez la commande :
show engines; ou
select * from information_schema.engines
3
4.2 Les Moteurs de Stockage
• MyISAM a été le moteur de stockage par défaut jusqu’à la version
5.5.5 de MySQL. Il est le plus simple à utiliser et à mettre en œuvre. Il
utilise plusieurs fichiers qui grandissent au fur et à mesure que la base
grossit. Il ne supporte pas les transactions, ni les clefs étrangères;
• InnoDB est le moteur par défaut depuis MySQL 5.6. Lorsque vous
créez une table dans MySQL sans spécifier un moteur, MySQL utilise
une table InnoDB.
• InnoDB gère les transactions et les clefs étrangères (et donc l'intégrité
de ses tables). En contrepartie, les bases qui l'utilisent occupent bien
plus d'espace sur le disque.
4
4.2 Les Moteurs de Stockage
• Lorsque vous créez une table, précisez le moteur de stockage avec le
mot clé ENGINE :
Create table nom_table (colonne1 description_colonne1, colonne2
description_colonne2 …]) [ENGINE=moteur]
• Exemple :
create table titulaire_compte ( id int auto_increment, nom
varchar (45), prenom varchar (45), primary key
(id)) ENGINE=InnoDB;
5
4.2 Les Moteurs de Stockage
• Pour voir sur quel moteur de stockage une table repose, utilisez les
informations dans la base :
6
4.3 Comment Implémenter une transaction
• Une transaction est un ensemble de requêtes qui sont exécutées en
un seul bloc.
• Ainsi, si une des requêtes du bloc échoue, on peut décider d’annuler
tout le bloc de requêtes
• Sans transactions, certaines opérations risqueraient d’être à moitié
réalisées, et la moindre erreur, la moindre interruption pourrait avoir
des conséquences énormes.
7
4.3 Comment Implémenter une transaction
• Exemple :
Les cas des transactions OM
Imaginez que M. GAMO fait un virement de 30000 FCFA à Mme
GAMO via OM. Il saisit tous les codes USSD, puis valide. L'application
de la banque commence à traiter le virement quand soudain, une
violente panne de courant provoque l'arrêt des serveurs de la banque.
Deux jours plus tard, M. GAMO reçoit un coup de fil de Mme GAMO,
très énervé, qui lui demande pourquoi le paiement convenu n'a
toujours pas été fait. Intrigué, M. GAMO va vérifier son compte, et
constate qu'il a bien été débité de 30000 FCFA.
8
4.3 Comment Implémenter une transaction
• Que s’est t’il passé:
Normalement, le traitement d'un virement est plutôt simple, deux étapes suffisent :
Seulement voilà, pas de chance pour M. GAMO, la panne de courant qui a éteint les
serveurs est survenue pile entre l'étape 1 et l'étape 2. Du coup, son compte a été débité,
mais le compte de Mme. GAMO n'a jamais été crédité.
La banque de M. GAMO n'utilisait pas les transactions. Si cela avait été le cas, la seconde
requête du traitement n'ayant jamais été exécutée, la première requête n'aurait jamais été
validée.
9
4.3 Comment Implémenter une transaction
• Voici un schéma qui devrait vous éclairer sur le principe des
transactions. On démarre une transaction.
11
4.3 Comment Implémenter une transaction
• Pour quitter ce mode, il suffit d’executé la requête suivante :
SET autocommit=0 ou SET autocommit=OFF
• Une fois que vous n’êtes plus en autocommit, chaque modification de
donnée devra être commitée pour prendre effet. Tant que vos
modifications ne sont pas validées, vous pouvez à tout moment les
annuler (faire un rollback).
• Les commandes pour commiter et faire un rollback sont relativement
faciles à retenir :
COMMIT; -- pour valider les requêtes
ROLLBACK; -- pour annuler les requêtes
12
4.3 Comment Implémenter une transaction
Démarrer explicitement une transaction
• En désactivant le mode autocommit, en réalité, on démarre une
transaction. Et chaque fois que l’on fait un rollback ou un commit (ce
qui met fin à la transaction), une nouvelle transaction est créée
automatiquement, et ce tant que la session est ouverte.
• Il est également possible de démarrer explicitement une transaction,
auquel cas on peut laisser le mode autocommit activé, et décider au
cas par cas des requêtes qui doivent être faites dans une transaction.
• Repassons donc en mode autocommit qui est le mode par défaut de
MySQL, utilisez :
SET autocommit=1; ou SET autocommit=ON ;
13
4.3 Comment Implémenter une transaction
Démarrer explicitement une transaction
• Pour démarrer une transaction, il suffit de lancer la commande suivante :
START TRANSACTION ou BEGIN WORK ou BEGIN
• Dans l’exemple suivant, nous implémentons une transaction :
START TRANSACTION;
INSERT INTO contribuable Values(1, 'Ateba Pierre','12/05/2010');
INSERT INTO contribuable Values(2, 'Fotso Ahmadou','18/12/2008');
COMMIT;
• Dans cet exemple, une transaction est initiée avec la commande START
TRANSACTION. Deux inserts sont exécutés et ensuite un Commit pour
valider la transaction. Vous pouvez observer le résultat en utilisant :
SELECT * from contribuable
14
4.3 Comment Implémenter une transaction
Démarrer explicitement une transaction
• Exemple 2 :
START TRANSACTION;
INSERT INTO contribuable Values(1, ' Mba Ledoux','13/08/2009');
INSERT INTO contribuable Values(2, 'KOKE
Marcellin','11/04/2010');
ROLLBACK;
• en observant le résultat de cette requête, vous vous rendez compte
que les inserts n’ont pas été validés
SELECT * from contribuable
15
4.4 Comment Implémenter une transaction
Jalon de transaction
• Lorsque l'on travaille dans une transaction et que l'on constate que certaines requêtes
posent problème, on n'a pas toujours envie de faire un rollback depuis le début de la
transaction, annulant toutes les requêtes alors qu'une partie aurait pu être validée.
• Les jalons de transaction sont des points de repère qui permettent d'annuler toutes les
requêtes exécutées depuis ce jalon, et non toutes les requêtes de la transaction.
• Syntaxe :
SAVEPOINT nom_jalon;
-- Crée un jalon avec comme nom "nom_jalon"
ROLLBACK [WORK] TO [SAVEPOINT] nom_jalon;
-- Annule les requêtes exécutées depuis le jalon "nom_jalon", WORK et
SAVEPOINT ne sont pas obligatoires
RELEASE SAVEPOINT nom_jalon;
-- Retire le jalon "nom_jalon" (sans annuler, ni valider les requêtes faites depuis)
16
4.4 Comment Implémenter une transaction
Exemple
• Exécutez les requêtes suivantes :
START TRANSACTION;
INSERT INTO contribuable (nom, date_naissance) VALUES ('Frank', '03/11/1985’);
SAVEPOINT jalon1;
INSERT INTO contribuable (nom, date_naissance) VALUES ('Momo', '13/12/1985');
ROLLBACK TO SAVEPOINT jalon1;
INSERT INTO contribuable (nom, date_naissance) VALUES ('Mimi', ‘03/12/1985’);
COMMIT;
• On n’utilise qu’une seule transaction, on valide à la fin, et pourtant, la seconde
insertion n’a pas été faite finalement, puisqu’elle a été annulée grâce au jalon. Seuls
Frank et Mimi existent
17
4.4. Comment Sauvegarder et Restaurer les données
• La commande Mysqldump
la commande utilisée pour faire des backup est :
mysqldump [options] > dump.sql
• il existe trois façons générales d’invoquer mysqldump :
• pour sauvegarder un serveur
• pour sauvegarder une ou plusieurs BD
• pour sauvegarder une ou plusieurs tables
Par défaut, mysqldump verrouille toutes les tables avant de faire la sauvegarde
18
4.4. Comment Sauvegarder et Restaurer les données
• utilisez la commande suivante pour sauvegarder toutes les bases de
données
mysqldump -u <username> -h hote -p --all-databases >
all_databases.sql
• Exemple : pour sauvegarder votre serveur utilisez :
mysqldump -u root -h localhost -p --all-databases >
all_databases.sql
19
4.4. Comment Sauvegarder et Restaurer les données
20
4.4. Comment Sauvegarder et Restaurer les données
●
Exemple 2 : pour sauvegarder la base fiscalite avec le nom du fichier
qui porte la date de la sauvegarde:
mysqldump -u root -h localhost -p fiscalite > fiscalite-$(date +%d-%m-
%Y).sql
●
Si la sauvegarde a lieu le 06 juillet 2020, le fichier portera nom fiscalite-06-07-
2020.sql
●
Pour que le fichier contient l’heure et la minute de sauvegarde utilisez %d-%m-
%Y-%Hh-%Mmin
21
4.4. Comment Sauvegarder et Restaurer les données
22
4.4. Comment Sauvegarder et Restaurer les données
Restauration
• pour restaurer une sauvegarde utilisez mysql (rassurez vous au
préalable d’avoir crée la base de données) :
mysql -u <user> -h <hote> -p nombd < nombd.sql
●
Exemple : pour restaurer la base fiscalite:
mysql -u root -p -e "create database fiscalitetest";
mysql -u root -p fiscalitetest < fiscalite.sql
●
On crée d’abord la base, puis on la restaure les informations
23
4.5. Automatiser une sauvegarde
24
4.5. Automatiser une sauvegarde
●
Copiez et collez les lignes suivante dans le fichier, en mettant les valeurs
correspondante :
[client]
user=utilisateur_db
password=mot_de_passe
●
Restreindre l’accès à ce fichier, à vous uniquement l’accès :
sudo chmod 644 ~/.my.cnf
25
4.5. Automatiser une sauvegarde
26
4.5. Automatiser une sauvegarde
4. Création du cron
●
Ouvrez votre fichier crontab :
crontab -e
●
Ajoutez la ligne suivante, pour faire une sauvegarde tous les jours à
03h du matin :
0 3 * * * mysqldump -u nom-utilisateur -h hote nom_bd >
~/db_backups/ma_bd-$(date +\%Y\%m\%d).sql
27
4.5 Référence et Lecture Additionnelle
• https://www.mysqltutorial.org/mysql-table-locking/
• https://www.tutorialspoint.com/How-can-we-implement-a-MySQL-tr
ansaction
• https://openclassrooms.com/fr/courses/1959476-administrez-vos-bas
es-de-donnees-avec-mysql/1970063-transactions
• https://www.mysqltutorial.org/mysql-transaction.aspx/
• https://linuxize.com/post/how-to-back-up-and-restore-mysql-
databases-with-mysqldump/
28
QUESTIONS
4.6 Exercices
1. la commande pour faire une sauvegarde est
A) mysql B ) mysqldump C) mysqlbackup D) mysqlsave
2. la commande pour restaurer est
A) mysql B ) mysqldump C) mysqlbackup D) mysqlsave
3. Considérez la requête ci-après :
START TRANSACTION;
INSERT INTO contribuable Values(1, ' Mba Ledoux','13/08/2009');
INSERT INTO contribuable Values(2, 'KOKE Marcellin','11/04/2010');
ROLLBACK;
En exécutant, cette requête, deux lignes seront insérés dans la table contribuable. Vrai ou Faux ?
Justifiez votre réponse
30
4.7 Travaux Pratiques
1. Voir fichier
31