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) |