Oracle logminer 读取 redol og

SCN

System Change Number. A database ordering primitive. The value of an SCN is the logical point in time at which changes are made to a database.
SCN 是 Oracle 使用的一种简单的计时机制,用于保证事务的顺序,并支持失败恢复。SCN 还用于保证数据库中的读一致性和检查点。SCN在正常操作下保证增加。不能保证数字是连续的(缺少数字),在下面的博客中提及。
https://www.red-gate.com/simple-talk/sql/oracle/oracle-system-change-number-an-introduction/

redo log Contents

redo log 内容包括更改向量描述表的数据段块,还原段数据块和还原段的事务处理表的更改
https://docs.oracle.com/database/122/ADMIN/managing-the-redo-log.htm#ADMIN007

note: 经过验证,rollback的语句会插入到redo log 文件中。

例:insert into t5 values('WW');
insert into t5 values('MM');
ROLLBACK;
UPDATE T5 SET NAME = 'AAA' WHERE NAME ='aa'
commit;

redo log的对应内容
SCN


OPERATION

SQL_REDO

insert into "HR"."T5"("NAME") values ('MM');
3050577
INSERT
insert into "HR"."T5"("NAME") values ('WW');
3050577
INSERT
3050628
DELETE
delete from "HR"."T5" where ROWID = 'AAAR4bAAEAAAKWtAAJ';
3050628
DELETE
delete from "HR"."T5" where ROWID = 'AAAR4bAAEAAAKWtAAI';
3050716
UPDATE
update "HR"."T5" set "NAME" = 'AAA' where "NAME" = 'aa' and ROWID = 'AAAR4bAAEAA
AKWtAAA';

exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);使用联机字典读取日志,添加的日志为当前日志(current),可以边操作边读取,如果大量操作发生导致日志切换,status 变为active/inactive ,日志的内容仍可以读取,直到日志的status再一次变为current,此时正在读的日志会被覆写。

如果使用重做日志数据字典,开启日志不关闭,数据库在日志开启的过程中进行其他操作时,redo_log会读取到开启logminer后的进行的操作

配置要求如下:ADD_LOGFILE需要添加所有的redo log 文件,如果EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_REDO_LOGS);

通过具体的SCN和DBMS_LOGMNR.CONTINUOUS_MINE读取redo log的内容,无论redo log的状态是什么(active/curran/inactive) 甚至是scn已经归档复写了,都可以读取redo log的内容。

EXECUTE DBMS_LOGMNR.START_LOGMNR(STARTSCN => 3018376, ENDSCN => 3060446, OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINUOUS_MINE);
options选项加上DBMS_LOGMNR.CONTINUOUS_MINE,就不用指定具体的log文件,log miner会通过控制文件自动确定并添加要分析的log文件
必须处于归档模式,而且归档的日志文件以被移走会报错ORA-01291: missing logfile)

如果EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_REDO_LOGS);ADD_LOGFILE需要添加多个的redo log 文件,否则会报错。根据字典文件的大小不同,它可能包含在一个或多个log文件中,在进行日志分析时,也就需要将这些字典文件所在的log文件包含在分析日志列表中。

ERROR at line 1:
ORA-01371: Complete LogMiner dictionary not found
ORA-06512: at "SYS.DBMS_LOGMNR", line 58
ORA-06512: at line 1

redo log

-必要配置

  1. 启用归档日志(cdb$root)
  2. 启用补充日志(CDB$ROOT)
  3. 查询是否包含lobminer包

archive log list -- 没有归档日志,启用归档日志,要cdb$root 容器下启用
Shutdown immediate
Startup mount
alter database archivelog;
Alter database open;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;--必须在cdb下启用,然后pdb就自动启用,启用补充日志(CDB$ROOT)
select * from dba_objects where object_type='PACKAGE' and object_name LIKE '%LOGMNR%';--查看dbms_logmnr、dbms_logmnr_d包

-logminer 配置

logminer系统视图

select group#,status,type,member from v$logfile -- 查看日志文件组路径/u01/app/oracle/oradata/orcl/redo03.log
select group#,status,first_change# ,next_change# from v$log ---- 查看日志文件组

开启日志分析的三种方法的比较

  • DBMS_LOGMNR_D.STORE_IN_FLAT_FILE:将数据字典提取到一个平面数据字典文件,当字典文件为文本文件,和包含在redo logs的日志文件相比,占用更少的系统资源。

  • mkdir LOGMNR
    create directory utlfile as '/u01/app/oracle/oradata/orcl/LOGMNR';
    EXECUTE dbms_logmnr_d.build(dictionary_location=>'my_dictionary_dir', dictionary_filename =>'dictionary.ora',options =>dbms_logmnr_d.store_in_flat_file);

  • DBMS_LOGMNR_D.STORE_IN_REDO_LOGS:将数据字典提取到重做日志文件,数据库必须打开并且ARCHIVELOG模式下必须启用归档,当数据字典文件生成到日志文件过程中,任何的DDL操作是不允许的。 提取字典文件到日志文件中占用数据库资源,但是你把这个提取操作限制在非高峰时期,那么这就不是个问题了。而且该操作要比把字典生成到文本文件中要快。根据字典文件的大小的不同,可能该字典包含多个日志文件。加入日志已经归档,我们通过查询视图而得知字典文件的开始和结束日志序号。
    EXECUTE DBMS_LOGMNR_D.BUILD( OPTIONS => DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);

SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN= 'YES';
SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_END='YES';
最后就是建议能够定期备份该字典文件。

  • DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG:使用当前的数据库的联机数据字典(只能分析当前数据库的重做日志文件,此时就不需要平面字典文件),使用在线目录来分析在线重做日志文件,您可以使用它来分析存档的重做日志文件,如果您位于生成归档重做日志文件的同一系统上.联机目录包含了大量的数据库信息,也是一种最快的分析数据库日志的方法。因为DDL语句对数据库对象的改变在日志中只有很少的记录,因此日志挖掘中只提供少量的分析信息。使用联机目录分析,只能挖掘最近的数据库对象的信息,而对以前的老的对象,或者是归档日志中的对象目前已经不存在或者改变的,只有使用以前的方法去分析。使用前两种方法分析的前提是:含有以前提取的数据字典文件的备份。
    EXECUTE DBMS_LOGMNR.START_LOGMNR (OPTIONS=>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);

数据字典提取到重做日志文件

redo_log字典
提取数据字典文件

  1. alter pluggable database all open;

  2. EXECUTE DBMS_LOGMNR_D.BUILD(options => DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);

  3. 指定LogMiner要分析的重做日志文件
    EXECUTE DBMS_LOGMNR.ADD_LOGFILE('/u01/app/oracle/oradata/orcl/redo03.log',options=>dbms_logmnr.NEW);
    EXECUTE DBMS_LOGMNR.ADD_LOGFILE('/u01/app/oracle/oradata/orcl/redo02.log',options=>dbms_logmnr.ADDFILE);
    EXECUTE DBMS_LOGMNR.ADD_LOGFILE('/u01/app/oracle/oradata/orcl/redo03.log',options=>dbms_logmnr.ADDFILE);

  4. alter session set nls_date_format='dd-mm-yyyy hh24:mi:ss';

  5. SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_REDO_LOGS);

  6. 查看结果
      SQL> SELECT * FROM V$LOGMNR_LOGFILE;
      SQL> select t.scn,t.operation,t.sql_redo from v$logmnr_contents t where t.table_name='DULIYAN';

  7. 结束LogMiner会话
      SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR;

或者设定时间
EXECUTE DBMS_LOGMNR.START_LOGMNR(STARTTIME => '09-11-2017 08:30:00', ENDTIME => '09-11-2017 15:55:00', OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINUOUS_MINE);

EXECUTE DBMS_LOGMNR.START_LOGMNR(STARTSCN => 3489525, ENDSCN => 3489535, OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINUOUS_MINE);

如果在源数据库上进行log miner时,也可以通过starttime\endtime或startscn\endscn界定分析范围并options选项加上DBMS_LOGMNR.CONTINUOUS_MINE,就不用指定具体的log文件,log miner会通过控制文件自动确定并添加要分析的log文件
必须处于归档模式,而且归档的日志文件以被移走会报错ORA-01291: missing logfile)

查看归档日志

Select name, sequence#, first_change# FROM v$archived_log;--scn 对应的归档日志
/u01/app/oracle/product/12.1.0/db_1/dbs/arch1_37_955651645.dbf

EXECUTE DBMS_LOGMNR.ADD_LOGFILE('/u01/app/oracle/product/12.1.0/db_1/dbs/arch1_37_955651645.dbf',options=>dbms_logmnr.NEW);

exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);

exec dbms_logmnr.end_logmnr;

Logmnr运行的数据库的字符集要与产生日志的数据库字符集一致,logmnr日志分析过程中需要的字典文件需要从生成日志文件的数据库中生成。如果数据字典是文本文件(flat file)或者数据字典是保存在联机日志中的,那么我们将要分析的日志文件可以为:运行logmnr数据库的日志文件,也可以是来自于其它数据库的日志文件。如果使用联机目录(online catalog)作为logmnr的数据字典,那么我们只能分析来自运行logmnr数据库的日志文件。Logmnr运行的硬件平台需要与分析日志产生的运行平台需要一致,但是他们并不需要相同的系统。查看当前正在被分析的日志通过视图:v$logmnr_logs视图查看。
无论数据字典文件生成平面文件日志还是redo日志的数据字典的过程中,任何的DDL操作是不允许。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容