Trong bối cảnh kinh doanh hiện tại, “data-driven” đã và đang trở thành một xu hướng mà mọi doanh nghiệp đều theo đuổi, nó đang trở thành một trong những yếu tố quan trọng quyết định đến sự phát triển bền vững của doanh nghiệp. Tuy nhiên, việc quản lý quá trình xử lý và phân tích dữ liệu sao cho hiệu quả luôn là một thách thức lớn, có rất nhiều câu hỏi cần trả lời: Làm sao để thực hiện phân tích dữ liệu những không ảnh hưởng đến hệ thống sản xuất cốt lõi của doanh nghiệp? Làm sao đảm bảo dữ liệu luôn được cập nhật và chính xác trong thời gian thực?… Đây là lúc Change Data Capture (CDC) ra đời và phát huy vai trò quan trọng của mình. CDC giúp liên tục thu thập và chuyển những thay đổi trong dữ liệu từ các hệ thống sản xuất tới hệ thống phân tích, cho phép tổ chức phân tích dữ liệu gần như ngay lập tức mà không làm gián đoạn hoạt động sản xuất.

1. Change Data Capture là gì? Tại sao nên sử dụng Change Data Capture (CDC)

Change Data Capture là gì?

Change Data Capture (CDC) là một kỹ thuật theo dõi và ghi nhận những thay đổi xảy ra trong dữ liệu nguồn, giúp cập nhật các dữ liệu thay đổi vào hệ thống phân tích hoặc cơ sở dữ liệu khác mà không cần tải lại toàn bộ dữ liệu từ đầu. CDC hoạt động bằng cách phát hiện các thay đổi (như thêm, xóa hoặc cập nhật) trong dữ liệu và sau đó chuyển những thay đổi này đến hệ thống đích theo thời gian thực hoặc gần thời gian thực.

Kỹ thuật này ra đời nhằm đáp ứng nhu cầu truyền tải dữ liệu nhanh chóng, đảm bảo rằng các hệ thống phân tích, báo cáo, hoặc các ứng dụng khác luôn làm việc với thông tin mới nhất mà không làm gián đoạn các hoạt động của hệ thống nguồn. CDC thường được sử dụng trong các doanh nghiệp muốn tách biệt việc phân tích dữ liệu khỏi hệ thống sản xuất, giúp các hoạt động kinh doanh không bị ảnh hưởng bởi những truy vấn phân tích nặng nề

Tại sao nên sử dụng Change Data Capture?

CDC đem lại nhiều lợi ích đáng kể, đặc biệt trong các môi trường kinh doanh yêu cầu khả năng phân tích và phản hồi nhanh chóng với dữ liệu mới. Dưới đây là một số lý do tại sao nên sử dụng CDC:

  • Hỗ Trợ Quyết Định Nhanh Chóng và Chính Xác: Điểm đáng giá nhất của CDC đó là cho phép phân tích dữ liệu thời gian thực, giúp tận dụng tối đa giá trị của dữ liệu.Vào năm 2017, nghiên cứu của Nucleus Research có tiêu đề ”The Half Life of Data”, chỉ ra rằng tactical decision(những dữ liệu được sử dụng để đưa ra quyết định cho các hoạt động vận hành trong doanh nghiệp) sẽ mất 50% giá trị sau 30 phút kể từ khi nó được tạo
  • Giảm Tác Động Đến Hệ Thống Sản Xuất: Bằng cách chỉ chuyển các thay đổi nhỏ, CDC giữ cho các hệ thống sản xuất luôn hoạt động liên tục mà không cần dừng lại để thực hiện các đợt tải dữ liệu theo lô.
  • Giảm chi phí truyền dữ liệu qua mạng WAN: Do CDC chỉ gửi các thay đổi nhỏ trong dữ liệu, khối lượng dữ liệu cần truyền qua mạng WAN giảm đi đáng kể, tiết kiệm chi phí và thời gian so với việc truyền tải toàn bộ dữ liệu nhiều lần.

2. Cách Change Data Capture hoạt động

Các loại thay đổi dữ liệu chính trong CDC

  1. Insert: Thêm một hoặc nhiều hàng vào cơ sở dữ liệu (ví dụ, một bản ghi giao dịch bán hàng mới)
  2. Update: Cập nhật các trường trong các hàng hiện có (ví dụ, chỉnh sửa địa chỉ của khách hàng trong bản ghi giao dịch)
  3. Delete: Xóa một hoặc nhiều hàng khỏi cơ sở dữ liệu (ví dụ, xóa một giao dịch bán hàng sai)
  4. DDL (Data Definition Language): Thay đổi cấu trúc cơ sở dữ liệu (ví dụ, thêm hoặc xóa các bảng hoặc cột)

Các loại CDC

Trigger-Based CDC

Phương pháp này sử dụng trigger trong cơ sở dữ liệu để phát hiện những thay đổi và lưu chúng vào bảng “shadow” để ghi nhận những thay đổi. Các cơ sở dữ liệu hiện này đều có hỗ trợ sẵn trigger trong API SQL, giúp thực hiện CDC ngay ở cấp độ SQL với khả năng cập nhật dữ liệu theo thời gian thực

  • Ưu điểm: Có khả năng ghi nhận dữ liệu theo thời gian thực và tạo ra bản ghi chi tiết của tất cả giao dịch trong bảng shadow, tạo ra một bản ghi bất biến.
  • Nhược điểm: Trigger-Based CDC có thể làm giảm hiệu suất của cơ sở dữ liệu vì cần ghi thêm dữ liệu cho mỗi thao tác thêm, cập nhật, hoặc xóa. Việc quản lý trigger cũng có thể trở nên phức tạp khi ứng dụng có sự thay đổi.

🡪 Thích hợp cho: Các ứng dụng cần bản ghi chi tiết về mọi thay đổi và có thể chấp nhận ảnh hưởng nhất định đến hiệu suất.

Log-Based CDC

Phương pháp Log-Based CDC sẽ đọc transaction log của cơ sở dữ liệu để ghi nhận các thay đổi như thêm, cập nhật, hoặc xóa. Log này có thể được gọi bằng tên khác nhau tùy vào loại cơ sở dữ liệu, ví dụ: write-ahead log (WAL) trong PostgreSQL hay binary log (binlog) trong MySQL

  • Ưu điểm: Ít ảnh hưởng đến hiệu suất nhất vì không cần truy vấn trực tiếp bảng dữ liệu hoặc thay đổi cấu trúc ứng dụng.
  • Nhược điểm: Quá trình phân tích log có thể phức tạp, đặc biệt là khi cơ sở dữ liệu có sự thay đổi phiên bản. Đôi khi cần phải có hệ thống quản lý metadata để đảm bảo tính chính xác của sự kiện

🡪 Thích hợp cho: Hệ thống cần tối thiểu hóa tác động lên cơ sở dữ liệu gốc

Query-Based CDC

Query-Based CDC dựa trên việc thực hiện các truy vấn để phát hiện thay đổi trong cơ sở dữ liệu, chỉ trích xuất các dòng đã thay đổi kể từ lần truy vấn trước đó. Phương pháp này khá linh hoạt và có thể áp dụng với hầu hết các cơ sở dữ liệu(có thể dựa vào các cột như modified date..)

  • Ưu điểm: Linh hoạt và có thể hoạt động mà không cần công cụ bên ngoài.
  • Nhược điểm: Đòi hỏi tài nguyên hệ thống lớn và có thể gây ra vấn đề về tính nhất quán của dữ liệu nếu không xây dựng đúng cách.
    • Thích hợp cho: Các tình huống có thể tích hợp logic phát hiện thay đổi trong ứng dụng và không yêu cầu công cụ ngoài

3. Demo Change Data Capture trong Sql Server

Bước 1: Chạy câu lệnh để enable tính năng CDC cho database trong SQL Server(Lưu ý: Ta cần bật tính năng này trước khi chạy câu lệnh EXEC sys.sp_cdc_enable_table để enable tính năng CDC cho bảng). Ngoài ra ta cũng cần enable SQL Server Agent để CDC có thể hoạt động

–Enable CDC by running the following T-SQL command(Need to enable this options before enable cdc to any table in the db)

— Need to enable sql server agent also

EXEC sys.sp_cdc_enable_db;

Bước 2: Sau khi đã enable tính năng CDC cho database, ta tiếp tục thực hiện enable tính năng CDC cho bảng ta muốn thực hiện tracking sự thay đổi

/*EXEC sys.sp_cdc_enable_table

@source_schema = N’dbo’,

@source_name = N’source table name’,

@role_name = N’cdc_admin’; — role access to cdc data*/

EXEC sys.sp_cdc_enable_table

@source_schema = N’dbo’,

@source_name = N’tests’, — bảng được tạo có tên schemaName_tableName

@role_name = N’cdc_admin’,– tự tạo role nếu role đó không tồn tại

@captured_column_list = N’standard_score,grade_at_assessment’; — nếu để NULL sẽ bắt thay đổi tất cả các cột

— check if table cdc enable

SELECT * FROM sys.tables WHERE is_tracked_by_cdc = 1;

Sau khi đã hoàn thành 2 bước trên thì giờ đây SQL Server sẽ tự động tracking thay đổi của 2 cột standard_score, grade_at_asessment của bảng tests. Mọi thay đổi sẽ được lưu trong bảng “Shadow” có tên cdc.dbo_tests_CT

Giả sử ta chạy câu lệnh sau để update điểm của học sinh trong bảng tests:

UPDATE tests

SET standard_score = 120

WHERE student_id = ‘D26FA722-640C-EE11-8F6E-002248B32010’

— run query to check

SELECT *

FROM cdc.dbo_tests_CT

WHERE __$operation IN (3,4); — Operation type 1 corresponds to INSERT

Kết quả: Có 20 dòng bị ảnh hưởng bởi update này. Như vậy tương ứng sẽ có 40 dòng được tạo ở trong bảng cdc.dbo_test_CT. Lý do sẽ có 40 dòng trong bảng shadow vì đối với hành động update được thực hiện thì chức năng CDC của SQL Server đều lưu lại trạng thái của dòng trước và sau khi update(__$operation tương ứng với các hành động được thực hiện trong db như sau 1 – Delete, 2 – insert, 3 – trạng thái trước khi update, 4 – trạng thái sau khi update)

Kết quả từ bảng cdc.dbo_tests_CT

Tương tự ta cũng sẽ thực hiện Demo với hành động insert và delete:

INSERT INTO dbo.tests (standard_score, assessment_level_id, student_assessment_id, student_id, assessment_type, assessment_date, school_year_grade_class, semester, school_year2, toswrf_assessment_id, towre_assessment_id, grade_at_assessment

)

VALUES (110, ‘C395859B-ED0D-EE11-8F6E-002248B32010′, ’09E9B0EB-4E0D-EE11-8F6E-6045BD5D055B’, ‘D26FA722-640C-EE11-8F6E-002248B32010′,’TOSREC’, ‘2022-09-16’, 3, ‘Fall’, ‘2022 / 2023’,NULL, NULL, 3.0

);

SELECT *

FROM cdc.dbo_tests_CT

WHERE __$operation = 2;

Kết quả: Kết quả trả về 1 dòng mà ta vừa thực hiện insert

— case 3: delete

DELETE FROM tests

WHERE student_assessment_id = ’09E9B0EB-4E0D-EE11-8F6E-6045BD5D055B’

SELECT *

FROM cdc.dbo_tests_CT

WHERE __$operation = 1;

Kết quả: Khi ta thực hiện câu lệnh Delete trên chỉ có 1 dòng bị xóa nên tương ứng trong bảng shadow sẽ lưu dòng vừa bị xóa từ bảng tests

 

Viết bài: Đinh Quang Tiến