การวิเคราะห์ SQL Server เพิ่มเพื่อตรวจหาปัญหา I/O ที่ไม่ถูกรายงานเนื่องจากเก่าแล้วอ่านหรือเขียนข้อมูลสูญหาย

นำไปใช้กับ: Microsoft SQL Server 2005 Compact EditionMicrosoft SQL Server 2005 Developer EditionMicrosoft SQL Server 2005 Enterprise Edition

จุดบกพร่อง #: 470086 (SQL Server 8.0)

อาการ


ถ้าสาเหตุปัญหาแพ้ระบบปฏิบัติการ ไดรเวอร์ หรือฮาร์ดแวร์เขียนเงื่อนไขหรือเงื่อนไขอ่านเก่าแล้ว คุณอาจเห็นข้อความแสดงข้อผิดพลาดที่เกี่ยวข้องกับความสมบูรณ์ของข้อมูลเช่นข้อผิดพลาด 605, 823, 3448, 3456 ได้ คุณอาจได้รับข้อความแสดงข้อผิดพลาดที่คล้ายกับตัวอย่างต่อไปนี้:

2003-07-24 16:43:04.57 spid63 Getpage: bstat = 0x9, sstat = 0x800 แคช
pageno spid63 16:43:04.57 2003-07-24 เป็น/ควร: objid เป็น/ควรเป็น:
2003-07-24 16:43:04.57 spid63 (1:7040966)/(1:7040966) 2093354622/2039782424

spid63 16:43:04.57 2003-07-24 ... IAM ระบุว่า เพจนั้นถูกปันส่วนไปยังวัตถุนี้

ข้อผิดพลาดการ spid63 16:52:37.67 2003-07-24: ความรุนแรง 605 : 21 สถานะ: 1
2003-07-24 16:52:37.67 spid63 พยายามดึงหน้าแบบลอจิคัล (1:7040966) ในฐานข้อมูล 'pubs' เป็นของ 'ผู้เขียน' ไม่ให้วัตถุ 'เรื่อง' ของวัตถุ...

ข้อผิดพลาดการ spid63 16:52:40.99 2003-07-24: ความรุนแรง 3448 : 21 สถานะ: 1
2003-07-24 16:52:40.99 spid63 ไม่สามารถเลิกทำระเบียนแฟ้มบันทึก (63361:16876:181), สำหรับรหัสธุรกรรม (0:159696956), บนหน้า (1:7040977), ฐานข้อมูล 'pubs' (ฐานข้อมูลรหัส 12) หน้ารายละเอียด: LSN = (63192:958360:10), ชนิด = 2 ข้อมูลการเข้าสู่ระบบ: OpCode = 2 บริบท 1 ...

ข้อผิดพลาด spid66 14:31:35.92 2003-07-09: ความรุนแรง 823 : 24 สถานะ: 2
2003-07-09 14:31:35.92 spid66 ข้อผิดพลาด I/O (ID ของหน้าไม่ถูกต้อง) ตรวจพบในระหว่างการอ่านที่ออฟเซต 0x00000016774000 ในแฟ้ม 'h:\sql\MSSQL\data\tempdb.mdf'

ข้อผิดพลาด spid17s 15:57:24.14 2010-02-06:3456 ความรุนแรง: รัฐ 21 : 1
spid17s 15:57:24.14 2010-02-06 ไม่สามารถทำซ้ำเรกคอร์ดล็อก (58997:5252:28), สำหรับรหัสธุรกรรม (0:109000187), บนหน้า (1:480946), ฐานข้อมูล 'MyDatabase' (ฐานข้อมูล ID 17) หน้า: LSN = (58997:5234:17), ชนิด = 3 แฟ้มบันทึก: OpCode = 2, 5 บริบท PrevPageLSN: (58997:5243:17) คืนค่าจากสำเนาสำรองของฐานข้อมูล หรือซ่อมแซมฐานข้อมูล

ข้อมูลเพิ่มเติม


Microsoft แนะนำความสามารถในการขยายการติดตามเริ่มต้น ด้วย SQL Server 2000 Service Pack 4 และได้รับการวินิจฉัยเหล่านี้เป็นส่วนหนึ่งของผลิตภัณฑ์ใน SQL Server 2005 และรุ่นที่ใหม่กว่า ความสามารถเหล่านี้ถูกออกแบบมาเพื่อช่วยในการตรวจหาปัญหาภายนอกที่เกี่ยวข้องของ I/O และการแก้ไขปัญหาข้อความแสดงข้อผิดพลาดอธิบายไว้ในส่วน "อาการ"

ถ้าคุณได้รับข้อความแสดงข้อผิดพลาดที่กล่าวถึงในส่วน "อาการ" ใด ๆ และจะไม่มีอธิบาย โดยเหตุการณ์เช่นความล้มเหลวของไดรฟ์ที่มีอยู่จริง ตรวจสอบปัญหาที่พบกับ SQL Server ระบบปฏิบัติการ ไดรเวอร์ และฮาร์ดแวร์ ลองการวินิจฉัยเพื่อให้ข้อมูลเกี่ยวกับสองเงื่อนไขต่อไปนี้:
  • แพ้เขียน: เรียกสำเร็จไปยังWriteFile API แต่ระบบปฏิบัติการ ไดรเวอร์ หรือตัวควบคุมแคชไม่ได้อย่างถูกต้องล้างข้อมูลไปยังสื่อที่มีอยู่จริงแม้ว่า SQL Server จะทราบว่า การเขียนที่ประสบความสำเร็จ
  • อ่านเก่า: เรียกสำเร็จไปยังReadFile API แต่ระบบปฏิบัติการ ไดรเวอร์ หรือตัวควบคุมแคชอย่างไม่ถูกต้องส่งกลับข้อมูลรุ่นเก่ากว่า
ตัวอย่างเช่น Microsoft ได้ยืนยันสถานการณ์ซึ่งการเรียกWriteFile API ส่งกลับเป็นผลสำเร็จ แต่อ่านในทันที ประสบความสำเร็จของบล็อกข้อมูลเดียวกันส่งกลับข้อมูลเก่า รวมทั้งข้อมูลที่อาจเก็บอยู่ในฮาร์ดแวร์อ่านแคช บางครั้ง ปัญหานี้เกิดขึ้นเนื่องจากปัญหาในการอ่านการแคช ในกรณีอื่น ๆ เขียนข้อมูลก็ไม่เขียนลงในดิสก์ทางกายภาพ

เมื่อต้องการเปิดใช้การวินิจฉัยเพิ่มเติมสำหรับชนิดของปัญหาเหล่านี้ SQL Server ได้เพิ่มค่าสถานะการสืบค้นกลับ 818 คุณสามารถระบุค่าสถานะการสืบค้นกลับ 818 เป็นพารามิเตอร์เริ่มต้น, -T818 สำหรับคอมพิวเตอร์ที่กำลังเรียกใช้ SQL Server หรือคุณสามารถเรียกใช้คำสั่งต่อไปนี้:
DBCC TRACEON(818, -1)

แฟล็กการติดตาม 818 ช่วยให้มีบัฟเฟอร์วงแหวนในหน่วยความจำที่ใช้สำหรับการติดตามการดำเนินงานที่ดำเนินการ โดยคอมพิวเตอร์ที่เรียกใช้ SQL Server ไม่รวมถึงการเรียงลำดับและ workfile การรับเข้า/ส่งออก เขียน 2,048 ล่าสุดที่ประสบความสำเร็จ เมื่อเกิดข้อผิดพลาดเช่นข้อผิดพลาด 605, 823 หรือ 3448 ค่า (LSN) ของหมายเลขลำดับของล็อกของบัฟเฟอร์ขาเข้ามีการเปรียบเทียบการเขียนรายการล่าสุด ถ้าเป็นรุ่นเก่ากว่าระบุในระหว่างการดำเนินการเขียน LSN ที่ดึงมาในระหว่างการดำเนินการอ่าน ข้อความข้อผิดพลาดใหม่ถูกบันทึกในแฟ้มบันทึกข้อผิดพลาดของ SQL Server การดำเนินการเขียน SQL Server ส่วนใหญ่เกิดขึ้น เป็นจุดตรวจ หรือเขียนคนขี้เกียจ การเขียนคนขี้เกียจงานพื้นหลังที่ใช้ I/O แบบอะซิงโครนัส การปฏิบัติการของบัฟเฟอร์วงแหวนคือเบา ดังนั้นจึงทำให้ประสิทธิภาพการทำงานที่มีผลกระทบต่อระบบ negligible

ข้อความต่อไปนี้บ่งชี้ว่า SQL Server ไม่ได้รับข้อผิดพลาดจากการเรียก API WriteFileหรือการเรียกReadFile API อย่างไรก็ตาม เมื่อ LSN ถูกตรวจทาน ค่าที่ไม่ถูกต้อง:

ตรวจพบ SQL Server ระดับ OS/ฮาร์ดแวร์ ที่ไม่ถูกรายงานอ่าน หรือเขียนปัญหาบนหน้า (1:75007) ของฐานข้อมูล 12

LSN ส่งกลับ (63361:16876:181) LSN ที่คาดไว้ (63361:16876:500)

ติดต่อผู้จำหน่ายฮาร์ดแวร์ และพิจารณาการปิดใช้งานการแคชกลไกเพื่อแก้ปัญหา

เริ่มการทำงานกับ SQL Server 2005 ข้อผิดพลาดจะมีรายงานเป็น:

SQL Server แบบลอจิคัลตามความสอดคล้องของข้อผิดพลาด I/O ที่ตรวจพบ: อ่านเก่าแล้ว จะเกิดขึ้นในระหว่างการ <<แบบอ่าน/เขียน >> ในหน้าของ << PAGEID >> << DBID >> รหัสฐานข้อมูลที่ออฟเซต <<ออฟเซ็ตทางกายภาพ >> ในแฟ้ม <<แฟ้มชื่อ >> ข้อความเพิ่มเติมใน SQL Server ข้อผิดพลาดของระบบหรือการบันทึกแฟ้มบันทึกเหตุการณ์อาจมีรายละเอียดเพิ่มเติม นี่คือเงื่อนไขข้อผิดพลาดร้ายแรงที่คุกคามความสอดคล้องของฐานข้อมูล และจำเป็นต้องแก้ไขทันที การตรวจสอบอย่างสม่ำเสมอเต็มของฐานข้อมูล (DBCC CHECKDB) ให้เสร็จสมบูรณ์ ข้อผิดพลาดนี้อาจมีสาเหตุจากหลายปัจจัย สำหรับข้อมูลเพิ่มเติม ดู SQL Server Books Online

ณจุดนี้ แคอ่านประกอบด้วยรุ่นเก่ากว่าของหน้า หรือข้อมูลไม่ได้ถูกถูกเขียนลงในดิสก์ทางกายภาพ ในกรณีใดกรณีหนึ่ง (แพ้เขียนคำหรือการอ่านเก่าแล้ว), SQL Server รายงานมีปัญหาภายนอก ด้วยระบบปฏิบัติการ ไดรเวอร์ หรือฮาร์ดแวร์ชั้นต่าง ๆ

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

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

บางครั้ง ปัญหาอาจไม่มีแคฮาร์ดแวร์เฉพาะ อาจมีปัญหากับโปรแกรมควบคุมตัวกรอง ในกรณีดังกล่าว ตรวจทานซอฟต์แวร์ของคุณ รวมทั้งโปรแกรมอรรถประโยชน์การสำรองข้อมูลและซอฟต์แวร์ป้องกันไวรัส และจากนั้น ดูว่า มีปัญหากับโปรแกรมควบคุมตัวกรอง

Microsoft ได้นอกจากนี้ยังระบุเงื่อนไขที่ตรงกับเงื่อนไขสำหรับข้อผิดพลาด 605 หรือข้อผิดพลาด 823 แต่เกิดขึ้นจากการอ่านเก่าแล้วหรือแพ้เขียนกิจกรรมเดียวกัน ในบางกรณี เพจปรากฏขึ้นเมื่อต้องการ ปรับปรุงสองครั้ง แต่ LSN แบบเดียวกันกับค่า ลักษณะการทำงานนี้อาจเกิดขึ้นได้ถ้ารหัสออบเจ็กต์และID ของหน้าคือ หน้าที่ถูกต้อง (ปันส่วนไปวัตถุแล้ว), และการเปลี่ยนแปลงถูกสร้างให้กับเพจ และล้างข้อมูลลงในดิสก์ เรียกคืนหน้าถัดไปคืนค่ารูปเก่า และจากนั้น ทำการเปลี่ยนแปลงที่สอง ล็อกธุรกรรมของ SQL Server แสดงว่า หน้าถูกปรับปรุงสองครั้ง ด้วยค่า LSN เดียวกัน การกระทำนี้กลายเป็น ปัญหาเมื่อคุณพยายามคืนค่าลำดับการล็อกธุรกรรมหรือ มีปัญหา เกี่ยวกับความสอดคล้องของข้อมูล เช่นความล้มเหลวของคีย์ foreign หรือรายการข้อมูลที่ขาดหายไป ข้อความแสดงข้อผิดพลาดต่อไปนี้แสดงตัวอย่างหนึ่งของเงื่อนไขนี้:

ข้อผิดพลาด: 3456 ความรุนแรง: รัฐ 21 : 1 ไม่สามารถทำการล็อกระเบียน (276666:1664:19), สำหรับรหัสธุรกรรม (0:825853240), บนหน้า (1:1787100), ฐานข้อมูล 'ผู้เขียน' (7) ได้ หน้า: LSN = (276658:4501:9), ชนิด = 1 แฟ้มบันทึก: OpCode = 4 บริบท 2, PrevPageLSN: (275565:3959:31) ...

บางสถานการณ์ได้รับการพูดถึงรายละเอียดในรายการต่อไปนี้:
  • LSN SequenceAction1Checkpoint
    2Begin Transaction
    3Table created or truncated
    4Inserts (Pages allocated)
    5Newly allocated page written to disk by Lazy Writer
    6Select from table – Scans IAM chain, newly allocated page read back from disk (LRU | HASHED = 0x9 in getpage message), encounters Error 605 - Invalid Object ID
    7Rollback of transaction initiated

  • LSN SequenceAction1Checkpoint
    2Begin Transaction
    3Page Modification
    4Page written to disk by Lazy Writer
    5Page read in for another modification (stale image returned)
    6Page Modified for a second time but because of stale image does not see first modification
    7Rollback – Fails – Transaction Log shows two different log records with the same PREV LSN for the page

ตัวดำเนินการ SQL Server 'เรียงลำดับ' ทำกิจกรรม I/O เพื่อเป็นหลัก และ จากฐานข้อมูลtempdb การดำเนินการ I/O เหล่านี้จะคล้ายกับการดำเนินการ I/O บัฟเฟอร์ อย่างไรก็ตาม พวกเขามีอยู่แล้วถูกออกแบบให้ใช้ตรรกะในการลองอ่านเพื่อพยายามแก้ไขปัญหาที่คล้ายคลึงกัน การวินิจฉัยเพิ่มเติมที่ได้อธิบายไว้ในบทความนี้ไม่ใช้กับการดำเนินการ I/O

Microsoft ระบุว่า สาเหตุรากสำหรับการเรียงลำดับดังต่อไปนี้อ่านความล้มเหลวของการคิดการอ่านเก่าแล้วหรือแพ้เขียนเป็น:

2003-04-01 20:13:31.38 spid122 ยืนยันการเซิร์ฟเวอร์ SQL: แฟ้ม: < p:\sql\ntdbms\storeng\drs\include\record.inl > บรรทัด =ตรวจสอบเงื่อนไขล้มเหลว 1447 = ' m_SizeRec > 0 & & m_SizeRec < = MAXDATAROW'

09:51:41.12 2003-03-29 เรียง spid57 อ่านล้มเหลว (ID ของหน้าไม่ถูกต้อง) pageid = (0x1:0x13e9), dbid = 2 แฟ้ม = files\Microsoft e:\program SQL Server\mssql\data\tempdb.mdf ลองอีกครั้ง

ข้อผิดพลาด spid57 09:51:41.13 2003-03-29:823 ความรุนแรง: รัฐ 24 : 7
2003-03-29 09:51:41.13 spid57 ข้อผิดพลาด I/O (ID ของหน้าไม่ถูกต้อง) ที่ตรวจพบในระหว่างการอ่านที่ออฟเซต 0x000000027d2000 ในแฟ้ม 'e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf'

* 00931097 Module(sqlservr+00531097) (utassert_fail + 000002E3)
* 005B1DA8 Module(sqlservr+001B1DA8) (RecBase::Resize+00000091)
* 00407EE7 Module(sqlservr+00007EE7) (RecBase::LocateColumn+00000012)
* 00852520 Module(sqlservr+00452520) (mergerow + 000000A4)
* 008522B3 Module(sqlservr+004522B3) (merge_getnext+00000285)
* 0085207D Module(sqlservr+0045207D) (mergenext+0000000D)
* 004FC5FB Module(sqlservr+000FC5FB) (getsorted+00000021)

ลูกค้าที่พบข้อผิดพลาดเหล่านี้เรียงลำดับได้บ่อยแก้ไขปัญหา ด้วยการย้ายtempdbไดรฟ์ภายในเครื่องไม่ใช่แค หรือ โดยการปิดใช้กลไกการแคชอ่าน

เนื่องจากการอ่านเก่าแล้วหรือการเขียนหายไปส่งผลในการจัดเก็บข้อมูลที่ไม่ได้คาดหวัง อาจเกิดลักษณะการทำงานที่หลากหลาย อาจกลายเป็นข้อมูลที่หายไป แต่บางผลกระทบทั่วไปของข้อมูลที่ขาดหายไปปรากฏเป็นดัชนีความเสียหายของ เช่นข้อผิดพลาด 644 หรือข้อผิดพลาด 625:

ข้อผิดพลาด 644 ความรุนแรงระดับ 21 ข้อความข้อความไม่พบรายการดัชนีสำหรับ RID ' % * hs' ในดัชนีหน้า% S_PGID, ID ดัชนี %d ฐานข้อมูล ' % * ls'

ข้อความข่าวสาร 21 ระดับความรุนแรงของข้อผิดพลาด 625 ไม่สามารถดึงแถวจากหน้า% S_PGID โดย RID เนื่องจาก slotid (%d) ไม่ถูกต้อง

ลูกค้าบางรายมีรายงานแถวที่ขาดหายไปหลังจากที่ดำเนินการกิจกรรมการนับจำนวนแถว ปัญหานี้เกิดขึ้นเนื่องจาก มีการเขียนที่หายไป ซึ่งอาจทำหน้าถูกสมมุติลิงค์ไปหน้าดัชนีคลัสเตอร์ ถ้าการเขียนเกิดสูญหายทางกายภาพ ข้อมูลหายไปยัง

สิ่งสำคัญ ถ้าคุณได้พบลักษณะการทำงาน หรือหากคุณสงสัยที่ปัญหาที่คล้ายกันพร้อมด้วยการปิดใช้งานการแคชกลไก Microsoft ขอแนะนำที่ คุณได้รับการปรับปรุงล่าสุดสำหรับ SQL Server และ SQL ความเค้น I/O เซิร์ฟเวอร์โปรแกรมจำลองล่าสุด Microsoft ขอแนะนำยังชักชวนให้คุณทำการตรวจทานแบบจำกัดของระบบปฏิบัติการของคุณและตั้งค่าคอนฟิกที่เกี่ยวข้อง

หมายเหตุ Microsoft ยืนยันว่า ภายใต้การโหลด I/O จำนวนมาก และไม่ค่อย แพลตฟอร์ฮาร์ดแวร์บางอย่างสามารถส่งกลับการอ่านเก่าแล้ว ถ้าการวินิจฉัยเพิ่มเติมระบุเป็นไปได้เก่าแล้ว อ่าน/สูญหายเขียนเงื่อนไข ติดต่อผู้ผลิตฮาร์ดแวร์ของคุณเพื่อในทันทีตามค่า และทดสอบกับโปรแกรมอรรถประโยชน์SQLIOSimนี้

SQL Server ต้องการระบบเพื่อสนับสนุนการรับประกันการจัดส่งไปยังสื่อที่มั่นตามที่อธิบายไว้ภายใต้ข้อกำหนดโปรแกรมความน่าเชื่อถือของ i/o ของเซิร์ฟเวอร์ SQL สำหรับข้อมูลเพิ่มเติมเกี่ยวกับข้อกำหนดอินพุท และเอาท์พุทสำหรับ SQL Server database engine ดูMicrosoft SQL Server ฐานข้อมูลเอ็นจินการอินพุต/เอาต์พุตความต้องการ