MSSQLSERVER_9017

Si applica a:SQL Server

Dettagli

Attributo Valore
Nome prodotto SQL Server
ID evento 9017
Origine evento MSSQLSERVER
Componente SQLEngine
Nome simbolico LOG_MANY_VLFS
Testo del messaggio Il database %ls contiene più di %d file di log virtuali che sono eccessivi. Troppi file di log virtuali possono causare tempi di avvio e backup lunghi. Prendere in considerazione la compattazione del log e l'uso di un incremento di crescita diverso per ridurre il numero di file di log virtuali.

Spiegazione

Durante l'avvio di un database, SQL Server rileva che un database ha un numero elevato di file di log virtuali e registra questo messaggio di errore. Le situazioni in cui è possibile riscontrare l'errore sono:

  • Quando si avvia un'istanza di SQL Server
  • Ripristinare un database
  • Collegare un database

Il messaggio informativo 9017 simile a questo esempio viene registrato nel log degli errori di SQL Server:

Database dbName has more than n virtual log files which is excessive. Too many virtual log files can cause long startup and backup times. Consider shrinking the log and using a different growth increment to reduce the number of virtual log files. Too many virtual log files can adversely affect the recovery time of the database.

Inoltre, se si usano tecnologie Replication, Database Mirroring o AlwaysOn nell'ambiente in uso, è possibile notare problemi di prestazioni con queste tecnologie.

L'effetto di molte funzioni VLF nella replica

Troppi file di log possono influire sulla replica perché il processo di lettura log deve analizzare ogni file di log virtuale per le transazioni contrassegnate per la replica. È possibile visualizzare questo comportamento tracciando le prestazioni della stored procedure sp_replcmds. Il processo di lettura log usa la stored procedure sp_replcmds per analizzare i file di log virtuali e leggere le transazioni contrassegnate per la replica.

Causa

Questo problema si verifica quando si specificano valori di piccole dimensioni per il parametro FILEGROWTH per i file di log delle transazioni.

Il motore di database di SQL Server divide internamente ogni file di log fisico in diversi file di log virtuali (VVLF). SQL Server 2008 R2 Service Pack 2 ha introdotto un nuovo messaggio (9017) registrato all'avvio di un database (a causa dell'avvio di un'istanza di SQL Server o a causa del collegamento o del ripristino del database) e ha più di 1.000 VLF in SQL Server 2008 R2 o ha più di 10.000 VLFS in SQL Server 2012 e versioni successive.

Nota

In SQL Server 2012, anche se questo messaggio viene registrato quando il database ha 10.000 VLF, il messaggio effettivo segnalato nel log degli errori indica erroneamente "1000 VLF". L'avviso si verifica dopo 10.000 VVL. Tuttavia, il messaggio segnala 1.000 VVL. Questo problema è stato risolto nelle versioni successive.

Azione utente

Per risolvere il problema, seguire questa procedura:

  1. È possibile visualizzare il numero di VLF e le dimensioni medie in SQL Server usando questa query. Il risultato consentirà di identificare i database su cui concentrarsi:

    SELECT db.name, count(dbl.database_id) as Total_VLF_count, convert(decimal (10,2), avg(dbl.vlf_size_mb)) as Avg_VLF_Size_MB
    FROM sys.databases db
     CROSS APPLY sys.dm_db_log_info(db.database_id) dbl
    GROUP BY db.name
    ORDER BY Total_VLF_count DESC
    

    Per altre informazioni, vedere sys.dm_db_log_info.

  2. Ridurre il log delle transazioni usando DBCC SHRINKDB/DBCC SHRINKFILE o SQL Server Management Studio.

  3. Eseguire un aumento una tantum delle dimensioni del file di log delle transazioni a un valore elevato. Questo aumento una tantum viene fatto per evitare frequenti aumenti automatici. Per altre informazioni, vedere Gestire le dimensioni del file di log delle transazioni.

  4. Aumentare il parametro FILEGROWTH a un valore maggiore rispetto a quello attualmente configurato. Questa operazione deve essere basata sull'attività del database e sulla frequenza di crescita del file di log.

  5. È anche possibile esaminare gli articoli di correzione seguenti, a seconda della versione di SQL Server attualmente in esecuzione:

    CORREZIONE: il ripristino di un database in SQL Server 2008 R2, SQL Server 2008 o SQL Server 2012 richiede molto tempo

    CORREZIONE: rallentamento delle prestazioni quando si ripristina un database se sono presenti molti file VVL all'interno del log delle transazioni in SQL Server 2005, SQL Server 2008 o SQL Server 2008 R2

    CORREZIONE: il ripristino richiede più tempo del previsto per un database in un ambiente SQL Server 2008 o SQL Server 2008 R2

Suggerimento

Per determinare la distribuzione dei file di log virtuali ottimale per le dimensioni correnti del log delle transazioni di tutti i database in un'istanza specifica e gli incrementi della crescita necessari per ottenere le dimensioni richieste, vedere questo script.