利用Logmnr实现Oracle增量订阅

查看Oracle归档状态

docker exec -it oracle /bin/bash
# 登陆数据库
sqlplus
# 查看归档状态
archive log list;

在这里插入图片描述
在这里插入图片描述

开启Oracle归档

-- 关闭数据库
shutdown immediate;
-- 启动数据库至mount状态
startup mount;
alter database archivelog;
alter database open;
archive log list;

在这里插入图片描述

开启附加日志

如果未开启附加日志则无法记录增量记录。

# 表级别开启附加日志
alter table 用户名.表名 add supplemental log data(all) columns;
# 库级别开启附加日志
alter database add supplemental log data(all) columns;
alter database add supplemental log data;

使用LOGMNR查看增量数据

此处使用的解析字典是在线解析字典,可省略多个操作步骤。

获取要解析的日志文件

select member from v$logfile;

在这里插入图片描述

此处也可只获取当前日志文件,但可能存在增量分布不均导致获取增量丢失的情况。

SQL> SELECT member from v$logfile where group# = (SELECT group# as g FROM v$log  where status = 'CURRENT');

添加日志文件

添加的第一个日志文件需使用options=>dbms_logmnr.NEW,后续日志文件使用options=>dbms_logmnr.ADDFILE

SQL>EXEC dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/oradata/xe/redo03.log',options=>dbms_logmnr.NEW);
SQL>EXEC dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/oradata/xe/redo02.log',options=>dbms_logmnr.ADDFILE);
SQL>EXEC dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/oradata/xe/redo01.log',options=>dbms_logmnr.ADDFILE);

启动日志解析

当前scn可通过select current_scn from v$database获取,也可以从查询到的增量记录数中获取。

SQL> EXEC dbms_logmnr.start_logmnr(options=>dbms_logmnr.DICT_FROM_ONLINE_CATALOG, startScn=>xxxx, endScn=>xxxx);

读取增量记录

-- seg_name为表名,sql_redo为增量记录的原生SQL语句
SQL> SELECT seg_name, operation, sql_redo, timestamp, scn FROM v$logmnr_contents WHERE seg_owner = ‘xxxx’ and operation in ('UPDATE', 'DELETE', 'INSERT');

关闭增量解析

SQL> EXEC dbms_logmnr.end_logmnr;

上述操作均基于Oracle容器,实际Oracle服务器需根据配置调整操作。

猜你喜欢

转载自blog.csdn.net/Loiterer_Y/article/details/123811949