Comment récupérer des enregistrements supprimés?

49

J'ai supprimé par erreur environ 2 000 000 enregistrements d'une table SQL Server 2008 distante. Le serveur ne me donne pas accès aux fichiers de sauvegarde côté serveur.

Est-il possible de récupérer ces disques?

Nick Chammas
la source
18
Quand avez-vous testé vos sauvegardes pour la dernière fois?
Joe
20
À quand remonte la dernière fois que vous avez testé une restauration de vos sauvegardes?
datagod

Réponses:

116

Votre base de données est-elle en mode de récupération complète?

  • Si oui, effectuez-vous des sauvegardes du journal des transactions?

    • Si oui, avez-vous un utilitaire de sauvegarde comme Quest LiteSpeed, Red Gate SQL Backup ou Idera SQLSafe?
      • Si tel est le cas, ces utilitaires peuvent récupérer des objets à partir de fichiers de sauvegarde (y compris les journaux complets et de transaction), mais expliquer comment les utiliser va au-delà de la portée de ce que je peux faire ici. Contactez le vendeur pour obtenir des instructions.
      • Si non, restaurez les journaux de sauvegarde et de transaction complets en tant que base de données portant un nom différent. (N'écrasez pas la base de données existante.) Vous pourrez obtenir une copie de l'objet à la seconde près avant la suppression, mais vous devrez utiliser la partie stopat de la commande de restauration pour spécifier quand arrêter de restaurer les commandes. Vous devez vous arrêter avant la suppression.
    • Sinon, récupérez une copie d'un utilitaire de lecture de journaux tel que Quest LiteSpeed ​​ou Apex SQL Log. Ces utilitaires peuvent se connecter au serveur de base de données, examiner le fichier journal et vous aider à annuler des transactions. Je ne sais pas si les versions de démonstration fonctionneront, mais les versions payantes le seront certainement.
  • Si non (pas en mode de récupération complète), restaurez la dernière sauvegarde complète en tant que base de données portant un nom différent. (N'écrasez pas la base de données que vous avez déjà.) À partir de là, vous pourrez restaurer tous les enregistrements en ligne au moment de la sauvegarde, mais vous perdrez toutes les modifications apportées depuis.

Brent Ozar
la source
4
Excellente réponse, je vais ajouter que si vous avez un audit ou un suivi des modifications, il est généralement plus facile de récupérer les données à partir de ces tables lorsque seulement une table a été affectée. Et bien sûr, si votre réponse est négative pour tout ou partie de ce qui précède, après avoir restauré autant que possible les enregistrements, corrigez ensuite votre processus de sauvegarde et déterminez éventuellement qui a accès aux données de production.
HLGEM
Si vous êtes en mode simple, les lignes peuvent toujours être physiquement présentes sur certaines pages. Certains d’entre eux pourront peut-être être récupérés (à un coût horaire et / ou financier très élevé).
usr
FYI. ApexSQL Récupérer en plus de la limitation dans le temps, la version d'évaluation ne récupère que 1 sur 10 rangées de lignes totales disponibles pour la récupération ( apexsql.com/faqs/faqs_recover.aspx )
Sameer
30

SQL Server conserve des journaux pour chaque enregistrement supprimé. Vous pouvez interroger ces journaux via la fn_dblogfonction SQL Server.

SELECT [RowLog Contents 0] 
FROM   sys.fn_dblog(NULL, NULL) 
WHERE  
       AllocUnitName = 'dbo.TableName'        
   AND Context IN ( 'LCX_MARK_AS_GHOST', 'LCX_HEAP' )        
   AND Operation in ( 'LOP_DELETE_ROWS' )   
;

Mais ce journal est au format Hex et vous devez convertir ce format Hex en données réelles.

L'article ci-dessous vous aidera à récupérer les enregistrements supprimés de la manière définie ci-dessus:

http://raresql.com/2011/10/22/how-to-recover-deleted-data-from-sql-sever/

utilisateur1059637
la source
3
C'est plutôt cool. Dans quelles conditions cette approche fonctionne-t-elle (ou ne fonctionne-t-elle pas)?
Nick Chammas
3
@ NickChammas - Il ne peut récupérer que le contenu du journal actif. Par conséquent, pour un modèle de récupération simple, un point de contrôle ne doit pas s'être produit. En outre, il semble actuellement que cela ne fonctionne pas correctement dans les bases de données avec isolation par cliché, mais cela devrait être une solution de facilité. @user1059637- Quelle est votre attitude vis-à-vis des personnes qui ajoutent des fonctionnalités à votre code?
Martin Smith
@MartinSmith, il fonctionne maintenant parfaitement avec l'isolation de capture instantanée.
user1059637
22

Malheureusement, nous ne pourrons pas vous aider sans plus d'informations. Mais de votre question, je vois que vous avez supprimé ce qui semble être 2 millions d’enregistrements de votre base de données. Il est fort probable que vous ne puissiez pas récupérer ces informations, à moins que votre base de données ne soit journalisée et que vous achetiez des outils très spécifiques.

Si vous pouvez décrire plus en détail ce que vous pensez avoir accompli et les raisons pour lesquelles vous estimez que vous ne pouvez pas récupérer les enregistrements et que vous pouvez décrire l'organisation de votre base de données, nous pourrons peut-être vous aider un peu plus.

Un conseil général: si vous pensez que vous avez supprimé 2 millions de disques, vous êtes probablement un peu paniqué en ce moment. Vous devriez donc faire une pause de cinq minutes, vous calmer et revoir le problème. De plus, vous devriez informer immédiatement votre patron si c'est raisonnable (ne levez pas quelqu'un à 2 heures du matin pour le lui dire) et que vous travaillez sur une solution. Mieux vaut admettre ce qui est arrivé que d'essayer frénétiquement de récupérer et potentiellement aggraver les choses et de cacher les détails. Sachant que votre patron peut vous aider d'une certaine manière, vous aide à résoudre le problème. Comme je l'ai dit, juste quelques conseils généraux.

jcolebrand
la source
10
bonne idée avec la pause de 5 minutes. Fonctionne toujours. Aide à se concentrer. :-) été fait ça.
John aka hot2use