Il database principale è danneggiato, l'istanza non si avvia: quali sono le mie opzioni?


11

Aiuto! Il mio database principale è corrotto, non riesco nemmeno a portare l'istanza SQL online! Quali sono le mie opzioni per il backup del mio server?

Ho un backup del master, ma la pagina MSDN "Ripristino del database master" mi chiede di avviare l'istanza in modalità utente singolo, cosa che non posso fare!

(Nota: sto lasciando questa domanda non specificata sulla versione SQL, in modo da essere un riferimento più ampiamente applicabile. Ci sono alcune domande simili su DBA.SE, ma nessuna che coinvolge il server non è in grado di avviarsi.)


(I commenti o altre risposte sono certamente ben accetti, ma l'ho chiesto nel tentativo di fornire una risposta esaustiva, compresi alcuni aspetti che non potrei trovare altrove sul web.)
BradC

Risposte:


12

Qui ci sono alcune strade che vorrei indagare. Non fare tutte queste (alcune sono tecniche diverse per raggiungere lo stesso scopo), ma vale la pena considerare:

1. Esaminare direttamente il registro errori SQL

Passare direttamente alla cartella contenente i log degli errori SQL e caricare il più recente ERRORLOGnel blocco note per ottenere maggiori dettagli sul motivo per cui l'istanza SQL non verrà avviata. Forse scoprirai che il problema non riguarda affatto il database principale.

2. Provare ad avviare l'istanza in modalità utente singolo

Ecco un elenco completo delle opzioni di avvio per il server SQL , tra cui -m(modalità utente singolo) e -f(modalità di configurazione minima). Altre opzioni consentono di specificare il percorso per il database principale, se questo è il problema.

Se sei in grado di avviare l'istanza, segui i passaggi nell'articolo MSDN che hai collegato per ripristinare il database principale o questa procedura dettagliata dettagliata di Thomas LaRock .

Se un'altra applicazione prende sempre la connessione del singolo utente prima che tu possa farlo, disabilita prima SQL Agent in modo che non si avvii. In secondo luogo, vedere le idee su questa domanda per l'utilizzo del -m"Application Name"parametro per specificare il nome dell'applicazione.

3. Ripristinare masterin un'altra istanza e copiarne i file

Ho trovato solo un'altra menzione di questa tecnica non documentata, ma l'ho usata con successo lo scorso fine settimana, quindi potrebbe valere la pena provarla.

Se non riesci ad avviare l'istanza in modalità utente singolo, ma hai un'altra istanza SQL che esegue esattamente la stessa versione e build , prova a ripristinare l'ultimo backup noto del database master valido dall'altro server:

  • Ripristina come nome diverso, ovviamente ( master_please_god_let_this_work), in WITH MOVEmodo da non sovrascrivere mastersul tuo buon server
  • Restore WITH NORECOVERY. Non sono sicuro che ciò sia necessario, ma mi ha fatto sentire meglio sapendo che l'altro server non avrebbe modificato nulla nel master ripristinato
  • Impostalo su offline: ALTER DATABASE [master_please_god_let_this_work] SET OFFLINE
  • Copia i file MDF e LDF ripristinati dal server valido al server guasto
  • Rinominare i file master.mdfe mastlog.ldfcome necessario per sostituire i file master danneggiati con le versioni ripristinate
  • Incrocia le dita e avvia l'istanza
  • Opzionale: eseguire un nuovo ripristino del master sul server ripristinato. Non sono sicuro che ciò sia necessario, poiché siamo stati abbastanza attenti a non cambiare master.

4. Ricostruire i database di sistema

Se non si dispone di un'altra istanza che esegue la stessa versione o se non si ha familiarità con l'utilizzo della procedura non documentata elencata al punto 3 o se non si dispone di backup di master( perché non si dispone di backup ?? ), è possibile ricostruire i database del sistema SQL dal disco di installazione originale :

Setup.exe /ACTION=REBUILDDATABASE /...

Al termine, è possibile seguire i passaggi precedentemente collegati per ripristinare masterdall'ultimo backup valido. Sarà inoltre necessario ripristinare un backup recente di msdbper mantenere tutti i lavori, la pianificazione dei lavori e la cronologia dei lavori.

5. Ripristinare tutti i database USER in una nuova (o esistente) istanza SQL

Se hai già un'altra istanza esistente (versione SQL corretta, spazio su disco sufficiente), probabilmente inizierei i ripristini del database dai backup più recenti mentre sto lavorando agli altri passaggi di risoluzione dei problemi sopra, nel caso in cui ne avessi bisogno.

Se la tua nuova (o reinstallata) istanza ha accesso allo stesso disco, è molto più veloce collegarli semplicemente come nuovi database:

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

6. Eseguire nuovamente le modifiche a master

Una volta ripristinato correttamente master(tramite una delle tecniche sopra), è necessario esaminare eventuali modifiche che potrebbero essere state perse, se sono state apportate dopo il backup appena ripristinato:

  • Cambiamenti di sicurezza
  • Nuovi database (i file saranno ancora su disco, basta collegarli)
  • Impostazioni a livello di server

Non esiste un modo magico per trovarli, dovrai tornare alla documentazione della tua azienda per questo tipo di modifiche, se ne hai uno.


1
Bel post. +1. Ho effettuato un test corrompendo il mio master, ripristinando un backup su un altro server e quindi copiando i file sul vecchio server. Ha funzionato senza problemi. A proposito, ho ricevuto l'errore 3411 mentre il master era corrotto.
Racer SQL,

Ottimo, grazie per aver verificato quella tecnica. Nel mio caso, non ho mai avuto un errore reale, ma il mio db master impiegava ore a recuperare, ben oltre qualsiasi possibile impostazione di timeout del servizio cluster.
BradC,

1
@RafaelPiccinelli Il master mantiene i "metadati" su tutto sul server (sicurezza, altri database, ecc.), Quindi ha senso. Vedi i miei punti 5 e 6. Dovrai ricollegare quei dbs e reimpostare tutta la sicurezza che avevi in ​​atto. A proposito, spero che tu stia facendo tutto questo in un ambiente di laboratorio !!
BradC,

Sì, ecco perché il test. Ricevo un errore ma probabilmente è con l'autorizzazione nel mio archivio. di nuovo, bel post. Eliminerò solo questo ultimo commento ahah.
Racer SQL,

2

Volevo solo aggiungere un possibile problema e soluzione in cui mi sono appena imbattuto: ho avuto una situazione simile durante un aggiornamento cumulativo non riuscito (SQL2016 CU12) e messaggi nel visualizzatore eventi e nel log degli errori in cui si diceva "Impossibile ripristinare il database principale. SQL Server è impossibile eseguire. Ripristina master da un backup completo, ripristinalo o ricostruiscilo. ", tuttavia alla fine ho scoperto che se eseguissi nuovamente l'eseguibile CU, rilevava lo stato di aggiornamento come" Incompletamente installato "e mi permetteva semplicemente di eseguire il aggiornare di nuovo, dopo di che è stato completato correttamente e il database principale e tutti gli altri si sono aperti senza problemi.


Buona aggiunta alla lista; grazie per averlo incluso.
BradC
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.