Si applica aSQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

Sintomi

Quando si usa il mirroring del database in Microsoft SQL Server 2012 o Microsoft SQL Server 2014, è possibile che venga raggiunta una condizione Assert e che il mirroring del database venga inserito nello stato Suspended.

Causa

Il problema si verifica perché, quando si assegna una nuova pagina, SQL Server Ottiene un blocco X nella nuova pagina. SQL Server imposterà il hobt_id (ID heap o albero B-Tree) a cui appartiene la nuova pagina nella richiesta di blocco. Tuttavia, SQL Server non può inserire il hobt_id nel log mirroring e genera un comportamento di blocco diverso tra il principale e il mirror. Questa operazione può essere illustrata in dettaglio nel modo seguente:

  1. T1 tenere premuto un blocco IX nella pagina P1.

  2. T2 fare una pagina divisa in P1, allocare una nuova pagina P2, viene usata una transazione di sistema TX, che contiene un blocco X in P2. In questo caso, SQL Server non ha inserito il hobt_id nel log di mirroring.

  3. TX esegue una migrazione di blocco per T1 per trasferire il blocco IX da P1 a P2.

  4. TX committed, ora T2 può usare la pagina P2 e T2 ottenere un altro blocco IX nella pagina P2.

  5. T1 committed, ora T2 è l'unico che contiene un blocco IX in P2.

  6. Dopo un sacco di inserimento, si verifica un'escalation di blocco, sul principale, T2 rilascia la IX su P2, ma nello specchio, durante l'escalation dei blocchi, T2 non rilascia il blocco IX.

  7. Dopo un sacco di eliminazione, la pagina P2 diventa vuota e viene deallocata.

  8. T3 ha bisogno di una nuova pagina e succede ad allocare P2, questo richiede un blocco X, ma nello specchio questo passaggio non è riuscito a causa del passaggio 6.

In mirror, il passaggio 6 non rilascia il blocco IX perché l'hobt_id nel blocco di blocco non è corretto. Questa hobt_id non corretta viene eseguita durante il passaggio 2 e a causa di SQL Server non inserisce il hobt_id nel log di mirroring. in genere non viene visualizzato alcun problema perché il TX nel passaggio 2 è molto breve e il blocco di blocco con hobt_id non corretto verrà rilasciato quando viene commesso il commit. Tuttavia, a causa della migrazione dei blocchi in step3 e dei passaggi seguenti (4 e 5), questo blocco di blocco con hobt_id non corretto viene mantenuto e infine causa il problema. Il principale non ha questo problema perché usa una hobt_id corretta nel passaggio 2. Ma il record di log non ha hobt_id corretti.

Ogni nuovo aggiornamento cumulativo per SQL Server contiene tutti gli hotfix e tutti gli aggiornamenti della sicurezza inclusi nell'aggiornamento cumulativo precedente. Vedere gli ultimi aggiornamenti cumulativi per SQL Server:

Soluzione alternativa

Per risolvere il problema, reinizializzare il mirror per terminare lo stato sospeso.

Stato

Microsoft ha confermato che questo problema si verifica nei prodotti elencati nella sezione "Si applica a".

Serve aiuto?

Vuoi altre opzioni?

Esplorare i vantaggi dell'abbonamento e i corsi di formazione, scoprire come proteggere il dispositivo e molto altro ancora.