Condividi tramite


Il ripristino di un database di SQL Server tramite un'applicazione VDI con striping multipla potrebbe non riuscire con errore 3456

Questo articolo illustra come risolvere un problema che si verifica quando si usano applicazioni basate su VDI (Virtual Device Interface) per ripristinare i database di SQL Server.

Sintomi

Quando si ripristina un backup completo VDI (Multi-Striped Virtual Device Interface) in SQL Server 2019 o versione successiva, è possibile che venga visualizzato l'errore MSSQLSERVER_3456:

Msg 3456, Level 16, State 1, Line <LineNumber>
Could not redo log record (120600:18965748:1), for transaction ID (0:1527178398), on page (14:1987189), allocation unit 72057761533001728, database 'DB1_STRIPE' (database ID 8).
Page: LSN = (120598:23255372:8), allocation unit = 72057761317781504, type = 1. Log: OpCode = 6, context 2, PrevPageLSN: (120600:18965371:85).

Causa

Quando SQL Server esegue il backup in VDI, passa i dati all'istanza VDI tramite un buffer. L'VDI gestisce quindi la formattazione di come archiviare il backup. Tuttavia, in molti casi, il client VDI potrebbe aspettarsi solo una singola copia di ogni pagina di dati.

Quando si esegue lo striping di un backup in VDI, più dispositivi di backup insieme costituiscono il contenuto di un backup completo. I dati vengono scritti in modo asincrono e l'ordinamento della copia dei dati viene gestito dalla logica del client VDI. Poiché la fase di copia dei dati è asincrona, i dati possono essere scritti in ordine. Tuttavia, in uno scenario di backup completo prima di SQL Server 2019, è presente una sola copia per pagina di dati. Pertanto, quando il client VDI invia dati al buffer da cui SQL Server legge per un ripristino, SQL Server sarà comunque in grado di sapere esattamente dove e come ripristinare ogni pagina di dati. Con l'introduzione dell'aggiunta ritardata del log in SQL Server 2019, nei file di backup potrebbero essere presenti più copie della pagina dei dati. Esistono più copie a causa di un mini backup differenziale eseguito all'interno del backup completo (vedere la sezione Altre informazioni per i dettagli). Il client VDI non prevede più copie della stessa pagina di dati o il passaggio delle pagine di dati a SQL Server nell'ordine errato. Questo comportamento causa l'errore di ripristino. L'errore 3456 Could not redo log record indica che SQL Server tenta di applicare un record di log che prevede la versione più recente della pagina dei dati, ma trova una versione precedente.

Risoluzione

  1. A seconda della configurazione, è necessario abilitare uno o più flag di traccia come parametri di avvio per l'istanza di SQL Server:

    • Se si eseguono backup completi quando l'istanza funge da replica primaria o da un'istanza senza gruppi di disponibilità, abilitare il flag di traccia 3471 per disabilitare la funzionalità di aggiunta ritardata del log per i backup completi.

    • Se si eseguono backup differenziali quando l'istanza funge da replica primaria o da un'istanza senza gruppi di disponibilità, abilitare il flag di traccia 3475 per disabilitare la funzionalità di aggiunta ritardata del log per i backup differenziali.

    • Se si eseguono backup completi con COPY_ONLY quando l'istanza funge da replica secondaria, abilitare il flag di traccia 3472 per disabilitare la funzionalità di aggiunta ritardata del log per i backup differenziali.

  2. Riavviare SQL Server.

  3. Eseguire nuovamente i backup completi o differenziali.

Note

È anche possibile abilitare temporaneamente questi flag di traccia usando il comando DBCC TRACEON .

DBCC TRACEON(3471,3472,3475,-1)

Questo comando può essere usato per attenuare il problema se non è possibile riavviare immediatamente l'istanza di SQL Server.

Importante

A causa di questo problema, i backup esistenti potrebbero non essere ripristinabili se sono vere le condizioni seguenti:

  • Il backup viene eseguito con la funzionalità di aggiunta del log ritardata abilitata.
  • Lo strumento di backup usa VDI.
  • Il backup viene eseguito usando il multi-striping (backup in più file).

È consigliabile ripristinare i backup esistenti in un server di test per verificare se possono essere ripristinati correttamente.

Ulteriori informazioni

SQL Server 2019 introduce una funzionalità denominata aggiunta ritardata del log. Prima dell'introduzione di questa funzionalità, durante un backup completo del database, SQL Server impedisce l'esecuzione di qualsiasi transazione (aggiunge il log), copia i dati e il log e quindi rimuove il pin direttamente all'inizio. Con la funzionalità presente, SQL Server ritarda le transazioni dall'esecuzione (aggiunge il log) verso la fine della durata del backup, anziché direttamente all'inizio. Questa funzionalità è progettata per evitare un problema completo del log delle transazioni (MSSQLSERVER_9002 errore) durante un backup completo che richiede molto tempo per il completamento. Poiché il blocco del log è ritardato, le transazioni possono comunque essere applicate alle pagine di dati del database mentre il backup è in corso. SQL Server gestisce una bitmap per identificare le pagine modificate dall'ora di inizio del backup completo in corso, in modo che possa eseguire un mini backup differenziale di tali pagine. In questo modo, ottiene una copia aggiornata di ogni pagina di dati modificata durante il backup dell'intero database. In questo modo viene creata una copia aggiuntiva di alcune pagine di dati. Inoltre, viene creata questa sezione aggiuntiva del backup completo.