一、实验目的
测试未提交的DML会不会记录到联机日志中。
二、实验步骤
1)查看日志模式
SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
SUPPLEMENTAL_LOG_DATA_MIN
-------------------------
YES
SQL>
2)插入测试数据
SQL> create table dyh.hello(id number);
SQL> insert into dyh.hello values(0);--不提交
SQL> select * from dyh.hello;
ID
----------
0
SQL>
在另一个会话:
SQL> select * from dyh.hello;
no rows selected
3)直接ABORT关闭数据库
SQL> shutdown abort;
[oracle@dyh31 ~]$ cp /u01/app/oracle/oradata/dyh/group01.log /tmp/ 这个是插入数据0的联机日志
4)启动实例
SQL> startup open;
[oracle@dyh31 ~]$ cp /u01/app/oracle/oradata/dyh/group02.log /tmp/ 这个是启动成功后的当前日志
5)使用logmnr工具分析
a.分析第一个日志
BEGIN
dbms_logmnr.add_logfile(logfilename=>'/tmp/group01.log',options=>dbms_logmnr.NEW);
END;
/
begin
dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
end;
/
SELECT L.SCN,L.SQL_REDO,L.SQL_UNDO FROM v$logmnr_contents l where l.TABLE_NAME='HELLO';
842988
create table dyh.hello(id number);
843000
insert into "DYH"."HELLO"("ID") values ('0');
delete from "DYH"."HELLO" where "ID" = '0' and ROWID = 'AAACgkAAEAAAAXaAAA';
--未提交的数据记录在了日志文件中,同时记录了回滚操作
b.分析第二个日志
BEGIN
dbms_logmnr.add_logfile(logfilename=>'/tmp/group02.log',options=>dbms_logmnr.NEW);
END;
/
begin
dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
end;
/
SELECT L.SCN,L.SQL_REDO,L.SQL_UNDO FROM v$logmnr_contents l where l.TABLE_NAME='HELLO';
863133
delete from "DYH"."HELLO" where ROWID = 'AAACgkAAEAAAAXaAAA';
--open时,执行了回滚操作。
三、实验结论:
1)DDL及DML操作会立即记录到联机日志中,不管事务有没有提交,对于DML操作,还会记录回滚SQL.
2)对于异常关闭时没有提交的事务,ORACLE数据库在open之前会先进行回滚操作,回滚操作记录在open后的当前联机日志文件中。
|