测试未提交的事务会不会记录到联机日志中

[复制链接]
查看11 | 回复7 | 2012-9-28 17:34:42 | 显示全部楼层 |阅读模式
一、实验目的
测试未提交的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后的当前联机日志文件中。


回复

使用道具 举报

千问 | 2012-9-28 17:34:42 | 显示全部楼层
已经操作了,跟提交没关系,提交只是一个标识。不然干嘛要回滚
回复

使用道具 举报

千问 | 2012-9-28 17:34:42 | 显示全部楼层
跟提交无关,发生dml就有记录.
回复

使用道具 举报

千问 | 2012-9-28 17:34:42 | 显示全部楼层
恩,是的,一开始以为未提交的只是记录在log buffer中,实际也记录到了online log file 中的。
回复

使用道具 举报

千问 | 2012-9-28 17:34:42 | 显示全部楼层
oracle实例恢复是先前滚,再回滚,而这个过程必须读取redo日志,所以根据这个原理也知道不管commit与否都必然写redo的。
回复

使用道具 举报

千问 | 2012-9-28 17:34:42 | 显示全部楼层
1、DDL一旦完成,会记录到online redo;DML提交前,未必记录到online redo中。
2、应该是这样。
3、其实,Oracle启动时的恢复过程,并不仅仅是根据redo去前滚和回滚,还要进行控制文件、数据文件、undo空间、redo文件等信息的一系列对比。可以设想,假如数据库异常关闭时,未提交事务信息并未写入redo文件,数据库重启时,也可以成功完成数据库的恢复。

回复

使用道具 举报

千问 | 2012-9-28 17:34:42 | 显示全部楼层
sqysl 发表于 2016-6-5 22:56
1、DDL一旦完成,会记录到online redo;DML提交前,未必记录到online redo中。
2、应该是这样。
3、其实, ...

在这次实验中,就是使用的abort方式关闭的数据库。
回复

使用道具 举报

千问 | 2012-9-28 17:34:42 | 显示全部楼层
fzxxdyh 发表于 2016-6-20 09:35
在这次实验中,就是使用的abort方式关闭的数据库。

嗯,即使通过abort选项关闭库,redo还是很有可能已经写进了redo log中,只是不会等待事务完成和回滚。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行