基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
使用 Logminer 拉取 Oracle 数据库的数据
更新时间:2026-08-11 09:11
本文为您介绍如何使用 Logminer 拉取 Oracle 数据库的变更数据。
适用版本
适用于 OceanBase 迁移服务(OceanBase Migration Service,OMS)V3.3.0 及之后版本。
使用场景
Oralce Store 是利用 Oracle 数据库自带的 Logminer 工具进行增量采集,运行过程中由于一些未知的原因,产生数据质量问题时,需要排查是否是 Logminer 自身的问题导致。此时,需要到 Oracle Server 上手动的进行日志挖取,用于排查问题。
拉取指定 ROWID 的日志文件
查询对应的归档日志文件
根据 ROWID 查询该条记录最后变更 SCN,该 SCN 不一定准,查出的是对应的 BLOCK 上的最后变更 SCN。如果能从业务数据中获得更准确的变更时间,则推荐使用业务数据的时间。
alter session set nls_timestamp_format='YYYY-MM-DD HH24:MI:SS'; select ora_rowscn from table_name where rowid= 'xxxxxxxxx'; select scn_to_timestamp(ora_rowscn)from table_name where rowid= 'xxxxxxxxx';查询指定时间或者 SCN 属于哪个归档。如果 Oracle 为 RAC 环境,下述 SQL 可能会查出来多条记录,则每个归档文件都需要进行分析。如果查询结果为空,说明归档日志已经被删除了,无法进行分析。
使用时间查询,例如查询时间为
2022-06-10 14:59:00:SELECT THREAD#, NAME FROM V$ARCHIVED_LOG WHERE NAME IS NOT NULL AND STATUS = 'A' AND DELETED = 'NO' AND ARCHIVED = 'YES' AND STANDBY_DEST = 'NO' AND FIRST_TIME <= TO_TIMESTAMP('2022-06-10 14:59:00','yyyy-MM-dd hh24:mi:ss') AND NEXT_TIME > TO_TIMESTAMP('2022-06-10 14:59:00','yyyy-MM-dd hh24:mi:ss');使用 SCN 查询,例如查询 SCN 为 2106626:
SELECT THREAD#,NAME FROM V$ARCHIVED_LOG WHERE NAME IS NOT NULL AND STATUS = 'A' AND DELETED = 'NO' AND ARCHIVED = 'YES' AND STANDBY_DEST = 'NO' AND FIRST_CHANGE# <= 2106626 AND NEXT_CHANGE# > 2106626;
使用 Logminer 分析归档日志
使用 Logminer 分析归档日志,用上面步骤中查出来的 NAME 替换下面 SQL 中的 logfilename,执行 SQL 进行日志分析。
ADG 主库和备库分别采用不同的分析 SQL,为了一次查询出更多的有效信息,您可以一次添加多组归档文件进行分析。建议一次添加 5 组日志文件进行分析。
ADG 主库:
begin sys.dbms_logmnr.add_logfile(logfilename=>'/oracle/archivedlog/filename1.arc',options=>sys.dbms_logmnr.new); sys.dbms_logmnr.add_logfile(logfilename=>'/oracle/archivedlog/filename2.arc',options=>sys.dbms_logmnr.addfile); sys.dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog); end; /ADG 备库:
begin sys.dbms_logmnr.add_logfile(logfilename=>'/oracle/archivedlog/filename1.arc',options=>sys.dbms_logmnr.NEW); sys.dbms_logmnr.add_logfile(logfilename=>'/oracle/archivedlog/filename2.arc',options=>sys.dbms_logmnr.addfile); sys.dbms_logmnr.start_logmnr(); end; /
根据 ROWID 从 Logminer 返回结果中查询事务 ID。如果有多条事务 ID,则需要对每个 XID 分别按照步骤 3 的方式进行查询,找出该 ROWID 的完整变更过程。
select XID from V$LOGMNR_CONTENTS where ROW_ID = 'AAASauAAEAAAAKGAAA' order by SCN desc;根据步骤 2 中的 XID 查询出事务完整的操作。如果查询对应的归档日志文件步骤中查出了多条结果,则每条结果都需要使用 Logminer 分析一遍,直到获取对应 ROWID 的变更记录。
select SCN, RBASQN, OPERATION, TABLE_NAME, SEG_OWNER, ROLLBACK, SEG_NAME, SEG_TYPE, TIMESTAMP, XID, ROW_ID, SQL_REDO from V$LOGMNR_CONTENTS where XID = 'xxxxxxxxxxxx';如果上面的 SQL 查询出的内容过多,不方便查看,您可以只查询一些重要的信息,以便排查问题。发现需要更多的信息时,再逐步增加。示例如下:
select OPERATION,TABLE_NAME, ROW_ID, ROLLBACK from V$LOGMNR_CONTENTS where XID = 'xxxxxxxxxxxx';
查询归档文件中的大事务表
根据上面的步骤使用 Logminer 分析归档文件。
找到归档文件中大事务的 XID,下面 SQL 会根据事务的记录数从大到小进行排序,排在前几个的就是大事务。
select XID, count(*) from V$LOGMNR_CONTENTS group by XID order by 2 desc;根据大事务的 XID 找到记录数最多的表。
select SEG_OWNER, SEG_NAME, COUNT(*) from V$LOGMNR_CONTENTS where XID='xxxx' group by SEG_OWNER, SEG_NAME order by 3 desc;