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
| Mot | Ce que ça veut dire |
|---|---|
| Sauvegarde | une copie de données faite pour pouvoir les retrouver |
| Export | un fichier texte du SQL qui reconstruit une table et ses lignes |
| Restauration | remettre les données à partir d'une sauvegarde |
| Lignes touchées | le nombre de lignes qu'un changement a modifiées |
| Répétition à blanc | essayer 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
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfAffiché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
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
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
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
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
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
mariadb-dump -h db -u student -pstudent --skip-extended-insert --no-tablespaces student_copie liste_prix > liste_prix.sqlAffiché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
grep -c "^INSERT" liste_prix.sqlAffiché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
grep -m1 "^INSERT" liste_prix.sqlAffiché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
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
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
mariadb -h db -u student -pstudent student_copie < liste_prix.sqlAffiché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
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
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
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
| Temps | Ce que vous faites | Contre quoi cela protège |
|---|---|---|
| 1 | Exporter la table dans un fichier | un changement impossible à défaire |
| 2 | SELECT COUNT(*) avec le même WHERE | un WHERE qui choisit trop de lignes |
| 3 | START TRANSACTION puis le UPDATE | un changement déjà définitif |
| 4 | Comparer ROW_COUNT() au temps 2 | un nombre inattendu |
| 5 | COMMIT, ou ROLLBACK puis regarder de nouveau | terminer 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.