DBAtlas · 数据库运维图谱

变更跟踪(CDC / change tracking)

Oracle

-- Read changes from redo logs with LogMiner:
-- 1) Add the archived/redo log file to analyze:
EXECUTE DBMS_LOGMNR.ADD_LOGFILE(
  LOGFILENAME => '/u01/arch/1_1234_1122334455.arc',
  OPTIONS => DBMS_LOGMNR.NEW);
-- 2) Start the session:
EXECUTE DBMS_LOGMNR.START_LOGMNR(
  OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
SELECT sql_redo, sql_undo FROM V$LOGMNR_CONTENTS
WHERE seg_name = 'ORDERS';
-- 3) When finished: EXECUTE DBMS_LOGMNR.END_LOGMNR;
-- For enterprise CDC/replication, Oracle GoldenGate is used.

Oracle 基于重做日志进行变更跟踪。LogMiner 将重做日志/归档日志转换为 SQL 以检查历史 DML;需分析的日志文件通过 DBMS_LOGMNR.ADD_LOGFILE 添加。要获得有意义的结果,至少必须启用最小补充日志(ALTER DATABASE ADD SUPPLEMENTAL LOG DATA)。对于持续、低延迟的 CDC 和异构复制,Oracle GoldenGate(单独产品)是标准方案;旧的 Streams/Change Data Capture 功能已弃用。

PostgreSQL

-- Create a logical replication (logical decoding) slot:
SELECT * FROM pg_create_logical_replication_slot(
  'cdc_slot', 'wal2json');
-- Consume changes as JSON:
SELECT data FROM pg_logical_slot_get_changes('cdc_slot', NULL, NULL);

PostgreSQL 逻辑解码通过输出插件(wal2json、pgoutput、test_decoding)将 WAL 记录转换为可读的变更流;复制槽确保变更不会丢失。wal_level 必须为 logical。Debezium 利用该机制提供企业级 CDC。

MySQL

-- The row-based binlog is the CDC source (binlog_format=ROW):
SHOW BINARY LOGS;
SHOW BINLOG EVENTS IN 'binlog.000042';
-- Usually Debezium/Maxwell reads the binlog and turns it into a stream.

在 MySQL 中,CDC 的来源是二进制日志。使用 binlog_format=ROW 时会记录每一行变更。Debezium 或 Maxwell 等工具像副本一样读取 binlog,并向 Kafka 生成事件流。启用 GTID 可简化可靠的位点跟踪。

SQL Server

-- Enable Change Data Capture on the database and the table:
EXEC sys.sp_cdc_enable_db;
EXEC sys.sp_cdc_enable_table
  @source_schema = N'dbo', @source_name = N'orders',
  @role_name = NULL;
-- For lightweight tracking: ALTER DATABASE ... SET CHANGE_TRACKING = ON;

SQL Server 提供两种机制:变更数据捕获(CDC)将事务日志中的所有 DML(包含旧值/新值)写入变更表,需要 SQL Server Agent。更改跟踪(Change Tracking)只轻量地跟踪哪些行发生了变化(净变更),不保留完整的数据历史。

MongoDB

// Watch changes in real time with Change Streams:
const stream = db.orders.watch([
  { $match: { operationType: { $in: ["insert", "update"] } } }
]);
while (stream.hasNext()) { printjson(stream.next()); }

基于 oplog 的 MongoDB Change Streams 以实时流的形式在集合/数据库/集群级别传递 insert、update 和 delete 事件。需要副本集或分片集群。借助 resumeToken,流在中断后可从中断处恢复;它是 CDC 集成的基础。

Redis

# Listen for key changes with keyspace notifications:
CONFIG SET notify-keyspace-events KEA
# Subscribe to changed keys via Pub/Sub:
PSUBSCRIBE __keyevent@0__:set
PSUBSCRIBE __keyevent@0__:expired

Redis keyspace 通知通过 Pub/Sub 频道发布键上的事件(SET、DEL、EXPIRE 等);通过 notify-keyspace-events 设置启用(K=keyspace,E=keyevent,A=所有事件)。若需要可靠、持久的变更流,推荐使用 Redis Streams(XADD/XREAD)。

Elasticsearch

-- Not applicable: there is no built-in CDC/change stream.
# Closest equivalent: incremental query on a timestamp field:
GET orders/_search
{ "query": { "range": { "updated_ts": { "gt": "2026-07-05T00:00:00" } } },
  "sort": [ { "updated_ts": "asc" } ] }

Elasticsearch 不提供变更数据捕获(CDC)流;它不会原生发布文档何时发生了变化。常见做法是为每个文档添加 updated_ts 字段,并按时间戳执行增量查询(range + sort)。通常是将源数据库的 CDC 输送到 Elasticsearch。

在 DBAtlas 中打开 →