2010-03-12 3 views
12

Longue histoire courte, j'ai essayé de mettre à jour rapidement une seule ligne dans SQL Server en utilisant le studio de gestion et juste tapé UPDATE table SET column='value' et j'ai oublié la partie WHERE other_column='other_value'. Je suis allé déjeuner, je suis revenu et il y avait 15 emails non lus qui m'attendaient. Il y a environ une heure, il attendait que le type de base de données revienne pour voir quand la dernière sauvegarde a eu lieu. Il n'y a pas de fonction UNDO magique mais est-ce là?Est-ce que SQL Server dispose d'une fonction d'annulation magique?

+0

question connexe: http://stackoverflow.com/questions/168486/whats-your-1 -way-to-be-prudent-with-a-live-database/ –

Répondre

19

Oui, il y a - c'est le journal des transactions. Pour récupérer à partir de quelque chose comme ça, tant que vous avez votre base de données dans le modèle de récupération complète, vous feriez simplement une autre sauvegarde du journal des transactions, puis faites une restauration avec l'option STOPAT pour indiquer à la restauration d'arrêter de restaurer au point temps juste avant de commencer votre transaction. Cela rétablira la base de données au point de votre erreur.

Voir ici pour plus d'informations sur l'utilisation de l'option STOPAT - http://msdn.microsoft.com/en-us/library/ms186858(SQL.90).aspx.

Votre script ressemblerait à quelque chose comme ça ...

-- backup the existing log 
BACKUP LOG [MyDatabase] 
    TO DISK = N'\\MyServer\Share\MyDatabase.trn' 
    -- options left out for brevity 
GO 

-- restore the database first 
RESTORE DATABASE [MyDatabase] 
    FROM DISK = N'\\MyServer\Share\MyDatabase.bak' 
    WITH FILE = 1, 
    NORECOVERY, 
    NOUNLOAD, 
    STATS = 10 
GO 

/* Previous transaction logs in the chain go here... */ 

/* restore your log that you backed up after the mistake 
    took place, stopping at your point where the problem happened */ 
RESTORE LOG [MyDatabase] 
    FROM DISK = N'\\MyServer\Share\MyDatabase.trn' 
    WITH FILE = 1, 
    NORECOVERY, 
    NOUNLOAD, 
    STATS = 10, 
    STOPAT = '2010-03-12 13:00' 
GO 
+1

Le journal des transactions est votre ami, et combien d'entre nous pensent, "Je détestais quand je faisais ça ..." – dverespey

+0

Nous avons tous fait il - mais seulement le laisser arriver une fois. Des erreurs comme celle-ci sont censées être apprises à partir de :) –

+0

Great post, je vais essayer dans un petit peu –

2

C'est ce qu'on appelle le journal des transactions. Vous pouvez le renvoyer. Vous avez enregistré le entier en vous connectant à un moment précis, et pas seulement votre mauvaise transaction.

1

si vous prenez des sauvegardes de bases de données et les sauvegardes du journal des transactions, vous pouvez faire un point dans le temps de restauration au moment avant que vous avez exécuté la déclaration de mise à jour autrement pas , pas vraiment

0

J'ai peur qu'il n'y en ait pas. C'est pourquoi j'écris toujours le select voir les résultats et ensuite le convertir en mise à jour. A également appris la leçon à la dure lol. Bien sûr, vous pouvez restaurer à partir du journal des transactions.

+0

Que voulez-vous dire? il y a une raison pour laquelle des journaux de transactions et des sauvegardes existent – SQLMenace

+0

J'ai ajouté que monsieur ... Je voulais dire qu'il n'y a aucun moyen magique d'annuler cette opération sans restaurer à partir des sauvegardes. (Il a dit qu'il attend que le gars de DB revienne.) – Raja

Questions connexes