1 配置源数据库
1.1 查看是否开启归档
使用如下语句查询RLOG_APPEND_LOGIC和ARCH_INI是否为1,保证数据库已开启归档模式:
select para_name, para_value from v$dm_ini where para_name in ('ARCH_INI','RLOG_APPEND_LOGIC');
1.2 修改dm.ini参数
设置RLOG_APPEND_LOGIC=1
alter system set 'RLOG_APPEND_LOGIC'=1 both;
1.3 配置归档
alter database mount;
alter database add archivelog 'dest=/dmarch,type=local,file_size=500,space_limit=10240';
alter database archivelog;
alter database open;
1.4验证结果
2 源数据库模拟数据操作
2.1 创建表
在HR用户下创建T_LOG_TEST表,并插入表数据,使用一条UPDATE语句更新数据。SQL语句参考如下:
a. 创建用户
create user HR identified by "HR1234567";
grant dba to HR;
b. 创建表(当创建表时候,选择写好脚本,模拟数据和直接执行dml语句模拟数据,挖掘的日志有区别的,详细见下文,模拟环境是用脚本模拟数据)
CREATE TABLE HR.T_LOG_TEST (ID INT,NAME VARCHAR(50)) ;
INSERT INTO HR.T_LOG_TEST VALUES(1,'LIMING');
INSERT INTO HR.T_LOG_TEST VALUES(2,'DAMENG');
INSERT INTO HR.T_LOG_TEST VALUES(3,'TEST');
INSERT INTO HR.T_LOG_TEST VALUES(4,'HANMEIMEI');
INSERT INTO HR.T_LOG_TEST VALUES(5,'DAIWEI');
INSERT INTO HR.T_LOG_TEST VALUES(6,'JACK');
UPDATE HR.T_LOG_TEST SET ID = ID + 10 WHERE ID <10;
COMMIT;
2.2 切换归档
alter system archive log current;
2.3 创建表空间及用户
执行如下命令创建表空间LOGTEST.DBF,用户LOGTEST,并赋予LOGTEST用户查询T_LOG_TEST表权限。
2.4 切换归档
alter system archive log current;
2.5 查看归档,执行如下sql:
select sequence# seq, name , to_char(first_time,'yyyy-mm-dd hh24:mi:ss') first_time, to_char(next_time,'yyyy-mm-dd hh24:mi:ss') next_time, first_change# , next_change# from v$archived_log;
3 配置本地数据库
3.1 修改dm.ini参数和配置归档
3.2 查询魔数
SELECT DB_MAGIC FROM V$RLOG;
3.3 下载源端归档日志到本地(不要使用xftp下载,会损坏日志)
3.4 修改归档日志魔数(依次修改三个归档日志魔数)
dmmdf.exe TYPE=2 FILE="D:\dmdbms\arch\ARCHIVE_LOCAL1_0x7D58A8BD[0]_2020-11-27_20-53-16.log"
dmmdf.exe TYPE=2 FILE="D:\dmdbms\arch\ARCHIVE_LOCAL1_0x7D58A8BD[0]_2020-11-27_21-00-45.log"
dmmdf.exe TYPE=2 FILE="D:\dmdbms\arch\ARCHIVE_LOCAL1_0x7D58A8BD[0]_2020-11-27_21-02-56.log"
PS D:\dmdbms\bin> dmmdf.exe TYPE=2 FILE="D:\dmdbms\arch\ARCHIVE_LOCAL1_0x7D58A8BD[0]_2020-11-27_20-53-16.log"
dmmdf V8
**********************************************************
1 sig = DMALOG
2 ver = 7006
3 chksum = 1448588121
4 sta = 1
5 n_magic = 0
6 db_magic = 2102962365
7 len = 273920
8 free = 273920
9 clsn = 40483
10 clsn_fil = 0
11 clsn_off = 4096
12 pemnt_magic = 22286092
13 fil_id = 0
15 next_seq = 3985
16 g_next_seq = 3985
17 arch_lsn = 37931
18 arch_seq = 3971
19 dbversion = 0x7000b
20 min_exec_version = V8.1.1.1
21 min_dct_version = 4
22 p_db_magic = 0
23 n_apply_ep = 0
24 apply_info_lsn = 0
pkg_seq_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
apply_lsn_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
25 recv_p_db_magic = 0
26 recv_n_apply_ep = 0
recv_pkg_seq_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
recv_apply_lsn_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
**********************************************************
You can only reset sta(4) or db_magic (6) or clsn (9) or clsn_fil(10) or clsn_off(11) or pemnt_magic(12) or fil_id(13) or next_seq(15) or g_next_seq(16) or p_db_magic(20) or n_apply_ep(21).
Please input the num which one you want to change, q to quit: 6
+++++++++++++++--db_magic值编号为6因此这里输入6++++++++++++++++
Input the new value: 1021174950
+++++++++++++++填写本地库的db_magic值+++++++++++++++++++++++++
**********************************************************
1 sig = DMALOG
2 ver = 7006
3 chksum = 399703874
4 sta = 1
5 n_magic = 0
6 db_magic = 1021174950
7 len = 273920
8 free = 273920
9 clsn = 40483
10 clsn_fil = 0
11 clsn_off = 4096
12 pemnt_magic = 22286092
13 fil_id = 0
15 next_seq = 3985
16 g_next_seq = 3985
17 arch_lsn = 37931
18 arch_seq = 3971
19 dbversion = 0x7000b
20 min_exec_version = V8.1.1.1
21 min_dct_version = 4
22 p_db_magic = 0
23 n_apply_ep = 0
24 apply_info_lsn = 0
pkg_seq_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
apply_lsn_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
25 recv_p_db_magic = 0
26 recv_n_apply_ep = 0
recv_pkg_seq_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
recv_apply_lsn_arr: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
**********************************************************
Do you want to quit and save the change to file (y/n): y -------保存
Save to file success!
3.5 添加归档日志文件到本地库
源数据库模拟数据操作在两个最新的归档日志中,所以此时添加最新的三个归档日志进行分析
DBMS_LOGMNR.ADD_LOGFILE('D:\dmdbms\arch\ARCHIVE_LOCAL1_0x7D58A8BD[0]_2020-11-27_20-53-16.log');
DBMS_LOGMNR.ADD_LOGFILE('D:\dmdbms\arch\ARCHIVE_LOCAL1_0x7D58A8BD[0]_2020-11-27_21-00-45.log');
DBMS_LOGMNR.ADD_LOGFILE('D:\dmdbms\arch\ARCHIVE_LOCAL1_0x7D58A8BD[0]_2020-11-27_21-02-56.log');
3.6 查询归档信息
可以通过动态视图V$LOGMNR_LOGS查询 ADD_LOGFILE 添加的归档日志文件信息,查询结果如下:
select low_scn, next_scn, low_time, high_time, log_id, filename from v$logmnr_logs;
3.7 启动归档日志文件分析
执行ADD_LOGFILE添加日志文件后,需要调用START_LOGMNR过程启动归档日志分析,在调用时可指定START_SCN, END_SCN, START_DATE, END_DATE, OPTIONS等参数。
时间参数值可根据V$LOGMNR_LOGS中LOW_TIME和HIGH_TIME或者实际业务场景指定范围;SCN可参考V$LOGMNR_LOGS视图中LOW_SCN和NEXT_SCN来指定。
OPTIONS参数参考如下表所列的可选模式,各模式可以通过 + 或者按位或来进行组合。其它位的值如 1、4、8 等目前不支持,配置后不会报错,但是没有效果。例如,组合全部模式,则取值2+16+64+2048=2130,那么 OPTIONS 值就是 2130。一个会话上仅能START一个LOGMNR,即只能执行一次START_LOGMNR,若要重新START需要执行终止操作,见步骤6。这里以不指定时间范围和SCN范围为例,启动所有添加的归档日志文件的分析,语句参考如下(OPTIONS=2066是2+16+2048的组合):
DBMS_LOGMNR.START_LOGMNR(OPTIONS=>2066);
4. 查看归档日志文件分析结果
4.1 查看日志分析过程
select * from V$LOGMNR_PARAMETERS;
4.2 查看分析结果
执行START_LOGMNR后,可以通过动态视图V$LOGMNR_CONTENTS查看归档日志文件的分析结果,语句如下:
SELECT OPERATION_CODE , OPERATION, SCN, SQL_REDO, TIMESTAMP ,SEG_OWNER, TABLE_NAME FROM V$LOGMNR_CONTENTS WHERE TABLE_NAME is not null;
查询结果如下图,从SQL_REDO字段中可以看出包含了我们步骤2中执行的所有操作。
终止归档日志文件分析
归档日志分析完毕后,执行如下语句结束归档日志分析
DBMS_LOGMNR.END_LOGMNR();
执行该语句后查询V$LOGMNR_LOGS和V$LOGMNR_PARAMETERS将不会有数据,此时查询V$LOGMNR_CONTENTS也会报错。此3个动态性能视图都是会话级别,其他会话无法查询该视图数据。到此一个完整的日志挖掘分析步骤已完成,如果要重新启动归档日志的分析,需要执行此步骤后,重新执行3.4-3.7步操作。若在添加文件ADD_LOGFILE之后,想移除对该文件的分析,在执行START_LOGMNR之前,可执行REMOVE_LOGFILE删除此文件;若已经执行了START_LOGMNR,则需执行END_LOGMNR结束本次分析才能开启下一次分析操作。
5 注意
1. 做日志挖掘时候,始终用同一个会话创空执行sql,这样才会成功;
2.挖掘结果,只能挖掘单个sql执行的记录,当使用脚本执行批量作业时候,只记录脚本第一条。