เมื่อใดที่มีการเปิดใช้งานการตรวจสอบและตรวจสอบหน้าฉีกขาดกับ SQL Server และพฤติกรรมการอัพเกรดคืออะไร


15

มีสองตัวเลือกที่แตกต่างกันใน SQL Server ที่ทันสมัยสำหรับการตรวจสอบหน้า; ถูกฉีกหน้าตรวจสอบและตรวจสอบผลรวม ไม่มีตัวเลือกแน่นอน

ฉันเชื่อว่าChecksumถูกนำมาใช้ใน SQL Server 2005 และการอัปเกรดหรือการกู้คืนฐานข้อมูลจากเวอร์ชันก่อนหน้านั้นจะคงไว้ซึ่งวิธีการตรวจสอบหน้าก่อนหน้า เช่นไม่มีการอัพเกรดโดยนัย

ปัญหาที่เกี่ยวข้องคือเรามีฐานข้อมูลการผลิตที่นำไปผลิตโดยใช้ SQL Server 2000 และย้ายไปยังเซิร์ฟเวอร์ SQL Server 2008 R2 หน้าตรวจสอบการตั้งค่าเพื่อไม่เมื่อฉันได้รับการคาดหวังว่ามันจะได้รับการขาดการตรวจสอบหน้า ย้อนกลับไปตามระยะเวลาที่เราดูเหมือนว่าฐานข้อมูลนี้ได้รับการพัฒนาใน SQL Server 7.0 แล้วย้ายไปยัง SQL Server 2000 และนี่อาจอธิบายผลลัพธ์ที่สังเกตได้

ฉันสงสัยว่าเมื่อTorn Page DetectionและChecksumกลายเป็นคุณสมบัติของ SQL Server และวิธีการทำงานเมื่อทำการโยกย้ายหรืออัปเกรดเป็นเวอร์ชันที่ใหม่กว่า

แก้ไข: สรุปคำตอบบางส่วน:

มีความแตกต่างเล็กน้อยในบางวันเมื่อ Torn Page Detection มาใน SQL Server
ลิงก์ 1: http://support.microsoft.com/kb/230785
ลิงก์ 2: http://technet.microsoft.com/en-us/library/aa337525(v=sql.90).aspx

ลิงค์แรกระบุว่า SQL 7.0 และ SQL2000 ตัวที่สอง ฉันมักจะใส่ความเชื่อมั่นในข้อเสนอแนะ SQL7.0 และลิงค์ที่สองนั้นสับสนว่ามันถูกปิดโดยค่าเริ่มต้นใน SQL7.0 และโดยค่าเริ่มต้นใน SQL2000


2
มันแนะนำเมื่อรหัสมุ่งมั่น
swasheck

ทำไมมันถึงสำคัญ? ปัญหาการแก้ไขที่นี่คืออะไร?
แมเรียน

@swasheck - ขอโทษฉันไม่เข้าใจความคิดเห็นของคุณ
พอล

1
@Paul โหวตให้เปิดใหม่อีกครั้ง
swasheck

1
@ พอลฉันได้เพิ่มข้อมูลหน้า dbcc เพื่อตรวจสอบหน้าฉีกขาดหรือบิต checksum ในคำตอบของฉัน
Kin Shah

คำตอบ:


15

ใน SQL Server 2000 ถ้าคุณต้องการระบุเพจที่เสียหายดังนั้นตัวเลือกฐานข้อมูล TORN_PAGE_DETECTION ควรถูกตั้งค่าเป็น TRUE

แต่ใน SQL 2005 และสูงกว่าการตั้งค่าใหม่ PAGE_VERIFY แทนที่ TORN_PAGE_DETECTION เก่าซึ่งอนุญาตให้เลือกการยืนยันหน้าสองประเภทที่แตกต่างกัน: TORN_PAGE_DETECTION และ CHECKSUM

ตอนนี้คำถามมาที่หนึ่งที่จะตั้ง - TORN_PAGE_DETECTION หรือตรวจสอบ?

TORN_PAGE_DETECTION - เขียนบิตสำหรับทุก ๆ 512 ไบต์ในหน้าหนึ่งซึ่งช่วยให้คุณตรวจจับได้เมื่อหน้าไม่ได้เขียนลงดิสก์สำเร็จ สิ่งที่จับได้คือมันจะไม่บอกคุณว่าข้อมูลที่จัดเก็บใน 512 ไบต์นั้นถูกต้องจริงหรือไม่เนื่องจากข้อเท็จจริงที่ว่าไบต์คู่อาจถูกเขียนอย่างไม่ถูกต้อง

ตรวจสอบ - จะคำนวณผลรวมตรวจสอบของหน้าทั้งสองเมื่อหน้าถูกเขียนและเมื่ออ่านหน้าสมมติว่ามันมีการตรวจสอบบน

SQL Server คำนวณการตรวจสอบตามรูปแบบบิตบนหน้าเก็บไว้ในส่วนหัวของหน้าแล้วออก I / O เพื่อเขียนหน้า เมื่อ SQL Server อ่านหน้านั้นคำนวณการตรวจสอบใหม่โดยใช้ตรรกะเดียวกันและเปรียบเทียบกับค่าที่มีอยู่ในส่วนหัวของหน้า หากค่าการตรวจสอบที่ตรงกันนั้นจะถือว่าหน้าไม่ได้รับความเสียหายในระหว่างรอบการอ่าน - เขียน

เนื่องจากค่าใช้จ่ายในการคำนวณการตรวจสอบที่เกิดขึ้นในแต่ละหน้าอ่านและเขียนมันสามารถเพิ่มค่าใช้จ่ายของ CPU และอาจส่งผลกระทบต่อปริมาณงานของปริมาณงานของคุณ สิ่งที่ควรทราบอีกประการหนึ่งคือการตรวจสอบที่ไม่ซ้ำกันสำหรับรูปแบบบิตเฉพาะในหน้า สองหน้าสามารถแมปกับค่าเช็คซัมเดียวกันได้ ดังนั้นจึงมีความเป็นไปได้จากระยะไกลที่หน้าเสียหายอาจตรวจไม่พบ

การอ้างอิง: Checksum ใน SQL2005

เพื่อตอบคำถามของคุณโดยเฉพาะ:

ฉันเชื่อว่า Checksum ได้รับการแนะนำใน SQL2005 และการอัปเกรดหรือการกู้คืนฐานข้อมูลจากเวอร์ชันก่อนหน้านั้นจะคงไว้ซึ่งวิธีการตรวจสอบหน้าก่อนหน้า เช่นไม่มีการอัพเกรดโดยนัย

ใช่ CHECKSUM เป็นที่รู้จักใน SQL Server 2005 และเป็นค่าเริ่มต้น เมื่อคุณอัปเกรดจาก 2000 เป็น 2005 คุณจะต้องเปลี่ยนตัวเลือกฐานข้อมูลอย่างชัดเจน Page Verify เพื่อใช้ CHECKSUM

หากคุณกู้คืนฐานข้อมูลที่สร้างไว้แล้วใน sql 2005 ไปยังเซิร์ฟเวอร์อื่นที่รัน sql 2005 คุณไม่จำเป็นต้องตั้งค่า มันจะยืนยันสิ่งที่คุณเคยตั้งค่าตัวเลือกการยืนยันหน้าเป็น

ฉันไม่ประสบความสำเร็จในการค้นคว้าเมื่อมีการตรวจจับหน้าเว็บด้วย Torn

จาก: http://support.microsoft.com/kb/230785

SQL Server รุ่นก่อนหน้า 7.0

SQL Server รุ่นก่อนหน้า 7.0 ไม่ได้จัดเตรียมบันทึกการตรวจสอบหรือการตรวจจับบิตฉีกขาด อันที่จริงแล้วเวอร์ชันเหล่านั้นสามารถเขียนหน้าล็อกเดียวกันได้หลายครั้งจนกระทั่งเรคคอร์ดบันทึกเติมหน้าล็อก 2-KB สิ่งนี้สามารถเปิดเผยธุรกรรมที่ได้กระทำสำเร็จ หากหน้าบันทึกกำลังถูกเขียนใหม่ในระหว่างความล้มเหลวภาคที่มีการทำธุรกรรมที่มุ่งมั่นอาจไม่ได้รับการเขียนใหม่อย่างถูกต้อง

ดังนั้น TORN_PAGE_DETECTION จึงมีมาตั้งแต่ SQL Server 7.0 แล้วถึงแม้เริ่มต้นก็คือว่ามันไม่ได้เปิดใช้ (ลิงค์เดียวกัน)

หมายเหตุการตรวจหาหน้า Torn นั้นไม่ได้เปิดใช้งานโดยค่าเริ่มต้นใน SQL Server 7.0 ดูsp_dboptionสำหรับวิธีการเปิดใช้งานการตรวจจับในระบบของคุณ

ดังนั้นหากฐานข้อมูลได้รับการพัฒนาเทียบกับอินสแตนซ์ 7.0 และได้รับการอัพเกรดในภายหลังมันจะอัพเกรดด้วยตัวเลือก PAGE VERIFY ของ NONE ที่มีอยู่ (ตามที่ @ThomasStringer ระบุไว้ในคำตอบของเขา)


แก้ไข: 09/24/2013 เพื่อปรับปรุงคำตอบ:

การอ้างอิงถึงบันทึกย่อภายใน SQL Server ของฉันจาก SQLSkills ฉันพบว่าการใช้การถ่ายโอนข้อมูลหน้าคุณสามารถตรวจสอบว่าการตรวจจับบิตฉีกขาด - TORN_PAGE_DETECTION หรือ CHECKSUM ถูกเปิดใช้งานหรือไม่:

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 : สิ่งนี้จะเก็บเช็กซัมหน้าหรือบิตที่แทนที่โดยบิตการป้องกันการฉีกขาดหน้า - ทั้งนี้ขึ้นอยู่กับรูปแบบของการป้องกันเพจที่จะเปิดใช้งานสำหรับฐานข้อมูล

หมายเหตุ : ฉันไม่มีรุ่นเซิร์ฟเวอร์ sql รุ่นเก่ากว่าทำงานอยู่ ด้านล่างได้รับการยืนยันจากsql server 2000 ขึ้นไป หากคุณใช้งาน 7.0 หรือ 6.5 คุณสามารถยืนยันได้เช่นกัน :-)

ป้อนคำอธิบายรูปภาพที่นี่


@ คินใช่ฉันรู้ว่ามันเป็นรอบใน SQL2000 ด้วยอยากจะรู้ว่าเมื่อมันถูกนำมาใช้ครั้งแรก โดยวลี "การย้ายไปยังรุ่นก่อนหน้า" ให้เราแกล้งทำเป็น TPD ถูกนำมาใช้ใน SQL2000 จากนั้นการย้ายจาก SQL7 ไปยัง SQL2000 จะเป็นการย้ายระหว่างเวอร์ชันก่อนหน้า SQL2005 ฉันสนใจที่จะทราบว่า TPD ถูกเปิดใช้งานระหว่างการย้ายข้อมูลหรือไม่ ฉันคาดหวังอย่างเต็มที่ว่าจะไม่ได้ แต่ไม่สามารถตรวจสอบได้
พอล

@paul ฉันลบพวกเขาเพราะฉันรู้สึกว่าการแก้ไขของฉันรวมความคิดเห็นไว้
swasheck

@ คินฉันลองใช้รหัส DBCC ของคุณบน SQL2008R2 และได้ค่า m_tornbits เป็น 1711843878 .. ดังนั้นมันจึงเป็นการวัดมากกว่าที่คุณจะพูดแบบบูล
เปาโล

@Paul หมายความว่าการตรวจสอบหรือหน้า torm นั้นเปิดอยู่ ตั้งแต่ a2005 ขึ้นไปคุณควรไปเพียงเช็คอินเท่านั้น สงสัยหรือไม่ว่าคุณมีผู้รอทดสอบอยู่ 7.0 คน?
Kin Shah

6

ดูการอ้างอิงจาก BOL :

เมื่อมีการอัปเกรดฐานข้อมูลผู้ใช้หรือระบบเป็น SQL Server 2005 หรือรุ่นที่ใหม่กว่าค่า PAGE_VERIFY (NONE หรือ TORN_PAGE_DETECTION) จะยังคงอยู่ เราแนะนำให้คุณใช้ CHECKSUM

คำสั่งนี้ว่าก่อนที่จะ SQL Server 2005 ตัวเลือกสำหรับการTORN_PAGE_DETECTIONดำรงอยู่ CHECKSUMแต่ไม่ได้

และเพื่อตอบจุดที่สองของคุณ:

... และการอัปเกรดหรือการกู้คืนฐานข้อมูลจากเวอร์ชันก่อนหน้านั้นจะคงไว้ซึ่งวิธีการตรวจสอบหน้าก่อนหน้า

ใช่ว่าถูกต้อง คุณจะต้องตั้งค่าฐานข้อมูลอย่างชัดเจนเพื่อใช้CHECKSUMวิธีการตรวจสอบหน้า


ขอบคุณสำหรับการอ้างอิง @Thomas แต่ไม่ได้รับคำตอบเมื่อ TORN PAGE DETECTION เปิดใช้งานครั้งแรกใน SQL Server
พอล

2
@Paul นี่จะตอบว่าการตรวจจับหน้าเว็บขาดอยู่ก่อน SQL Server 2005 คุณกำลังค้นหา SQL Server รุ่นใดที่การตรวจสอบหน้าเว็บเข้ามาเล่นอยู่? นอกจากบทเรียนประวัติศาสตร์แล้วฉันไม่แน่ใจว่าคุณต้องการรับสิ่งใด คุณพยายามแก้ไขปัญหาอะไรกันแน่?
Thomas Stringer

ฉันพยายามที่จะรู้ว่าเมื่อมันมาถึงการดำรงอยู่และวิธีการทำงานในระหว่างการย้ายถิ่น ฉันหวังว่าจะเข้าใจว่าฐานข้อมูลที่เก่าแก่ของเราบางส่วนมีการตั้งค่าที่พวกเขาทำบนเซิร์ฟเวอร์สมัยใหม่ (ish, SQL2008R2) บางรุ่นของเราได้อย่างไร
พอล

หากฐานข้อมูลของคุณมี TORN_PAGE_DETECTION นั่นอาจส่งผลให้มีการอัปเกรดจาก pre-SQL Server 2005 และตัวเลือกการยืนยันหน้านั้นยังคงมีอยู่
Thomas Stringer

พวกเขาไม่ได้เปิดใช้งาน TPD นั่นคือส่วนที่ยุ่งเหยิง คำตอบอื่น ๆ ได้ให้วิธีการแก้ปัญหาในขณะนี้ (SQL7.0 มี TPD แต่ไม่ได้เปิดใช้งานโดยค่าเริ่มต้นและนี่เป็นรุ่นที่พัฒนาขึ้นมาตั้งแต่แรก)
Paul

3

มีสองตัวเลือกที่แตกต่างกันใน SQL Server ที่ทันสมัยสำหรับการตรวจสอบหน้า

มีสามอย่างตามที่คุณระบุไว้: TORN_PAGE_DETECTION, CHECKSUM และ NONE

ฉันเชื่อว่ามีการเปิดตัว CHECKSUM ใน SQL Server 2005

ที่ยกมาจากนี้บทความ MSDN หัวข้อ "การบริหารจัดการบัฟเฟอร์": การตรวจสอบหน้าฉีกเป็นที่รู้จักใน SQL Server 2000 Checksum ได้รับการแนะนำใน SQL Server 2005

บทสรุปของสิ่งอื่น ๆ ที่ระบุไว้ในบทความนี้คือกลไกการตรวจสอบหน้าระบุไว้ในเวลาที่สร้างฐานข้อมูล ดังนั้นมันขึ้นอยู่กับว่าใครและอย่างไรที่พวกเขาสร้างฐานข้อมูลว่ามันถูกตั้งค่าเป็นยังสามารถควบคุมโดยสิ่งที่ฐานข้อมูลรูปแบบการกำหนดค่า สิ่งที่น่าสนใจที่ควรทราบก็คือหากคุณเปลี่ยนการตั้งค่าจะไม่มีผลกับฐานข้อมูลทั้งหมดเฉพาะเมื่อมีการเขียนเพจไปยังถัดไป พอลแรนดัลตามที่ทำได้ก็ต่อเมื่ออ่านหน้าหน่วยความจำเปลี่ยนแล้วเขียนลงดิสก์ ว่าข้อมูลเป็นที่นี่

ฉันมีฐานข้อมูลการผลิตที่นำไปผลิตโดยใช้ SQL Server 2000 แม้ว่าอาจได้รับการพัฒนาเทียบกับ SQL Server 7.0 และได้ย้ายไปยังเซิร์ฟเวอร์ SQL Server 2008 R2 แล้ว หน้ายืนยันถูกตั้งค่าเป็นไม่มีแม้ว่าฉันคาดว่าจะเป็นการตรวจสอบหน้าฉีกขาด

ทุกคนที่มีสิทธิ์ในอินสแตนซ์ฐานข้อมูลสามารถแก้ไขค่านั้นได้ อาจมีการยืนยันผ่านการอัปเกรดตามที่ระบุใน MSDN ที่นี่ :

เมื่อมีการอัปเกรดฐานข้อมูลผู้ใช้หรือระบบเป็น SQL Server 2005 หรือรุ่นที่ใหม่กว่าค่า PAGE_VERIFY (NONE หรือ TORN_PAGE_DETECTION) จะยังคงอยู่

มันอาจได้รับการแก้ไขในภายหลังเพราะมีคนเข้าใจผิดเกี่ยวกับการกำหนดค่าและกำลังถ่ายทำในที่มืดเพื่อลองและแก้ไขปัญหา

ฉันสงสัยว่าเมื่อใดที่การตรวจสอบหน้าฉีกขาดกลายเป็นคุณสมบัติการยืนยันหน้า

SQL Server 2000 ตามที่ระบุไว้ข้างต้น

วิธีการทำงานเมื่อย้ายข้อมูลหรืออัปเกรดเป็นรุ่นที่ใหม่กว่า

การตั้งค่าก่อนหน้านี้จะยังคงอยู่ในระหว่างการอัพเกรดตามที่ระบุไว้ข้างต้น

ตอนนี้ฉันอยากจะชี้ให้เห็นข้อเท็จจริงที่ว่าการเชื่อมโยงอื่น ๆ ที่จัดทำโดยคนระบุว่า SQL Server 7.0 คือเมื่อการตรวจสอบหน้าฉีกขาดพร้อมใช้งาน ซึ่งตามที่ระบุไว้ในบทความเหล่านั้นเป็นจริงอย่างไรก็ตามมีการพิสูจน์หลายครั้งว่าเอกสารของ Microsoft ไม่ควรถือเป็นความจริงในทุกสถานการณ์ มีหลายที่ที่พวกเขาผิด ดังนั้นด้วยวิธีการดังกล่าวคุณจะทราบได้อย่างไรว่าคำตอบใดเป็นที่ยอมรับ? เราทุกคนจัดหาเอกสารโดย Microsoft เพื่อสนับสนุนคำตอบของเรา

โปรดทราบว่าการตรวจจับหน้าฉีกขาดอยู่ในรายการค่าเสื่อมราคา ณ SQL Server 2012 ดังนั้นสิ่งที่เป็นข้อกังวลเกี่ยวกับวิธีการตั้งค่าบนฐานข้อมูลของคุณเริ่มต้นด้วย ถ้าฉันเห็นมันตั้งค่าเป็นสิ่งอื่นที่นอกเหนือจากเช็คซัมฉันเปลี่ยนมันทันทีและย้ายไปทำงานที่สำคัญอื่น ๆ ฉันไม่กังวลว่าจะมีการกำหนดค่าที่ไม่ถูกต้องอย่างไรสำคัญกว่าการแก้ไขและตรวจสอบให้แน่ใจว่าผู้ที่มีสิทธิ์ในการเปลี่ยนแปลงได้รับแจ้งว่าเหตุใดจึงไม่ควรเปลี่ยนรายการการกำหนดค่าเป็นสิ่งอื่น แค่ $ 0.02 ของฉัน


ฉันคิดว่าปี 2000 เริ่มต้นเมื่อ TPD เริ่มต้นเป็น ON เช่นเดียวกับฟีเจอร์ SQL Server ใหม่อื่น ๆ พวกเขาจะปล่อยมันถูกปิดใช้งาน / ปิดโดยค่าเริ่มต้นและบังคับให้ DBAs เปิดใช้งาน ไม่ว่าในกรณีใดก็ตาม +1 จากฉันสำหรับคำเตือนการคัดค้าน
swasheck

เป็นจุดที่ดีคุณมีลิงค์ที่ดีที่ดูเหมือนจะสำรองข้อมูลที่คุณพูด แต่ฉันรู้สึกว่าเชื่อมโยงบุคคลอื่นที่มีให้ ( support.microsoft.com/kb/230785 ) ทำสิ่งที่เหนือกว่า ฉันมีแนวโน้มที่จะคิดว่าส่วนการจัดการบัฟเฟอร์ทำให้เกิดความผิดพลาดมากกว่าลิงก์อื่นที่ทำให้เข้าใจผิด ถ้ามันสมเหตุสมผลแล้วก็ไม่แน่ใจเลยว่าฉันจะทำดีมาก!
เปาโล

มันเป็นหนึ่งในสิ่งเหล่านั้นเช่นการออกใบอนุญาตไม่มีสิ่งใดที่ MS ทำออกมาเกี่ยวกับเรื่องนี้ได้อย่างชัดเจน ...

0

ในฐานะที่เป็น @Thomas Stringer และ @Kin บอกว่ามันถูกนำมาใช้ใน SQL Server 2005 และฉันเชื่อว่ามันทำงานได้กับ SQL Server ทุกรุ่น สำหรับ TempDB แม้ว่า CHECKSUM ถูกนำมาใช้ใน SQL Server 2008

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


ขอบคุณ @DaniSQL แต่ยังไม่มีใครตอบคำถามเต็ม เช่นเมื่อเปิดใช้งานการตรวจสอบการฉีกขาดหน้าและวิธีการทำงานของมันในระหว่างการอัพเกรด / การย้ายข้อมูล
พอล

ฉันจะปล่อยให้สำหรับนักประวัติศาสตร์ที่จะหา :-) สำหรับการอัพเกรด / การโยกย้ายไม่มีอะไรจะเกิดขึ้นถ้าคุณเปลี่ยนตัวเลือกการตรวจสอบหน้าตัวเองเพื่อตรวจสอบการตรวจสอบในแต่ละฐานข้อมูล แม้หน้านั้นมีอยู่แล้วจะไม่ได้ตรวจสอบ blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/29/…
DaniSQL

ขอบคุณ @DaniSQL นั่นคือวิธีที่ฉันเข้าใจการโยกย้ายไปยัง SQL2005 ขึ้นไปในการทำงาน ฉันแค่ต้องการทำให้แน่ใจว่าเวอร์ชันก่อนหน้านี้ยังคงรักษาพฤติกรรมนี้ไว้
Paul
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.