Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Une sauvegarde avant chaque changement

Après cette leçon: Je peux sauvegarder une table avant un changement et la restaurer si le changement est faux.

Leçon de 55 min15 commandesLab MySQL et phpMyAdmin avec une base de boutique pour s’exercer en SQL

Le changement impossible à défaire

Une sauvegarde est une copie des données faite avant un changement, pour pouvoir revenir en arrière. Sans elle, une erreur peut être définitive.

Un vendredi après-midi, un ingénieur corrige les prix d'un fournisseur. Le UPDATE est juste. Le WHERE a une faute de frappe et touche toute la table.

Une base de données n'a pas de bouton « annuler ». Le seul retour possible est une copie faite avant le changement.

Dans un métier, cette copie est la première étape, à chaque fois.

À la fin de cette leçon

Remarque

Je peux sauvegarder une table avant un changement et la restaurer si le changement est faux.

Mots-clés

MotCe que ça veut dire
Sauvegardeune copie de données faite pour pouvoir les retrouver
Exportun fichier texte du SQL qui reconstruit une table et ses lignes
Restaurationremettre les données à partir d'une sauvegarde
Lignes touchéesle nombre de lignes qu'un changement a modifiées
Répétition à blancessayer un changement dans une transaction, puis l'annuler

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Travailler sur une copie de la boutique

Vous allez changer des données, puis les réparer. La boutique doit rester intacte.

Ces Runs créent une table liste_prix dans votre propre base, copiée des articles de la boutique.

Relancez-les quand vous voulez pour repartir de zéro.

Accepter le certificat du serveur

Commande
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnf

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Un nom court pour le client

Commande
alias bd='mariadb -h db -u student -pstudent -t -e'

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Créer votre base

Commande
bd "CREATE DATABASE IF NOT EXISTS student_copie"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Supprimer l'ancienne copie

Commande
bd "DROP TABLE IF EXISTS student_copie.liste_prix"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Copier les articles

Commande
bd "CREATE TABLE student_copie.liste_prix AS SELECT id, name AS nom, price AS prix, stock FROM shop.products"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Noter son état actuel

Commande
bd "SELECT COUNT(*) AS lignes_actuelles, MIN(prix) AS moins_cher, MAX(prix) AS plus_cher FROM student_copie.liste_prix"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Un export est une sauvegarde lisible

L'outil mariadb-dump demande une table au serveur et écrit le SQL qui la reconstruit. Le fichier contient une ligne CREATE TABLE et un INSERT par ligne de la table.

L'option --skip-extended-insert met une ligne de la table sur chaque ligne du fichier. --no-tablespaces est nécessaire car votre compte ne peut pas lire les fichiers de stockage du serveur.

Le signe > envoie le résultat dans un fichier au lieu de l'écran.

Sauvegarder la table dans un fichier

Commande
mariadb-dump -h db -u student -pstudent --skip-extended-insert --no-tablespaces student_copie liste_prix > liste_prix.sql

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Compter les lignes INSERT du fichier

Commande
grep -c "^INSERT" liste_prix.sql

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Lire la première ligne sauvegardée

Commande
grep -m1 "^INSERT" liste_prix.sql

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Faire l'erreur, puis la réparer

Faites maintenant comme l'ingénieur. Lancez un UPDATE sans WHERE sur la copie.

Regardez ensuite les prix. Puis restaurez le fichier. L'export commence chaque table par DROP TABLE IF EXISTS : le charger remplace donc la table abîmée.

Mettre tous les prix à zéro

Commande
bd "UPDATE student_copie.liste_prix SET prix = 0"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Voir les dégâts

Commande
bd "SELECT COUNT(*) AS lignes_actuelles, MIN(prix) AS moins_cher, MAX(prix) AS plus_cher FROM student_copie.liste_prix"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Restaurer depuis le fichier

Commande
mariadb -h db -u student -pstudent student_copie < liste_prix.sql

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Voir la table réparée

Commande
bd "SELECT COUNT(*) AS lignes_actuelles, MIN(prix) AS moins_cher, MAX(prix) AS plus_cher FROM student_copie.liste_prix"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Une erreur fréquente

Attention

Beaucoup croient qu'une sauvegarde est sûre dès que le fichier existe. Un fichier jamais restauré n'est qu'un espoir. Il peut être vide ou coupé. Comptez les lignes qu'il contient, et entraînez-vous à restaurer sur une copie.

Vérifier combien de lignes un changement touche

Une sauvegarde sert quand tout va mal. Mieux vaut encore voir les dégâts avant qu'ils soient définitifs.

Commencez une transaction. Lancez le UPDATE. Demandez à ROW_COUNT() combien de lignes il a changées. Si le nombre est faux, faites ROLLBACK. S'il est bon, relancez et faites COMMIT.

C'est une répétition à blanc.

Essayer un changement, puis l'annuler

Commande
bd "START TRANSACTION; UPDATE student_copie.liste_prix SET stock = stock + 5 WHERE stock < 10; SELECT ROW_COUNT() AS modifiees; ROLLBACK"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Compter les lignes que le WHERE choisit

Commande
bd "SELECT COUNT(*) AS stock_bas FROM student_copie.liste_prix WHERE stock < 10"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Exemple : un changement sûr en cinq temps

TempsCe que vous faitesContre quoi cela protège
1Exporter la table dans un fichierun changement impossible à défaire
2SELECT COUNT(*) avec le même WHEREun WHERE qui choisit trop de lignes
3START TRANSACTION puis le UPDATEun changement déjà définitif
4Comparer ROW_COUNT() au temps 2un nombre inattendu
5COMMIT, ou ROLLBACK puis regarder de nouveauterminer un changement faux

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Pour aller plus loin

Exportez toute la base student_copie en omettant le nom de la table. Comptez ses lignes CREATE TABLE.

Dans un vrai métier, vous copieriez aussi le fichier ailleurs, et vous testeriez la restauration sur un autre serveur. Une sauvegarde au même endroit que les données disparaît avec elles.

À propos de ce labo et de sa source: Lab MySQL et phpMyAdmin avec une base de boutique pour s’exercer en SQL

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.