Quando è stato introdotto il rilevamento di pagine strappate e checksum in SQL Server e quali sono i comportamenti di aggiornamento?


15

Esistono due diverse opzioni nel moderno SQL Server per la verifica della pagina; essere strappata rilevamento delle pagine e Checksum . Naturalmente nessuno è un'opzione.

Credo che Checksum sia stato introdotto in SQL Server 2005 e che l'aggiornamento o il ripristino di un DB da una versione precedente manterrebbe il metodo di verifica della pagina precedente. cioè non c'è stato un aggiornamento implicito.

Il problema è che abbiamo un database di produzione che è entrato in produzione usando SQL Server 2000 e da allora è passato a un server SQL Server 2008 R2. Verifica pagina è impostato su Nessuno quando mi aspettavo che fosse il rilevamento della pagina strappata . Ritornando a questo periodo di tempo, sembra che il DB sia stato originariamente sviluppato in SQL Server 7.0, quindi migrato in SQL Server 2000 e questo potrebbe spiegare il risultato osservato.

Mi chiedevo quando Torn Page Detection e Checksum diventassero una funzionalità di SQL Server e come si comportassero quando venivano migrati o aggiornati a versioni più recenti.

Modifica: riassumendo alcune delle risposte:

Vi è una certa discrepanza in alcune date per quando il rilevamento di pagine strappate è entrato in SQL Server.
Link 1: http://support.microsoft.com/kb/230785
Link 2: http://technet.microsoft.com/en-us/library/aa337525(v=sql.90).aspx

Il primo collegamento indica SQL 7.0 e il secondo SQL2000. Tendo a riporre la mia fiducia nel suggerimento SQL7.0 e che il collegamento due era confuso dal fatto che era disattivato per impostazione predefinita in SQL7.0 e attivato per impostazione predefinita in SQL2000.


2
è stato introdotto al momento del commit del codice.
swasheck,

Perchè importa? Qual è il problema risolto qui?
Marian,

@swasheck - scusa non capisco il tuo commento.
Paul,

1
@Paul ha votato per riaprire
swasheck il

1
@Paul Ho aggiunto informazioni sulla pagina di dbcc per verificare la presenza di pagine strappate o bit di checksum nella mia risposta.
Kin Shah,

Risposte:


15

In SQL Server 2000, se si desidera identificare pagine corrotte, l'opzione di database TORN_PAGE_DETECTION dovrebbe essere impostata su TRUE.

Ma in SQL 2005 e versioni successive, una nuova impostazione PAGE_VERIFY ha sostituito il vecchio TORN_PAGE_DETECTION che consente di scegliere tra due diversi tipi di verifica della pagina: TORN_PAGE_DETECTION e CHECKSUM.

Ora arriva la domanda su quale impostare: TORN_PAGE_DETECTION o CHECKSUM?

TORN_PAGE_DETECTION: scrive un po 'ogni 512 byte in una pagina, consentendo di rilevare quando una pagina non è stata scritta correttamente sul disco. Il problema è che non ti dirà se i dati memorizzati in quei 512 byte sono effettivamente corretti o meno a causa del fatto che un paio di byte potrebbero essere stati scritti in modo errato.

CHECKSUM - Calcolerà un checksum della pagina sia quando viene scritta una pagina sia quando viene letta una pagina, supponendo che abbia un checksum su di essa.

SQL Server calcola il checksum in base al modello di bit nella pagina, lo memorizza nell'intestazione della pagina e quindi emette un I / O per scrivere la pagina. Quando SQL Server legge la pagina, calcola nuovamente il checksum utilizzando la stessa logica e quindi lo confronta con il valore disponibile nell'intestazione della pagina. Se il valore di checksum corrisponde, si presume che la pagina non sia stata danneggiata durante il ciclo di lettura-lettura.

Poiché il costo del calcolo del checksum è sostenuto su ogni pagina di lettura e scrittura, può aumentare l'overhead della CPU e influire sul throughput del carico di lavoro. Un'altra cosa da tenere a mente è che il checksum non è univoco per uno specifico schema di bit nella pagina. Due pagine possono eventualmente essere associate allo stesso valore di checksum. Quindi esiste la remota possibilità che la corruzione della pagina non venga rilevata.

Riferimento: checksum in SQL2005

Per rispondere in modo specifico alle tue domande:

Credo che Checksum sia stato introdotto in SQL2005 e che l'aggiornamento o il ripristino di un DB da una versione precedente manterrebbe il metodo di verifica della pagina precedente. cioè non c'è stato un aggiornamento implicito.

Sì, CHECKSUM è stato introdotto in SQL Server 2005 ed è DEFAULT . Quando si aggiorna dal 2000 al 2005, è necessario modificare esplicitamente l'opzione Database Verifica pagina per utilizzare CHECKSUM.

Se si ripristina il database già creato su SQL 2005 su un altro server che esegue SQL 2005, non è necessario impostarlo. Continuerà a qualsiasi cosa tu abbia impostato l'opzione Verifica pagina.

Non sono riuscito a fare ricerche quando è arrivato Torn Page Detection

Da: http://support.microsoft.com/kb/230785

Versioni di SQL Server precedenti alla 7.0

Le versioni di SQL Server precedenti alla 7.0 non fornivano parità di log o funzionalità di rilevamento dei bit strappati. In effetti, tali versioni possono scrivere più volte la stessa pagina di registro fino a quando i record di registro non riempiono la pagina di registro da 2 KB. Ciò può esporre le transazioni che sono state impegnate correttamente. Se la pagina del registro viene riscritta durante un errore, un settore con la transazione impegnata potrebbe non essere riscritto correttamente.

Pertanto, TORN_PAGE_DETECTION è in circolazione da SQL Server 7.0. Anche allora, il valore predefinito era che non era abilitato (stesso collegamento) .

Nota Il rilevamento di pagine strappate non è abilitato per impostazione predefinita in SQL Server 7.0. Vedi sp_dboption per come abilitare il rilevamento sul tuo sistema.

Pertanto, se il database fosse stato sviluppato su un'istanza 7.0 e successivamente aggiornato, avrebbe aggiornato l'opzione con l'opzione PAGINA VERIFY esistente di NESSUNO (come notato da @ThomasStringer nella sua risposta).


Modifica: 24/09/2013 Per migliorare la risposta:

Facendo riferimento alle mie note interne di SQL Server da SQLSkills, ho scoperto che utilizzando un dump della pagina, è possibile verificare se il rilevamento di bit strappati - TORN_PAGE_DETECTION o CHECKSUM è stato abilitato o meno:

use database_name -- change here for your database !!
checkpoint
go 
dbcc traceon (3604)   -- send output to screen
go
dbcc page (dbaalert, 1,1,0)
dbcc traceoff (3604)  -- turn off the trace flag
go

m_tornBits : contiene il checksum della pagina o i bit che sono stati spostati dai bit di protezione della pagina strappata, a seconda della forma di protezione della pagina attivata per il database.

Nota : non ho versioni precedenti del server sql in esecuzione. Di seguito è confermato da SQL Server 2000 e versioni successive . Se hai un 7.0 o 6.5 in giro, puoi anche confermarlo :-)

inserisci qui la descrizione dell'immagine


@Kin aye So che era presente anche in SQL2000, vorrei sapere quando è stato introdotto per la prima volta. con la frase "passare alle versioni precedenti" facciamo finta che TPD sia stato introdotto in SQL2000, quindi spostandosi da SQL7 a SQL2000 si passerebbe da una versione all'altra di SQL2005. Sono interessato a sapere se la TPD è stata attivata durante tali migrazioni. Mi aspetto pienamente che non sarebbe, ma non sono stato in grado di verificarlo.
Paul,

@paul li ho cancellati perché sentivo che la mia modifica includeva i commenti
swasheck

@Kin Ho provato il tuo codice DBCC su SQL2008R2 e ho ottenuto un valore m_tornbits di 1711843878 .. quindi è una misura piuttosto che un valore booleano diresti?
Paolo,

@Paul significa che la pagina di checksum o torm è ON. A partire dal 2005, dovresti scegliere Solo CHECKSUM. Ti stai chiedendo se hai qualche 7.0 in giro da testare?
Kin Shah,

6

Dai un'occhiata al riferimento di BOL :

Quando un database utente o di sistema viene aggiornato a SQL Server 2005 o versione successiva, viene mantenuto il valore PAGE_VERIFY (NONE o TORN_PAGE_DETECTION). Si consiglia di utilizzare CHECKSUM

Ciò impone che prima di SQL Server 2005 TORN_PAGE_DETECTIONesistesse l'opzione per , ma non CHECKSUM.

E per rispondere al tuo secondo punto:

... e che l'aggiornamento o il ripristino di un DB da una versione precedente manterrebbe il metodo di verifica della pagina precedente.

Si, è corretto. Dovresti impostare esplicitamente il database per utilizzare il CHECKSUMmetodo di verifica della pagina.


Grazie per il riferimento @Thomas ma questo non risponde quando TORN PAGE DETECTION è diventato disponibile per la prima volta in SQL Server.
Paul,

2
@Paul Questo risponde al fatto che il rilevamento di pagine strappate esisteva prima di SQL Server 2005. Stai cercando quale versione di SQL Server è entrata in gioco con la verifica delle pagine? Oltre a una lezione di storia, non sono sicuro di cosa stai cercando di guadagnare lì. Quale problema stai esattamente cercando di risolvere?
Thomas Stringer,

Stavo cercando di sapere quando è nata e come si è comportata durante le migrazioni. Spero di capire come alcuni dei nostri DB molto vecchi sono arrivati ​​ad avere le impostazioni che fanno su alcuni dei nostri server moderni (ish, SQL2008R2).
Paul,

Se i tuoi database hanno TORN_PAGE_DETECTION, ciò potrebbe sicuramente comportare un aggiornamento da pre-SQL Server 2005 e l'opzione di verifica della pagina è persistita.
Thomas Stringer,

non hanno il TPD abilitato, quella era la parte sconcertante. Altre risposte hanno fornito la soluzione al problema ora (SQL7.0 aveva TPD, ma non abilitato per impostazione predefinita e questa era la versione originariamente sviluppata contro)
Paul

3

Esistono due diverse opzioni nel moderno SQL Server per la verifica della pagina

Ce ne sono tre come hai dichiarato: TORN_PAGE_DETECTION, CHECKSUM e NONE.

Credo che CHECKSUM sia stato introdotto in SQL Server 2005

Come citato da questo articolo MSDN intitolato "Gestione buffer": il rilevamento di pagine strappate è stato introdotto in SQL Server 2000. Checksum è stato introdotto in SQL Server 2005.

Una sinossi di altre cose annotate in questo articolo è che il meccanismo di verifica della pagina è specificato al momento della creazione del database. Quindi dipende da chi e come hanno creato il database su cosa è impostato, potrebbe anche essere controllato da quale database modello è configurato. È anche interessante notare che se si modifica l'impostazione non ha effetto sull'intero database, solo quando si passa alla pagina successiva. Inoltre, secondo Paul Randal, viene eseguito solo quando la pagina viene letta in memoria, modificata e quindi riscritta su disco; quell'informazione è qui .

Ho un database di produzione che è entrato in produzione usando SQL Server 2000, anche se potrebbe essere stato sviluppato su SQL Server 7.0 e da allora è passato a un server SQL Server 2008 R2. Verifica pagina è impostato su NESSUNO sebbene mi aspettassi che fosse RILEVAMENTO PAGINA TORN.

Chiunque disponga delle autorizzazioni per l'istanza del database può modificare quel valore. Potrebbe essere persistito attraverso gli aggiornamenti come indicato su MSDN qui :

Quando un database utente o di sistema viene aggiornato a SQL Server 2005 o versione successiva, viene mantenuto il valore PAGE_VERIFY (NONE o TORN_PAGE_DETECTION)

Potrebbe anche essere stato modificato in un secondo momento perché qualcuno ha frainteso la configurazione e stava girando al buio per cercare di risolvere un problema.

Mi chiedevo quando TORN RILEVARE PAGINA diventasse una funzione di verifica della pagina

SQL Server 2000 come indicato sopra.

come si comporta quando viene migrato o aggiornato a versioni più recenti.

L'impostazione precedente viene mantenuta durante l'aggiornamento come indicato sopra.

Ora vorrei sottolineare il fatto che altri collegamenti forniti da persone affermano che SQL Server 7.0 è quando era disponibile il rilevamento di pagine strappate. Il che, come affermato in tali articoli, è vero, tuttavia è dimostrato più volte che la documentazione Microsoft non dovrebbe essere considerata come vera in tutte le circostanze. Ci sono molti dove si sbagliano. Detto questo, come puoi determinare quale risposta è accettabile? Tutti abbiamo fornito documentazione di Microsoft per supportare la nostra risposta.

Si noti inoltre che il rilevamento di pagine strappate è nell'elenco degli ammortamenti a partire da SQL Server 2012, quindi qual è la preoccupazione per come è stato impostato sui database per cominciare. Se lo vedessi impostato su qualcosa di diverso da CHECKSUM, lo cambierò immediatamente e passerò ad altri compiti più importanti. Non mi preoccupo di come sia stata messa in atto una configurazione errata, è più importante correggerla e quindi assicurarsi che coloro che dispongono delle autorizzazioni per modificarla siano informati del perché tale elemento di configurazione non dovrebbe essere modificato in nient'altro. Solo i miei $ 0,02


Penso che 2000 sia stato quando TPD è passato a ON. Come con molte altre nuove funzionalità di SQL Server, lo rilasciano disabilitato / disattivato per impostazione predefinita e impongono ai DBA di attivarlo. Ad ogni modo, +1 da parte mia per l'avvertimento di ammortamento.
swasheck,

È un buon punto, hai un buon collegamento che sembra fare il backup di ciò che dici. Ma credo che il collegamento fornito da qualcun altro ( support.microsoft.com/kb/230785 ) lo sostituisca. Sono più propenso a pensare che la sezione di gestione del buffer abbia sbagliato metà rispetto all'altro link. Se questo ha senso, non sono del tutto sicuro che mi sto mettendo molto bene!
Paolo,

È una di quelle cose come le licenze, nulla di ciò che MS afferma è molto chiaro ...

0

Come hanno affermato sia @Thomas Stringer che @Kin, è stato introdotto in SQL Server 2005 e credo che funzioni in tutte le edizioni di SQL Server. Per TempDB però CHECKSUM è stato introdotto in SQL Server 2008

http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/03/23/checksum-and-tempdb.aspx


Grazie @DaniSQL, tuttavia nessuno ha ancora risposto alla domanda per intero. cioè quando è stata introdotta la RILEVAMENTO PAGINA TORN e come si sono comportati durante gli aggiornamenti / migrazioni.
Paul,

Lascio che gli storici lo scoprano :-) Per quanto riguarda l'aggiornamento / le migrazioni non accadrà nulla se non cambi manualmente l'opzione di verifica della pagina in CHECKSUM in ciascun database. Anche allora le pagine già esistenti non avranno checksum. blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/29/…
DaniSQL

grazie @DaniSQL, è così che intendo le migrazioni a SQL2005 e superiori per funzionare. Volevo solo assicurarmi che anche le versioni precedenti mantenessero questo comportamento
Paul,
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.