Come posso recuperare alcuni record eliminati?


49

Ho eliminato per errore circa 2.000.000 di record da una tabella remota di SQL Server 2008. Il server non mi sta concedendo l'accesso ai file di backup sul lato server.

C'è un modo per recuperare questi record?


18
Quando è stata l'ultima volta che hai testato i tuoi backup?
Joe

20
Quando è stata l'ultima volta che hai testato un RIPRISTINO dei tuoi backup?
datagod

Risposte:


116

Il tuo database è in modalità di recupero completo?

  • In caso affermativo, esegui backup del registro delle transazioni?

    • Se sì, hai un'utilità di backup come Quest LiteSpeed, Red Gate SQL Backup o Idera SQLSafe?
      • In caso affermativo, tali utilità possono ripristinare gli oggetti dai file di backup (inclusi i registri completi e delle transazioni), ma spiegare come utilizzarli non rientra nell'ambito di ciò che posso fare qui. Contattare il fornitore per istruzioni.
      • In caso contrario, ripristinare il backup completo e i registri delle transazioni come database con un nome diverso. (Non sovrascrivere il database esistente.) Sarai in grado di ottenere una copia aggiornata al secondo dell'oggetto prima che si verifichi l'eliminazione, ma dovrai specificare la parte stopat del comando restore quando interrompere il ripristino dei comandi. È necessario interrompere prima dell'eliminazione.
    • In caso contrario, prendi una copia di un'utilità di lettura dei registri come Quest LiteSpeed ​​o Apex SQL Log. Queste utility possono connettersi al server di database, esaminare il file di registro e aiutarti a annullare le transazioni. Non sono sicuro che le versioni demo funzioneranno, ma quelle a pagamento sicuramente lo faranno.
  • In caso negativo (non in modalità di ripristino completo), ripristinare l'ultimo backup completo come database con un nome diverso. (Non sovrascrivere il database che hai già.) Da lì, sarai in grado di ripristinare qualsiasi record online al momento del backup, ma da allora perderai tutte le modifiche.


4
Ottima risposta, aggiungerò che se si ha il controllo o il rilevamento delle modifiche, in genere è più semplice recuperare i dati da quelle tabelle quando è stata interessata solo una tabella. E, naturalmente, se la tua risposta era no ad alcune o tutte le precedenti, dopo aver ripristinato i record il più possibile, risolvi il processo di backup e, eventualmente, chi ha accesso ai dati di produzione.
HLGEM,

Se sei in modalità semplice, le righe potrebbero essere fisicamente presenti in alcune pagine. Forse alcuni di essi possono essere recuperati (in tempi molto elevati e / o costi in denaro).
usr

PER TUA INFORMAZIONE. ApexSQL Recover oltre al limite di tempo, la versione di valutazione recupera solo 1 su ogni 10 righe delle righe totali disponibili per il ripristino ( apexsql.com/faqs/faqs_recover.aspx )
Sameer,

30

SQL Server mantiene i registri per ogni record eliminato. È possibile eseguire query su questi registri tramite la fn_dblogfunzione 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' )   
;

Ma questo registro è in formato esadecimale ed è necessario convertire questo formato esadecimale nei dati effettivi.

L'articolo seguente ti aiuterà a recuperare i record eliminati nel modo sopra definito:

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


3
Questo è abbastanza bello. In quali condizioni funziona (o non funziona) questo approccio?
Nick Chammas,

3
@NickChammas - Può solo recuperare ciò che è nel registro attivo, quindi per un modello di recupero semplice non deve essersi verificato un checkpoint. Inoltre, al momento sembra che non funzioni correttamente nei database con isolamento delle istantanee, ma dovrebbe essere una soluzione semplice. @user1059637- Qual è il tuo atteggiamento nei confronti delle persone che aggiungono funzionalità al tuo codice?
Martin Smith,

@MartinSmith, ora funziona perfettamente anche con l'isolamento di istantanee.
user1059637

22

Sfortunatamente, non saremo in grado di aiutarti senza molte più informazioni. Ma dalla tua domanda, vedo che hai eliminato quelli che sembrano essere 2 milioni di record dal tuo database. Molto probabilmente non puoi recuperare queste informazioni, a meno che tu non abbia una registrazione completa sul tuo database e acquisti alcuni strumenti molto specifici.

Se riesci a descrivere in modo più dettagliato cosa pensi di aver fatto e perché ritieni di non poter recuperare i record e di descrivere l'organizzazione del tuo database, allora potremmo aiutarti un po 'di più.

Alcuni consigli generali: se pensi di aver eliminato 2 milioni di record, probabilmente sei un po 'fuori di testa in questo momento. Quindi dovresti fare una pausa di cinque minuti, calmarti e rivisitare il problema. Inoltre, dovresti dire subito al tuo capo se è ragionevole (non svegliare qualcuno alle 2 del mattino per dirglielo) e che stai lavorando a una soluzione. Meglio ammettere che cosa è successo che cercare freneticamente di recuperare e potenzialmente peggiorare le cose e nascondere i dettagli. Sapere che il tuo capo può aiutarti in qualche modo, ti aiuta a risolvere il problema. Come ho detto, solo alcuni consigli generali.


10
buona idea con la pausa di 5 minuti. Funziona sempre Aiuta a concentrarsi. :-) Ci sono stato fatto.
John aka hot2use,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.