Khi nào nên sử dụng CDC để theo dõi lịch sử?


26

SQL Server Change Data Capture là một tính năng đọc dữ liệu lịch sử từ nhật ký giao dịch SQL Server và lưu trữ chúng trong một bảng đặc biệt.

Thông qua việc sử dụng các hàm giá trị bảng đặc biệt (TVF), sau đó cho phép người dùng truy vấn dữ liệu này, cho phép có thể nhận được tất cả các thay đổi trên một bảng cụ thể hoặc chỉ những thay đổi thuần phát sinh từ những thay đổi trong một thời gian cụ thể.

CDC có những lợi thế nhất định

  • Nó có thể được cấu hình để chỉ theo dõi các bảng hoặc cột nhất định.
  • Nó có thể xử lý các thay đổi mô hình ở một mức độ nhất định.
  • Nó không ảnh hưởng nhiều đến hiệu suất như các trình kích hoạt vì nó hoạt động với nhật ký giao dịch.
  • Nó dễ dàng được kích hoạt / vô hiệu hóa và không yêu cầu các cột bổ sung trên bảng cần được theo dõi.

Nó cũng có một số nhược điểm:

Tôi đã đọc khá nhiều về CDC và trong khi tôi biết cách sử dụng nó, tôi vẫn không chắc nó có phải là công cụ phù hợp với mình không.

  1. Đối với những nhiệm vụ / kịch bản nào là CDC, công cụ phù hợp? (ví dụ: Cho phép người dùng khôi phục đối tượng dữ liệu đến một thời điểm nhất định? Kiểm toán? Hiển thị toàn bộ lịch sử dữ liệu?)
  2. Khi nào bạn không nên sử dụng CDC mà sử dụng giải pháp dựa trên kích hoạt tùy chỉnh?
  3. Bạn có thể sử dụng CDC trong cơ sở dữ liệu vận hành và sử dụng dữ liệu CDC trong một ứng dụng hoạt động không? (ví dụ: hiển thị nó cho người dùng cuối) Hoặc đây rõ ràng là một sự lạm dụng của tính năng này?

Tôi thường nghe nói rằng CDC là một công cụ kiểm toán, nhưng đó không phải là SQL Server Audit dùng để làm gì? Có phải cả hai công cụ khác nhau cho cùng một nhiệm vụ? Hoặc CDC có thể được sử dụng cho những thứ khác?

Kịch bản hiện tại của tôi là tôi được yêu cầu xây dựng một khung dữ liệu đáng tin cậy, được cho là cơ sở cho nhiều ứng dụng trong tương lai. Các yêu cầu chính xác là mờ, nhưng một là nó có thể theo dõi lịch sử dữ liệu và khôi phục các mục cũ hơn cùng với tất cả dữ liệu liên quan từ các bảng khác. Tôi đang đánh giá CDC ngay bây giờ như là một tùy chọn, nhưng không chắc chắn liệu đây có phải là hướng đi hay không, vì tôi thực sự không thể tìm thấy bất kỳ trường hợp sử dụng được đề xuất nào.

Mặc dù tôi đánh giá cao lời khuyên cho kịch bản cụ thể của mình, các câu trả lời sẽ đưa ra lời khuyên chung về thời điểm hoặc khi không sử dụng Change Data Capture.


1
Lý tưởng nhất là một "khuôn khổ" sẽ không đưa ra quyết định kiểu này; nó sẽ được để lại cho các dự án cá nhân. Nhưng vì bạn được yêu cầu làm điều này, nên ít nhất tôi sẽ đưa ra quan điểm mà bất kỳ ai cũng đưa ra cho bạn những yêu cầu này: có nhiều cách khác nhau để thực hiện điều này, và sự lựa chọn tốt nhất phụ thuộc nhiều vào cách sử dụng và nhu cầu chính xác. Hỏi xem họ có thể cung cấp cho bạn bất kỳ sự làm rõ nào có thể giúp bạn quyết định (như hiệu suất hoặc tính linh hoạt là quan trọng hơn). Một lựa chọn khác để xem xét là phát triển cả hai tùy chọn như là một phần của "khung" và để các dự án thực sự chọn cái nào sẽ kích hoạt.
jpmc26

@ jpmc26, khuôn khổ có thể cần thiết để ngăn chặn mỗi dự án dành thời gian quyết định loại câu hỏi này.
Ian Ringrose

@IanRingrose Quan điểm của tôi là cố gắng đưa ra quyết định mà không xem xét các nhu cầu cụ thể của dự án, về lâu dài, sẽ gây ra nhiều vấn đề hơn giải quyết (và do đó thực sự tốn kém hơn thời gian đó). Đây là một quyết định không thể được đưa ra một cách hiệu quả trong trường hợp chung. Các chi tiết cụ thể của dự án phải được xem xét. Sử dụng một quyết định trùm mền, thời gian sẽ được sử dụng giải pháp đã chọn và đưa ra các giả định xung quanh nó chỉ cho các giả định đó bị vi phạm khi phát hiện ra đó không phải là một giải pháp thích hợp. Sau đó, hệ thống sẽ cần phải được thiết kế lại.
jpmc26

1
@ jpmc26 Tôi thực sự có thể đi với giải pháp mà bạn đề xuất, trong trường hợp tôi tìm cách loại bỏ nó: Phát triển cả theo dõi lịch sử dựa trên kích hoạt và dựa trên CDC, có thể chuyển đổi và đằng sau một giao diện chung. Các ứng dụng sau đó có thể chọn cái này hoặc cái kia, tùy theo yêu cầu của chúng, nhưng không phải lo lắng về việc tự thực hiện nó. Tất nhiên tôi vẫn muốn có một câu trả lời tốt cho câu hỏi trên của mình, bởi vì nếu CDC không bị loại bỏ cho loại nhiệm vụ này (ví dụ vì nó chỉ tốt cho việc kiểm toán) tôi có thể tự cứu mình khỏi rắc rối và luôn sử dụng trình kích hoạt .
Magnattic

"Nếu Tác nhân không chạy hoặc gặp sự cố, không có lịch sử nào được theo dõi" - nhưng nếu nó được khởi động lại, sẽ không có thay đổi nào bị mất, phải không?
Andy Joiner

Câu trả lời:


12

Thứ nhất,

Thay đổi dữ liệu chụp chỉ khả dụng trên các phiên bản Doanh nghiệp, Nhà phát triển và Đánh giá của Máy chủ SQL.

Vì vậy, điều đó có thể quyết định cho bạn nếu bất kỳ khách hàng nào của bạn sẽ không có phiên bản doanh nghiệp hoặc bạn chưa biết bạn sẽ sử dụng phiên bản doanh nghiệp. (Vì thông số kỹ thuật bao gồm "nhiều ứng dụng trong tương lai", đây có thể là một vấn đề thực sự đối với bạn)

Không giống như kích hoạt nó không phải là thời gian thực, đây là cả một lợi thế và bất lợi. Sử dụng kích hoạt luôn làm chậm một bản cập nhật.

Tôi đã làm việc trên một hệ thống khi chúng tôi sử dụng các trình kích hoạt (do CodeSmith tạo ra), cũng như theo dõi tất cả các thay đổi đối với các bản ghi, chúng tôi cũng liên kết các thay đổi với nhau với bảng lịch sử của lịch sử bao gồm mô-đun của ứng dụng đã thực hiện thay đổi, và mục UI mà người dùng đã sử dụng để thực hiện thay đổi.

Tuy nhiên, bạn có thể giải quyết vấn đề này tốt nhất ở cấp ứng dụng, bằng cách viết tất cả cập nhật vào hàng đợi tin nhắn sau đó được phát lại để tạo cơ sở dữ liệu tại bất kỳ thời điểm nào, xem blog Temporal trên blog Martin Flowler để biết tổng quan tốt về các tùy chọn.


Liên kết là một đọc rất thú vị, cảm ơn vì điều đó. Tuy nhiên, giải quyết điều này ở cấp ứng dụng không phải là một lựa chọn trong trường hợp của tôi. Khung tôi đang xây dựng được cho là thực hiện hầu hết các công việc, bao gồm theo dõi lịch sử, cho các ứng dụng dựa trên nó. Các ứng dụng sau đó đang làm việc với một giao diện chung để lưu trữ / truy xuất dữ liệu, do đó chúng không phải quan tâm đến cách lưu trữ dữ liệu. Tôi nhận thức được rằng nhiệm vụ này là xa tầm thường.
Magnattic

Ngoài ra, tôi hiện không xem xét Phiên bản doanh nghiệp hoặc không phải là yếu tố quyết định trong trường hợp của chúng tôi. Các ứng dụng trong tương lai mà tôi đang nói đến rất có thể tất cả sẽ được chúng tôi xây dựng và lưu trữ.
Magnattic

@atticae, Khung của bạn không phải giới hạn trong cơ sở dữ liệu, nó có thể bao gồm mã chạy bên ngoài cơ sở dữ liệu.
Ian Ringrose

Tất nhiên, nó không giới hạn trong cơ sở dữ liệu. (Tôi sẽ không gọi nó là khung trong trường hợp này.) Tôi hiểu ý của bạn bây giờ là "cấp độ ứng dụng" và thực tế tôi hiện đang sử dụng một biến thể của mẫu Thuộc tính tạm thời mà liên kết của bạn nói về. Khung công tác tôi xây dựng cung cấp giao diện này cho các ứng dụng sử dụng nó. Tuy nhiên, đó là một phần của phía giao diện và không có gì thực sự trả lời câu hỏi của tôi được nêu ở trên.
Magnattic

Cảm ơn một lần nữa cho câu trả lời của bạn. Đây có lẽ là yếu tố quyết định đối với hầu hết mọi người, vì vậy tôi nghĩ đó là một câu trả lời tốt và có thể giúp khách truy cập trong tương lai quyết định không sử dụng CDC. Tuy nhiên, tôi cảm thấy rằng nó không thực sự trả lời hầu hết các câu hỏi của tôi, vì vậy tôi sẽ phải đưa tiền thưởng cho stacylaray, người duy nhất cố gắng trả lời tất cả các câu hỏi tôi có. (Mặc dù tôi đã hy vọng câu trả lời phức tạp hơn một chút.)
Magnattic

12

Dưới đây là một loạt 9 phần được viết rất tốt để xem xét các cách khác nhau để kiểm tra các thay đổi dữ liệu của SQL Server. Phần 3, 4 & 5 tập trung vào CDC. Rất đáng để đọc qua tất cả các bài viết bởi vì điều này sẽ trả lời các câu hỏi của bạn, như các tình huống khác nhau trong đó các tính năng sẽ phù hợp và chi phí chung. http://solutioncenter.apexsql.com/tag/methods-for-auditing-sql-server


1
Sau khi lướt qua bài báo, tôi vẫn không thông minh hơn nhiều. Như hầu hết các bài viết, nó đi sâu vào chi tiết cách sử dụng CDC và cách so sánh với Theo dõi Thay đổi. Điều đó không thực sự trả lời các câu hỏi trên của tôi mặc dù.
Magnattic

9

Đối với những nhiệm vụ / kịch bản nào là CDC, công cụ phù hợp? (ví dụ: Cho phép người dùng khôi phục một đối tượng dữ liệu đến một thời điểm nhất định?

Có lẽ, nó phụ thuộc.

Kiểm toán?

Vâng.

Hiển thị lịch sử đầy đủ của dữ liệu?)

Vâng.

Khi nào bạn không nên sử dụng CDC mà sử dụng giải pháp dựa trên kích hoạt tùy chỉnh?

Khi dữ liệu trong bảng thay đổi không đáp ứng nhu cầu của bạn.

Bạn có thể sử dụng CDC trong cơ sở dữ liệu vận hành và sử dụng dữ liệu CDC trong một ứng dụng hoạt động không? (ví dụ: hiển thị nó cho người dùng cuối)

Vâng.

Hay đây rõ ràng là một sự lạm dụng của tính năng này?

Không, nó không phải là lạm dụng tính năng này.

Tôi thường nghe nói rằng CDC là một công cụ kiểm toán, nhưng đó không phải là SQL Server Audit dùng để làm gì?

Vâng.

Có phải cả hai công cụ khác nhau cho cùng một nhiệm vụ?

Không.

Hoặc CDC có thể được sử dụng cho những thứ khác?

CDC có thể được sử dụng cho những thứ khác.

Có Theo dõi Thay đổi và có Ghi dữ liệu Thay đổi. Cả hai đều có nguồn gốc của họ trong bản sao.

Theo dõi thay đổi cung cấp một cách để cung cấp các thay đổi ròng cho một bảng. Một ví dụ về việc sử dụng sẽ là đồng bộ hóa thiết bị cầm tay.

CDC, mặt khác, theo dõi mọi thay đổi nhỏ, một lịch sử. Người ta có thể sử dụng lịch sử đó để cập nhật kho dữ liệu thay vì sao chép hàng loạt dữ liệu hoặc người ta có thể sử dụng lịch sử đó làm dữ liệu và tạo báo cáo từ đó. Bảng thay đổi không bị ẩn và cũng không có lược đồ lạ hoặc thứ gì đó. Bạn có thể truy vấn nó và sử dụng dữ liệu theo cách bạn muốn. Hãy ghi nhớ ... đó không phải là thời gian thực, như Ian nói. Dữ liệu đến từ nhật ký giao dịch, vì vậy hãy chăm sóc nó giống như bạn sử dụng bản sao, hoặc phản chiếu hoặc ghi nhật ký vận chuyển. Bởi và lớn, nó sẽ nhanh hơn kích hoạt. Bạn sẽ cần sử dụng Snapshot Isolation, có chi phí hoạt động và bạn sẽ phải suy nghĩ về Phục hồi thảm họa.


2

Một điểm điều chỉnh. Tại một thời điểm, thay đổi dữ liệu chụp chỉ có sẵn trong các phiên bản được liệt kê ở trên. Tuy nhiên, thay đổi dữ liệu đã có sẵn trong phiên bản tiêu chuẩn kể từ 2016 SP1. Do đó, nhiều bài viết được viết trước năm 2016 SP1 làm cho âm thanh như thể CDC nằm ngoài tầm với của những người trong chúng ta sử dụng phiên bản Tiêu chuẩn. Đây không còn là trường hợp. Tài liệu Microsoft phác thảo tính khả dụng của CDC nằm trong liên kết bên dưới.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.