Change Data Capture (CDC) w bazie danych - jak działa?

Tymoteusz Kowalski 27 sierpnia 2026
Log-Based CDC śledzi zmiany w bazie danych, np. aktualizację statusu zamówienia 102. To właśnie cdc co to.

Spis treści

Gdy dane z systemu sprzedażowego mają niemal natychmiast trafić do hurtowni, aplikacji raportowej albo modelu analitycznego, zwykły eksport całej tabeli szybko przestaje wystarczać. Właśnie wtedy przydaje się Change Data Capture, czyli CDC, które rejestruje zmiany w bazie i przekazuje dalej tylko nowe, zmodyfikowane lub usunięte rekordy. Poniżej wyjaśniam, jak działa ten mechanizm, czym różni się od podobnych technik SQL i na co uważać podczas wdrożenia.

CDC zamienia zmiany w bazie na użyteczne zdarzenia

  • CDC śledzi operacje INSERT, UPDATE i DELETE.
  • System przesyła tylko zmienione dane, zamiast skanować całą tabelę.
  • Najczęściej korzysta z logu transakcyjnego, wyzwalaczy albo mechanizmów replikacji.
  • Technika sprawdza się w ETL, hurtowniach danych, mikroserwisach i integracjach.
  • CDC nie zastępuje automatycznie pełnego audytu ani kopii zapasowej.

Schemat pokazuje, jak CDC Connector (np. Debezium) przechwytuje zmiany (INSERT, UPDATE, DELETE) z logu transakcyjnego bazy danych (OLTP) i przesyła je do platformy strumieniowania zdarzeń (np. Kafka), co pozwala na analizę w czasie rzeczywistym.

Co oznacza CDC w bazach danych

CDC to sposób wykrywania i przekazywania zmian zachodzących w danych. Gdy ktoś doda zamówienie, zmieni jego status albo je usunie, mechanizm zapisuje informację o tej operacji i udostępnia ją kolejnemu systemowi. Najważniejsza różnica względem klasycznego eksportu polega na tym, że odbiorca dostaje delta danych, a nie kolejną kopię całej tabeli.

Przykładowo, tabela orders może mieć kilka milionów wierszy, ale w ciągu minuty zmieniło się tylko 200 rekordów. Proces bez CDC musi szukać tych zmian za pomocą daty modyfikacji, pełnego porównania albo cyklicznego odczytu. CDC pozwala przechwycić dokładnie te 200 zdarzeń, co zwykle ogranicza obciążenie bazy i skraca czas synchronizacji.

Jakie operacje są rejestrowane

Najczęściej przechwytywane są trzy rodzaje zmian:

  • INSERT, czyli dodanie nowego rekordu,
  • UPDATE, czyli modyfikacja istniejącego rekordu,
  • DELETE, czyli usunięcie danych.

W zależności od technologii zdarzenie może zawierać tylko nowy obraz wiersza albo także wartości przed i po zmianie. To ważne przy synchronizacji. Jeśli odbiorca wie, że status zamówienia zmienił się z „nowe” na „wysłane”, może zaktualizować własny stan bez ponownego odpytywania źródłowej bazy.

Jak działa przechwytywanie zmian

Najprościej wyobrazić sobie CDC jako potok złożony z kilku etapów. Użytkownik lub aplikacja wykonuje operację SQL, baza zapisuje ją w swoim mechanizmie transakcyjnym, a narzędzie CDC odczytuje informację o zmianie i publikuje ją dla odbiorcy. Ostatnim elementem może być hurtownia danych, broker komunikatów, inna baza albo aplikacja napisana w Pythonie.

  1. Transakcja zmienia dane w tabeli źródłowej.
  2. Baza zapisuje operację w logu, tabeli zmian albo systemie replikacji.
  3. Proces CDC odczytuje zmianę i nadaje jej format zdarzenia.
  4. Wiadomość trafia do systemu docelowego.
  5. Odbiorca zapisuje zmianę i potwierdza jej przetworzenie.

W dojrzałych rozwiązaniach pojawiają się także offsety i identyfikatory pozycji. Offset mówi, od którego miejsca narzędzie ma wznowić odczyt po awarii. Dzięki temu nie trzeba zaczynać całego procesu od początku, choć projekt powinien przewidywać obsługę duplikatów i ponowne przetwarzanie zdarzeń.

Co może zawierać zdarzenie CDC

Typowy komunikat opisuje tabelę, typ operacji, klucz główny, czas lub pozycję w logu oraz dane rekordu. Przykładowa struktura może wyglądać tak:

{
  "operation": "UPDATE",
  "table": "orders",
  "key": 1842,
  "before": {"status": "new"},
  "after": {"status": "shipped"}
}

Nie każda implementacja używa dokładnie takiego formatu. Czasem otrzymasz wyłącznie wartości po zmianie, a czasem osobne zdarzenia dla stanu przed i po aktualizacji. Przed wyborem narzędzia sprawdzam przede wszystkim, czy zachowuje kolejność zdarzeń, jak traktuje usunięcia i czy pozwala wznowić pracę po błędzie.

Metody CDC i ich najważniejsze różnice

Nie istnieje jeden uniwersalny sposób przechwytywania zmian. Wybór zależy od silnika bazy, wymagań dotyczących opóźnienia, uprawnień i skali danych. W praktyce najczęściej spotykam cztery podejścia.

Metoda Jak działa Największa zaleta Ograniczenie
Log-based CDC Odczytuje log transakcyjny bazy Niskie obciążenie tabel źródłowych Wymaga wsparcia konkretnego silnika
Trigger-based CDC Trigger kopiuje zmianę do tabeli pomocniczej Może działać w wielu bazach Dodaje koszt do operacji INSERT, UPDATE i DELETE
Timestamp lub wersja Zapytanie wybiera rekordy zmienione po danym czasie Prosta implementacja Łatwo przeoczyć usunięcia i zmiany o tej samej wartości czasu
Snapshot System cyklicznie porównuje pełne kopie danych Nie wymaga specjalnych funkcji CDC Duży transfer i koszt obliczeń

Najczęściej wybrałbym CDC oparte na logu, gdy baza i infrastruktura je wspierają. Trigger bywa rozsądnym rozwiązaniem w mniejszym systemie, ale trzeba pamiętać, że każda zmiana zapisuje wtedy dodatkowy rekord. Proste pole updated_at jest użyteczne przy nieskomplikowanych integracjach, lecz nie daje takiej pewności jak odczyt logu, zwłaszcza gdy system pozwala usuwać dane.

CDC a Change Tracking i audyt

Te pojęcia bywają mylone. Change Tracking zwykle odpowiada na pytanie, które rekordy zmieniły się od ostatniego odczytu, ale nie musi przechowywać pełnych wartości przed i po zmianie. CDC przekazuje bardziej szczegółowe zdarzenia, natomiast audyt skupia się na tym, kto, kiedy i z jakiego powodu wykonał operację.

CDC nie jest też kopią zapasową. Dane o zmianach często są przechowywane tylko przez określony czas, na przykład kilka dni lub tygodni, zależnie od konfiguracji retencji. Jeżeli potrzebuję dowodu zgodności lub pełnej historii działań użytkowników, projektuję osobny mechanizm audytowy.

Do czego wykorzystuje się Change Data Capture

Największą wartość CDC widać tam, gdzie dane muszą być regularnie synchronizowane, ale pełny eksport jest zbyt wolny lub kosztowny. Mechanizm nie służy wyłącznie dużym firmom. Ma sens także w mniejszej aplikacji, jeśli kilka usług korzysta z tego samego źródła danych.

Hurtownie danych i procesy ETL

Proces ETL może pobierać wyłącznie nowe i zmienione rekordy, a potem aktualizować model analityczny. Zmniejsza to liczbę zapytań i ilość przesyłanych danych. Przy dużych tabelach różnica między pełnym ładowaniem a przetwarzaniem zmian może oznaczać skrócenie procesu z wielu godzin do kilku minut, ale konkretny efekt zależy od wolumenu i konfiguracji.

Integracja mikroserwisów

CDC pozwala reagować na zdarzenia w bazie bez dodawania bezpośrednich wywołań między wszystkimi usługami. Zmiana statusu płatności może uruchomić aktualizację zamówienia, wysyłkę powiadomienia i zmianę danych w systemie magazynowym. Trzeba jednak pilnować, aby odbiorcy nie uzależnili się od przypadkowej kolejności zdarzeń, której źródło nie gwarantuje.

Przeczytaj również: MySQL vs MariaDB - Porównanie i wybór na dziś. Co wybrać?

Replikacja i migracja danych

Podczas migracji można wykonać początkowy snapshot, a potem przesyłać bieżące zmiany. Dzięki temu system docelowy nadrabia różnicę bez długiego wyłączania aplikacji. To praktyczny scenariusz, w którym snapshot i strumień zmian uzupełniają się, zamiast konkurować.

CDC w SQL Server i PostgreSQL

W SQL Server funkcja CDC zapisuje zmiany w tabelach systemowych i korzysta z zadań agenta do ich przechwytywania oraz czyszczenia. Po włączeniu mechanizmu dla bazy i wybranej tabeli można odczytywać tabelę zmian, której nazwa zwykle kończy się sufiksem _CT.

EXEC sys.sp_cdc_enable_db;
GO

EXEC sys.sp_cdc_enable_table
    @source_schema = N'dbo',
    @source_name = N'orders',
    @role_name = NULL;
GO

SELECT
    __$operation,
    __$start_lsn,
    order_id,
    status
FROM cdc.dbo_orders_CT;

Kolumna __$operation opisuje typ zmiany. W typowej konfiguracji wartość 2 oznacza INSERT, 3 stan przed aktualizacją, 4 stan po aktualizacji, a 1 usunięcie. Przed wdrożeniem sprawdziłbym także retencję i działanie SQL Server Agent, bo zatrzymane zadanie może spowodować narastanie logu lub opóźnienia w strumieniu.

PostgreSQL realizuje podobny cel przez logical decoding, czyli odczytywanie logicznych zmian z dziennika WAL. Narzędzia takie jak Debezium korzystają z replikacji logicznej i slotów replikacyjnych, a zakres tabel można ograniczyć między innymi za pomocą publikacji.

CREATE PUBLICATION app_publication
FOR TABLE public.orders;

W PostgreSQL trzeba uważać na slot replikacyjny. Jeśli konsument przestanie odbierać zdarzenia, baza może przechowywać coraz więcej danych potrzebnych do wznowienia odczytu. To jeden z tych szczegółów, które na początku łatwo przeoczyć, a później mogą realnie zająć przestrzeń dyskową.

Jak zaplanować wdrożenie bez przykrych niespodzianek

Sam fakt, że baza obsługuje CDC, nie oznacza jeszcze gotowej integracji. Najpierw ustalam, jakie tabele i kolumny są potrzebne, jak szybko odbiorca ma reagować oraz co ma się stać po przerwie trwającej godzinę albo dobę. Opóźnienie, retencja i możliwość wznowienia są ważniejsze niż efektowny diagram architektury.

  • Zdefiniuj zakres tabel i kolumn objętych przechwytywaniem.
  • Ustal, czy odbiorca potrzebuje wartości przed zmianą, po zmianie, czy obu.
  • Zaprojektuj początkowy snapshot oraz sposób przejścia na bieżący strumień.
  • Dodaj monitoring opóźnienia, liczby błędów i rozmiaru logu lub slotu.
  • Zapewnij idempotencję, czyli bezpieczne ponowne przetworzenie tego samego zdarzenia.
  • Ogranicz uprawnienia procesu CDC do niezbędnego minimum.

Najczęstszy błąd polega na traktowaniu zdarzeń jak zwykłych rekordów do jednorazowego importu. W systemach rozproszonych wiadomość może dotrzeć ponownie albo chwilowo pojawić się poza kolejnością. Odbiorca powinien mieć unikalny identyfikator zdarzenia, kontrolę wersji rekordu i procedurę obsługi sytuacji, w której zmiana nie może zostać zastosowana.

Trzeba też określić, co dzieje się z usunięciami. Jeżeli proces ignoruje zdarzenia DELETE, system docelowy będzie z czasem zawierał rekordy, których nie ma już w bazie źródłowej. To klasyczny przykład pozornie działającej synchronizacji, która po kilku tygodniach zaczyna pokazywać nieaktualne dane.

Kiedy CDC nie będzie najlepszym wyborem

Jeżeli tabela ma kilkaset rekordów, a synchronizacja uruchamia się raz dziennie, pełny eksport może być prostszy i wystarczający. Włączanie log-based CDC tylko dlatego, że jest nowoczesne, zwiększa liczbę komponentów, uprawnień i punktów monitorowania. Prostota też jest cechą dobrej architektury.

CDC może nie pasować również wtedy, gdy potrzebujesz ścisłego audytu użytkowników, ale mechanizm rejestruje wyłącznie zmianę danych bez informacji o osobie wykonującej operację. W takim przypadku lepszy będzie audyt aplikacyjny lub dedykowana tabela historii. Z kolei przy bardzo dużym strumieniu zmian trzeba zaplanować pojemność brokera, równoległe przetwarzanie i politykę przechowywania zdarzeń.

Nie zakładałbym również, że CDC zapewnia zerowe opóźnienie. W praktyce mówimy zwykle o przetwarzaniu prawie rzeczywistym, a opóźnienie może wynosić od milisekund do minut. Zależy ono od obciążenia bazy, konfiguracji konektora, sieci i szybkości konsumenta.

Co zapamiętać przed pierwszym użyciem CDC

Najkrócej mówiąc, Change Data Capture rejestruje zmiany zamiast całych danych i przekazuje je dalej w formie, którą mogą wykorzystać inne systemy. Najlepiej sprawdza się przy synchronizacji hurtowni, replikacji, migracjach i komunikacji między usługami.

Przed wdrożeniem wybrałbym metodę dopasowaną do silnika bazy, sprawdził obsługę usunięć i aktualizacji, a także przetestował odtwarzanie po awarii. Dobrze skonfigurowane CDC nie powinno być widoczne dla użytkownika aplikacji, ale bardzo wyraźnie poprawia świeżość danych i ogranicza koszt ich przesyłania.

FAQ - Najczęstsze pytania

Change Tracking wskazuje zwykle, które rekordy zmieniły się od ostatniego odczytu, ale nie musi przechowywać pełnych wartości przed i po zmianie. CDC przekazuje bardziej szczegółowe zdarzenia, natomiast audyt rejestruje między innymi to, kto, kiedy i z jakiego powodu wykonał operację.

Najczęściej najlepszym wyborem jest CDC oparte na logu transakcyjnym, jeśli dany silnik bazy i infrastruktura je wspierają. Taka metoda ogranicza obciążenie tabel źródłowych. Triggery mogą działać w wielu bazach, ale zwiększają koszt operacji INSERT, UPDATE i DELETE.

Najpierw wykonuje się początkowy snapshot, a następnie przesyła bieżące zmiany. System docelowy nadrabia różnicę między snapshotem a aktualnym stanem bez długiego wyłączania aplikacji. Trzeba także zaplanować offsety, wznowienie po awarii i obsługę duplikatów.

PostgreSQL korzysta z logical decoding i replikacji logicznej, a narzędzia takie jak Debezium używają slotów replikacyjnych. Jeśli konsument przestanie odbierać zdarzenia, slot może powodować przechowywanie coraz większej ilości danych potrzebnych do wznowienia odczytu, co zajmuje przestrzeń dyskową.

Oceń artykuł

Ocena: 0.00 Liczba głosów: 0

Tagi

cdc
mikroserwisy
log transakcyjny
replikacja logiczna
hurtownie danych
Autor Tymoteusz Kowalski
Tymoteusz Kowalski
Nazywam się Tymoteusz Kowalski i od 7 lat zajmuję się programowaniem, ze szczególnym uwzględnieniem Pythona oraz nowoczesnych technologii. Moja przygoda z programowaniem zaczęła się od fascynacji możliwościami, jakie daje kod, a z czasem przerodziła się w pasję do dzielenia się wiedzą i pomagania innym w zrozumieniu złożonych zagadnień. Interesuje mnie, jak można uprościć trudne tematy, aby były bardziej przystępne dla każdego, niezależnie od poziomu zaawansowania. W moich tekstach staram się dostarczać rzetelne, aktualne i zrozumiałe informacje, a także porównywać różne źródła, aby zapewnić czytelnikom szeroki kontekst. Piszę o praktycznych zastosowaniach Pythona, nowinkach technologicznych oraz najlepszych praktykach programistycznych. Moim celem jest nie tylko przedstawienie teorii, ale także pokazanie, jak można ją zastosować w praktyce, co mam nadzieję, uczyni moją twórczość użyteczną dla każdego, kto pragnie rozwijać swoje umiejętności w programowaniu.

Udostępnij artykuł

Napisz komentarz