วิธีแก้ปัญหาการล้างข้อมูลผีของเซิร์ฟเวอร์ SQL ที่จำเป็น


15

ฉันมีหลายตารางที่มีจำนวนแถวระหว่าง 5M ถึง 1.5G

แต่ละตารางมีเขตข้อมูล BLOB ซึ่งขนาดแตกต่างจาก 100 ไบต์ถึง 30 MBytes และเก็บไว้เป็น 'ประเภทค่าขนาดใหญ่นอกแถว' = ON

ตารางจะถูกจัดเก็บในกลุ่มไฟล์ที่แตกต่างกันโดยแต่ละไฟล์มี 3-4 ไฟล์ในดิสก์ที่แตกต่างกัน @ LUNs ที่แตกต่างกัน @ SAN ที่เร็วมาก

ทุกวันโต๊ะเหล่านี้มีขนาดโตขึ้น 5-100 Gb และมีแถว 600k - 1.5M

หลังจากระยะเวลาหนึ่งซึ่งแตกต่างกันไปจาก 2 สัปดาห์ถึง 6 เดือนแถวบางแถวจะถูกลบหรือย้ายไปเก็บถาวร DB ดังนั้นจึงไม่มีแถวใด ๆ ในเวิร์กทอรีที่มีอายุมากกว่า 6 เดือน

การกำหนดค่าปัจจุบันของเซิร์ฟเวอร์:

  • SQL เซิร์ฟเวอร์เอ็นจิ้นคือ 2008 R2 SP1 Enterprise @ 24 คอร์, @ 64Gb RAM
  • SQL Server ทำงานด้วยการตั้งค่าสถานะเริ่มต้นพิเศษ:

-T 3640; (กำจัดการส่งข้อความ DONE_IN_PROC ไปยังไคลเอนต์สำหรับแต่ละคำสั่งในขั้นตอนการจัดเก็บซึ่งคล้ายกับการตั้งค่าเซสชันของ SET NOCOUNT ON แต่เมื่อตั้งค่าเป็นแฟล็กการติดตามทุกเซสชันไคลเอ็นต์จะถูกจัดการด้วยวิธีนี้)

-T 1118; (สลับการจัดสรรใน tempDB จาก 1pg ต่อครั้ง (สำหรับ 8 หน้าแรก) เป็นระดับหนึ่ง)

-T 2301; (เปิดใช้งานการปรับแต่งขั้นสูงที่เฉพาะเจาะจงกับแบบสอบถามสนับสนุนการตัดสินใจตัวเลือกนี้ใช้กับการประมวลผลสนับสนุนการตัดสินใจของชุดข้อมูลขนาดใหญ่)

-T 1117; (ขยายไฟล์ข้อมูลทั้งหมดในครั้งเดียวมิฉะนั้นจะเปลี่ยนไป)

-E; (เพิ่มจำนวนส่วนขยายที่ถูกจัดสรรสำหรับแต่ละไฟล์ในกลุ่มไฟล์ตัวเลือกนี้อาจเป็นประโยชน์สำหรับแอปพลิเคชันคลังข้อมูลที่มีจำนวน จำกัด ผู้ใช้ที่รันดัชนีหรือสแกนข้อมูล)

-T 834; (ทำให้ SQL Server ใช้การจัดสรรเพจขนาดใหญ่ของ Windows สำหรับหน่วยความจำที่จัดสรรให้กับพูลบัฟเฟอร์ http://msdn2.microsoft.com/en-us/library/aa366720.aspx , http://support.microsoft com / kb / 920093 )

  • SQL Server ใช้ส่วนขยายของหน้าขนาดใหญ่
  • SQL Server ใช้ตัวเลือกการเริ่มต้นไฟล์อย่างรวดเร็ว
  • AUTOSHRINK ปิดใช้งานสำหรับฐานข้อมูลทั้งหมด

ปัญหาคือ - ที่เริ่มต้นจากบางช่วงเวลาของเซิร์ฟเวอร์ (จากสองสามวันถึงหนึ่งเดือน) GHOST CLEANUPกระบวนการปฏิเสธการบังคับให้ล้างข้อมูลและเพียงแค่ทำงานตามปกติ - ล้างข้อมูลหลาย ๆ หน้าในเวลาไม่กี่วินาที ( which is seen thru Extended Events) ซึ่งไม่เหมาะสมเพราะ ไม่สามารถล้างแถวที่ถูกลบทั้งหมดได้

ปัญหายังคงมีอยู่จากเวลาของ SQL Server 2005 RTM Enterprise

ฉันพยายามแก้ไขปัญหาได้อย่างไร:

  • พยายามบังคับให้ SCAN ดำเนินการกับดัชนีคลัสเตอร์ของตาราง
  • พยายามบังคับให้ SCAN ดำเนินการซึ่งเกี่ยวข้องกับเนื้อหาทั้งหมดของคอลัมน์ BLOB ในดัชนีคลัสเตอร์ของตาราง
  • ระบบ sp_clean_db_free_space & sp_clean_db_file_free_space
  • การล้างข้อมูลด้วยตนเอง dbcc (@dbid, @fileid, @page) สำหรับไฟล์และหน้าทั้งหมดใน DB
  • ดัชนีคลัสเตอร์จะสร้างและจัดระเบียบใหม่
  • การสร้างฐานข้อมูลใหม่
  • DBCC FORCEGHOSTCLEANUP

  • เมื่อฉันเรียกใช้แบบสอบถาม:

    select * 
    from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')

    ฉันเห็นบันทึกผีเป็นล้าน ๆ ล้าน แต่เฉพาะสำหรับหน่วยการจัดสรรประเภทของ LOB_DATA

สิ่งเดียวที่ช่วย:

  • การหยุดเซิร์ฟเวอร์ด้วยคำสั่ง SHUTDOWN หรือรีสตาร์ทโฮสต์ทั้งหมด - ช่วยหลังจากรีสตาร์ทกระบวนการ GHOST CLEANUP แล้วจะทำงานหลายชั่วโมงและล้างข้อมูลบันทึกผีทั้งหมด
  • DBCC SHRINKFILE พร้อมตัวเลือก EMPTYFILE - การย้ายข้อมูลทั้งหมดจากไฟล์หนึ่งไปยังไฟล์อื่นหรือไฟล์ที่สร้างขึ้นใหม่จะล้างข้อมูลบันทึกผีในไฟล์นี้เท่านั้น - ปัญหาคือฉันเกลียดการหดตัว และใช้เวลา 3-4 วันสำหรับไฟล์เดียว

คำถาม - มีวิธีการเขียนโปรแกรม (ดีกว่า) หรือการบำรุงรักษาเพื่อบังคับให้ GHOST CLEANUP ปราศจากการหยุดทำงานของเซิร์ฟเวอร์เลยเนื่องจากการหยุดทำงานของเซิร์ฟเวอร์มีค่าใช้จ่ายมากเกินไปแม้จะยอมรับไม่ได้ - จากหลายพันถึงหมื่นหมื่นดอลลาร์ต่อชั่วโมง

ปัญหาที่สังเกตเห็นเหมือนกันฉันอยู่ที่นี่:

และเหมือนกันอยู่ที่นี่:

คำตอบ:


12

ในที่สุด, MS ได้รับการยอมรับปัญหาเป็นข้อผิดพลาด: http://support.microsoft.com/kb/2622823

สั้น ๆ : มันได้รับการแก้ไขใน

  • SQL Server 2008 SP3 CU4
  • SQL Server 2008 R2 CU10
  • SQL Server 2008 R2 SP1 CU4

ใน SQL Server 2012 SP1 ฉันไม่พบปัญหานี้มานานกว่าปีรันไทม์


3

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

คุณได้ลองอนุญาตให้ฐานข้อมูลปิดแล้วนำมาออนไลน์หรือไม่ นี่จะทำให้การกู้คืนความขัดข้องทำงานและอาจทำให้การล้างข้อมูลบนผีหายไป

คุณเขียนไปที่โต๊ะบ่อยไหม? บ่อยครั้งที่ฉันหมายถึงตลอดเวลา?

สำหรับ MSKB 932115 คุณเห็นผีระเบียนถูกทิ้งไว้ในไฟล์ทั้งหมดหรือไม่หรือมันเป็นการล้างไฟล์แรกในกลุ่มไฟล์หรือไม่?

ทำไมการใช้ -T1117 และไฟล์ทันทีเริ่มต้น?


1. ฉันจะไปที่ MS support แน่นอน 2. ถ้าฉันปิด DB มันจะเพิ่มขึ้นประมาณ 10-30 นาทีกลิ้งทรานส์กลับไปกลับมาซึ่งไม่เป็นที่ยอมรับ 3. GC IS กำลังทำงานอยู่ แต่ไม่ได้ประมวลผลรายการ LOB ที่ถูกลบทิ้ง 4. การเขียนลงในตารางที่มีการดำเนินการอย่างต่อเนื่องขึ้นอยู่กับเวลาของวันจาก 20 ถึง 600 การเขียนต่อวินาทีและตลอดเวลา 5. ไฟล์แรกของ DB ไม่ได้ใช้งาน - ไม่มีตารางขนาดใหญ่และใช้เป็นที่เก็บข้อมูลของระบบเท่านั้น - ไม่มีบันทึกผีใด ๆ
Oleg Dok

ด้วย -T1117 ฉันแค่ต้องการกระจายโหลดทั้งหมดระหว่างหลายไฟล์แทนเมื่อมีไฟล์เดียวที่เหลือจาก filegroup ซึ่งยังคงมีพื้นที่ว่าง - มันเริ่มที่จะชะลอตัวลงบน LFS ของ PFS ไฟล์เริ่มต้นทันทีจะลดเวลาของ filegrowth เนื่องจากการเพิ่มขึ้นถูกตั้งไว้ที่ 10-50 Gb ต่อเทิร์น ฉันไม่สามารถตั้งค่าไฟล์ให้ใหญ่ที่สุดเท่าที่จะทำได้เพราะมันไม่สามารถคาดเดาได้อย่างสมบูรณ์ - ไฟล์ใดจะได้รับข้อมูลในวันนี้และในปริมาณใด มันง่ายกว่าที่จะขอให้ผู้ดูแลระบบ SAN เพิ่มพื้นที่มากขึ้นกว่าที่ฉันควรเพิ่มช่องว่างให้คาดเดา
Oleg Dok
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.