จะใช้ CDC เพื่อติดตามประวัติเมื่อใด


26

SQL Server Change Data Capture เป็นคุณสมบัติที่อ่านข้อมูลประวัติจากบันทึกธุรกรรม SQL Server และเก็บไว้ในตารางพิเศษ

จากการใช้ฟังก์ชั่นค่าตารางพิเศษ (TVF) จะช่วยให้ผู้ใช้สามารถสืบค้นข้อมูลนี้ทำให้สามารถรับการเปลี่ยนแปลงทั้งหมดในตารางที่ระบุหรือเฉพาะการเปลี่ยนแปลงสุทธิที่เกิดจากการเปลี่ยนแปลงภายในเวลาที่กำหนด

CDC มีข้อดีบางประการ

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

นอกจากนี้ยังมีข้อเสีย:

ฉันได้อ่านเกี่ยวกับ CDC ค่อนข้างมากและในขณะที่ฉันรู้วิธีใช้งานฉันยังไม่แน่ใจว่ามันเป็นเครื่องมือที่เหมาะสมสำหรับฉันหรือไม่

  1. CDC สำหรับภารกิจ / สถานการณ์ใดเป็นเครื่องมือที่เหมาะสม (เช่นอนุญาตให้ผู้ใช้กู้คืนวัตถุข้อมูลไปยังจุดที่กำหนดเวลาหรือไม่การตรวจสอบ? แสดงประวัติของข้อมูลทั้งหมด?)
  2. เมื่อใดที่คุณไม่ควรใช้ CDC แต่หันไปใช้โซลูชันทริกเกอร์ที่กำหนดเอง
  3. การใช้ CDC ในฐานข้อมูลการดำเนินงานและใช้ประโยชน์จากข้อมูล CDC ภายในแอปพลิเคชันในการดำเนินงานหรือไม่ (เช่นแสดงให้ผู้ใช้เห็น) หรือว่านี่เป็นการใช้งานผิดวัตถุประสงค์อย่างชัดเจนหรือไม่?

ฉันมักจะได้ยินว่า CDC เป็นเครื่องมือตรวจสอบ แต่ไม่ใช่ว่าSQL Server Auditเหมาะกับอะไร พวกเขาทั้งสองมีเครื่องมือต่างกันสำหรับงานเดียวกันหรือไม่? หรือ CDC สามารถใช้สำหรับสิ่งอื่น ๆ ?

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

ในขณะที่ฉันชื่นชมคำแนะนำสำหรับสถานการณ์เฉพาะของฉันคำตอบควรให้คำแนะนำทั่วไปเกี่ยวกับเวลาหรือไม่ใช้การเก็บข้อมูลการเปลี่ยนแปลง


1
เป็นการดีที่ "กรอบ" จะไม่ตัดสินใจเช่นนี้; มันจะเหลือให้กับแต่ละโครงการ แต่เนื่องจากคุณถูกขอให้ทำสิ่งนี้อย่างน้อยฉันก็จะทำให้คนที่ชี้ให้เห็นว่าคุณต้องการสิ่งเหล่านี้: มีวิธีต่าง ๆ ที่จะทำให้สำเร็จและทางเลือกที่ดีที่สุดนั้นขึ้นอยู่กับการใช้งานและความต้องการที่แน่นอน ถามว่าพวกเขาสามารถให้คำชี้แจงใด ๆ ที่อาจช่วยให้คุณตัดสินใจได้ (เช่นว่าประสิทธิภาพหรือความยืดหยุ่นสำคัญกว่า) ตัวเลือกอื่นที่ควรพิจารณาคือการพัฒนาทั้งสองตัวเลือกซึ่งเป็นส่วนหนึ่งของ "กรอบงาน" และให้โครงการจริงเลือกตัวเลือกที่จะเปิดใช้งาน
jpmc26

@ jpmc26 คุณอาจจำเป็นต้องใช้กรอบงานเพื่อหยุดเวลาแต่ละโครงการที่จะตัดสินใจถามคำถามแบบนี้
Ian Ringrose

@IanRingrose ประเด็นของฉันคือการพยายามตัดสินใจโดยไม่คำนึงถึงความต้องการเฉพาะของโครงการในระยะยาวจะทำให้เกิดปัญหามากกว่าที่จะแก้ไขได้ (และจริง ๆ แล้วมีค่าใช้จ่ายสูงกว่าการใช้เวลานั้น) นี่เป็นการตัดสินใจที่ไม่สามารถทำได้อย่างมีประสิทธิภาพในกรณีทั่วไป จะต้องพิจารณารายละเอียดเฉพาะของโครงการ การใช้การตัดสินใจแบบครอบคลุมเวลาจะถูกใช้ไปกับการแก้ปัญหาที่เลือกและทำการตั้งสมมติฐานโดยรอบเพื่อให้สมมติฐานเหล่านั้นถูกละเมิดเมื่อค้นพบว่าไม่ใช่วิธีการแก้ไขที่เหมาะสม จากนั้นระบบจะต้องได้รับการออกแบบใหม่
jpmc26

1
@ jpmc26 ฉันอาจไปกับทางออกที่คุณเสนอในกรณีที่ฉันหาวิธีที่จะดึงมันออก: การพัฒนาทั้งการติดตามประวัติที่อิงกับทริกเกอร์และ CDC สลับได้และอยู่หลังอินเทอร์เฟซทั่วไป แอปพลิเคชันสามารถเลือกอย่างใดอย่างหนึ่งขึ้นอยู่กับความต้องการของพวกเขา แต่ไม่ต้องกังวลเกี่ยวกับการใช้งานเอง แน่นอนว่าฉันยังต้องการคำตอบที่ดีสำหรับคำถามข้างต้นของฉันเพราะหาก CDC ไม่ได้ถูกตัดออกสำหรับงานประเภทนี้แล้ว (เช่นเพราะมันดีสำหรับการตรวจสอบเท่านั้น) ฉันอาจช่วยตัวเองให้เดือดร้อนและใช้ทริกเกอร์เสมอ .
magnattic

"ถ้า Agent ไม่ทำงานหรือล่มไม่มีการติดตามประวัติ" - แต่ถ้าถูกรีสตาร์ทแล้วจะไม่มีการเปลี่ยนแปลงใด ๆ หายไปใช่มั้ย
Andy Joiner

คำตอบ:


12

ประการแรก

การดักจับข้อมูลการเปลี่ยนแปลงนั้นมีเฉพาะในรุ่น Enterprise, Developer และ Evaluation ของ SQL Server

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

ไม่เหมือนกับทริกเกอร์ที่ไม่ใช่เวลาจริงนี่เป็นทั้งข้อดีและข้อเสีย การใช้ทริกเกอร์จะทำให้การอัปเดตช้าลงเสมอ

ฉันทำงานในระบบเดียวเมื่อเราใช้ทริกเกอร์ (สร้างโดย CodeSmith) รวมถึงการติดตามการเปลี่ยนแปลงทั้งหมดในบันทึกเรายังเชื่อมโยงการเปลี่ยนแปลงเข้าด้วยกันกับตาราง“ ประวัติ” ซึ่งรวมถึงโมดูลของแอปพลิเคชันที่ทำการเปลี่ยนแปลง และรายการ UI ที่ผู้ใช้เคยทำการเปลี่ยนแปลง

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


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

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

@atticae กรอบงานของคุณไม่จำเป็นต้อง จำกัด อยู่ที่ฐานข้อมูลสามารถรวมรหัสที่ทำงานนอกฐานข้อมูลได้
Ian Ringrose

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

ขอบคุณอีกครั้งสำหรับคำตอบของคุณ นี่อาจเป็นปัจจัยในการตัดสินใจสำหรับคนส่วนใหญ่ดังนั้นฉันคิดว่ามันเป็นคำตอบที่ดีและอาจช่วยให้ผู้เยี่ยมชมในอนาคตตัดสินใจไม่ใช้ CDC อย่างไรก็ตามฉันรู้สึกว่ามันไม่ได้ตอบคำถามส่วนใหญ่ของฉันดังนั้นฉันจะต้องให้รางวัลกับ stacylaray ซึ่งเป็นคนเดียวที่พยายามตอบคำถามทั้งหมดที่ฉันมี (ถึงแม้ว่าฉันหวังว่าจะได้คำตอบที่ซับซ้อนกว่านี้สักหน่อย)
magnattic

12

ต่อไปนี้เป็นซีรีส์ 9 ส่วนที่ได้รับการเขียนเป็นอย่างดีซึ่งวิจารณ์วิธีต่างๆในการตรวจสอบการเปลี่ยนแปลงข้อมูล SQL Server ส่วนที่ 3, 4 และ 5 มุ่งเน้นไปที่ CDC ควรอ่านบทความทั้งหมดเพราะจะตอบคำถามของคุณเช่นสถานการณ์ต่าง ๆ ที่คุณลักษณะจะเหมาะสมและค่าใช้จ่าย http://solutioncenter.apexsql.com/tag/methods-for-auditing-sql-server


1
หลังจากอ่านบทความนี้ฉันยังไม่ค่อยฉลาดเท่าไหร่ บทความส่วนใหญ่จะอธิบายรายละเอียดวิธีการใช้ CDC และเปรียบเทียบกับการติดตามการเปลี่ยนแปลง แต่นั่นไม่ได้ตอบคำถามข้างต้นของฉันจริงๆ
magnattic

9

CDC สำหรับภารกิจ / สถานการณ์ใดเป็นเครื่องมือที่เหมาะสม (เช่นการอนุญาตให้ผู้ใช้กู้คืนข้อมูลวัตถุไปยังจุดที่กำหนดในเวลา?

บางทีมันขึ้นอยู่กับ

การตรวจสอบ?

ใช่.

แสดงประวัติข้อมูลทั้งหมดหรือไม่)

ใช่.

เมื่อใดที่คุณไม่ควรใช้ CDC แต่หันไปใช้โซลูชันทริกเกอร์ที่กำหนดเอง

เมื่อข้อมูลในตารางการเปลี่ยนแปลงไม่ตรงกับความต้องการของคุณ

คุณสามารถใช้ CDC ในฐานข้อมูลการดำเนินงานและใช้ประโยชน์จากข้อมูล CDC ภายในแอปพลิเคชันที่ใช้งานได้หรือไม่? (เช่นแสดงให้ผู้ใช้เห็น)

ใช่.

หรือนี่เป็นการใช้งานผิดวัตถุประสงค์ของคุณสมบัตินี้อย่างชัดเจนหรือไม่

ไม่มันไม่ได้ใช้คุณสมบัตินี้ในทางที่ผิด

ฉันมักได้ยินว่า CDC เป็นเครื่องมือตรวจสอบบัญชี แต่นั่นไม่ใช่ SQL Server Audit

ใช่.

พวกเขาทั้งสองมีเครื่องมือต่างกันสำหรับงานเดียวกันหรือไม่?

เลขที่

หรือ CDC สามารถใช้สำหรับสิ่งอื่น ๆ ?

CDC สามารถใช้เพื่อสิ่งอื่นได้

มีการติดตามการเปลี่ยนแปลงและมีการเก็บข้อมูลการเปลี่ยนแปลง ทั้งสองมีรากฐานในการจำลอง

การติดตามการเปลี่ยนแปลงเป็นวิธีในการจัดเตรียมการเปลี่ยนแปลงสุทธิในตาราง ตัวอย่างของการใช้งานจะเป็นการซิงค์อุปกรณ์มือถือ

ในทางกลับกัน CDC ติดตามการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ ทุกประวัติศาสตร์ เราสามารถใช้ประวัตินั้นเพื่ออัปเดตคลังข้อมูลแทนการคัดลอกข้อมูลจำนวนมากหรือสามารถใช้ประวัตินั้นเป็นข้อมูลเองและสร้างรายงานได้ ตารางการเปลี่ยนแปลงไม่ได้ถูกซ่อนหรือมีสคีแปลกหรือบางอย่าง คุณสามารถสืบค้นและใช้ข้อมูลได้ตามต้องการ แค่จำไว้ ... มันไม่ใช่เวลาจริงอย่างที่เอียนบอก ข้อมูลมาจากบันทึกธุรกรรมดังนั้นดูแลเหมือนคุณใช้การจำลองแบบหรือทำมิเรอร์หรือบันทึกการจัดส่ง โดยและขนาดใหญ่มันจะเร็วกว่าทริกเกอร์ คุณจะต้องใช้ Snapshot Isolation ซึ่งมีค่าใช้จ่ายและคุณจะต้องคิดถึง Disaster Recovery


2

จุดของการแก้ไข ในแต่ละครั้งการดักจับข้อมูลการเปลี่ยนแปลงจะมีให้เฉพาะในรุ่นที่ระบุไว้ข้างต้น อย่างไรก็ตามการดักจับข้อมูลการเปลี่ยนแปลงมีให้ในรุ่นมาตรฐานตั้งแต่ปี 2559 SP1 ดังนั้นบทความจำนวนมากที่เขียนก่อนปี 2016 SP1 จะส่งเสียงราวกับว่า CDC ไม่สามารถเข้าถึงได้สำหรับผู้ใช้รุ่นมาตรฐาน นี่ไม่ใช่กรณีอีกต่อไป เอกสาร Microsoft การสรุปความพร้อมใช้งานของ CDC อยู่ในลิงค์ด้านล่าง

https://docs.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-2016?view=sql-server-2017#DW

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