J'ai été chargé d'essayer de récupérer une base de données qui a souffert de corruption (en raison d'une défaillance d'E / S, qui a été corrigée depuis). Je ne connais pas la base de données ni ce qu'elle contient.
On m'a donné une vieille sauvegarde complète (~ 3 semaines) et une série de journaux de transactions ... mais il manque des journaux de transactions, donc je ne peux récupérer que jusqu'à une certaine date. Il manque environ 2,5 semaines de données (et de nombreuses données sont constamment ajoutées à cette base de données).
J'ai également reçu une copie de la base de données corrompue (qui est accessible, mais avec beaucoup de pages corrompues / manquantes).
J'ai essayé les DBCC CHECKDB
commandes typiques (toujours non repair_allow_data_loss
, ce sera mon dernier recours si rien d'autre ne fonctionne).
Après que de nombreux va et vient dans la base de données (la base de données est un petit monstre de 1,5 téraoctet et tout ce que je fais est lent et prend du temps), j'ai essayé de faire une restauration de page en ligne à partir de la dernière bonne sauvegarde connue pour les pages corrompues.
Pour ce faire, j'ai fait un script qui crée de nombreuses RESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'
commandes à partir de la DBCC CHECKDB
sortie (essentiellement une expression régulière et une distincte) ... jusqu'ici tout va bien, cela a fonctionné au point où il est dit que j'avais atteint une limite de 1000 pages par fichier (il y a 8 fichiers sur cette base de données) par commande de restauration.
Donc, il me demande de "terminer la restauration en ligne", mais je ne sais pas comment faire ... Je n'ai pas de journal de fin ou quoi que ce soit de plus complet que la sauvegarde complète avec laquelle je commence, donc Je ne sais pas comment terminer la restauration pour continuer à essayer avec le reste des pages.
J'en ai essayé un RESTORE DATABASE <foo> WITH RECOVERY
mais ça n'a pas marché non plus, il me demande un journal que je n'ai pas.
Quelqu'un a-t-il des conseils sur la façon dont je pourrais essayer de récupérer quoi que ce soit d'ici? Ou comment "terminer" la restauration en ligne pour que je puisse continuer à essayer de récupérer plus de pages? Aurais-je le même problème si j'essaie une restauration hors ligne (essentiellement en ajoutant WITH NORECOVERY
à tout, puis en essayant de la ramener à la fin?)
L'élaboration manuelle de la base de données est fondamentalement impossible à éliminer ... il y a des centaines de tables avec des millions de lignes et il n'y a aucune signification claire de ce que c'est. La base de données corrompue échouera sur les SELECT
requêtes après quelques millions de lignes, mais je ne suis pas sûr de pouvoir savoir où. J'ai essayé de reconstruire tous les index non clusterisés, mais il y a des pages corrompues avec des données de ligne, donc cela n'a pas fonctionné non plus.
Une certaine perte de données serait acceptable, mais la cohérence sur la base de données devrait au moins essayer d'être atteinte.
La base de données corrompue est toujours en ligne et les clients y travaillent (donc elle continue à obtenir de nouvelles données), donc tout processus que je fais sur le banc de laboratoire devrait être reproductible sur la base de données de production par la suite (le temps d'arrêt sera difficile pour elle).
Il s'agit de SQL Server 2014 Enterprise
PS: je ne suis pas DBA ... Je suis programmeur, mais le client a essayé des services de récupération d'urgence sql "experts" et ils ont abandonné, donc on m'a demandé de le regarder et de voir si je pouvais faire n'importe quoi.
Mise à jour : après de nombreux tests, la restauration page par page a été un échec, nous avons donc abandonné l'idée. Nous allons effectuer une récupération manuelle (en sélectionnant manuellement les enregistrements manquants dans les tables corrompues et en les insérant dans la dernière bonne sauvegarde connue), en faisant des outils automatisés pour cela (encore une fois, il y a des centaines et des centaines de tables).