แบ่ง DBCC CHECKDB ในช่วงหลายวัน


10

ฉันทำงานเกี่ยวกับการใช้วิธีการของ Paul Randal ในการกระจาย DBCC CHECKDB ด้วยตนเองไปหลายวันสำหรับฐานข้อมูลขนาดใหญ่มากซึ่งโดยทั่วไปประกอบด้วย:

  • การแบ่งตารางในฐานข้อมูลอย่างคร่าว ๆ ระหว่าง 7 ถังข้อมูล
  • รัน DBCC CHECKALLOC สองครั้งต่อสัปดาห์
  • รัน DBCC CHECKCATALOG สัปดาห์ละครั้ง
  • รัน DBCC CHECKTABLE ในหนึ่งถังในแต่ละวันของสัปดาห์

มีใครใช้เทคนิคนี้หรือไม่? สคริปต์ที่มีอยู่ออกมี?

ฉันกังวลว่าสิ่งนี้อาจไม่ครอบคลุมทุกอย่างที่ CHECKDB ทำ หนังสือ Books Online สำหรับ CHECKDBกล่าวว่านอกเหนือจาก CHECKALLOC, CHECKCATALOG และ CHECKTABLE แล้วยัง:

  • ตรวจสอบเนื้อหาของทุกมุมมองที่จัดทำดัชนีในฐานข้อมูล
  • ตรวจสอบความสอดคล้องระดับลิงก์ระหว่างตารางเมตาดาต้าและไดเรกทอรีระบบไฟล์และไฟล์เมื่อเก็บข้อมูล varbinary (สูงสุด) ในระบบไฟล์โดยใช้ FILESTREAM (SQL 2008 เท่านั้น)
  • ตรวจสอบข้อมูล Service Broker ในฐานข้อมูล

ดังนั้นนี่คือคำถามของฉัน:

  1. การตรวจสอบเพิ่มเติมเหล่านี้จำเป็น / สำคัญหรือไม่ (มุมมองที่จัดทำดัชนีอาจเกี่ยวข้องกับฉันมากกว่านี้ฉันไม่คิดว่าเรากำลังใช้ Service Broker หรือ FILESTREAM เลย)

  2. ถ้าเป็นเช่นนั้นจะมีวิธีดำเนินการตรวจสอบเพิ่มเติมเหล่านี้แยกกันหรือไม่?

  3. CHECKALLOC และ CHECKCATALOG ดูเหมือนจะทำงานได้อย่างรวดเร็วแม้ในขนาดใหญ่ dbs มีเหตุผลใดที่จะไม่เรียกใช้สิ่งเหล่านี้ทุกวัน?

(หมายเหตุ: นี่จะเป็นกิจวัตรมาตรฐานสำหรับฐานข้อมูลที่มีอยู่หลายพันฐานข้อมูลในหลายร้อยเซิร์ฟเวอร์หรืออย่างน้อยทุกฐานข้อมูลในขนาดที่กำหนดซึ่งหมายความว่าตัวเลือกเช่นการปรับโครงสร้างฐานข้อมูลทั้งหมดเพื่อใช้ CHECKFILEGROUP นั้นใช้ไม่ได้จริง ๆ )


พอลตอบคำถามรุ่นนี้ในความคิดเห็นในบล็อกของเขา เขากล่าวว่า "ไม่ต้องกังวลเกี่ยวกับการตรวจสอบมุมมองที่มีการจัดทำดัชนีโดยเริ่มต้นตั้งแต่ปี 2551 เป็นต้นไปเพราะไม่พบปัญหา"
BradC

ฉันกำลังพยายามทำสิ่งเดียวกัน - คำแนะนำใด ๆ / gotcha ที่คุณพบเนื่องจากคุณมีแนวโน้มที่จะใช้งานแล้ว?
scsimon

1
@ ssimon ฉันได้มันไปทำงานได้ดีดูคำถามที่เกี่ยวข้องนี้สำหรับกลยุทธ์เฉพาะที่ฉันใช้ในการแบ่งตาราง ฉันคิดว่าในท้ายที่สุดฉันได้สร้างรายการหลักของตารางทั้งหมดในฐานข้อมูล (ใหญ่) ทั้งหมดบนเซิร์ฟเวอร์ทั้งหมดเพื่อแบ่งออกเป็น "ถัง" รายวันซึ่งทำให้ฉันมีความแตกต่างมากยิ่งขึ้นกว่าการแบ่งรายชื่อฐานข้อมูลแต่ละรายการ ฐานข้อมูลขนาดเล็กฉันเพิ่งทำ DBCC แบบเต็มในแต่ละวันและไม่ได้เป็นส่วนหนึ่งของการแยก
BradC

คำตอบ:


6

การตรวจสอบเพิ่มเติมเหล่านี้จำเป็น / สำคัญหรือไม่ (มุมมองที่จัดทำดัชนีอาจเกี่ยวข้องกับฉันมากกว่านี้ฉันไม่คิดว่าเรากำลังใช้ Service Broker หรือ FILESTREAM เลย)

คุณสามารถเรียกใช้โดยตรงในดัชนีมุมมองDBCC CHECKTABLE WITH EXTENDED_LOGICAL_CHECKS การตรวจสอบมุมมองที่มีการจัดทำดัชนีอาจเป็นปัญหาได้ในบางสถานการณ์ดังนั้นโปรดเตรียมเพื่อตรวจสอบผลบวกที่ผิดพลาดใด ๆ ที่เกิดขึ้น (พอลแรนดัลยังกล่าวถึงความคิดเห็นในบทความที่อ้างถึงว่าฟิล์มเนกาทีฟนั้นเป็นไปได้เช่นกัน แต่ฉันไม่มีประสบการณ์ตรงจากนั้น)

ถ้าเป็นเช่นนั้นจะมีวิธีดำเนินการตรวจสอบเพิ่มเติมเหล่านี้แยกกันหรือไม่?

ไม่มีการสนับสนุนการเรียกใช้ Service Broker หรือการFILESTREAMตรวจสอบแยกต่างหากไม่มี

CHECKALLOCและCHECKCATALOGดูเหมือนว่าจะทำงานได้อย่างรวดเร็วแม้ในขนาดใหญ่ dbs มีเหตุผลใดที่จะไม่เรียกใช้สิ่งเหล่านี้ทุกวัน?

ไม่ใช่ว่าฉันรู้


DBCC CHECKCONSTRAINTSนอกจากนี้คุณยังอาจพิจารณาใช้ การตรวจสอบนี้ไม่รวมอยู่ในDBCC CHECKDBไม่ว่าคุณจะระบุตัวเลือกใดก็ตาม คุณอาจต้องการคิดเกี่ยวกับการทำงานเป็นครั้งคราวCHECKDBเป็นและเมื่อสถานการณ์อนุญาต


6

DBCC CHECKDB มีความสำคัญสำหรับฐานข้อมูล SQL Server ที่จะแน่ใจ 100% ว่าไม่มีความเสียหาย อย่างไรก็ตามเนื่องจากฐานข้อมูลมีขนาดใหญ่ขึ้นเรื่อย ๆ เป็นเรื่องยากมากที่จะพบหน้าต่างการบำรุงรักษาเมื่อคุณอ้างว่า 24x7 ขึ้นไป ในช่วงหลายปีที่ผ่านมาทีม SQL Server ได้ใช้กลไกต่าง ๆ ที่จะตรวจจับความเสียหายในรูปแบบที่พบบ่อยที่สุดโดยเฉพาะอย่างยิ่งที่เกี่ยวข้องกับความเสียหายทางกายภาพที่เกิดจากฮาร์ดแวร์

SQL Server 2005 และใหม่กว่ามีPAGE_VERIFY = CHECKSUMซึ่งสามารถช่วยคุณตรวจสอบความเสียหายทางกายภาพในหน้าฐานข้อมูลซึ่งจะเป็นการเพิ่มการตรวจสอบในแต่ละหน้าตามที่เขียนไปยังระบบ I / O และตรวจสอบการตรวจสอบตามที่อ่านจากดิสก์

นอกจากนี้การสำรองข้อมูล (เต็มหรือส่วนต่าง) ด้วย CHECKSUMจะรับประกันในการตรวจสอบความเสียหายของ I / O ที่เกิดจากฮาร์ดแวร์

ดังนั้นจากด้านฮาร์ดแวร์ของความเสียหาย SQL Server ทำงานได้ดีในการตรวจจับและรายงาน (ตรวจสอบให้แน่ใจว่าได้ตั้งค่าการแจ้งเตือนความเสียหายที่สำคัญเช่นกัน)

ที่ถูกกล่าวว่ายังคงเสียหายตรรกะ , ข้อผิดพลาด Scribbler เหนี่ยวนำ - ที่ในหน่วยความจำหน้าจะเสียหายอย่างใดอย่างหนึ่งตามรหัสของบุคคลที่สามที่ทำงานภายในกระบวนการ SQL Server หรือโดยไดรเวอร์หรือซอฟต์แวร์อื่น ๆ ที่มีสิทธิ์เพียงพอที่รันในโหมดเคอร์เนลของ Windows และ / หรือSQL Server ข้อบกพร่องฯลฯ ไม่สามารถตรวจจับได้โดยใช้วิธีการด้านบนและด้วยเหตุนี้CHECKDBจึงเข้ามาในรูปภาพ

DBCC CHECKDB ทำการตรวจสอบอย่างละเอียดยิ่งขึ้นซึ่งรวมถึงการตรวจสอบส่วนหัวของหน้าสำหรับความเสียหายที่อาจเกิดขึ้นซึ่งไม่สามารถตรวจพบได้ด้วยวิธีการอื่น

สคริปต์ที่มีอยู่ออกมี?

ฉันขอแนะนำให้คุณลองดูวิธีการตรวจสอบความถูกต้องสมบูรณ์ของเซิร์ฟเวอร์ SQL ของ Ola

รัน DBCC CHECKDB อย่างมีประสิทธิภาพ:

คุณต้องสร้างสรรค์เมื่อคุณเข้มงวดในการบำรุงรักษาโดยมีฐานข้อมูลขนาดใหญ่หรือมีฐานข้อมูลจำนวนมากเพื่อเปิดใช้งาน CHECKDB

หลังจากเข้าร่วมการฝึกอบรม SQLSkills สิ่งที่ฉันได้นำไปใช้ในสภาพแวดล้อมของฉันคือ:

  • จัดลำดับความสำคัญกับสิ่งที่ตารางมีความสำคัญต่อการตรวจสอบ
  • แยกตารางออกเป็นกลุ่มที่มีลำดับความสำคัญต่างกันจากนั้นเรียกใช้DBCC CHECKTABLEพร้อมกับการรันDBCC CHECKALLOCและDBCC CHECKCATALOG
  • สร้างตารางผู้ปฏิบัติงานที่จะจัดเก็บชื่อตารางด้วยลำดับความสำคัญ เพียงตรวจสอบให้แน่ใจว่าตารางลำดับความสำคัญสูงทั้งหมด (ซึ่งมีขนาดใหญ่มาก) ไม่ได้อยู่ในกลุ่มเดียว CHECKDB ของคุณจะไม่สมบูรณ์เลย
  • คุณยังสามารถมีคอลัมน์ไทม์เอาต์ในตารางงานของคุณที่จะประสานเมื่อ CHECKDB ของคุณจะถูกฆ่าเมื่อมันผ่านหน้าต่างการบำรุงรักษา
  • เพิ่มนานเท่าใดจึงต่อตารางการทำงานDBCC CHECKTABLE, และDBCC CHECKALLOC DBCC CHECKCATALOGเพื่อให้คุณสามารถรับความรู้สึกอยู่กับระยะเวลามันจะมักจะพาสำหรับการตรวจสอบการทำงานของคุณไป
  • คุณสามารถเรียกใช้NOINDEXตัวเลือกได้เพราะจะทำให้การดำเนินการเร็วขึ้นเนื่องจากไม่ได้ตรวจสอบดัชนีที่ไม่เป็นคลัสเตอร์บนตารางผู้ใช้ สิ่งนี้มีข้อได้เปรียบเนื่องจากไม่สำคัญเท่ากับความเสียหายของข้อมูลเนื่องจากไม่มีข้อมูลสูญหายและคุณสามารถปล่อยและสร้างดัชนีใหม่หากจำเป็น

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

หมายเหตุ:หากคุณมีคอลัมน์เบาบางแล้ว CHECKDB ของคุณจะตายช้าตามที่อธิบายไว้ที่นี่

ในที่สุดวิธีการป้องกันความเสียหายของฐานข้อมูลโดยใช้ชุดเครื่องมือที่มีอยู่ทั้งหมด + ความเชื่อมั่นในระบบฮาร์ดแวร์เซิร์ฟเวอร์ฐานข้อมูลของคุณและที่สำคัญที่สุดคือคุณค่าของข้อมูลของคุณ

บางแหล่งอ้างอิงที่ยอดเยี่ยม:

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