Chinaunix首页 | 论坛 | 博客
  • 博客访问: 518635
  • 博文数量: 101
  • 博客积分: 1635
  • 博客等级: 上尉
  • 技术积分: 1282
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-05 01:51
文章分类

全部博文(101)

文章存档

2019年(2)

2018年(16)

2013年(14)

2012年(69)

我的朋友

分类: Oracle

2018-10-30 18:28:26

redo copy latch的个数都跟cpu_ count有关,大概是这么一个关系:2* cpu_ count,如下是我这里的情况:
select latch#,name from v$latch  where name like '%redo copy%'


select latch#,name,level# from v$latch_children where latch#=186 order by 3


select latch#,name from v$latch where name like '%redo alloca%'
select latch#,name,level# from v$latch_children where latch#=187  order by 3
4)关于redo相关的参数
_log_io_size                                integer   0 一定义每次Igwr进程写操作的io最大值,10里面默认为0了,实际上是自动调节了
_log_parallelism                            integer   1   一控制是否进行log的parallel写入,表示degree,大于1表示进行parallel操作,跟cpu_ count有关
_log_parallelism_ dynamic              boolean   TRUE一表示是否进行redo log并行写入粒度的动态调整。
_log_parallelism_max                    integer 1  一表示最大的log parallel操作degree,不能大于cpu_ count


_log_private_mul         integer   5
_log_private_parallelism   boolean   FALSE
_log_private_parallelism_mul   integer   10
log_buffer              integer   2875392一表示log buffer的大小
log_ checkpoint_interval        integer   0
log_ checkpoint_ timeout          integer   1800
这里需要补充一点,关于strand,所谓的strand,其实就把redo buffer进行分割为多个部分,类似oracle 9.2引入的sub shared pool一样。
将每个shared pool划分为多个子pool,每个子pool的结构完全一样,每个字pool都存在相关的latch去保护。这里的strand也是一样。
另外,从oracle lOg又引入了一个新的结构,那就是private strand,所以之前版本的strand也被称为shared strand.我们来看下实际清况:


SQL> select * from v$sgastat where name like '%strand%';
POOL         NAME                            BYTES
------------ -------------------------- ----------
shared pool  private strands              13891584


private strands在shared pool里面。
SQL> select indx,strand_size_kcrfa from x$kcrfstrand where last_buf_kcrfa='00';


      INDX STRAND_SIZE_KCRFA
---------- -----------------
         2            132096
         3            132096
         4            132096
         5            132096
         6            132096
         7            132096
         8            132096
         9            132096
        10            132096
        11            132096
        12            132096


      INDX STRAND_SIZE_KCRFA
---------- -----------------
        13            132096
        14            132096
        15            132096
        16            132096
        17            132096
        18            132096
        19            132096


如果server process获得到这部分private strand空间的事务那么就不在是pga里面完成7,而是在private strand中。引入这个机制的好处是什么呢?
显然可以缓解pga特别是redo buffer中的冲突和争用。当然,这个在11中存在微小的变化,大家刚刚也看到,11.2中存在28个redo allocation latch了。
所以回到这里,那么前面提到的一个参数-log_private_mul就描述指定logfile为private strand预留多少空间。  10g中默认是5,那么就是5*65k.


redo什么情况下写入
---事务commit
--log buffer脏数据大小超过1M
--log buffer 脏数据库超过1/3大小
--every 3s
通过strace 观察lgwr的写入操作
---session 1 
开启strace 跟踪lgwr进程
[oracle@localhost tmp]$ strace -fr -o /tmp/17827.log -p 17827
Process 17827 attached
^CProcess 17827 detached


----session2
随便执行dml操作如下:
SQL> delete from test;


1 row deleted.


SQL> commit;


Commit complete.


SQL> alter system switch logfile;


System altered.


查看session1操作的信息如下:
17827      3.000456 gettimeofday({1540346969, 812216}, NULL) = 0  ---3s检查机制
17827      0.000055 gettimeofday({1540346969, 812269}, NULL) = 0
17827      0.000050 gettimeofday({1540346969, 812313}, NULL) = 0
17827      0.000017 getrusage(RUSAGE_SELF, {ru_utime={4, 220358}, ru_stime={8, 930642}, ...}) = 0
17827      0.000018 gettimeofday({1540346969, 812348}, NULL) = 0
17827      0.000028 getrusage(RUSAGE_SELF, {ru_utime={4, 220358}, ru_stime={8, 930642}, ...}) = 0
17827      0.000019 gettimeofday({1540346974, 223587}, NULL) = 0
17827      0.000023 gettimeofday({1540346974, 223610}, NULL) = 0
17827      0.000016 pwrite(260, "\1\"\0\0B\214\0\0\341\0\0\0\20\200(G$\2\0\0\r\0\0\0\0317[\0\1\0$\0"..., 1024, 18383872) = 1024


第一位 260 表示fd,文件描述符,表示该操作所对应的文件,倒数第2部分是写操作的具体位置,即offset位置。
最后的1024,表示该写操作的大小。单位是byte


进行下面的fd信息如下:
[oracle@localhost fd]$ ls -ltr
total 0
lrwx------. 1 oracle oinstall 64 Oct 24 10:18 9 -> /u01/app/oracle/products/11.2.0.4/db_1/dbs/hc_orcl.dat
lr-x------. 1 oracle oinstall 64 Oct 24 10:18 8 -> /dev/zero
lr-x------. 1 oracle oinstall 64 Oct 24 10:18 7 -> /proc/17827/fd
lr-x------. 1 oracle oinstall 64 Oct 24 10:18 6 -> /u01/app/oracle/products/11.2.0.4/db_1/rdbms/mesg/oraus.msb
lr-x------. 1 oracle oinstall 64 Oct 24 10:18 5 -> /dev/null
lr-x------. 1 oracle oinstall 64 Oct 24 10:18 4 -> /dev/null
lr-x------. 1 oracle oinstall 64 Oct 24 10:18 3 -> /dev/null
lrwx------. 1 oracle oinstall 64 Oct 24 10:18 265 -> /u01/app/oracle/oradata/orcl/undotbs02.dbf
lrwx------. 1 oracle oinstall 64 Oct 24 10:18 264 -> /u01/app/oracle/oradata/orcl/tbs_unvdata01.dbf
lrwx------. 1 oracle oinstall 64 Oct 24 10:18 263 -> /u01/app/oracle/oradata/orcl/users01.dbf
lrwx------. 1 oracle oinstall 64 Oct 24 10:18 262 -> /u01/app/oracle/oradata/orcl/sysaux01.dbf
lrwx------. 1 oracle oinstall 64 Oct 24 10:18 261 -> /u01/app/oracle/oradata/orcl/system01.dbf
lrwx------. 1 oracle oinstall 64 Oct 24 10:18 260 -> /u01/app/oracle/oradata/orcl/redo03.log--------正在写的日志
lrwx------. 1 oracle oinstall 64 Oct 24 10:18 259 -> /u01/app/oracle/oradata/orcl/redo02.log




此时redo log的情况如下:
SQL> select * from v$log;


    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME   NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ------------ ------------ ------------
         1          1        226   52428800        512          1 NO  CURRENT                5977901 24-OCT-18      2.8147E+14
         2          1        224   52428800        512          1 YES INACTIVE               5963783 24-OCT-18         5967993 24-OCT-18
         3          1        225   52428800        512          1 YES INACTIVE               5967993 24-OCT-18         5977901 24-OCT-18




[oracle@localhost fd]$ cat /tmp/17827.log |grep pwri
17827      0.000016 pwrite(260, "\1\"\0\0B\214\0\0\341\0\0\0\20\200(G$\2\0\0\r\0\0\0\0317[\0\1\0$\0"..., 1024, 18383872) = 1024
17827      0.000013 pwrite(260, "\1\"\0\0D\214\0\0\341\0\0\0\20\200\177\237t\0\0\0\0053\0\0\0327[\0\1\0\360T"..., 2560, 18384896) = 2560
17827      0.000027 pwrite(260, "\1\"\0\0I\214\0\0\341\0\0\0\20\200\3068t\0\0\0\5\2\0\0\0357[\0\1\0\201\0"..., 21504, 18387456) = 21504
17827      0.000016 pwrite(260, "\1\"\0\0s\214\0\0\341\0\0\0\20\200\236\27t\0\0\0\5\2\0\0!7[\0\1\0\201\0"..., 1536, 18408960) = 1536
17827      0.000015 pwrite(260, "\1\"\0\0v\214\0\0\341\0\0\0\20\200\210w\0\2\0\0\r\0\0\0$7[\0\1\0\0\0"..., 1024, 18410496) = 1024
17827      0.000014 pwrite(260, "\1\"\0\0x\214\0\0\341\0\0\0\20\200\356W\320\0\0\0\6\24\0\0%7[\0\1\0\200\1"..., 1024, 18411520) = 1024
17827      0.000015 pwrite(260, "\1\"\0\0z\214\0\0\341\0\0\0\20\200\202(\374\1\0\0\r \0\0'7[\0\1\0\0\0"..., 1024, 18412544) = 1024
17827      0.000016 pwrite(260, "\1\"\0\0|\214\0\0\341\0\0\0\20\200pxL\2\0\0\rN\0\0(7[\0\1\0\6^"..., 2560, 18413568) = 2560
17827      0.000015 pwrite(256, "\25\302\0\0\26\0\0\0\346P\0\0\377\377\1\4\26\244\0\0\0\220\1\0\0\0\0\0\0\0\0\0"..., 16384, 360448) = 16384
17827      0.000024 pwrite(257, "\25\302\0\0\26\0\0\0\346P\0\0\377\377\1\4\26\244\0\0\0\220\1\0\0\0\0\0\0\0\0\0"..., 16384, 360448) = 16384
17827      0.000014 pwrite(256, "\25\302\0\0\22\0\0\0\346P\0\0\377\377\1\4\307\325\0\0\0\0\0\0\0\0\0\0Z&\5;"..., 16384, 294912) = 16384
17827      0.000014 pwrite(257, "\25\302\0\0\22\0\0\0\346P\0\0\377\377\1\4\307\325\0\0\0\0\0\0\0\0\0\0Z&\5;"..., 16384, 294912) = 16384
17827      0.000016 pwrite(256, "\25\302\0\0\20\0\0\0\346P\0\0\377\377\1\4:l\0\0\200C\0\0\0\0\0\0\0\0\0\1"..., 16384, 262144) = 16384
17827      0.000015 pwrite(257, "\25\302\0\0\20\0\0\0\346P\0\0\377\377\1\4:l\0\0\200C\0\0\0\0\0\0\0\0\0\1"..., 16384, 262144) = 16384
17827      0.000015 pwrite(256, "\25\302\0\0\1\0\0\0\0\0\0\0\0\0\1\4p`\0\0\0\0\0\0\0\4 \v\346\350FZ"..., 16384, 16384) = 16384
17827      0.000015 pwrite(257, "\25\302\0\0\1\0\0\0\0\0\0\0\0\0\1\4p`\0\0\0\0\0\0\0\4 \v\346\350FZ"..., 16384, 16384) = 16384
17827      0.000016 pwrite(258, "\1\"\0\0\1\0\0\0\342\0\0\0\0\200\236\341\0\0\0\0\0\4 \v\346\350FZORCL"..., 512, 512) = 512
17827      0.000016 pwrite(260, "\1\"\0\0\1\0\0\0\341\0\0\0\0\200\220\36\0\0\0\0\0\4 \v\346\350FZORCL"..., 512, 512) = 512
17827      0.000015 pwrite(256, "\25\302\0\0\25\0\0\0\347P\0\0\377\377\1\4ap\0\0\0\220\1\0\342\0\0\0\1\0\0\0"..., 16384, 344064) = 16384
17827      0.000015 pwrite(257, "\25\302\0\0\25\0\0\0\347P\0\0\377\377\1\4ap\0\0\0\220\1\0\342\0\0\0\1\0\0\0"..., 16384, 344064) = 16384
17827      0.000032 pwrite(256, "\25\302\0\0\300\0\0\0\347P\0\0\377\377\1\4\226\317\0\0c&\5;\1\0\0\0\0\0\0\0"..., 16384, 3145728) = 16384
17827      0.000015 pwrite(257, "\25\302\0\0\300\0\0\0\347P\0\0\377\377\1\4\226\317\0\0c&\5;\1\0\0\0\0\0\0\0"..., 16384, 3145728) = 16384
17827      0.000014 pwrite(256, "\25\302\0\0\23\0\0\0\347P\0\0\377\377\1\4\244\350\0\0\17\0\0\0y\20[\0\0\0j\t"..., 16384, 311296) = 16384
17827      0.000014 pwrite(257, "\25\302\0\0\23\0\0\0\347P\0\0\377\377\1\4\244\350\0\0\17\0\0\0y\20[\0\0\0j\t"..., 16384, 311296) = 16384
17827      0.000014 pwrite(256, "\25\302\0\0\21\0\0\0\347P\0\0\377\377\1\4\357A\0\0\0\0\0\0\0\0\0\0Z&\5;"..., 16384, 278528) = 16384
17827      0.000014 pwrite(257, "\25\302\0\0\21\0\0\0\347P\0\0\377\377\1\4\357A\0\0\0\0\0\0\0\0\0\0Z&\5;"..., 16384, 278528) = 16384
17827      0.000014 pwrite(256, "\25\302\0\0\17\0\0\0\347P\0\0\377\377\1\4\245/\0\0\0@\0\0\0\0\0\0\0\0\0A"..., 16384, 245760) = 16384
17827      0.000018 pwrite(257, "\25\302\0\0\17\0\0\0\347P\0\0\377\377\1\4\245/\0\0\0@\0\0\0\0\0\0\0\0\0A"..., 16384, 245760) = 16384
17827      0.000014 pwrite(256, "\25\302\0\0\1\0\0\0\0\0\0\0\0\0\1\4y`\0\0\0\0\0\0\0\4 \v\346\350FZ"..., 16384, 16384) = 16384
17827      0.000014 pwrite(257, "\25\302\0\0\1\0\0\0\0\0\0\0\0\0\1\4y`\0\0\0\0\0\0\0\4 \v\346\350FZ"..., 16384, 16384) = 16384
17827      0.000013 pwrite(258, "\1\"\0\0\2\0\0\0\342\0\0\0\20\2004\177p\0\0\0\6\0\0\0-7[\0\1\0\20\17"..., 512, 1024) = 512
每次写入redo的大小不固定,都是512的整数倍。
最大的单次IO是1M,以batch的方式写入。


[oracle@localhost fd]$ cat /tmp/17827.log |grep read
17827      0.000017 pread(256, "\25\302\0\0\1\0\0\0\0\0\0\0\0\0\1\4\\a\0\0\0\0\0\0\0\4 \v\346\350FZ"..., 16384, 16384) = 16384
17827      0.000016 pread(257, "\25\302\0\0\1\0\0\0\0\0\0\0\0\0\1\4\\a\0\0\0\0\0\0\0\4 \v\346\350FZ"..., 16384, 16384) = 16384
17827      0.000015 pread(256, "\25\302\0\0\17\0\0\0\345P\0\0\377\377\1\4\245n\0\0\0A\0\0\0\0\0\0\0\0\0\1"..., 16384, 245760) = 16384
17827      0.000018 pread(256, "\25\302\0\0\21\0\0\0\345P\0\0\377\377\1\4\304\325\0\0\0\0\0\0\0\0\0\0Z&\5;"..., 16384, 278528) = 16384
17827      0.000015 pread(256, "\25\302\0\0\24\0\0\0\253P\0\0\377\377\1\4\243\350\0\0\17\0\0\0y\20[\0\0\0j\t"..., 16384, 327680) = 16384
17827      0.000016 pread(256, "\25\302\0\0-\1\0\0\345P\0\0\377\377\1\4\16W\0\0\26\0\n\0\342\7\0\0\0\0\0\0"..., 16384, 4931584) = 16384
17827      0.000015 pread(256, "\25\302\0\0\25\0\0\0\237P\0\0\377\377\1\4\207~\0\0\0\220\1\0\337\0\0\0\2\0\0\0"..., 16384, 344064) = 16384
17827      0.000017 write(12, "Thread 1 cannot allocate new log"..., 46) = 46
17827      0.000017 pread(256, "\25\302\0\0\1\0\0\0\0\0\0\0\0\0\1\4\\a\0\0\0\0\0\0\0\4 \v\346\350FZ"..., 16384, 16384) = 16384
17827      0.000017 pread(257, "\25\302\0\0\1\0\0\0\0\0\0\0\0\0\1\4\\a\0\0\0\0\0\0\0\4 \v\346\350FZ"..., 16384, 16384) = 16384
17827      0.000027 pread(256, "\25\302\0\0\17\0\0\0\345P\0\0\377\377\1\4\245n\0\0\0A\0\0\0\0\0\0\0\0\0\1"..., 16384, 245760) = 16384
17827      0.000017 pread(256, "\25\302\0\0\21\0\0\0\345P\0\0\377\377\1\4\304\325\0\0\0\0\0\0\0\0\0\0Z&\5;"..., 16384, 278528) = 16384
17827      0.000016 pread(256, "\25\302\0\0\24\0\0\0\253P\0\0\377\377\1\4\243\350\0\0\17\0\0\0y\20[\0\0\0j\t"..., 16384, 327680) = 16384
17827      0.000017 pread(256, "\25\302\0\0-\1\0\0\345P\0\0\377\377\1\4\16W\0\0\26\0\n\0\342\7\0\0\0\0\0\0"..., 16384, 4931584) = 16384
17827      0.000016 pread(256, "\25\302\0\0\25\0\0\0\237P\0\0\377\377\1\4\207~\0\0\0\220\1\0\337\0\0\0\2\0\0\0"..., 16384, 344064) = 16384
17827      0.000028 pread(260, "\1\"\0\0\1\0\0\0\341\0\0\0\0\200\262\367\0\0\0\0\0\4 \v\346\350FZORCL"..., 512, 512) = 512
17827      0.000016 pread(256, "\25\302\0\0 \0\0\0\344K\0\0\377\377\1\4\2634\0\0\3\0\3\0\0\0\0\0\0\0/u"..., 16384, 524288) = 16384
17827      0.000016 pread(260, "\1\"\0\0\1\0\0\0\341\0\0\0\0\200\262\367\0\0\0\0\0\4 \v\346\350FZORCL"..., 512, 512) = 512
17827      0.000016 pread(256, "\25\302\0\0-\1\0\0\345P\0\0\377\377\1\4\16W\0\0\26\0\n\0\342\7\0\0\0\0\0\0"..., 16384, 4931584) = 16384
17827      0.000022 pread(256, "\25\302\0\0\277\0\0\0\235P\0\0\377\377\1\4I\4\0\0c&\5;\1\0\0\0\0\0\0\0"..., 16384, 3129344) = 16384
17827      0.000016 pread(256, "\25\302\0\0\25\0\0\0\347P\0\0\377\377\1\4ap\0\0\0\220\1\0\342\0\0\0\1\0\0\0"..., 16384, 344064) = 16384
17827      0.000017 pread(256, "\25\302\0\0\24\0\0\0\253P\0\0\377\377\1\4\243\350\0\0\17\0\0\0y\20[\0\0\0j\t"..., 16384, 327680) = 16384
17827      0.000017 pread(256, "\25\302\0\0 \0\0\0\344K\0\0\377\377\1\4\2634\0\0\3\0\3\0\0\0\0\0\0\0/u"..., 16384, 524288) = 16384
17827      0.000035 read(12, "17895 (oracle) S 1 17895 17895 0"..., 999) = 251
17827      0.000029 write(12, "Thread 1 advanced to log sequenc"..., 51) = 51


从上面的跟踪我们可以等到
1)lgwr进程每3s触发一次。
2)lgwr 进程会更新controlfile header block
3) lgwr 进程每次写入的大小是不固定的,是以batch方式写入,但是都是redo log block(512)的整数倍。
4)对于inactive 状态的redo,oracle 仍然会进行写操作,不过仅仅是更新redo logfile头部。
5)从实验来看,lgwr的一次性写大小达到接近1M,因为可以猜测该linux版本的最大单次IO大小是1M。










SQL> select addr,latch#,name,level# from v$latch where name like '%redo%' order by 4;


ADDR                 LATCH# NAME                                                                 LEVEL#
---------------- ---------- ---------------------------------------------------------------- ----------
0000000060029BE0        238 readable standby metadata redo cache                                      0
0000000060023FF0        207 redo writing                                                              1
0000000060024098        208 redo copy                                                                 4
0000000060024140        209 redo allocation                                                           5
0000000060051648        544 KFR redo allocation latch                                                 6
00000000600241E8        210 real redo SCN                                                             8
0000000060024C18        212 readredo stats and histogram                                              8
000000006001AC90        168 redo on-disk SCN                                                          8
000000006001AD30        169 ping redo on-disk SCN                                                     8


9 rows selected.


SQL> select addr,name,latch#,level#,child#,hash from v$latch_children where 
  2  latch# in(select latch# from v$latch where name like '%redo%');


ADDR             NAME                                                                 LATCH#     LEVEL#     CHILD#       HASH
---------------- ---------------------------------------------------------------- ---------- ---------- ---------- ----------
000000006FE26698 redo copy                                                               208          4         16 4092072627
000000006FE265C0 redo copy                                                               208          4         15 4092072627
000000006FE264E8 redo copy                                                               208          4         14 4092072627
000000006FE26410 redo copy                                                               208          4         13 4092072627
000000006FE26338 redo copy                                                               208          4         12 4092072627
000000006FE26260 redo copy                                                               208          4         11 4092072627
000000006FE26188 redo copy                                                               208          4         10 4092072627
000000006FE260B0 redo copy                                                               208          4          9 4092072627
000000006FE25FD8 redo copy                                                               208          4          8 4092072627
000000006FE25F00 redo copy                                                               208          4          7 4092072627
000000006FE25E28 redo copy                                                               208          4          6 4092072627


ADDR             NAME                                                                 LATCH#     LEVEL#     CHILD#       HASH
---------------- ---------------------------------------------------------------- ---------- ---------- ---------- ----------
000000006FE25D50 redo copy                                                               208          4          5 4092072627
000000006FE25C78 redo copy                                                               208          4          4 4092072627
000000006FE25BA0 redo copy                                                               208          4          3 4092072627
000000006FE25AC8 redo copy                                                               208          4          2 4092072627
000000006FE259F0 redo copy                                                               208          4          1 4092072627
000000006FE2A300 redo allocation                                                         209          5         29  999804931
000000006FE2A260 redo allocation                                                         209          5         28  999804931
000000006FE2A1C0 redo allocation                                                         209          5         27  999804931
000000006FE2A120 redo allocation                                                         209          5         26  999804931
000000006FE2A080 redo allocation                                                         209          5         25  999804931
000000006FE29FE0 redo allocation                                                         209          5         24  999804931


ADDR             NAME                                                                 LATCH#     LEVEL#     CHILD#       HASH
---------------- ---------------------------------------------------------------- ---------- ---------- ---------- ----------
000000006FE29F40 redo allocation                                                         209          5         23  999804931
000000006FE29EA0 redo allocation                                                         209          5         22  999804931
000000006FE29E00 redo allocation                                                         209          5         21  999804931
000000006FE29D60 redo allocation                                                         209          5         20  999804931
000000006FE29CC0 redo allocation                                                         209          5         19  999804931
000000006FE29C20 redo allocation                                                         209          5         18  999804931
000000006FE29B80 redo allocation                                                         209          5         17  999804931
000000006FE29AE0 redo allocation                                                         209          5         16  999804931
000000006FE29A40 redo allocation                                                         209          5         15  999804931
000000006FE299A0 redo allocation                                                         209          5         14  999804931
000000006FE29900 redo allocation                                                         209          5         13  999804931


ADDR             NAME                                                                 LATCH#     LEVEL#     CHILD#       HASH
---------------- ---------------------------------------------------------------- ---------- ---------- ---------- ----------
000000006FE29860 redo allocation                                                         209          5         12  999804931
000000006FE297C0 redo allocation                                                         209          5         11  999804931
000000006FE29720 redo allocation                                                         209          5         10  999804931
000000006FE29680 redo allocation                                                         209          5          9  999804931
000000006FE295E0 redo allocation                                                         209          5          8  999804931
000000006FE29540 redo allocation                                                         209          5          7  999804931
000000006FE294A0 redo allocation                                                         209          5          6  999804931
000000006FE29400 redo allocation                                                         209          5          5  999804931
000000006FE29360 redo allocation                                                         209          5          4  999804931
000000006FE292C0 redo allocation                                                         209          5          3  999804931
000000006FE29220 redo allocation                                                         209          5          2  999804931


ADDR             NAME                                                                 LATCH#     LEVEL#     CHILD#       HASH
---------------- ---------------------------------------------------------------- ---------- ---------- ---------- ----------
000000006FE29180 redo allocation                                                         209          5          1  999804931


45 rows selected.


下面我们手工来持有latch,依此来观察上述latch的持有顺序。
1) 我们知道server process需要将redo entry copy到redo buffer中,那么首先就需要获得redo copy latch
这里我们先来持有redo copy latch.
-----------session1
SQL> oradebug setmypid
Statement processed.
SQL> oradebug call kslgetl 1610760344 1
Function returned 1


上面的1610760344  latch地址转成16进制是60024098,正好是redo copy latch的addr地址。
-----------session2
SQL> select sid from v$mystat where rownum<2;


       SID
----------
        96


SQL> show user;
USER is "SYS"
SQL> delete from test where rownum<10;


0 rows deleted.


SQL> commit;


Commit complete.
这里可以正常运行,因为redo copy latch 还有很多的子latch,如果父latch 获得不到,可以继续获得子latch的。
oracle里面是不容许同时去持有父latch和子latch的,如果你同时去持有子latch,你会发现实例会down掉。
会出现ora-07445错误。
2) redo allocation latch
这个latch的获取是在 server process将redo entry copy到redo buffer中之前,需要获得该latch,以便于分配空间,用于存放redo entry.
3)如果该latch会持有,那么必然导致lgwr无法操作,因为当事务commit后,会触发lgwr进程将redo buffer中的脏数据写入到redo logfile中,而lgwr在写入之前,必然先获得redo writing latch.


模拟一下:
---------session1
SQL> oradebug setmypid
Statement processed.
SQL> oradebug call kslgetl 1610760176 1
Function returned 1
-----------session2
SQL> insert into test values(2);


1 row created.


SQL> commit;
.........这里会hang住
--------sesson1释放latch
SQL> oradebug call kslfre 1610760176  
Function returned 0
---------session2
SQL> insert into test values(2);


1 row created.


SQL> commit;


Commit complete.


当latch释放之后,该commit才完成。
















































































阅读(2284) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~