Oracle RAC环境下的v$log v$logfile
Oracle RAC环境下的v$log v$logfile
通常情况下,在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] --下面我们查询视图来看看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
- 更多Oracle疑问解答:
- 运行exp备份oracle数据库提示oracle-12154错误
- 有没有,生产Oracle Rman 备份脚本的工具啊!
- 初学orcle,希望有大大帮忙解说一下详细步骤,从登录oracle到创建表的过程
- oracle语句问题:一张user表,三个字段,id,name,time,插入记录比如:张三2007,李四2008,张三2011
- 如何写一个ORACLE触发器同步两个表中的数据?
- oracle 如何查看一个服务器上有多少个数据库.
- oracle 创建包的时候错误 求解
- oracle 重复列的问题
- oracle 中如何查处2星期前的数据
- 请教oracle数据库安装中的问题
- 请问谁能提供给我标准的oracle ERP的数据库表结构并详细说明各表主要的作用?
- 安装oracle遇到的问题 invalid entry CRC (expected 0x3e12e795 but got 0x9db0e9fd)
- 我的是ORACLE 10G,在RMAN中如何按指定的时间恢复数据文件啊?
- oracle为什么没有自动增长列
- oracle快捷键都有哪些啊?