ตรวจสอบหรือ COMMIT เขียนลงดิสก์?


12

สมมติว่าสำหรับ SQLServer2008R2 และสูงกว่าพร้อมฐานข้อมูลโหมดการกู้คืนแบบเต็ม

ฉันคิดเสมอ:

  1. เมื่อมีการทำธุรกรรม (COMMIT) ธุรกรรมนั้นจะถูกเขียนไปยังบันทึกธุรกรรมใน RAM

  2. เมื่อ CHECKPOINT เกิดขึ้น (หลังจากเวลาผ่านไปและ / หรือธุรกรรมบางอย่างและเกณฑ์อื่น ๆ ) ธุรกรรมระหว่าง CHECKPOINT ที่ผ่านมาและปัจจุบันจะถูกเขียนไปยังดิสก์

  3. เมื่อบันทึกการสำรองข้อมูลเกิดขึ้นข้อมูลจะถูกเขียนไปยังไฟล์ MDF

ฉันถูกไหม? เพื่อนร่วมงานของฉันบางคนบอกว่าฉันผิดและยากที่จะหาคำตอบที่ถูกต้องแม้กับ BOL

ขอบคุณ!


คำตอบ:


20

น่าเสียดายที่มีข้อผิดพลาดจำนวนมากในคำตอบที่เกี่ยวกับวิธีการทำงานของ COMMIT ดังนั้นฉันจะเพิ่มอีกหนึ่งข้อ ดูวิธีการทำงาน: Bob Dorr ของ SQL Server I / O การนำเสนอรายละเอียดและSQL Server 2000 I / O ข้อมูลพื้นฐานเกี่ยวกับ นี่คือวิธีการทำงาน:

  • ข้อมูลการบันทึก (การเปลี่ยนแปลง) ที่บันทึกไว้อย่างสมบูรณ์ทั้งหมดจะเกิดขึ้นในลำดับต่อไปนี้อย่างแน่นอน (ดูที่การทำความเข้าใจว่า SQL Server ดำเนินการกับแบบสอบถาม: การเขียนข้อมูล ):

    • หน้าข้อมูลถูก latched เฉพาะ
    • เรคคอร์ดบันทึกที่อธิบายการเปลี่ยนแปลงนั้นจะถูกเพิ่มลงในบันทึกในหน่วยความจำ บันทึกบันทึกใหม่สร้าง LSN ใหม่ให้ดูคืออะไร LSN: เข้าสู่ระบบลำดับหมายเลข
    • หน้าข้อมูลถูกแก้ไข (บันทึกข้อมูลและ last_update_lsn บนหน้า) ตอนนี้หน้านี้ถูกแก้ไข ('สกปรก')
    • latch หน้าข้อมูลถูกปล่อยออกมา
    • ไม่มีสิ่งใดถูกเขียนลงดิสก์โดยตรงอันเป็นผลมาจากการอัปเดต
  • COMMIT ทำสิ่งต่อไปนี้

    • เพิ่มบันทึกใหม่ที่อธิบายถึง COMMIT ในบันทึกในหน่วยความจำ
    • บันทึกข้อมูลทั้งหมดที่ไม่ได้ถูกฟลัชไปยังดิสก์จนถึงและรวมถึงรายการที่สร้างขึ้นด้านบนจะถูกลบทิ้ง (เขียนลงดิสก์)
    • บล็อกเธรดจะรอจนกระทั่งระบบปฏิบัติการรายงานว่าการเขียนข้างต้นมีความทนทาน (IO สมบูรณ์)
    • คำสั่ง COMMIT (หรือคำสั่ง DML ที่มีการกระทำโดยนัย) เสร็จสมบูรณ์
  • CHECKPOINT ทำสิ่งต่อไปนี้ (ลดความซับซ้อน) ดูวิธีการทำงานของจุดตรวจและสิ่งที่ได้รับการบันทึก :

    • หน้าสกปรกทั้งหมดในหน่วยความจำเขียนลงดิสก์
      • สำหรับแต่ละหน้าสกปรกก่อนที่จะเริ่มเขียนลงดิสก์บันทึกและรวมถึง LSN ที่เป็น last_update_lsn ในหน้านั้นจะถูกลบทิ้ง (เขียนลงดิสก์) โปรดทราบว่า flushin LSN ใด ๆ ที่แสดงถึง LSN ก่อนหน้านี้ทั้งหมดจะถูกลบทิ้งด้วยดังนั้นสำหรับเพจที่สกปรกที่สุดนี่คือไม่มีการใช้งานเนื่องจากเป็น Last_update ของตัวเอง
    • บันทึกบันทึกอธิบายจุดตรวจถูกเขียนไปยังบันทึกและล้าง
    • หน้าการบู๊ตฐานข้อมูลอัปเดตด้วย LSN ของบันทึกที่สร้างขึ้นด้านบน

เขียนทำงานแตกต่างกันสำหรับการดำเนินการลงทะเบียนน้อยที่สุดดูการดำเนินงานที่สามารถบันทึกการเข้าน้อยที่สุด การดำเนินการที่บันทึกไว้เล็กน้อยจะทำหน้าที่ดังต่อไปนี้ (ลดความซับซ้อน):

  • ก่อนที่จะแทรกแถวในหน้าซึ่งเป็นส่วนหนึ่งของการดำเนินการที่บันทึกไว้น้อยที่สุดบันทึกการบันทึกที่อธิบายถึงความจริงที่ว่าหน้ามีส่วนร่วมในการดำเนินการที่บันทึกน้อยที่สุดจะถูกสร้างและผนวกเข้ากับบันทึก (ในหน่วยความจำ)
  • หน้าที่บันทึกไว้น้อยที่สุดกำลังได้รับการอัปเดตเนื่องจากมีการเพิ่มส่วนแทรกจำนวนมาก ไม่มีอะไรถูกบันทึกไว้จะไม่มีการเขียนลายเซ็นลงในดิสก์
  • เมื่อการดำเนินการที่บันทึกไว้น้อยที่สุดก่อนที่จะกระทำการนั้นจำเป็นต้องมีเพจทั้งหมดที่เข้าร่วมในการดำเนินการบันทึกขั้นต่ำในธุรกรรมนั้นจะถูกเขียนไปยังดิสก์ Onyl หลังจากการเขียนเสร็จสิ้นเรคคอร์ดบันทึก COMMIT สามารถผนวกเข้ากับบันทึก (ในหน่วยความจำ) และและบันทึกได้สูงสุดและรวมถึงบันทึกบันทึกการคอมมิทที่เพิ่มเข้ามาใหม่นี้จะถูกล้าง (เขียน) ลงในดิสก์

8

เมื่อมีการทำธุรกรรม (COMMIT) ธุรกรรมนั้นจะถูกเขียนไปยังบันทึกธุรกรรมใน RAM

การทำธุรกรรมจะถูกเขียนลงในบันทึกการทำธุรกรรมก่อนที่จะเปลี่ยนหน้าหรือข้อมูลตามที่ร้องขอโดยแบบสอบถาม สิ่งนี้เรียกว่าการเขียนบันทึกล่วงหน้า (WAL) หาก SQL Server ขัดข้องในขณะที่หน้ากำลังมีการปรับปรุงในหน่วยความจำ WAL ให้แน่ใจว่าเครื่องยนต์ DB สามารถอ่านบันทึกธุรกรรมและย้อนกลับการทำธุรกรรม นี่เป็นคุณสมบัติ ACID ของ RDBMS

เมื่อ CHECKPOINT เกิดขึ้น (หลังจากเวลาผ่านไปและ / หรือธุรกรรมบางอย่างและเกณฑ์อื่น ๆ ) ธุรกรรมระหว่าง CHECKPOINT ที่ผ่านมาและปัจจุบันจะถูกเขียนไปยังดิสก์

ด่านตรวจวูบหน้าสกปรกจากบัฟเฟอร์ไปยังดิสก์ มันจะทำงานเล็ก ๆ น้อย ๆ ที่แตกต่างกันสำหรับ tempdb หน้าสกปรกเป็นหน้าที่มีการเปลี่ยนแปลงนับตั้งแต่ถูกอ่านจากดิสก์ กระบวนการจุดตรวจสอบนี้สร้างเครื่องหมายในการทำธุรกรรมบันทึกจนถึงจุดที่มีการทำธุรกรรม หลังจากความล้มเหลวการกู้คืนรู้ว่าการทำธุรกรรมทั้งหมดถึงเครื่องหมายที่ได้กระทำ คุณสามารถออกด่านด้วยตนเองได้ด้วยคำสั่ง TSQL

เมื่อบันทึกการสำรองข้อมูลเกิดขึ้นข้อมูลจะถูกเขียนไปยังไฟล์ MDF

ไม่เมื่อบันทึกการสำรองข้อมูลเกิดขึ้น SQL Server จะคัดลอกข้อมูลบันทึกธุรกรรมจากไฟล์บันทึกฐานข้อมูลไปยังดิสก์ที่คุณทำการสำรองข้อมูล การดำเนินการสำรองข้อมูลอ่านข้อมูลจากดิสก์และเขียนข้อมูลบนดิสก์

ฉันต้องการให้คุณอ่านลิงค์ด้านล่าง

ทำความเข้าใจเกี่ยวกับการบันทึกและการกู้คืนใน SQL Server ที่ชี้โดย Mark แล้ว

SQL Server 2008 Internals และการแก้ไขปัญหาหนังสือ

สถาปัตยกรรมบันทึกธุรกรรมและการจัดการ


ตกลงดูเหมือนชัดเจน เพื่อความมั่นใจ: เมื่อมีการคอมมิทเกิดขึ้นคุณบอกว่ามันถูกเขียนไปยังบันทึกการทำธุรกรรม คุณหมายถึง buffer หรือ disk (LDF)
Patator

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

"ถ้า SQL Server ขัดข้องในขณะที่หน้ากำลังมีการปรับปรุงในหน่วยความจำ WAL ทำให้แน่ใจว่าเอ็นจิน DB สามารถอ่านบันทึกธุรกรรมและย้อนกลับธุรกรรม" สิ่งนี้เป็นจริงเฉพาะในกรณีที่การทำธุรกรรมไม่ได้เกิดขึ้น หากมีความมุ่งมั่นแล้วไม่มีอะไรสามารถย้อนกลับ ข้อมูลในบันทึกธุรกรรมใช้เพื่ออัพเดทไฟล์ข้อมูล แม้ว่าบัฟเฟอร์ไม่ได้ถูกเขียนไปยังไฟล์ข้อมูลก่อนที่จะเกิดความผิดพลาด
miracle173

@ มิราเคิล: ฉันเดาว่าหน้ากำลังมีการปรับปรุงซึ่งเกี่ยวข้องกับการทำธุรกรรมโดยเฉพาะอย่างยิ่งของการทำธุรกรรมแน่นอนจะไม่ได้มุ่งมั่น
Shanky

4

ด้านล่างจะอธิบายสิ่งต่าง ๆ สำหรับคุณ:

เมื่อมีการทำธุรกรรม (COMMIT) ธุรกรรมนั้นจะถูกเขียนไปยังบันทึกธุรกรรมใน RAM

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

เมื่อ CHECKPOINT เกิดขึ้น (หลังจากเวลาผ่านไปและ / หรือธุรกรรมบางอย่างและเกณฑ์อื่น ๆ ) ธุรกรรมระหว่าง CHECKPOINT ที่ผ่านมาและปัจจุบันจะถูกเขียนไปยังดิสก์

เมื่อบันทึกการสำรองข้อมูลเกิดขึ้นข้อมูลจะถูกเขียนไปยังไฟล์ MDF

เอ่ยถึง :

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