[20171115]redo and commit.txt
--//参考Jonathan Lewis的https://jonathanlewis.wordpress.com/2011/08/19/redo-2/
--//很早以前的帖子,自己觉得很有意思,重复测试:
--//事务已经提交,但是redo log buffer还没有写到磁盘.看看发生什么情况?
1.环境:
SCOTT@book> @&r/ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
2.建立测试环境:
--//session 1:
create table t1(n1 number);
insert into t1 values(1);
commit;
--//session 2:
$ ps -ef | grep ora_lgwr_boo[k]
oracle 9275 1 0 08:29 ? 00:00:00 ora_lgwr_book
SYS@book> oradebug setospid 9275
Oracle pid: 13, Unix process pid: 9275, image: oracle@xxxx (LGWR)
SYS@book> oradebug suspend
Statement processed.
--//这样做的目的认为挂起写redo日志文件.
3.测试:
--//session 1:
update t1 set n1 = 2;
commit;
--//挂起!!
--//session 2:
SYS@book> select * from scott.t1;
N1
----------
2
SYS@book> @ &r/wait
P1RAW P2RAW P3RAW P1 P2 P3 SID SERIAL# SEQ# EVENT STATE WAIT_TIME_MICRO SECONDS_IN_WAIT
---------------- ---------------- ----- --- ---------- --- ---- -------- ----- ------------- ------- --------------- ---------------
00000000000001B8 0000000017701BD7 00 440 393223127 0 274 5 84 log file sync WAITING 26787924 27
--//可以发现session 1的提交已经生效,做一个shutdown abort. 然后重启数据库
SYS@book> shutdown abort
ORACLE instance shut down.
SYS@book> startup
ORACLE instance started.
Total System Global Area 634732544 bytes
Fixed Size 2255792 bytes
Variable Size 197133392 bytes
Database Buffers 427819008 bytes
Redo Buffers 7524352 bytes
Database mounted.
Database opened.
SYS@book> select * from scott.t1;
N1
----------
1
--//回到原来的值.
--//也许你认为提交根本就是挂起了,根本没有完成.
--//但是你简单做一个放大,假设commit时间很长,commit主要操作修改块,做一个快速提交,然后修改undo 事务槽标识,标识事务已经提交,然后将
--//这些修改从日志缓存写入日志文件.
--//提交的当中还没有完成前(至少认为写入日志文件才会完成),这个时候你另外的会话已经可以看到提交的结果.