La base de données principale est corrompue, l'instance ne démarre pas - quelles sont mes options?


11

Aidez-moi! Ma base de données principale est corrompue, je ne peux même pas mettre l'instance SQL en ligne! Quelles sont mes options pour récupérer mon serveur?

J'ai une sauvegarde de master, mais la page MSDN "Restauration de la base de données master" me demande de démarrer l'instance en mode mono-utilisateur, ce que je ne peux pas faire!

(Remarque: je laisse cette question sans précision quant à la version SQL, afin d'être une référence plus largement applicable. Il existe des questions similaires sur DBA.SE, mais aucune n'implique que le serveur ne puisse pas démarrer.)


(Les commentaires ou autres réponses sont certainement les bienvenus, mais je l'ai demandé dans le but de fournir une réponse complète, y compris certains aspects que je ne pouvais pas trouver ailleurs sur le Web.)
BradC

Réponses:


12

Voici quelques pistes sur lesquelles j'examinerais. Ne faites pas tout cela (certaines d'entre elles sont des techniques différentes pour atteindre le même objectif), mais méritent d'être considérées:

1. Examinez directement le journal des erreurs SQL

Accédez directement au dossier contenant les journaux d'erreurs SQL et chargez le plus récent ERRORLOGdans le bloc-notes pour obtenir plus de détails sur les raisons pour lesquelles l'instance SQL ne démarre pas. Vous constaterez peut-être que le problème ne vient pas du tout de la base de données master.

2. Essayez de démarrer l'instance en mode mono-utilisateur

Voici une liste complète des options de démarrage de SQL Server , notamment -m(mode mono-utilisateur) et -f(mode de configuration minimale). D'autres options vous permettent de spécifier le chemin d'accès à la base de données master, si tel est le problème.

Si vous êtes en mesure de démarrer l'instance, suivez les étapes de l'article MSDN que vous avez lié pour restaurer la base de données principale, ou cette procédure détaillée de Thomas LaRock .

Si une autre application saisit toujours la connexion mono-utilisateur avant que vous puissiez, désactivez d'abord l'agent SQL pour qu'il ne démarre pas. Deuxièmement, consultez les idées sur cette question pour utiliser le -m"Application Name"paramètre pour spécifier le nom de l'application.

3. Restaurez mastervers une autre instance et copiez ses fichiers

Je n'ai trouvé qu'une autre mention de cette technique non documentée, mais je l'ai utilisée avec succès le week-end dernier, donc cela pourrait valoir la peine d'être essayé.

Si vous ne pouvez pas démarrer l'instance en mode mono-utilisateur, mais que vous avez une autre instance SQL exécutant exactement la même version et la même construction , essayez de restaurer la dernière bonne sauvegarde de base de données maître connue de votre serveur mort vers l'autre instance:

  • Restaurer sous un nom différent, bien sûr ( master_please_god_let_this_work), WITH MOVEafin de ne pas écraser mastersur votre bon serveur
  • Restaurer WITH NORECOVERY. Je ne sais pas si cela est nécessaire, mais je me suis senti mieux que je savais que l'autre serveur n'allait rien changer dans le maître restauré
  • Réglez-le hors ligne: ALTER DATABASE [master_please_god_let_this_work] SET OFFLINE
  • Copiez les fichiers MDF et LDF restaurés du bon serveur vers le serveur mort
  • Renommez les fichiers master.mdfet mastlog.ldfsi nécessaire pour remplacer les mauvais fichiers maîtres par vos versions restaurées
  • Croisez les doigts et lancez l'instance
  • Facultatif: effectuez une nouvelle restauration du maître sur le serveur réactivé. Pas sûr que ce soit nécessaire, car nous avons fait très attention à ne pas changer master.

4. Reconstruisez les bases de données système

Si vous ne disposez pas d'une autre instance exécutant la même version, ou si vous n'êtes pas à l'aise avec la procédure non documentée répertoriée au # 3, ou si vous n'avez pas de sauvegardes de master( pourquoi n'avez-vous pas de sauvegardes ?? ), vous pouvez reconstruire les bases de données système SQL à partir du disque d'installation d'origine :

Setup.exe /ACTION=REBUILDDATABASE /...

Lorsque cela est terminé, vous pouvez suivre les étapes liées précédemment pour restaurer à masterpartir de votre dernière bonne sauvegarde. Vous devrez également restaurer une sauvegarde récente de msdbpour conserver tous vos travaux, le calendrier des travaux et l'historique des travaux.

5. Restaurez toutes les bases de données USER dans une nouvelle instance SQL (ou existante)

Si vous avez déjà une autre instance existante en cours d'exécution (version SQL appropriée, suffisamment d'espace disque), je commencerais probablement les restaurations de base de données à partir des sauvegardes les plus récentes pendant que je travaille sur les autres étapes de dépannage ci-dessus, juste au cas où j'en aurais besoin.

Si votre nouvelle instance (ou réinstallée) a accès au même disque, il est beaucoup plus rapide de simplement les attacher en tant que nouvelles bases de données:

CREATE DATABASE foo 
ON (FILENAME = 'D:\data\foo.mdf'),
   (FILENAME = 'D:\data\foo_log.ldf')
FOR ATTACH;

6. Effectuez à nouveau toutes les modifications master

Une fois que vous avez réussi à restaurer master(via l'une des techniques ci-dessus), vous devez rechercher toutes les modifications qui pourraient avoir été perdues, si elles ont été apportées après la sauvegarde que vous venez de restaurer:

  • Modifications de sécurité
  • Nouvelles bases de données (les fichiers seront toujours sur le disque, il suffit de les attacher)
  • Paramètres à l'échelle du serveur

Il n'y a aucun moyen magique de les trouver, vous devrez revenir à la documentation de votre propre entreprise pour ces types de changements, si vous en avez un.


1
Belle publication. +1. J'ai fait un test en corrompant mon maître, en restaurant une sauvegarde sur un autre serveur, puis en copiant les fichiers sur l'ancien serveur. Cela a fonctionné sans problème. Par ailleurs, j'ai eu l'erreur 3411 alors que le maître était corrompu.
Racer SQL

Super, merci d'avoir vérifié cette technique. Dans mon cas, je n'ai jamais eu d'erreur réelle, mais ma base de données principale prenait des heures à récupérer, bien au-delà de tout paramètre de délai d'expiration du service de cluster possible.
BradC

1
@RafaelPiccinelli Le maître conserve les "métadonnées" sur tout sur le serveur (sécurité, autres bases de données, etc.), donc cela a du sens. Voir mes points # 5 et # 6. Vous devrez reconnecter ces dbs et réinitialiser toute sécurité que vous aviez en place. BTW, j'espère que vous faites tout cela dans un environnement de laboratoire !!
BradC

Oui, c'est pourquoi le test. Je reçois une erreur mais est probablement avec autorisation dans mon stockage. encore une fois, beau post. Je vais juste supprimer ce dernier commentaire haha.
Racer SQL

2

Je voulais juste ajouter un problème possible et une solution que je viens de rencontrer - J'ai eu une situation similaire lors d'une mise à jour cumulative échouée (SQL2016 CU12) et des messages dans l'Observateur d'événements et le journal d'erreurs où disant "Impossible de récupérer la base de données principale. SQL Server est impossible à exécuter. Restaurez le maître à partir d'une sauvegarde complète, réparez-le ou reconstruisez-le. ", mais j'ai finalement trouvé que si je réexécutais simplement l'exécutable CU, il détectait l'état de la mise à niveau comme" Incompletely installed "et me permettait d'exécuter simplement le mettre à jour à nouveau, après quoi il s'est terminé avec succès et la base de données principale et toutes les autres ont été ouvertes sans problème.


Bon ajout à la liste; merci de l'inclure.
BradC
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.