>如果dbwr扫描检查点队列,发现队列过长决定刷出从队首到后面的某一个buffer之间的脏块的时候,如果中间有某个脏块此时恰好被别的进程以独占的pin锁住的话,dbwr会怎么办?例如dbwr决定刷出从1到10的脏块,此时第3个恰好在被别的进程修改,这时dbwr是等待修改完毕,还是跳过这个脏块呢?
这是我在贴吧提问,以下是别人的回复,楼主可以参考一下。
==>
FYI
制造一个长时间的 脏块被pin ,
10:46:44 SYS @ G10R25 > select dirty ,status from v$bh where file#=4 and block#=131765;
DIR STATUS
--- ---------------------
Y xcur
SO: 0x83384290, type: 4, owner: 0x8326ffd8, flag: INIT/-/-/0x00
(session) sid: 150 trans: (nil), creator: 0x8326ffd8, flag: (41) USR/- BSY/-/-/-/-/-
DID: 0001-0011-00000010, short-term DID: 0000-0000-00000000
txn branch: (nil)
oct: 3, prv: 0, sql: 0x7c7f79e0, psql: 0x7e078100, user: 67/MACLEAN
service name: SYS$USERS
O/S info: user: oracle, term: pts/3, ospid: 16211, machine: vrh8.oracle.com
program: sqlplus@vrh8.oracle.com (TNS V1-V3)
application name: SQL*Plus, hash value=3669949024
waiting for 'buffer busy waits' wait_time=0, seconds since wait started=75
file#=4, block#=202b5, class#=1
blocking sess=0x(nil) seq=29
Dumping Session Wait History
for 'buffer busy waits' count=1 wait_time=0.854820 sec
file#=4, block#=202b5, class#=1
for 'buffer busy waits' count=1 wait_time=0.977267 sec
file#=4, block#=202b5, class#=1
for 'buffer busy waits' count=1 wait_time=0.977512 sec
file#=4, block#=202b5, class#=1
for 'buffer busy waits' count=1 wait_time=0.977506 sec
file#=4, block#=202b5, class#=1
for 'buffer busy waits' count=1 wait_time=0.978095 sec
file#=4, block#=202b5, class#=1
for 'buffer busy waits' count=1 wait_time=0.976960 sec
file#=4, block#=202b5, class#=1
for 'buffer busy waits' count=1 wait_time=0.977529 sec
file#=4, block#=202b5, class#=1
for 'buffer busy waits' count=1 wait_time=0.977513 sec
file#=4, block#=202b5, class#=1
for 'buffer busy waits' count=1 wait_time=0.977504 sec
file#=4, block#=202b5, class#=1
此时触发 完全检查点
10:46:55 SYS @ G10R25 > alter system checkpoint;
==>hang
详见链接 http://tieba.baidu.com/p/4142925306