Ricompilare i database di sistema
Si applica a: SQL Server
Il processo di ricompilazione deve essere eseguito per correggere problemi di danneggiamento nei database di sistema master, model, msdbe resource oppure per modificare le regole di confronto predefinite a livello di server. In questo articolo sono incluse istruzioni dettagliate per la ricompilazione di database di sistema in SQL Server.
Questo articolo non è correlato alla ricompilazione degli indici.
Limiti
Quando vengono ricompilat i database di sistema master
, model
, msdb
e tempdb
, i database vengono eliminati e ricreati nel percorso originale. Se nell'istruzione di ricompilazione vengono specificate nuove regole di confronto, i database di sistema vengono creati utilizzando tale impostazione delle regole di confronto. Le eventuali modifiche apportate dall'utente ai database vanno perdute. Ad esempio, è possibile che siano presenti oggetti definiti dall'utente nel database master
, processi pianificati in msdb
o modifiche alle impostazioni predefinite del database nel database model
.
Prerequisiti
Prima di ricompilare i database di sistema, effettuare le attività seguenti per assicurarsi che sia possibile ripristinare le impostazioni correnti dei database.
Registrare tutti i valori di configurazione a livello di server.
SELECT * FROM sys.configurations;
Registrare tutti gli hotfix applicati all'istanza di SQL Server e le regole di confronto correnti. È necessario riapplicare questi hotfix dopo la ricompilazione dei database di sistema.
SELECT SERVERPROPERTY('ProductVersion ') AS ProductVersion, SERVERPROPERTY('ProductLevel') AS ProductLevel, SERVERPROPERTY('ResourceVersion') AS ResourceVersion, SERVERPROPERTY('ResourceLastUpdateDateTime') AS ResourceLastUpdateDateTime, SERVERPROPERTY('Collation') AS Collation;
Registrare il percorso corrente di tutti i file di dati e di log relativi ai database di sistema. Dopo la ricompilazione, tutti i database di sistema vengono installati nel percorso originale. Se i file di dati o di log dei database di sistema sono stati spostati in un percorso diverso, è necessario spostarli di nuovo.
SELECT name, physical_name AS current_file_location FROM sys.master_files WHERE database_id IN (DB_ID('master'), DB_ID('model'), DB_ID('msdb'), DB_ID('tempdb'));
Individuare il backup corrente dei database
master
,model
emsdb
.Se l'istanza di SQL Server configurata come distributore di repliche, individuare il backup corrente del database
distribution
.Assicurarsi di disporre delle autorizzazioni appropriate per ricompilare i database di sistema. Per eseguire questa operazione, è necessario essere membro del ruolo predefinito del server sysadmin . Per altre informazioni, vedere Ruoli a livello di server.
Verificare che le copie dei file modello di resoconto e dati di
master
,model
,msdb
esistano nel server locale. Il percorso predefinito per i file modello èC:\Program Files\Microsoft SQL Server\MSSQL<xx>.MSSQLSERVER\MSSQL\Binn\Templates
(dove<xx>
è la versione installata). Questi file vengono utilizzati durante il processo di ricompilazione e devono essere presenti affinché l'installazione venga completata correttamente. Se non sono disponibili, eseguire la caratteristica Ripristina del programma di installazione oppure copiarli manualmente dal supporto di installazione. Per individuare i file nel supporto di installazione, passare alla directory della piattaforma appropriata (x86 o x64) e quindi passare asetup\sql_engine_core_inst_msi\Pfiles\SqlServr\MSSQL.X\MSSQL\Binn\Templates
.
Ricompilare i database di sistema
Con la procedura seguente vengono ricompilati i database di sistema master
, model
, msdb
, e tempdb
. Non è possibile specificare i database di sistema da ricompilare. Per le istanze cluster, questa procedura deve essere eseguita nel nodo attivo e la risorsa di SQL Server nel gruppo di applicazioni cluster corrispondente deve essere portata offline prima di eseguire la procedura.
Con questa procedura non viene ricompilato il database resource
. Vedere la sezione Ricompilazione del database di sistema resource più avanti in questo articolo.
Ricompilare i database di sistema per un'istanza di SQL Server
Inserire il supporto di installazione di SQL Server nell'unità disco oppure dal prompt dei comandi passare alla directory in cui si trova il file
setup.exe
nel server locale. Per SQL Server 2022 (16.x), il percorso predefinito nel server èC:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\SQLServer2022
.Da una finestra del prompt dei comandi immettere il comando seguente. Le parentesi quadre indicano i parametri facoltativi Non immettere parentesi quadre. Se si utilizza un sistema operativo Windows con Controllo account utente abilitato, per eseguire il programma di installazione è necessario disporre di privilegi elevati. Il prompt dei comandi deve essere eseguito come Amministratore.
setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName /SQLSYSADMINACCOUNTS=accounts [ /SAPWD= StrongPassword ] [ /SQLCOLLATION=CollationName ]
Nome parametro Descrizione /QUIET o /Q Specifica che il programma di installazione dovrebbe essere eseguito senza alcuna interfaccia utente. /ACTION=REBUILDDATABASE Specifica che il programma di installazione dovrebbe ricreare i database di sistema. /INSTANCENAME=InstanceName Nome dell'istanza di SQL Server. Per l'istanza predefinita, immettere MSSQLSERVER. /SQLSYSADMINACCOUNTS=accounts Specifica i gruppi o i singoli account di Windows da aggiungere al ruolo predefinito del server sysadmin . Se si specificano più account, separarli con uno spazio. Ad esempio, immettere BUILTIN\Administrators MyDomain\MyUser. Quando si specifica un account che contiene uno spazio vuoto all'interno del nome dell'account, racchiudere l'account tra doppie virgolette. Ad esempio, immettere NT AUTHORITY\SYSTEM. [ /SAPWD=StrongPassword ] Specifica la password per l'account sa di SQL Server. Questo parametro è necessario se l'istanza usa la modalità autenticazione mista (autenticazione di SQL Server e di Windows).
Nota sulla sicurezza: l'account sa è un account noto di SQL Server che viene spesso preso di mira da utenti malintenzionati. È fondamentale usare una password complessa per l'accesso all'account sa.
Non specificare questo parametro per la modalità di autenticazione di Windows.[ /SQLCOLLATION=CollationName ] Vengono specificate nuove regole di confronto a livello di server. Il parametro è facoltativo. Se non viene specificato, verranno utilizzate le regole di confronto correnti del server.
Importante La modifica delle regole di confronto a livello di server non comporta la modifica delle regole di confronto dei database utente esistenti. Tutti i nuovi database utente creati utilizzeranno le nuove regole di confronto per impostazione predefinita.
Per altre informazioni, vedere Impostare o modificare le regole di confronto del server.[ /SQLTEMPDBFILECOUNT=NumberOfFiles ] Specifica il numero di file di dati tempdb
. Questo valore può essere aumentato fino al valore più elevato tra 8 e il numero di core.
Valore predefinito: 8 o il numero di core, a seconda di quale dei due valori risulta inferiore.[ /SQLTEMPDBFILESIZE=FileSizeInMB ] Specifica le dimensioni iniziali di ogni file di dati tempdb
in MB. Il programma di installazione consente dimensioni fino a 1024 MB.
Valore predefinito: 8[ /SQLTEMPDBFILEGROWTH=FileSizeInMB ] Specifica l'incremento in MB dell'aumento delle dimensioni di ogni file di dati tempdb
. Un valore 0 indica che l'opzione per l'aumento automatico è disattivata e non è consentito spazio aggiuntivo. Il programma di installazione consente dimensioni fino a 1024 MB.
Valore predefinito: 64[ /SQLTEMPDBLOGFILESIZE=FileSizeInMB ] Specifica le dimensioni iniziali del file di resoconto tempdb
in MB. Il programma di installazione consente dimensioni fino a 1024 MB.
Valore predefinito: 8.
Intervallo consentito: Min = 8, max = 1024.[ /SQLTEMPDBLOGFILEGROWTH=FileSizeInMB ] Specifica l'incremento in MB dell'aumento delle dimensioni del file di log tempdb
. Un valore 0 indica che l'opzione per l'aumento automatico è disattivata e non è consentito spazio aggiuntivo. Il programma di installazione consente dimensioni fino a 1024 MB.
Valore predefinito: 64
Intervallo consentito: Min = 8, max = 1024.[ /SQLTEMPDBDIR=Directories ] Viene specificata la directory per i file di dati tempdb
. Se si specificano più directory, separarle con uno spazio vuoto. Se vengono specificate più directory, i file di datitempdb
verranno distribuiti tra le directory secondo uno schema round-robin.
Valore predefinito: directory dei dati di sistema[ /SQLTEMPDBLOGDIR=Directory ] Viene specificata la directory per il file di resoconto tempdb
.
Valore predefinito: directory dei dati di sistemaAl termine della ricompilazione dei database di sistema, verrà visualizzato di nuovo il prompt dei comandi senza messaggi. Esaminare il file di log Summary.txt per verificare che il processo sia stato completato correttamente. Questo file si trova in
C:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\Logs
.Lo scenario RebuildDatabase elimina i database di sistema e li installa nuovamente nello stato originario. Poiché l'impostazione del numero di file
tempdb
non è persistente, il valore del numero di filetempdb
non è noto durante la configurazione. Di conseguenza, lo scenario RebuildDatabase non considera di dover aggiungere nuovamente il numero di filetempdb
. È possibile fornire nuovamente il valore del numero di filetempdb
con il parametro SQLTEMPDBFILECOUNT. Se il parametro non viene fornito, RebuildDatabase aggiungerà un numero predefinito di filetempdb
, ossia il valore inferiore di filetempdb
tra il numero di CPU o 8.
Attività successive alla ricompilazione
Al termine della ricompilazione del database, potrebbe essere necessario effettuare i seguenti task aggiuntivi:
Ripristinare i backup completi più recenti dei database
master
,model
emsdb
. Per altre informazioni, vedere Backup e ripristino di Database di sistema (SQL Server).Importante
Se sono state modificate le regole di confronto del server, non ripristinare i database di sistema. In caso contrario, le nuove regole di confronto verranno sostituite con quelle precedenti.
Se non è disponibile alcun backup oppure se il backup ripristinato non è aggiornato, ricreare le eventuali voci mancanti. Ad esempio, ricreare tutte le voci mancanti per i database utente, i dispositivi di backup, gli account di accesso di SQL Server, gli endpoint ecc. Il modo più efficace per ricreare le voci consiste nell'eseguire gli script originali con cui sono state create.
Importante
È consigliabile proteggere gli script per impedire che il contenuto venga modificato da utenti non autorizzati.
Se l'istanza di SQL Server è configurata come distributore di repliche, è necessario ripristinare il database
distribution
. Per altre informazioni, vedere Eseguire il backup e ripristino di database replicati.Spostare i database di sistema nei percorsi registrati in precedenza. Per altre informazioni vedere l'articolo Spostare i database di sistema.
Verificare che i valori di configurazione a livello di server corrispondano ai valori registrati in precedenza.
Ricompilare il database delle risorse
Con la procedura seguente vengono ricompilati il database di sistema resource
. Quando si ricompila il database resource
, tutti gli hotfix vanno persi e pertanto devono essere riapplicati.
Ricompilare il database del sistema di risorse
Avviare il programma di installazione di SQL Server (
setup.exe
) dal supporto di distribuzione.Nell'area di navigazione sinistra, selezionare Manutenzione, poi Ripara.
Verranno eseguite la regola di supporto dell'installazione e le routine dei file per garantire che nel sistema siano installati i prerequisiti e che il computer soddisfi le regole di convalida dell'installazione. Per continuare, selezionare OK o Installa.
Nella pagina Seleziona istanza, selezionare l'istanza da ripristinare, quindi fare clic su Avanti.
Verranno eseguite le regole di ripristino per convalidare l'operazione. Per continuare, selezionare Avanti.
Nella pagina Ripara, selezionare Ripara. Nella pagina Operazione completata è indicato che l'operazione è stata completata.
Creare un nuovo database msdb
Se il database msdb
è danneggiato e non si dispone di una copia di backup del database msdb
, è possibile creare un nuovo msdb
utilizzando lo script instmsdb
.
Avviso
La ricompilazione del database msdb
tramite lo script instmsdb.sql
comporterà l'eliminazione di tutte le informazioni archiviate in msdb
quali processi, avvisi, operatori, piani di manutenzione, cronologia di backup, impostazioni della gestione basata su criteri, Posta elettronica database, data warehouse contenente dati relativi alle prestazioni ecc.
Arrestare tutti i servizi che si connettono al motore di database, inclusi SQL Server Agent, SSRS, SSIS e tutte le applicazioni che utilizzano SQL Server come archivio dati.
Avviare SQL Server dalla riga di comando utilizzando il comando:
NET START MSSQLSERVER /T3608
Per altre informazioni, vedere Avviare, arrestare, sospendere, riprendere, riavviare i servizi SQL Server. Per altre informazioni su Flag di traccia 3608, vedere TF3608.
In un'altra finestra della riga di comando scollegare il database
msdb
eseguendo il comando seguente, sostituendo<servername>
con l'istanza di SQL Server:SQLCMD -E -S<servername> -dmaster -Q"EXEC sp_detach_db msdb"
Tramite Esplora risorse rinominare i file di database
msdb
. Per impostazione predefinita, tali file si trovano nella sottocartella DATA per l'istanza di SQL Server.Tramite Gestione configurazione SQL Server, arrestare e riavviare il servizio motore di database normalmente senza flag di traccia aggiuntivi.
In una finestra del prompt dei comandi connettersi a SQL Server ed eseguire il comando:
SQLCMD -E -S<servername> -i"C:\Program Files\Microsoft SQL Server\MSSQLXX.INSTANCE_NAME\MSSQL\Install\instmsdb.sql" -o"C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Install\instmsdb.out"
Sostituire
<servername>
con l'istanza del motore di database. Utilizzare il percorso del file system dell'istanza di SQL Server. Sostituire ancheMSSQLXX.INSTANCE_NAME
con la directory corrispondente alla versione e all'istanza.Tramite Blocco note di Windows, aprire il file
instmsdb.out
e verificare la presenza di eventuali errori nell'output.Riapplicare tutte le unità di capacità installate nell'istanza, che aggiornerà il database
msdb
al livello di unità di capacità corrente.Creare di nuovo il contenuto dell'utente archiviato nel database
msdb
, quali processi, avvisi e altri elementi.Eseguire il backup del database
msdb
.
Ricompilare il database tempdb
Se il database tempdb
risulta danneggiato o sospetto e non è possibile avviare il motore di database, è possibile ricompilare tempdb
senza dover ricompilare tutti i database di sistema.
Rinominare i file correnti
tempdb.mdf
etemplog.ldf
, se disponibili.Avviare SQL Server da un prompt dei comandi utilizzando l'applicazione sqlservr.
sqlservr -c -f -T3608 -T4022 -s <instance> -mSQLCMD
Per un nome di istanza predefinito usare
MSSQLSERVER
; per l'istanza denominata usareMSSQL$<instance_name>
. Il flag di traccia 4022 disabilita l'esecuzione delle stored procedure di avvio.-mSQLCMD
consente solo a sqlcmd.exe di connettersi al server. Per ulteriori informazioni, vedere Altre opzioni di avvio.Nota
Assicurarsi che la finestra del prompt dei comandi rimanga aperta dopo l'avvio di SQL Server. Chiudendo la finestra del prompt dei comandi verrà terminato il processo.
Connettersi al server usando sqlcmd e quindi usare la stored procedure seguente per reimpostare lo stato del database
tempdb
.exec master..sp_resetstatus tempdb
Spegnerr il server premendo
Ctrl
+C
nella finestra del prompt dei comandi.Riavviare il servizio SQL Server. Verrà così creato un nuovo set di file di database
tempdb
e ripristinato il databasetempdb
.
Risolvere gli errori di ricompilazione
Gli errori di sintassi e altri errori di runtime vengono visualizzati nella finestra del prompt dei comandi. Esaminare l'istruzione di installazione per rilevare gli errori di sintassi seguenti:
Barra (
/
) mancante prima di ogni nome di parametro.Segno di uguale (
=
) mancante tra il nome e il valore del parametro.Presenza di spazi tra il nome del parametro e il segno di uguale.
Presenza di virgole (
,
) o di altri caratteri non specificati nella sintassi.
Al termine dell'operazione di ricompilazione, esaminare i log di SQL Server per rilevare eventuali errori. Il percorso di log predefinito è C:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\Logs
. Per individuare il file di log che contiene i risultati del processo di ricompilazione, passare alla cartella Logs dal prompt dei comandi, quindi eseguire findstr /s RebuildDatabase summary*.*
. Con questa ricerca sarà possibile trovare tutti i file di log che contengono i risultati della ricompilazione dei database di sistema. Aprire i file di log ed esaminare i messaggi di errore pertinenti.