บทนำ
ปัจจุบัน Microsoft SQL Server เป็นหนึ่งในระบบจัดการฐานข้อมูลเชิงสัมพันธ์ (RDBMS) ที่ได้รับความนิยมและใช้งานกว้างขวางที่สุด เนื่องจากโครงสร้างภายในที่ทันสมัยและความน่าเชื่อถือสูง องค์กรจำนวนมากได้เลือกใช้ฐานข้อมูล SQL Server เพื่อจัดเก็บและดูแลข้อมูลธุรกิจที่สำคัญ
องค์กรคาดหวังให้ผู้ดูแลฐานข้อมูล (DBA) ปรับปรุงประสิทธิภาพ การบำรุงรักษา และความปลอดภัยของฐานข้อมูลอย่างต่อเนื่อง เมื่อฐานข้อมูลเสียหายและข้อมูลเข้าถึงไม่ได้ สาเหตุที่เป็นไปได้อาจรวมถึง การเสียหายของฮาร์ดแวร์ ปัญหาดิสก์ การโจมตีไวรัส หรือความล้มเหลวของระบบปฏิบัติการ (OS) การซ่อมแซมฐานข้อมูลที่เสียหายไม่ใช่งานง่าย จนกว่าคุณจะรู้จักเทคนิคที่ดีที่สุด
บทความนี้จะอภิปรายสาเหตุบางส่วนของการเสียหายฐานข้อมูล ช่วยให้คุณระบุการเสียหายของเพจ (page) สำรวจคำสั่ง Database Consistency Checker (DBCC) CHECKDB และสาธิตเทคนิคการกู้คืนและซ่อมแซมขั้นสูง
การเสียหายของฐานข้อมูล
SQL Server จัดเก็บข้อมูลผู้ใช้ในรูปแบบของเพจ (pages) เพจเหล่านี้อยู่ในไฟล์ข้อมูล .MDF (Primary) การเสียหายของไฟล์ .MDF อาจนำไปสู่การเสียหายของฐานข้อมูลทั้งหมด เพจของไฟล์ข้อมูลจะดีเมื่อเขียนออกจากหน่วยความจำของ SQL Server (กล่าวคือ บนดิสก์) แต่จะเสียหายเมื่ออ่านกลับเข้าสู่หน่วยความจำ ตามภาพประกอบด้านล่าง:
สาเหตุของการเสียหายฐานข้อมูล:
- ระบบ I/O (เป็นหนึ่งในสาเหตุที่พบบ่อยที่สุดของการเสียหายฐานข้อมูล)
- ระบบปฏิบัติการ Windows
- ไดรเวอร์ระบบไฟล์ เช่น การเข้ารหัสหรือแอนติไวรัส
- คอนโทรลเลอร์ SAN หรือ RAID
- ดิสก์
- หน่วยความจำ
- หัวข้อมูลไฟล์ (File Headers)
- บั๊กของ SQL Server
- ข้อผิดพลาดของมนุษย์
ข้อความแสดงข้อผิดพลาด:
เมื่อเข้าถึงฐานข้อมูลที่เสียหาย คุณอาจเห็นข้อความแสดงข้อผิดพลาดดังต่อไปนี้:
- Msg 823 ใน SQL Server
- Msg 824 ใน SQL Server
- Msg 825 (read retry) ใน SQL Server
- Error 9004 SQL Server
- Metadata Corruption Error
- Page Level Corruption Error
การติดตามการเสียหายของเพจ
SQL Server มีกลไกในตัวสำหรับระบุและแจ้งเตือนโดยอัตโนมัติเมื่อเกิดการเสียหายระหว่างการดำเนินการ I/O เช่น การอ่านและเขียนเพจไปยังดิสก์
ตัวเลือกการตรวจสอบระดับเพจประเภทต่างๆ ดังต่อไปนี้มีให้ใช้งานใน SQL Server และช่วยปกป้องเพจบนดิสก์:
- TORN_PAGE_DETECTION
- Checksum
เมื่อระบุ TORN_PAGE_DETECTION บิตจะถูกพลิกสำหรับ섹เตอร์ดิสก์ 512 ไบต์ 16 ชุดสำหรับเพจไฟล์ข้อมูล 8 KB เมื่อใดก็ตามที่มีการเขียนเพจลงดิสก์ หลังจากอ่านเพจกลับเข้าหน่วยความจำภายหลัง ค่าเหล่านี้จะถูกเปรียบเทียบ หากพบบิตในสถานะผิด เพจน่าจะถูกเขียนผิดพลาด ในกรณีนี้ ระบบจะสร้างข้อความแสดงข้อผิดพลาด 824 (ระบุข้อผิดพลาด torn-page)
เมื่อระบุ Checksum ระบบจะคำนวณค่า checksum จากเนื้อหาของเพจและเก็บค่านั้นไว้ในส่วนหัวของเพจเมื่อเขียนเพจลงดิสก์ หลังจากโหลดเพจจากดิสก์ภายหลัง checksum จะถูกคำนวณใหม่และเปรียบเทียบกับค่าที่เก็บไว้ในส่วนหัวของเพจ หากค่าไม่ตรงกัน ระบบจะสร้างข้อความแสดงข้อผิดพลาด 824 (ระบุความล้มเหลวของ checksum)
ทั้งสองข้อผิดพลาด 823 hard I/O และ 824 soft I/O เป็นข้อผิดพลาดระดับความรุนแรง 24 และถูกบันทึกในตาราง msdb.dbo.suspect_pages
ตาราง msdb.dbo.suspect_pages ใช้สำหรับการดำเนินการกู้คืนเพจเดี่ยว (single page restore) และสามารถบันทึกลงใน SQL Server error log และ Windows event log ได้
DBCC CHECKDB
DBCC CHECKDB ตรวจสอบความสมบูรณ์ทางกายภาพและตรรกะของออบเจ็กต์ทั้งหมดในฐานข้อมูล
เป็นการดำเนินการที่ใช้ทรัพยากรมาก และใช้การประมวลผลแบบขนาน แต่คุณสามารถรันในเธรดเดียวได้โดยใช้ trace flag 2528
การตรวจสอบตารางระบบพื้นฐานที่สำคัญ
การตรวจสอบพื้นฐานถูกออกแบบมาเพื่อตรวจสอบตารางระบบที่สำคัญซึ่งเก็บข้อมูลเมตาของสตอเรจเอนจิน และเส้นทางการจัดสรรที่ข้อมูลจัดเก็บในไฟล์ MDF
การตรวจสอบพื้นฐานมีดังต่อไปนี้:
DBCC CHECKALLOC: ตรวจสอบความสอดคล้องของโครงสร้างการจัดสรรในฐานข้อมูล ตรวจสอบว่าโครงสร้างการจัดสรรถูกต้อง และไม่มีเพจไฟล์ข้อมูลเดี่ยวถูกจัดสรรให้กับสองตาราง
DBCC CHECKTABLE: ตรวจสอบความสอดคล้องของตารางและดัชนี ตรวจสอบโครงสร้างของตารางและดัชนีที่เกี่ยวข้อง กำหนดว่าข้อมูลดัชนีมีแถวที่ตรงกันในตาราง และตรวจสอบคีย์ลำดับของดัชนี หากมี FILESTREAM ใช้ในตาราง จะตรวจสอบความมีอยู่ของลิงก์
DBCC CHECKCATALOG: ตรวจสอบความสอดคล้องระหว่างแคตตาล็อกระบบ
DBCC CHECKFILEGROUP: คล้ายกับ DBCC CHECKDB การตรวจสอบนี้ดำเนินการตรวจสอบความสอดคล้องสำหรับกลุ่มไฟล์และการตรวจสอบการจัดสรรสำหรับฐานข้อมูล
ตัวอย่างโค้ด
DBCC CHECKDB [ ( database_name | database_id | 0 [ , NOINDEX | , { REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD } ] ) ] [ WITH { [ ALL_ERRORMSGS ] [ , EXTENDED_LOGICAL_CHECKS ] [ , NO_INFOMSGS ] [ , TABLOCK ] [ , ESTIMATEONLY ] [ , { PHYSICAL_ONLY | DATA_PURITY } ] [ , MAXDOP = number_of_processors ] } ] ]
สแนปชอตฐานข้อมูลภายใน
การใช้สแนปชอตฐานข้อมูลภายในกับ CHECKDB เพื่อดำเนินการตรวจสอบและรักษาความสอดคล้องทางธุรกรรม ป้องกันปัญหาการบล็อกและความขัดแย้งด้านการทำงานพร้อมกัน หากคุณไม่สามารถสร้างสแนปชอตฐานข้อมูลได้ ให้แน่ใจว่าคุณมีล็อกแบบเฉพาะเจาะจงสำหรับฐานข้อมูลและล็อกตารางแบบแชร์ เนื่องจากสิ่งนี้จำเป็นสำหรับการตรวจสอบระดับตาราง CHECKDB จะล้มเหลวบน master หากไม่มีการสร้างสแนปชอต
รายการต่อไปนี้ประกอบด้วยการตรวจสอบภายในที่ดำเนินการโดย DBCC CHECKDB:
- การตรวจสอบตารางระบบสำคัญ
- การตรวจสอบตรรกะของตารางระบบสำคัญ
- การตรวจสอบตรรกะของตารางอื่นๆ
- การตรวจสอบการจัดสรร
- การตรวจสอบข้อมูลเมตา
- การตรวจสอบความถูกต้องของ Service Broker
- การตรวจสอบมุมมองดัชนีและดัชนีเชิงพื้นที่
ข้อผิดพลาดของ CHECKDB
ตารางต่อไปนี้แสดงข้อผิดพลาดบางส่วนของ DBCC CHECKDB:
แนวทางปฏิบัติที่ดีที่สุด
หากฐานข้อมูล VLDB มีปัญหาเวลารันไทม์สำหรับ CHECKDB คุณควรใช้ตัวเลือก PHYSICAL_ONLY บ่อยครั้งเพื่อลดเวลารันสำหรับฐานข้อมูล VLDB ในสภาพแวดล้อมการผลิต อย่างไรก็ตาม คุณควรเรียกใช้ DBCC CHECKDB โดยไม่มีตัวเลือกที่ระบุโดยทั่วไป จัดตารางเวลาการรัน CHECKDB ขึ้นอยู่กับสภาพแวดล้อมการผลิตแต่ละรายของคุณ
ตัวเลือกการกู้คืนขั้นสูง
ในขณะที่ส่วนใหญ่ใช้เทคนิคการกู้คืนฐานข้อมูลแบบง่ายสำหรับปัญหาการเสียหาย เทคนิคการกู้คืนขั้นสูงต่อไปนี้มีให้ใช้งาน:
การกู้คืนเพจ (Page Restore)
คุณสามารถกู้คืนเพจหนึ่งหรือหลายเพจด้วยเทคนิคนี้ การกู้คืนระดับเพจเป็นการดำเนินการออนไลน์สำหรับรุ่น Enterprise ของฐานข้อมูล และคุณสามารถใช้การดำเนินการออฟไลน์สำหรับรุ่นอื่นๆ ซึ่งหมายความว่าฐานข้อมูลสามารถออฟไลน์ระหว่างกระบวนการกู้คืน
สคริปต์ T-SQL
RESTORE DATABASE <database_name> PAGE = '<file: page> [ ,... n ] ' [ ,... n ] FROM <backup_device> [ ,... n ] WITH NORECOVERY
เพื่อรับ Page ID ให้ใช้แหล่งที่มาต่างๆ เช่น Error log, Event traces, DBCC, และระเบียนตาราง msdb..suspectpages ซึ่งแสดงรายการเพจที่เสียหายและ ID ของพวกเขา
หมายเหตุ: คุณไม่สามารถกู้คืนหน้าบูท (boot pages), หน้าหัวไฟล์ (file header pages), บางหน้าในตารางระบบสำคัญ และบิตแมปการจัดสรรเป็นการกู้คืนเพจได้
การกู้คืนแบบชิ้นส่วนและบางส่วน (Piecemeal and Partial Restores)
คล้ายกับการกู้คืนเพจ คุณสามารถดำเนินการกู้คืนแบบชิ้นส่วนและบางส่วนได้ออนไลน์สำหรับรุ่น Enterprise และออฟไลน์สำหรับรุ่นอื่นๆ ที่มีหลายไฟล์หรือกลุ่มไฟล์
การกู้คืนแบบชิ้นส่วนทุกครั้งเริ่มต้นด้วยลำดับการกู้คืนบางส่วน คำสั่ง RESTORE DATABASE ที่กู้คืนการสำรองข้อมูลเต็มรูปแบบด้วยตัวเลือก PARTIAL เมื่อการกู้คืนนี้เสร็จสิ้น ฐานข้อมูลควรจะออนไลน์บางส่วน ซึ่งหมายความว่าไฟล์ที่เหลืออยู่ในโหมด recovery pending เนื่องจากการกู้คืนถูกเลื่อน
การกู้คืนแบบชิ้นส่วนขึ้นอยู่กับโมเดลการกู้คืนของฐานข้อมูลและลำดับการกู้คืนของมัน
ลำดับการกู้คืน
เพื่อดำเนินการกู้คืนบางส่วนของกลุ่มไฟล์ X และ Z และกลุ่มไฟล์หลัก ให้รันโค้ดต่อไปนี้:
RESTORE DATABASE DB_XYZ FILEGROUP='X',FILEGROUP='Z' FROM partial_backup WITH PARTIAL, RECOVERY;
ในจุดก่อนหน้านี้ X สิ่งต่อไปนี้เป็นจริง:
- กลุ่มไฟล์ Z และกลุ่มไฟล์หลักอยู่ในสถานะออนไลน์
- ไฟล์ในกลุ่มไฟล์ Y อยู่ในสถานะ recovery pending
- กลุ่มไฟล์อยู่ในสถานะออฟไลน์
รัน RESTORE DATABASE DB_XYZ FILEGROUP='Y' FROM backup WITH RECOVERY;
ตอนนี้ กลุ่มไฟล์ทั้งหมดอยู่ในสถานะออนไลน์
เทคนิคซ่อมแซมขั้นสูงอื่นๆ
การซ่อมแซมมีการรับประกันการกู้คืนข้อมูลเสมอหรือไม่? คำตอบคือ "ไม่"
อาจมีการผสมผสานที่เป็นไปได้หลายอย่างที่สามารถทำให้ข้อมูลเสียหาย และเป็นไปไม่ได้ที่จะทดสอบทุกการผสมผสาน ตัวอย่างเช่น ตารางระบบเสียหาย และการซ่อมแซมจะไม่ทำงานบนหน้าต่างๆ เช่น Boot และ PFS
ต่อไปนี้คือตัวเลือกซ่อมแซมบางส่วน:
REPAIR_REBUILD
ตัวเลือกนี้ดำเนินการซ่อมแซม แต่อาจทำให้สูญเสียข้อมูลเมื่อสร้างดัชนี NC ที่เสียหายใหม่
REPAIR_ALLOW_DATA_LOSS
ตัวเลือกนี้ดำเนินการซ่อมแซม แต่อาจทำให้สูญเสียข้อมูล
การสร้างดัชนีตารางระบบใหม่
คุณไม่สามารถซ่อมแซมดัชนีแบบกลุ่ม (clustered) ของตารางระบบได้ แต่คุณสามารถซ่อมแซมดัชนีที่ไม่ใช่แบบกลุ่มในบางสถานการณ์ได้โดยการตรวจสอบตัวเลือก DBCC CHECKTABLE
หมายเหตุ: ควรดำเนินการเทคนิคซ่อมแซมขั้นสูงทุกประเภทบนสำเนาของฐานข้อมูล ไม่ใช่ฐานข้อมูลต้นฉบับ เพื่อหลีกเลี่ยงสถานการณ์ที่รุนแรง
สร้างข้อมูลใหม่จากดัชนีที่ไม่ใช่แบบกลุ่ม:
หากดัชนีแบบกลุ่มหรือฮีป (heap) เสียหาย การซ่อมแซมเป็นตัวเลือกเดียวสำหรับการกู้คืนข้อมูลจากดัชนีที่ไม่ใช่แบบกลุ่ม (NC) อย่างไรก็ตาม ในบางกรณี การซ่อมแซมจะไม่ทำงานหากข้อมูลเมตาเสียหาย
คุณสามารถใช้คำสัาม select เพื่อบังคับให้เลือกดัชนี NC ที่ไม่เสียหาย แต่สิ่งนั้นอาจขึ้นอยู่กับการครอบคลุมระดับคอลัมน์ของดัชนี NC
DBCC Page
การใช้ DBCC PAGE … WITH TABLERESULTS สามารถระบุช่วงคีย์ได้ คุณสามารถสร้างมันจากดัชนีที่ไม่ใช่แบบกลุ่มและตรวจสอบเพจที่เสียหายเพื่อพยายามดึงข้อมูลจากเพจเหล่านั้น
สรุป
หลังจากอ่านบทความนี้ คุณควรจะเข้าใจการเสียหายของฐานข้อมูลและวิธีกู้คืนฐานข้อมูลของคุณโดยใช้เทคนิคทั้งแบบง่ายและขั้นสูงได้ดีขึ้น นอกจากนี้ เทคนิคเหล่านี้ช่วยให้นำฐานข้อมูลกลับมาออนไลน์หลังการเสียหาย คุณควรมีแผนการสำรองข้อมูลที่แข็งแกร่งเพื่อหลีกเลี่ยงการหยุดทำงานเนื่องจากการเสียหาย
ใช้แท็บ Feedback เพื่อแสดงความคิดเห็นหรือถามคำถาม
เพิ่มประสิทธิภาพสภาพแวดล้อมของคุณด้วยการจัดการ การกำหนดค่า และการบริหารจัดการโดยผู้เชี่ยวชาญ
ผู้เชี่ยวชาญด้านบริการแอปพลิเคชันของ Rackspace (RAS) ให้บริการมืออาชีพและบริการที่จัดการทั่วพอร์ตโฟลิโอแอปพลิเคชันที่กว้างขวาง:
- แพลตฟอร์มอีคอมเมิร์ซและประสบการณ์ดิจิทัล
- การวางแผนทรัพยากรองค์กร (ERP)
- бизнес Intelligence
- Salesforce Customer Relationship Management (CRM)
- ฐานข้อมูล
- โฮสติ้งอีเมลและประสิทธิภาพการทำงาน
เราให้บริการ:
- ความเชี่ยวชาญที่ไร้ความลำเอียง: เราลดความซับซ้อนและนำทางการเดินทางการทำให้ทันสมัยของคุณ โดยเน้นความสามารถที่ส่งมอบคุณค่าทันที
- Fanatical Experience™: เรารวมแนวทาง Process first. Technology second.® กับการสนับสนุนทางเทคนิคที่专心เพื่อให้โซลูชันที่ครอบคลุม
- พอร์ตโฟลิโอที่ไม่มี đối thủ: เราใช้ประสบการณ์คลาวด์ที่กว้างขวางเพื่อช่วยคุณเลือกและปรับใช้เทคโนโลยีที่เหมาะสมบนคลาวด์ที่เหมาะสม
- การส่งมอบที่คล่องตัว: เราพบคุณที่จุดที่คุณอยู่ในการเดินทางของคุณและปรับความสำเร็จของเราให้สอดคล้องกับของคุณ
แชทตอนนี้เพื่อเริ่มต้น