web-dev-qa-db-fra.com

Comment annuler une mise à jour dans PostgreSQL

Lors de l'édition de certains enregistrements de ma base de données PostgreSQL en utilisant SQL dans le terminal (dans Ubuntu lucid), j'ai effectué une mise à jour incorrecte.

Au lieu de -

update mytable set start_time='13:06:00' where id=123;

J'ai tapé -

update mytable set start_time='13:06:00';

Ainsi, tous les enregistrements ont maintenant la même valeur start_time.

Y at-il un moyen d'annuler ce changement? Il y a plus de 500 enregistrements dans la table, et je ne sais pas quelle était la valeur start_time pour chaque enregistrement.

Est-il perdu pour toujours?

9
damon

Je suppose que c'était une transaction déjà engagée? Si c'est le cas, c'est ce que "commettre" signifie, vous ne pouvez pas revenir en arrière.

Certaines données peuvent être récupérées si vous avez de la chance. Arrêtez la base de données maintenant.

Voici une réponse que j'ai écrite sur le même sujet plus tôt . J'espère que c'est utile.

Cela pourrait être aussi: Récupéré des lignes supprimées dans postgresql .

À moins que les données ne soient absolument essentielles, il suffit de restaurer à partir de sauvegardes, ce sera beaucoup plus facile et moins pénible. Si vous n'avez pas eu de sauvegardes, considérez-vous comme totalement choqué.

6
Craig Ringer

Si vous détectez une erreur et arrêtez immédiatement les applications utilisant la base de données et les mettez hors ligne, vous pouvez éventuellement utiliser la récupération ponctuelle (PITR) pour relire vos fichiers WAL (Write Ahead Log) jusqu’à, mais sans les inclure. moment où la transaction errante a été faite. Cela ramènerait la base de données à l'état dans lequel elle se trouvait auparavant, ce qui aurait pour effet "d'annuler" cette transaction.

En tant qu'approche pour une base de données d'applications de production, elle présente un certain nombre de limitations évidentes, mais il existe des circonstances dans lesquelles le PITR peut être la meilleure option disponible, en particulier lorsque des pertes de données critiques se sont produites. Cependant, cela n'a aucune valeur si l'archivage n'était pas déjà configuré avant l'événement de corruption.

https://www.postgresql.org/docs/current/static/continuous-archiving.html

Des capacités similaires existent avec d'autres moteurs de bases de données relationnelles.

0
hemp