查看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服务器需根据配置调整操作。