This is a really interesting question that came up in the Microsoft Certified Architect class I'm teaching at present - if a database has torn-page protection enabled, and page checksums are enabled, is all the existing torn-page detection lost?
This is an important question, because enabling page checksums doesn't suddenly make all allocated pages be protected by page checksums (it's not until a page is read into the buffer pool, modified, and then written back to disk, that it gets a page checksum). If all the existing torn-page protection is discarded when page checksums are enabled, then the pages would be unprotected until they got page checksums on. I couldn't remember the answer, so I experimented!
My idea was to create a database with torn-page protection, create a table with a simulated torn-page in it, then enable page checksums and see if the torn-page was still reported.
-- Create the test databaseUSE master;GOCREATE DATABASE ChecksumTest;GOUSE ChecksumTest;GO -- Explicitly set the database to have torn-page detectionALTER DATABASE ChecksumTest SET PAGE_VERIFY TORN_PAGE_DETECTION;GO -- Create a test table and insert a row.CREATE TABLE BrokenTable (c1 INT, c2 CHAR (1000));INSERT INTO BrokenTable VALUES (1, 'a');GO -- Ensure the page is written to disk and then tossed from the buffer poolCHECKPOINT;GODBCC DROPCLEANBUFFERS;GO
-- Create the test database
-- Explicitly set the database to have torn-page detection
-- Create a test table and insert a row.
-- Ensure the page is written to disk and then tossed from the buffer pool
Now I'm going to examine the page. There are two bits in the page header that specify whether the page is protected by torn-page detection or with a page checksum. Specifically, the m_flagBits field will have 0x100 set if the page is encoded for torn-page protection, and 0x200 set if the page has a page-checksum stored on it, and the page has not been modified (i.e. the checksum is stillvalid). You should not see the 0x100 bit set as torn-page encoding is removed when the page is read into the buffer pool - UNLESS the page IS actually torn, in which case the encoding is NOT removed.
sp_allocationmetadata 'BrokenTable';GODBCC TRACEON (3604);GODBCC PAGE ('ChecksumTest', 1, 143, 3);GO <snip> m_pageId = (1:143) m_headerVersion = 1 m_type = 1m_typeFlagBits = 0x4 m_level = 0 m_flagBits = 0x8000m_objId (AllocUnitId.idObj) = 67 m_indexId (AllocUnitId.idInd) = 256 Metadata: AllocUnitId = 72057594042318848 Metadata: PartitionId = 72057594038321152 Metadata: IndexId = 0Metadata: ObjectId = 2073058421 m_prevPage = (0:0) m_nextPage = (0:0)pminlen = 1008 m_slotCnt = 2 m_freeCnt = 6070m_freeData = 2118 m_reservedCnt = 0 m_lsn = (28:183:2)m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0m_tornBits = 770 <snip>
<snip>
m_pageId = (1:143) m_headerVersion = 1 m_type = 1m_typeFlagBits = 0x4 m_level = 0 m_flagBits = 0x8000m_objId (AllocUnitId.idObj) = 67 m_indexId (AllocUnitId.idInd) = 256 Metadata: AllocUnitId = 72057594042318848 Metadata: PartitionId = 72057594038321152 Metadata: IndexId = 0Metadata: ObjectId = 2073058421 m_prevPage = (0:0) m_nextPage = (0:0)pminlen = 1008 m_slotCnt = 2 m_freeCnt = 6070m_freeData = 2118 m_reservedCnt = 0 m_lsn = (28:183:2)m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0m_tornBits = 770
In this case the torn-page encoding has been removed, and the page is fine. Once I've corrupted the page on disk, it's tricky to be able to see it with DBCC PAGE. I managed to catch it once and saw the following:
m_pageId = (1:143) m_headerVersion = 1 m_type = 1m_typeFlagBits = 0x4 m_level = 0 m_flagBits = 0x8100m_objId (AllocUnitId.idObj) = 67 m_indexId (AllocUnitId.idInd) = 256 Metadata: AllocUnitId = 72057594042318848 Metadata: PartitionId = 72057594038321152 Metadata: IndexId = 0Metadata: ObjectId = 2073058421 m_prevPage = (0:0) m_nextPage = (0:0)pminlen = 1008 m_slotCnt = 1 m_freeCnt = 7083m_freeData = 1107 m_reservedCnt = 0 m_lsn = (28:81:20)m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0m_tornBits = 41949233
Now if I try to select from the table I get:
SELECT * FROM BrokenTable;GO Msg 824, Level 24, State 2, Line 1 SQL Server detected a logical consistency-based I/O error: torn page (expected signature: 0xaaaaaaaa; actual signature: 0xaaaaa82a). It occurred during a read of page (1:143) in database ID 8 at offset 0x0000000011e000 in file 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\ChecksumTest.mdf'. Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online.
SELECT
Msg 824, Level 24, State 2, Line 1
SQL Server detected a logical consistency-based I/O error: torn page (expected signature: 0xaaaaaaaa; actual signature: 0xaaaaa82a). It occurred during a read of page (1:143) in database ID 8 at offset 0x0000000011e000 in file 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\ChecksumTest.mdf'. Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online.
The crux of the question is whether this will still be reported if the database switches to page checksums - let's try:
ALTER DATABASE checksumtest SET PAGE_VERIFY CHECKSUM;GO SELECT * FROM BrokenTable;GO Msg 824, Level 24, State 2, Line 1 SQL Server detected a logical consistency-based I/O error: torn page (expected signature: 0xaaaaaaaa; actual signature: 0xaaaaa82a). It occurred during a read of page (1:143) in database ID 8 at offset 0x0000000011e000 in file 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\ChecksumTest.mdf'. Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online.
ALTER
Cool! The answer is YES - the torn-page is still detected, because the bit in the page header specifies which page protection algorithm the page is using. In fact, it even works if you turn off page checksums and torn-page detection completely.
Remember Me
a@href@title, strike
Theme design by Jelle Druyts
Pick a theme: BlogXP sqlx BlogXP sqlx
Powered by: newtelligence dasBlog 2.0.7226.0
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.
© Copyright 2008, Paul S. Randal
E-mail