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
-必要配置
- 启用归档日志(cdb$root)
- 启用补充日志(CDB$ROOT)
- 查询是否包含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字典
提取数据字典文件
alter pluggable database all open;
EXECUTE DBMS_LOGMNR_D.BUILD(options => DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
指定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);alter session set nls_date_format='dd-mm-yyyy hh24:mi:ss';
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_REDO_LOGS);
查看结果
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';结束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操作是不允许。