ITPub博客

首页 > 数据库 > Oracle > [20171115]redo and commit.txt

[20171115]redo and commit.txt

原创 Oracle 作者:lfree 时间:2017-11-16 08:45:22 0 删除 编辑

[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 事务槽标识,标识事务已经提交,然后将
--//这些修改从日志缓存写入日志文件.

--//提交的当中还没有完成前(至少认为写入日志文件才会完成),这个时候你另外的会话已经可以看到提交的结果.

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2147329/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969454