Puis-je récupérer une base de données SQL en mode veille / lecture seule sans fichier de secours?

8

Existe-t-il un moyen de récupérer une base de données SQL à partir du mode veille / lecture seule si le "fichier de secours" est manquant?

(Je vois des références appelant cela un fichier TUF dans un scénario d'envoi de journaux, mais dans mon cas, il s'agissait simplement d'une restauration manuelle et le fichier de secours avait une extension BAK.)

Faire un "RESTORE DATABASE foo WITH RECOVERY" entraîne une erreur fatale:

During startup of warm standby database 'foo', its standby file
('path\filename.bak') was inaccessible to the RESTORE statement.
The operating system error was '5(Access is denied.)'. Diagnose the
operating system error, correct the problem, and retry startup.

La restauration a été effectuée il y a un certain temps et, malheureusement, le fichier de secours se trouvait dans le dossier de sauvegarde et a été supprimé par notre routine de nettoyage de dossier. Aucune copie du fichier n'existe sur aucun autre support. Les sauvegardes d'origine qui ont été utilisées pour restaurer à ce stade ont également disparu depuis longtemps.

Heureusement, ce n'est pas un gros problème pour nous (c'était une restauration temporaire), mais je n'ai trouvé aucune autre référence utile sur cette question, à part "ne pas supprimer ce fichier".

Si cela se résumait à cela, je suppose que je pourrais écrire la totalité de la base de données ou utiliser SSIS pour copier tous les objets dans un nouveau conteneur de base de données, car j'ai une copie en lecture seule de la base de données devant moi.

Une façon de résoudre ce problème? Je ne m'attends certainement pas à ce que je puisse le retourner à la "restauration" et continuer à faire des restaurations ultérieures ou quoi que ce soit, je voudrais simplement le forcer en mode en ligne normal dans son état actuel, afin que je puisse faire des choses comme changer les autorisations, ou changer le mode de récupération, ou prendre une nouvelle sauvegarde complète ou quelque chose.

BradC
la source

Réponses:

7

Il s'avère que cela peut être fait si vous utilisez CONTINUE_AFTER_ERROR

RESTORE DATABASE foo WITH RECOVERY, CONTINUE_AFTER_ERROR

J'ai quand même reçu un avertissement lorsque je l'ai essayé, mais j'ai ensuite effectué un CHECKDB et je n'ai reçu aucune erreur.

RESTORE WITH CONTINUE_AFTER_ERROR was successful but some damage was encountered. Inconsistencies in the database are possible.
RESTORE DATABASE successfully processed 0 pages in 4.180 seconds (0.000 MB/sec).
Msg 3441, Level 17, State 1, Line 13
During startup of warm standby database 'foo' (database ID 46), its standby file ('C:\MSSQL\Backup\foo_standby') was inaccessible to the RESTORE statement. The operating system error was '2(The system cannot find the file specified.)'. Diagnose the operating system error, correct the problem, and retry startup.

Étant donné l'avertissement, je ne suis pas certain à 100% de l'essayer sur une base de données de production où je n'avais pas de bonne sauvegarde. Étant donné qu'il s'agit d'une restauration temporaire, il pourrait être utile de lui donner un coup de feu.

Kenneth Fisher
la source