Logminer DDL变更场景测试

本文通过多个场景测试了Oracle Logminer在表结构变更时的数据字典影响,以及RMAN进行不完全恢复的能力。验证了表结构变更对数据字典的影响、Logminer解析效果,并展示了如何使用RMAN恢复到表结构变更前的状态。

一、Logminer字典解析测试

表结构变更与Logminer数据字典测试
测试目的:
1、验证表结构的变更是否会修改数据字典
2、某张表结构的变更是否只影响其本身的数据字典

1、开启最小附加日志

alter database add supplemental log data;

select SUPPLEMENTAL_LOG_DATA_ALL log_ALL,SUPPLEMENTAL_LOG_DATA_FK FK,SUPPLEMENTAL_LOG_DATA_MIN log_MIN,SUPPLEMENTAL_LOG_DATA_PK PK,SUPPLEMENTAL_LOG_DATA_UI UI from v$database;


ALL       FK        MIN                      PK     UI
--------- --------- ------------------------ --------- ---------
NO        NO        YES                       NO        NO

2、创建测试表EMP

create table emp(id number,name varchar2(20));

插入测试数据
insert into emp values(1,'a');
commit;

3、其他表TEST4插入测试数据

select * from test4;

no rows selected

insert into test4 values(1,'ok');
commit;

select * from test4;

        ID NAME
---------- ----------
         1 ok

4、修改表emp表结构,增加一数据列

alter table emp add sex varchar2(20);
insert into emp values(2,'b','man');
commit;

5、切换日志

alter system switch logfile;

6、解析日志

exec dbms_logmnr.add_logfile('/u01/arch/1_4_995726293.dbf',options=>dbms_logmnr.new);
 exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);

7、提取解析日志

 create table log_new2 as select * from v$logmnr_contents;


 select to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo from log_new2 where username='ADMIN' and table_name in ('EMP','TEST4')


exec dbms_logmnr.end_logmnr();

在这里插入图片描述

测试结论:
某张表结构发生变更之后,数据字典会被修改,使用logminer解析其他表的DML解析,无影响

##表删除测试
测试表被删除之后,前后DDL以及DML日志解析情况

1、创建表test

SQL> create table sales(id number,name varchar2(20));
08:57:31

2、插入一行测试数据

SQL> insert into sales values(1,'no1');
SQL> commit;
08:58:14

3、插入另外一张表测试数据

SQL> insert into new values(2,'no2');
SQL> commit;
08:58:34 

4、删除测试表

SQL> drop table sales;
08:58:47

5、重新创建测试表

SQL> create table sales(id number,name varchar2(20));
08:58:57

6、重新插入测试表

SQL> insert into sales values(3,'no3');
SQL> commit;
08:59:16

7、分析归档日志


SQL> select timestamp,scn,sql_redo from v$logmnr_contents where username='ADMIN' 
and table_name in ('SALES','NEW');

TIMESTAMP         SCN SQL_REDO
---------- ---------- ------------------------------------------------------------
2018/12/25    1774575 create table sales(id number,name varchar2(20));
 08:57:31

2018/12/25    1774615 insert into "ADMIN"."NEW"("ID","NAME") values ('2','no2');
 08:58:34

2018/12/25    1774635 ALTER TABLE "ADMIN"."SALES" RENAME TO "BIN$fc7HL0kxNTfgU4fOq
 08:58:47             MBvjw==$0" ;

2018/12/25    1774638 drop table sales AS "BIN$fc7HL0kxNTfgU4fOqMBvjw==$0" ;
 08:58:47

2018/12/25    1774655 create table sales(id number,name varchar2(20));
 08:58:57

2018/12/25    1774673 insert into "ADMIN"."SALES"("ID","NAME") values ('3','no3');
 08:59:16


6 rows selected.

在这里插入图片描述

测试结果:
测试表做drop table操作之后,logminer查询不到其被删除之前的DML记录,不对其他表的DML解析有影响

使用旧数据字典测试
检验Logminer使用老的数据字典,在表结构发生变化之后的解析情况

1、创建测试表test2

SQL> create table test2 (id number,name varchar2(20));

Table created.
--09:37:04 

SQL> insert into test2 values(1,'a');

1 row created.

SQL> commit;

Commit complete.

--09:37:23

2、logminer提取数据字典到归档日志

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

3、增加一列,表结构改变

 SQL> alter table test2 add sex varchar2(20);

Table altered.
--09:58:44

 SQL> insert into test2 values(2,'tom','man');
SQL> commit;
10:08:50

4、分别使用2种类型方法解析日志
使用当前数据字典

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

使用归档的数据字典

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

5、测试结果
结果1
online catalog
使用当前数据字典可以解析表test2增加一列之后插入数据的DML,由于数据字典已被修改,之前的DML无法成功解析。

在这里插入图片描述

结果2
redo dict
使用之前生成的数据字典归档日志,可以完整解析表TEST2表结构变更之前的DML语句.

因为是使用的旧的数据字典,所以表test2增加一列之后,新插入的数据的DML无法解析
在这里插入图片描述

二、RMAN不完全恢复

测试目的:
验证是否可以通过RMAN实现不完全恢复,将数据恢复到表结构变更之前的状态。

1、查询是否开启附加日志

select SUPPLEMENTAL_LOG_DATA_ALL log_ALL,SUPPLEMENTAL_LOG_DATA_FK FK,SUPPLEMENTAL_LOG_DATA_MIN log_MIN,SUPPLEMENTAL_LOG_DATA_PK PK,SUPPLEMENTAL_LOG_DATA_UI UI from v$database;


log_ALL       FK        log_MIN                      PK     UI
--------- --------- ------------------------ --------- ---------
NO        NO        NO                       NO        NO

2、做RMAN全备
T0时间点

    RMAN> backup database format '/u01/rman/full_%d_%U.bak';

    Finished backup at 2018/12/24 14:02:31

3、创建表emp

	create table emp(id number,name varchar2(20));
    
    14:02:52  创建表emp完毕

4、插入emp第一条数据

    insert into emp values(1,'a');
    commit;

    14:03:04 第一条数据插入完毕

5、插入test4表一条数据

    select * from test4;
   no rows selected



    insert into test4 values(1,'ok');
    commit;
     
    14:03:21 插入完毕

6、表emp增加1列以及插入emp第二条数据

T1时间点发生表结构变化

   alter table emp add sex varchar2(20);
   14:03:39 表结构发生变化




    insert into emp values(2,'b','man');
    commit;
    
    14:03:58 第二条数据插入完毕

7、查询两张表数据

       select * from emp;
        ID NAME       SEX
---------- ---------- ----------
         1 a
         2 b          man



       select * from test4;
        ID NAME
---------- ----------
         1 ok

8、切换日志

SQL> alter system switch logfile;

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> /

9、假设emp表被认为表结构需要恢复原状,需要将表恢复增加列之前

RMAN不完全恢复到14:03:39之前(表emp增加列的时间点T1)

rman target /

startup force mount;

run{
set until time "to_date('2018-12-24 14:03:38','yyyy-mm-dd hh24:mi:ss')";
restore database;
recover database;
}

    
Finished recover at 2018/12/24 12:54:42

RMAN> alter database open resetlogs;

9、查看数据

SQL> conn admin/admin123
Connected.


SQL> select * from emp;

        ID NAME
---------- ----------
         1 a


SQL> select * from test4;

        ID NAME
---------- ----------
         1 ok

结果:未打开附加日志,rman也可以恢复数据到修改表结构T1时间点之前,T0到T1这段时间的数据完好。

三、测试总结

1、一旦某张表发生过DDL的变更,数据字典会被修改。
2、通过几个场景的测试发现RMAN在做recover的时候不会被数据字典的修改所影响,可以通过基于时间点的不完全恢复数据。

四、参考文献

MOS文献
追加日志是否开启与Logminer测试结果
Effect of Supplemental Logging on LogMiner with Example (文档 ID 750198.1)
在这里插入图片描述
在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值