一个关于MR锁的小笑话
记得刚刚当DBA时,查询了一下v$lock视图,做了个group by:
SYS@DB1> select type,count(*) from v$lock 2 group by type order by 2 desc; TYPE COUNT(*) ---- ---------- MR 1193 TM 83 TX 14 RT 3 TS 2 XR 2 DM 1 PI 1 |
发现大量的“MR”锁,赶紧上报说:数据库有问题啊,大量MR锁。哈哈,闹了个小笑话。
下面是关于MR锁(”Media Recovery”)的一点解释:
The MR lock is used to protect database files from being read from while being recovered.Conversely, the MR lock exists so that you cannot perform recovery on the file while the database is open and the tablespaces are online.
来看看数据库处在OPEN状态时,MR锁的一些信息:
SQL> select sid,type,id1,id2,ctime from v$lock 2 where type='MR' order by id1; SID TY ID1 ID2 CTIME ---------- -- ---------- ---------- ---------- 2 MR 1 0 139 2 MR 2 0 139 2 MR 3 0 139 2 MR 4 0 139 2 MR 5 0 139 2 MR 2001 0 139 6 rows selected. SQL> select a.spid,b.sid,b.username,b.type,b.program 2 from v$process a,v$session b 3 where a.addr=b.paddr and b.sid=2; SPID SID USERNAME TYPE PROGRAM -------- ------ -------------- ---------- ----------------------------- 10797 2 BACKGROUND oracle@erdb-p01 (DBW0) SQL> |
可以看出,是DBWR进程在每个online datafile上加的MR锁。
在数据库打开,数据文件处于online状态时,ID1指的是数据文件的FILE ID
SQL> select file#,ts#,status from v$datafile; FILE# TS# STATUS ---------- ---------- ------- 1 0 SYSTEM 2 1 ONLINE 3 3 ONLINE 4 4 ONLINE 5 5 ONLINE SQL> select file#,ts#,status from v$tempfile; FILE# TS# STATUS ---------- ---------- ------- 1 2 ONLINE SQL> select sid,type,id1,id2,ctime from v$lock 2 where type='MR' order by id1; SID TY ID1 ID2 CTIME ---------- -- ---------- ---------- ---------- 2 MR 1 0 1198 2 MR 2 0 1198 2 MR 3 0 1198 2 MR 4 0 1198 2 MR 5 0 1198 2 MR 2001 0 1198 6 rows selected. SQL> |
这里ID1从1至5对应的是v$datafile中相应的数据文件。那么ID1为2001是什么文件呢?
这其实就是TEMP表空间的第一个TEMP FILE。之所以从2000开始,是由参数db_files控制的。
SQL> show parameter db_files NAME TYPE VALUE -------------------------- ----------- ---------------- db_files integer 2000 SQL> alter system set db_files=1000 scope=spfile; System altered. 重启数据库 SQL> show parameter db_files NAME TYPE VALUE -------------------------- ----------- ---------------- db_files integer 1000 SQL> SQL> select sid,type,id1,id2,ctime from v$lock 2 where type='MR' order by id1; SID TY ID1 ID2 CTIME ---------- -- ---------- ---------- ---------- 2 MR 1 0 171 2 MR 2 0 171 2 MR 3 0 171 2 MR 4 0 171 2 MR 5 0 171 2 MR 1001 0 171 6 rows selected. |
另外CTIME也可以看成数据文件ONLINE的时长,如果OFFLINE后再ONLINE的话,CTIME会重新计时:
SQL> alter database datafile 5 offline; Database altered. SQL> select file#,ts#,status from v$datafile; FILE# TS# STATUS ---------- ---------- ------- 1 0 SYSTEM 2 1 ONLINE 3 3 ONLINE 4 4 ONLINE 5 5 OFFLINE SQL> select sid,type,id1,id2,ctime from v$lock 2 where type='MR' order by id1; SID TY ID1 ID2 CTIME ---------- -- ---------- ---------- ---------- 2 MR 1 0 451 2 MR 2 0 451 2 MR 3 0 451 2 MR 4 0 451 2 MR 1001 0 451 SQL> alter database datafile 5 online; Database altered. SQL> select sid,type,id1,id2,ctime from v$lock 2 where type='MR' order by id1; SID TY ID1 ID2 CTIME ---------- -- ---------- ---------- ---------- 2 MR 1 0 478 2 MR 2 0 478 2 MR 3 0 478 2 MR 4 0 478 2 MR 5 0 9 2 MR 1001 0 478 6 rows selected. SQL> |
对于处在recovery状态的MR锁,ID1的有所不同,还没有进行实验,待验证。


站内搜索