当前位置: DBARoad > 基础知识 > 文章正文

一个关于MR锁的小笑话

                    作者 :OoNiceDream【转载时请务必以超链接形式标明文章原始出处和作者信息】
                    链接:http://www.dbaroad.me/archives/2009/02/mr-lock.html

记得刚刚当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的有所不同,还没有进行实验,待验证。

关键字:
喜欢DBARoad的文章,那就通过 RSS Feed 功能订阅阅读吧!

我要评论

*

* 绝不会泄露


  • 订阅


      抓虾
      google reader
      my yahoo
      bloglines
      鲜果
      有道

站内搜索



返回首页 | 关于我 | 联系我 | 广告合作 | 网站地图 | 友情链接 | 版权声明 |