Oracle RAC 环境下的 v$log v$logfile

v$archived_log视图中,有关时间的几列的含义:
first_time为该sequence#成为current redo log的时间
next_time为该sequence#被切换为archivelog 的开始时间
(即:该sequence#+1号成为current redo log的时间)
(即:在归档路径下,arch进程开始写入该sequence#的时间)
completion_time为该sequence#在归档路径下被arch进程写入完成的时间。


查询v$log获得联机
重做日志文件组的信息
下面的项是v$log视图中STATUS 列的常见值:
UNUSED  表明从未对联机重做日志组进行写入,这是刚添加的联机重做日志文件的状态。
CURRENT  表明当前的联机重做日志组,这意味着该联机重做日志组是活动的。
ACTIVE  表明联机重做日志组是活动的,但是并非当前联机重做日志组,崩溃恢复需要该状态它可能正用于块恢复,它可能归档也可能不归档。
CLEARING  表明在ALTER DATABASE CLEAR LOGFILE 命令后正在将该日志重建为一个空日志,日志清除后其状态更改为UNUSED。
CLEARING_CURRENT  表明正在清除当前日志文件中的已关闭线程,如果切换时发生某些故障,如写入新日志标题时的I/O错误,则该日志可以停留在该状态。
INACTIVE  表明例程恢复不再需要联机重做日志组,它可能归档也可能不归档。
查询V$LOGFILE获取日志成员信息
下面的项是v$logfile 视图中STATUS 列的常见值:
INVALID  表明该文件不可访问。
STALE  表明该文件内容不完全,例如正在添加一个日志文件成员。
DELETED  表明该文件已不再使用。
空白表明文件正在使用中。


注意


  如果数据库处于ARCHIVELOG模式(归档模式),在没有被后台归档进程(ARCn)归档前,ACTIVE的日志文件不能被再次使用;如果数据库处于NOARCHIVELOG模式(非归档模式),当最后一个重做日志文件被写满后,LGWR会重新写入第一个ACTIVE日志文件 
  可以使用alter database checkpoint命令手动的创建一个检查点,来使active的日志文件组变成inactive的日志文件组


active和inactive的区别


  这两种状态的重做日志都是已经归档的,不同的是,active状态的重做日志文件组是在实例恢复的时候被需要的,因为有一些事务虽然已经提交了,但是这些记录的更改还没有写到datafile中,如果这个时候实例down掉,在进行实例恢复的时候会需要这些active状态的日志文件组,每过一段时间,当系统负载不是很大的时候,Oracle会尝试将内存中的数据写入到datafile中,这个时候active的日志文件组就会变成inactive状态,我们可以使用alter database checkpoint强制来执行这个过程;而inactive是在实例恢复的时候不被需要的日志文件组。












通常情况下,在Oracle RAC 环境中,v$视图可查询到你所连接实例的相关信息,而gv$视图则包含所有实例的信息。然而在RAC环境中,当我们查询v$log视图时说按照常理的话,v$log视图应当看到的是你所连接到实例的日志组的信息。但v$log是个例外,也就是说v$log视图里看到的不仅仅是自身实例所包含的redo日志组,其他所有剩余实例的redo日志组也同样会出现在该视图中。无论你从任意一个节点连接查询v$log视图都将获得相同的结果。该情形同样适用于v$logfile。这到底是怎么一回事呢?如果你有类似的迷惑,不妨接着往下看。
 
1、理解数据库与实例以及RAC数据库的恢复
    数据库: 
          数据库就是一堆的数据文件的集合,如控制文件、数据文件、联机日志文件、参数文件、密码文件、归档日志等。
    实例: 
          包括了内存结构(SGA)和一系列后台进程(Background Process),两者合起来称为一个Oracle实例。
          关于Oracel数据库与实例描述详细请参考: Oracle实例和Oracle数据库(Oracle体系结构) 
    RAC数据库及恢复:
          一个RAC数据库可以有多个实例,也就是说在不同的节点上构建了SGA + Background Process,共享了数据库的一些数据文件。
          然而,对于redo/undo部分,则是各自使用单独的redo和undo,但是这并不意味着他们仅仅属于各个实例(节点)的一部分。
          RAC数据库的恢复,需要的是所有节点产生的archived log以及所有节点中的redo信息,这样子才能完整地展现RAC数据库的历史。
          其次RAC数据库恢复通常是在单节点上完成,也就是说我们在其余节点关闭的情形下,v$log也应当能够看到所有实例的redo日志信息。
 
2、理解Redo Threads
      When speaking in the context of multiple database instances, the redo log for each database instance is also referred to as a 
      redo thread. In typical configurations, only one database instance accesses an Oracle Database, so only one thread is present.
      In an Oracle Real Application Clusters environment, however, two or more instances concurrently access a single database and 
      each instance has its own thread of redo. A separate redo thread for each instance avoids contention for a single set of redo 
      log files, thereby eliminating a potential performance bottleneck.
  
      在单实例环境中,仅仅有一个redo thread,其thread#通常为1。
      而在RAC环境中,多个实例共享一个数据库,因此一个实例有一个redo thread,主要是为了避免竞争,提高性能。
 
3、v$log与v$logfile
[sql] view plain copy
--下面我们查询视图来看看v$log与v$logfile  
--环境  
SQL> select * from v$version where rownum<2;  
  
BANNER  
--------------------------------------------------------------------------------  
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production  
  
SQL> show parameter cluster_d  
  
NAME                                 TYPE        VALUE  
------------------------------------ ----------- ------------------------------  
cluster_database                     boolean     TRUE  
cluster_database_instances           integer     2  
  
--->查询v$log  
SQL> select group#,thread#,sequence#,members,archived,status,first_time,next_time from v$log;  
  
    GROUP#    THREAD#  SEQUENCE#    MEMBERS ARC STATUS           FIRST_TIME          NEXT_TIME  
---------- ---------- ---------- ---------- --- ---------------- ------------------- -------------------  
         1          1         13          2 NO  CURRENT          2013/08/05 14:38:36  
         2          1         12          2 YES INACTIVE         2013/08/05 14:04:29 2013/08/05 14:38:36  
         3          2         11          2 NO  CURRENT          2013/08/05 14:44:50 2013/08/05 14:44:50  
         4          2         10          2 YES INACTIVE         2013/08/05 14:04:32 2013/08/05 14:38:33  
  
--上面的查询中可以看出,当前数据库有4个日志组,且每个日志组两个成员。有2个redo thread,即thread 1与thread 2。  
--其中日志组1与组2由thread 1管理,也就是说日志组1与组2位于实例1,同理,日志组3与组4位于实例2。  
--从上面也可以看出v$log视图本身已经包含了整个数据所有实例的redo日志组的信息,从RAC数据库的任一节点查询,该视图都将返回相同的信息。  
--如果有3个实例,每个实例两个日志组,则v$log应包含3*2=6行(实例数*每个实例日志组数)。如果有4个实例,每个实例1个日志组,则包含4行记录。  
--其次我们也可以看到每一个实例上面有一个组属于当前组(current),如对于实例1,组1为当前组,对于实例2,组3位当前组。  
--下面来验证一下是否是这样子  
SQL> show parameter instance_nu  
  
NAME                                 TYPE        VALUE  
------------------------------------ ----------- ------------------------------  
instance_number                      integer     1  
SQL> archive log list;  
Database log mode              Archive Mode  
Automatic archival             Enabled  
Archive destination            USE_DB_RECOVERY_FILE_DEST  
Oldest online log sequence     12  
Next log sequence to archive   13  
Current log sequence           13       --->当前日志组为13,位于实例1  
  
SQL> show parameter instance_nu  
  
NAME                                 TYPE        VALUE  
------------------------------------ ----------- ------------------------------  
instance_number                      integer     2  
SQL> archive log list;  
Database log mode              Archive Mode  
Automatic archival             Enabled  
Archive destination            USE_DB_RECOVERY_FILE_DEST  
Oldest online log sequence     10  
Next log sequence to archive   11        
Current log sequence           11       --->当前日志组为11,位于实例1,这两个验证与我们从v$log实例里看到的是一样的情形。  
  
-->查询v$logfile  
SQL> select * from v$logfile;  
  
    GROUP# STATUS  TYPE    MEMBER                                                            IS_  
---------- ------- ------- ----------------------------------------------------------------- ---  
         2         ONLINE  +ASM_DATA/mmbo/onlinelog/group_2.262.821029383                    NO  
         2         ONLINE  +FRA_DATA/mmbo/onlinelog/group_2.258.821029385                    YES  
         1         ONLINE  +ASM_DATA/mmbo/onlinelog/group_1.261.821029381                    NO  
         1         ONLINE  +FRA_DATA/mmbo/onlinelog/group_1.257.821029383                    YES  
         3         ONLINE  +ASM_DATA/mmbo/onlinelog/group_3.266.821029785                    NO  
         3         ONLINE  +FRA_DATA/mmbo/onlinelog/group_3.259.821029787                    YES  
         4         ONLINE  +ASM_DATA/mmbo/onlinelog/group_4.267.821029787                    NO  
         4         ONLINE  +FRA_DATA/mmbo/onlinelog/group_4.260.821029789                    YES  
  
8 rows selected.  
--由于每一组日志包含2个成员,因此视图查询返回8行记录。如前面所说,该视图同样包含了所有实例的日志成员。  
--从上面的视图可知,当前数据库总共4个日志组,8个日志成员,其中每一组的一个成员位于闪回区。  
  
--->查询gv$log  
SQL> select inst_id,group#,thread#,sequence#,members,archived,status,first_time,next_time from gv$log;  
  
   INST_ID     GROUP#    THREAD#  SEQUENCE#    MEMBERS ARC STATUS           FIRST_TIME          NEXT_TIME  
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------------- -------------------  
         2          1          1         13          2 NO  CURRENT          2013/08/05 14:38:36  
         2          2          1         12          2 YES INACTIVE         2013/08/05 14:04:29 2013/08/05 14:38:36  
         2          3          2         11          2 NO  CURRENT          2013/08/05 14:44:50 2013/08/05 14:44:50  
         2          4          2         10          2 YES INACTIVE         2013/08/05 14:04:32 2013/08/05 14:38:33  
         1          1          1         13          2 NO  CURRENT          2013/08/05 14:38:36  
         1          2          1         12          2 YES INACTIVE         2013/08/05 14:04:29 2013/08/05 14:38:36  
         1          3          2         11          2 NO  CURRENT          2013/08/05 14:44:50 2013/08/05 14:44:50  
         1          4          2         10          2 YES INACTIVE         2013/08/05 14:04:32 2013/08/05 14:38:33  
  
8 rows selected.  
  
-->关闭任意一节点后查询v$log与gv$log的情形  
SQL> ho srvctl stop instance -d mmbo -i mmbo2  
SQL> select group#,thread#,sequence#,members,archived,status,first_time,next_time from v$log;  
  
    GROUP#    THREAD#  SEQUENCE#    MEMBERS ARC STATUS           FIRST_TIME          NEXT_TIME  
---------- ---------- ---------- ---------- --- ---------------- ------------------- -------------------  
         1          1         13          2 NO  CURRENT          2013/08/05 14:38:36  
         2          1         12          2 YES INACTIVE         2013/08/05 14:04:29 2013/08/05 14:38:36  
         3          2         11          2 YES ACTIVE           2013/08/05 14:44:50 2013/08/05 16:21:22  
         4          2         10          2 YES INACTIVE         2013/08/05 14:04:32 2013/08/05 14:38:33  
  
SQL> select inst_id,group#,thread#,sequence#,members,archived,status,first_time,next_time from gv$log;  
  
   INST_ID     GROUP#    THREAD#  SEQUENCE#    MEMBERS ARC STATUS           FIRST_TIME          NEXT_TIME  
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------------- -------------------  
         1          1          1         13          2 NO  CURRENT          2013/08/05 14:38:36  
         1          2          1         12          2 YES INACTIVE         2013/08/05 14:04:29 2013/08/05 14:38:36  
         1          3          2         11          2 YES ACTIVE           2013/08/05 14:44:50 2013/08/05 16:21:22  
         1          4          2         10          2 YES INACTIVE         2013/08/05 14:04:32 2013/08/05 14:38:33  
  
--从上面的查询可以看出,对于我们当前2节点的数据库,此时v$log与gv$log呈现相同的信息,gv$log仅仅列出了inst_id列为1的情形  
--从上面的整个测试结果可知,gv$log视图类似于使用union all, gv$logfile与此同,不再演示  
-- select 1 as inst_id, v.* from v$log v    --此时v$log位于实例1  
-- union all  
-- select 2 as inst_id, v.* from v$log v    --此时v$log位于实例2  
  
-- Author : Robinson Cheng  
-- Blog   : http://blog.csdn.net/robinson_0612  
  
--与之gv$log,gv$logfile类似的还有  
--gv$controlfile = (v$controlfile * instances quantity)   
--gv$datafile = (v$datafile * instances quantity)  
--gv$log = (v$log * instances quantity)  
--gv$archive_log = (v$archive_log * instances quantity)  
  
-->那如何查询当前实例自身的redo信息呢?  
--可以使用下面的方式来查询实例自身的redo信息  
SQL> select group#,thread#,sequence#,members,archived,status,first_time,next_time  
  2  from v$log where thread#=(select value from v$parameter where name='thread');  
  
    GROUP#    THREAD#  SEQUENCE#    MEMBERS ARC STATUS           FIRST_TIME          NEXT_TIME  
---------- ---------- ---------- ---------- --- ---------------- ------------------- -------------------  
         1          1         13          2 NO  CURRENT          2013/08/05 14:38:36  
         2          1         12          2 YES INACTIVE         2013/08/05 14:04:29 2013/08/05 14:38:36  
4、后记
a、对于RAC环境下的数据库,我们从v$log视图即可查询到当前数据库所有实例的redo日志组信息,v$logfile类似。
b、从v$log视图能够获取所有实例的redo信息的最终的目的是为了能够从任意一节点进行数据库恢复时能访问所有的redo。
c、对于实例自身redo信息的查询可以添加相应的thread作为过滤条件来过滤。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值