Mi è stato assegnato il compito di provare a ripristinare un database che ha subito un danneggiamento (a causa di un errore I / O, che è stato corretto da allora). Non ho familiarità con il database o cosa contiene.
Mi è stato dato un vecchio backup completo (~ 3 settimane) e una serie di registri delle transazioni ... tuttavia mancano i registri delle transazioni, quindi posso recuperare solo fino a una certa data. Mancano circa 2,5 settimane di dati mancanti (e molti dati vengono aggiunti costantemente a questo database).
Mi è stata anche data una copia del database corrotto (che è accessibile, ma con molte pagine corrotte / mancanti).
Ho provato i DBCC CHECKDB
comandi tipici (ancora no repair_allow_data_loss
, sarà la mia ultima risorsa se non funzionasse nient'altro).
Dopo che molti vanno e vengono nel database (il db è un piccolo mostro da 1,5 terabyte e tutto ciò che faccio è lento e richiede un po 'di tempo), ho provato a fare un ripristino della pagina online dall'ultimo buon backup noto per le pagine corrotte.
Per fare ciò, ho realizzato uno script che crea molti RESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'
comandi DBCC CHECKDB
dall'output (básically una regex e un distinto) ... finora tutto bene, ha funzionato fino al punto in cui diceva che avevo raggiunto un limite di 1000 pagine per file (ci sono 8 file su questo db) per comando di ripristino.
Quindi mi chiede di "completare il ripristino online", ma non riesco a farlo ... Non ho un registro di coda o qualcosa di più completo del backup completo con cui sto iniziando, quindi Fondamentalmente non so come completare il ripristino per continuare a provare con il resto delle pagine.
Ho provato un RESTORE DATABASE <foo> WITH RECOVERY
ma che non ha funzionato neanche, mi chiede un registro che non ho.
Qualcuno ha qualche consiglio su come potrei provare a recuperare qualcosa da qui? O come "completare" il ripristino online in modo da poter continuare a provare a recuperare più pagine? Avrei lo stesso problema se provassi un ripristino offline (fondamentalmente aggiungendo WITH NORECOVERY
tutto e poi provando a riportarlo alla fine?)
Elaborare il database a mano è praticamente annullabile ... ci sono centinaia di tabelle con milioni di righe e non c'è un chiaro significato di ciò che è. Il DB corrotto non funzionerà nelle SELECT
query dopo alcuni milioni di righe, ma non sono sicuro di riuscire a capire dove. Ho provato a ricostruire tutti gli indici non cluster, ma ci sono pagine corrotte con dati di riga, quindi non ha funzionato neanche.
Una certa perdita di dati sarebbe accettabile, ma la coerenza sul DB dovrebbe almeno tentare di essere raggiunta.
Il database corrotto è -still- online e i client ci stanno lavorando (quindi continua a ricevere nuovi dati), quindi qualsiasi processo che faccio sul banco di laboratorio dovrebbe essere riproducibile sul database di produzione in seguito (i tempi di inattività saranno difficili).
Questa è SQL Server 2014 Enterprise
PS: non sono un DBA ... sono un programmatore, ma il cliente ha provato alcuni servizi di "disaster recovery" sql "esperti" e hanno rinunciato, quindi mi è stato chiesto di guardarlo e vedere se potevo Fai qualcosa.
Aggiornamento : dopo molti test, il ripristino pagina per pagina non ha funzionato, quindi abbiamo abbandonato l'idea. Stiamo andando per un ripristino manuale (selezionando manualmente i record mancanti dalle tabelle corrotte e inserendoli nell'ultimo backup valido noto), facendo alcuni strumenti automatici per esso (di nuovo, ci sono centinaia e centinaia di tabelle).