星期一 三月 24, 2014

如何在各个平台上配置NTP的微调模式

对于11.2之前的版本,很多环境的重启原因(top5的情况)是由于NTP调整时间的步伐过大导致的,所以RAC环境中,我们建议用户如果使用NTP,需要配置成微调模式;

具体重启的原因,请大家参考Allen Gao写的博客 :如何诊断节点重启问题


这里介绍几个主流linux和unix平台上NTP微调的配置方法:


For Linux :


1.请确确认各节点的ntp包已经安装 ,我这里是个4.2.2的版本


[oracle@nascds10 ~]$ rpm -qa | grep ntp


ntp-4.2.2p1-9.el5_4.1


2.请编辑各个节点的ntp.conf文件


[oracle@nascds10 ~]$ su - root


Password:


[root@nascds10 ~]#  vi /etc/ntp.conf


#New ntp server added by Robinson


server  192.168.1.128 prefer  <<<<===========这里是时钟服务器


restrict 192.168.7.0  mask 255.255.255.255 nomodify notrap #基于网段的限制(限制在网段192.168.7.0)


broadcastdelay 0.008


[root@nascds11 ~]# vi /etc/ntp.conf


#New ntp server added by Robinson


server 192.168.7.71 prefer


broadcastdelay 0.008


3、配置ntpd的参数,我们主要强调的是要配置成"微调的模式" 也就是在options中要加入 -x的选项


[root@nascds10 ~]# vi /etc/sysconfig/ntpd


#The following item added by Robinson


#Set to 'yes' to sycn hw clock after successful ntpdate


SYNC_HWCLOCK=yes  


OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid"


[root@nascds11 ~]# vi /etc/sysconfig/ntpd


The following item added by Robinson


SYNC_HWCLOCK=yes


OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid"


4、自动启动配置


[root@nascds10 ~]# chkconfig ntpd on


[root@nascds11 ~]# chkconfig ntpd on


5、重启一下,使最新配置生效


[root@nascds10 ~]# service ntpd restart


Shutting down ntpd: [  OK  ]


ntpd: Synchronizing with time server: [  OK  ]


Syncing hardware clock to system time [  OK  ]


Starting ntpd: [  OK  ]


[root@nascds11 ~]# service ntpd restart


Shutting down ntpd: [  OK  ]


ntpd: Synchronizing with time server: [  OK  ]


Syncing hardware clock to system time [  OK  ]


Starting ntpd: [  OK  ]


6、检查ntpd进程的状态


[root@nascds10 ~]# ntpq -p


      remote           refid      st t when poll reach   delay   offset  jitter


==============================================================================


  LOCAL(0)        .LOCL.          10 l   40   64    1    0.000    0.000   0.001


[root@nascds11 ~]# ntpq -p


      remote           refid      st t when poll reach   delay   offset  jitter


==============================================================================


  test.oracle.com  .INIT.          16 u   60   64    0    0.000    0.000   0.000


  LOCAL(0)        .LOCL.          10 l   59   64    1    0.000    0.000   0.001




For Aix:




1. NTP的同步设置  编辑 /etc/ntp.conf文件, 内容如下:


----------------------------


#broadcastclient


server 192.168.5.2 


driftfile /etc/ntp.drift


tracefile /etc/ntp.trace


slewalways yes


----------------------------


我们这里还是要强调微调slewalways  ,这个值的默认设置是no,也就是说如果您不设置,NTP最大可一次调整1000秒. 根据IBM的官方说明,如果我们不指定slewthreshold  那么默认值是 0.128 seconds. 如果想特别设置,请指定slewthreshold 的值,注意单位是second




2.在NTP客户端启动xntpd守护进程


# startsrc -s xntpd



3. 查询xntpd的状态


当 system peer 不为 'insane' 时, 表明客户端已与服务器端成功地进行了同步.


# lssrc -ls xntpd


Program name: --/usr/sbin/xntpd


Version: -------3


Leap indicator: 00 (No leap second today.) Sys peer: ------192.168.5.2 ...




关于更多的关于IBM的平台上NTP的设置,可以参考IBM的官方文档解释:


http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.files/doc/aixfiles/ntp.conf.htm



For HP  UX:



NTP在HP上的配置,是比较省心的,不容易导致RAC重启的,因为HP上的NTP默认的就是微调的模式


1、首先我们还是要编辑ntp的配置文件 /etc/rc.config.d/netdaemons,把 XNTPD 设定为1表示启动


   export XNTPD=1


2、编辑配置文件 /etc/ntp.conf ,配置好时间同步服务器


   server 192.168.5.2      #  第一个地址是主服务器


   server 192.168.5.3      #  第二个地址是备用服务器


3、启动ntp的进程


   # /sbin/init.d/xntpd start


4、检查NTP的状态


   # /usr/sbin/ntpq -p


  这个命令您会看到同步的地址


  如果出现的结果是No association ID's returned 那么表示您失败了


关于HP主机上NTP的模式,有3种如下,在HP 平台的man page中有详细的说明:


模式1:offset below 128 milliseconds

This is the normal operating regime of NTP. A properly configured NTP hierarchy (with reasonable networking) can operate for years without ever approaching the 128 millisecond upper limit. All time adjustments are small and smooth (known as slewing), and nobody even notices the slew adjustments unless they have a cesium clock or a GPS clock and expensive instrumentation to make sophisticated measurements (HP/Agilent makes the instruments).

模式2:offset above 128 milliseconds

This regime is often encountered at power-on because, those battery-backed real-time clocks they put in computers are not too great. Because NTP is quite capable of keeping the offset below one millisecond all the time it is running, many users want to get into the normal regime quickly when an offset above 128 millisecond is encountered at startup. So in this situation NTP will (fairly quickly) make a single step change, and is usually successful in getting the offset well below 128 millisecond so there will be no more of the disruptive step changes.


模式3:offset above 1000 seconds


This is so far out of the normal operating range that NTP decides something is terribly wrong and human intervention is required. The daemon shuts down.


For Solars:


我这没有测试的平台,不过在KM (How to Configure NTP or Windows Time for Oracle Clusterware (Doc ID 1056693.1))里找到了配置的办法,这里还有Windows的配置方式


检查配置:


/usr/bin/svcs ntp


STATE          STIME    FMRI


online          7:39:29 svc:/network/ntp:default


ps -ef|grep ntp


root 21212     1   0   Feb 02 ?           0:33 /usr/lib/inet/xntpd



配置/etc/inet/ntp.conf 启用slewalaways


grep 'slewalways|pll' /etc/inet/ntp.conf


slewalways yes


disable pll


启动:


/usr/sbin/svcadm enable ntp

星期四 十二月 05, 2013

Vote disk 迁移失败 ORA-15274: Not enough failgroups (3) to create voting files

在一些特殊的情况下,比如存储迁移等,需要将vote disk从一个ASM disk group迁移到另外一个ASM disk group。

- 当前vote disk位于VOTE diskgroup

$crsctl query css votedisk

##  STATE    File Universal Id                File Name Disk group

--  -----    -----------------                --------- ---------

1. ONLINE   7971b4acbea54fbabf17d0cc091ed451 (/dev/rhdisk42) [VOTE]

2. ONLINE   56cb40af1ff64f9fbff79bfadd03d432 (/dev/rhdisk82) [VOTE]

3. ONLINE   40228e87536e4f9dbfdb7c6f90fbe917 (/dev/rhdisk2) [VOTE]

Located 3 voting disk(s).



- 迁移vote disk到+data diskgroup,命令失败:

$crsctl replace votedisk +data

Failed to create voting files on disk group data.

Change to configuration failed, but was successfully rolled back.

CRS-4000: Command Replace failed, or completed with errors.



- GI_HOME/log/<hostname>/client/crsctl_log.txt 错误信息

2013-08-14 10:32:01.767: [  CRSCTL][1]crsctl_replace_votedisk: calling kgfdvfPushDiskString

2013-08-14 10:32:03.153: [  CRSCTL][1]function crsctl_replace_votedisk, error 1 [clsuSlosFormatDiag called with non-error slos.]

2013-08-14 10:32:03.153: [  CRSCTL][1]crsctl_replace_votedisk: pushed the ASM DS to the profile 1

[   CLWAL][1]clsw_Initialize: OLR initlevel [30000]

2013-08-14 10:32:03.386: [  CRSCTL][1]crsctl_format_diskgroup: creating diskgroup data

2013-08-14 10:32:05.855: [  CRSCTL][1]function crsctl_format_diskgroup, error 1 SLOS: cat=-1, opn=(none), dep=(none), loc=ORA-01405: f

2013-08-14 10:32:05.856: [  CRSCTL][1]crsctl_format_diskgroup: diskgroup data creation with status 1. Please check the alert log file for ASM



- asm alert log 错误信息:

NOTE: Creating voting files in diskgroup DATA

NOTE: Voting File refresh pending for group 1/0xad5e996c (DATA)

NOTE: Attempting voting file creation in diskgroup DATA

NOTE: voting file allocation on grp 1 disk DATA_0000

NOTE: voting file allocation on grp 1 disk DATA_0001

ERROR: Voting file allocation failed for group DATA

Errors in file /app/base/diag/asm/+asm/+ASM1/trace/+ASM1_ora_43581494.trc:

ORA-15274: Not enough failgroups (3) to create voting files



- 问题原因:存放vote disk的diskgroup必须满足下面的要求:

1. 如果diskgroup是normal redundant,那么要求有3个failure group才能存放vote disk。

2. 如果diskgroup是high redundant,那么要求有5个failure group才能存放vote disk。



+DATA diskgroup是normal redundant diskgroup,但是只有2个failure group,不满足上面的要求,因此失败,

查看diskgroup的failure group信息:

select GROUP_NUMBER,name,type from v$asm_diskgroup;

GROUP_NUMBER NAME                           TYPE

------------ ------------------------------ ------

           2 DATA                           NORMAL  

<<<<<<<<<<< +DATA是normal redundant diskgroup   


select group_number,disk_number,name,path,failgroup from v$asm_disk where GROUP_NUMBER=2;    

GROUP_NUMBER DISK_NUMBER NAME                           PATH       FAILGROUP

------------ ----------- ------------------------------ ---------- ------------------------------

           2           0 ASMDISK1                   ORCL:ASMDISK1 CONTROLLER1

           2           1 ASMDISK2                   ORCL:ASMDISK2 CONTROLLER2

<<<<<<<<<<<+DATA只有2个failure group,CONTROLLER1和CONTROLLER2



- 解决方法:创建一个normal redundant diskgroup,并且有3个failure group,然后再迁移.



方法#1 指定3个disk,并且设置3个failure group

CREATE DISKGROUP temp1 NORMAL REDUNDANCY

FAILGROUP controller1 DISK '/dev/ASMDISK1' NAME ASMDISK1

FAILGROUP controller2 DISK '/dev/ASMDISK2' NAME ASMDISK2

FAILGROUP controller3 DISK '/dev/ASMDISK3' NAME ASMDISK3;



方法#2 指定3个disks,默认每个disk为自己的failure group

CREATE DISKGROUP temp1 NORMAL REDUNDANCY

DISK '/dev/ASMDISK1' NAME ASMDISK1

DISK '/dev/ASMDISK2' NAME ASMDISK2

DISK '/dev/ASMDISK3' NAME ASMDISK3;

-迁移vote disk

$crsctl replace votedisk +temp1



参考在线文档:http://docs.oracle.com/cd/E11882_01/install.112/e41961/storage.htm#CWLIN290

Disk groups containing voting files must have at least 3 failure groups for normal redundancy or at least 5 failure groups for high redundancy. 



参与此主题的后续讨论,可以访问我们的中文社区,跟帖“共享:Vote disk 迁移失败 ORA-15274: Not enough failgroups (3) to create voting files"。 

星期一 十一月 25, 2013

在11.2RAC上如何恢复全部丢失的OCR和VotingDisk(存储在集群文件系统)

   在11.2 集群中常见的OCR和Voting disk都是安装在ASM的diskgroup上,但也有一些情况是把OCR和Voting disk安装在集群文件系统上的。由于存储故障或者误删除等可能导致了OCR和Voting disk全部丢失

   在My Oracle Support上有一篇文档是恢复针对存储在ASM磁盘组上的OCR和Voting disk:
   How to restore ASM based OCR after complete loss of the CRS diskgroup on Linux/Unix systems (Doc ID 1062983.1)

   对于存储在集群文件系统(CFS)上的OCR和Voting disk,请按照下面的步骤进行恢复:

下面的操作都用root执行。

1. 找到最新的OCR备份所在的节点(OCR的备份会自动执行,大概每4小时一次):
在所有节点查看:
$ls -lrt $GRID_HOME/cdata/集群名/

2. 在所有节点都停止CRS:
#crsctl stop crs -f
由于OCR和Voting disk丢失后,集群基本上会异常终止,但是有一些进程可能没有停止,因此用-f来强制停止集群。

3. 在拥有最新的OCR备份的节点,用独占模式启动GI:
11.2.0.1:
# crsctl start crs -excl

11.2.0.2及以上:
# crsctl start crs -excl -nocrs

-excl 表示用独占模式启动CRS,不需要OCR和Voting disk。
-nocrs 表示不启动crsd.bin

4. 恢复OCR备份:
# cd $GRID_HOME/cdata/集群名/
# $GRID_HOME/bin/ocrconfig -restore OCR备份集的名字

如果在执行上面的命令恢复OCR的时候,报错 PROT-21: Invalid parameter (10.2/11.) 或者 PROT-30 The Oracle Cluster Registry location to be added is not accessible (for 11.2):

那么需要先在集群文件系统上手工创建OCR文件:

比如:
用root 用户:
# touch /cluster_fs/ocrdisk.dat <======请把这些文件的名字建成与原来同名的
# touch /cluster_fs/ocrmirror.dat
# chown root:oinstall /cluster_fs/ocrdisk.dat  /cluster_fs/ocrmirror.dat
# chmod 640 /cluster_fs/ocrdisk.dat  /cluster_fs/ocrmirror.dat

对于Voting disk不需要预先touch文件。

5. 确认OCR已经恢复成功:
# $GRID_HOME/bin/ocrcheck

对于11.2.0.1,需要执行下面的命令来启动crsd,这步在建voting file时需要(对于11.2.0.2及之上,不需执行):
# $CRS_HOME/bin/crsctl start res ora.crsd -init
CRS-2672: Attempting to start 'ora.crsd' on 'racnode1'
CRS-2676: Start of 'ora.crsd' on 'racnode1' succeeded

6. 用下面的命令列出Votingdisk的信息:
#crsctl query css votedisk

7. 用下面的命令删除原有的Voting disk:
#crsctl delete css votedisk voting_disk_GUID <==这个GUID是上面query命令列出来的


8. 用下面的命令添加新的Voting disk(和原来的文件同名):
#crsctl add css votedisk  path_to_voting_disk <==包括具体的路径和文件名

9.如果有多块voting disk盘,那么重复上面的7和8步。

10.在当前的这台节点执行下面的命令停止GI:
# crsctl stop crs -f

11.在所有节点都启动GI:
#crsctl start crs

12.检查CRS运行正常:
# crsctl check cluster -all
**************************************************************
racnode1:
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
racnode2:
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************

# /crsctl stat res -t



参考官方文档:
http://docs.oracle.com/cd/E11882_01/rac.112/e41959/votocr.htm#CWADD90961
Oracle® Clusterware Administration and Deployment Guide
11g Release 2 (11.2)
E41959-03
Restoring Oracle Cluster Registry
Restoring Voting Disks

星期四 十一月 21, 2013

RACcheck-RAC健康检查好帮手


     RACcheck 是在RAC系统上进行健康检查的一个专用工具,这个工具主要用来检查RAC相关软件的配置是否符合要求以及一些最佳实践是否被应用了。通过这个工具,用户可以很方便地、自动化地对自己的系统进行健康检查和评估。

    RACcheck 能够检查的软件主要有:OS、Oracle Clusterware (CRS)、 Grid Infrastructure environment(GI)、Automatic Storage Management (ASM)以及Real Application Clusters (RAC)。


    检查的项目包括:
      o OS kernel 参数
      o OS 包/补丁
      o OS上其它和RAC相关的配置
      o CRS/Grid Infrastructure
      o RDBMS
      o ASM
      o 数据库参数
      o 对于RAC数据库影响较大的设置
      o 升级到11.2.0.3/11.2.0.4/12c时的升级检查

    目前支持的平台:
       o Linux x86-64* (Enterprise Linux, RedHat and SuSE 9, SuSE 10 & SuSE 11)
       o Oracle Solaris SPARC (64-bit)(Solaris 10 and 11)
       o Oracle Solaris x86-64 (Solaris 10 and 11)
       o IBM AIX on POWER Systems (64-bit) **
       o HP-UX PA-RISC (64-bit)**
       o HP-UX Itanium **

       *  不支持32位平台,不支持 Linux Itanium
       ** 需要安装BASH Shell 3.2 或之上

    目前支持的数据库版本:

       o 10gR2
       o 11gR1
       o 11gR2
       o 12cR1

    注:自版本 2.2.0 起,RACcheck 支持单实例、Oracle Restart 以及 RAC(包括 RAC One)  


    我们推荐使用最新版本的RACcheck,这是因为RACcheck基于最佳实践,这些最佳实践会不断更新,另一方面RACcheck会检查补丁的安装情况,PSU 是按季度推出的,所以RACcheck也会至少每两到三个月更新一次。

    1.首先看一下如何下载和安装RACcheck


     RACcheck是从下面的My Oracle Support 文档中下载:
    RACcheck - RAC Configuration Audit Tool (Doc ID 1268927.1)

    对于RAC环境,只需要在任意一个节点执行RACcheck就可以,会通过SSH连接到别的节点收集数据,由于它会以sysdba身份登录到数据库中做很多检查,所以要求用数据库软件的属主来执行RACcheck,而且要对oracle用户配置用户等效性,使它能够无需密码就连接到远程节点

    下载之后的文件为raccheck.zip。 将这个文件用数据库软件属主上传到RAC集群的任一节点,比如节点1的一个目录:
su - oracle  <=======用数据库属主执行
$cd /home/oracle
$mkdir racheck
$cd raccheck

$pwd
/home/oracle/raccheck <==本例中把raccheck.zip上传到了这个目录

$ls -l raccheck
-rw-r--r-- 1 oracle oinstall 3822755 Nov 10 18:45 raccheck.zip

$unzip  raccheck.zip <==解压这个文件

$ls -l
total 25852
-rw-rw-r-- 1 oracle oinstall 17036921 Oct  7 15:42 collections.dat
-rwxr-xr-x 1 oracle oinstall  1152273 Oct  7 15:42 raccheck <============这个文件的权限为755,属主是oracle
-rw-r--r-- 1 oracle oinstall  3822755 Nov 10 18:45 raccheck.zip
-rw-r--r-- 1 oracle oinstall     2231 Oct  7 15:42 readme.txt
-rw-rw-r-- 1 oracle oinstall  4398080 Oct  7 15:42 rules.dat
-rw-r--r-- 1 oracle oinstall      304 Oct  7 15:42 UserGuide.txt

   2. 接下来看一下如何执行raccheck

   它的执行也是非常简单的,用oracle用户执行:
[oracle-AT-rac1 raccheck]$ ./raccheck

CRS stack is running and CRS_HOME is not set. Do you want to set CRS_HOME to /u01/app/11.2.0.4/grid?[y/n][y]y <==确认CRS_HOME是否正确

Checking ssh user equivalency settings on all nodes in cluster
Node rac2 is configured for ssh user equivalency for oracle user

Searching for running databases . . . . .
. .
List of running databases registered in OCR
1. RACDB
2. None of above

Select databases from list for checking best practices. For multiple databases, select 1 for All or comma separated number
like 1,2 etc [1-2][1].1 《===========选择要进行检查的数据库
. .

Checking Status of Oracle Software Stack - Clusterware, ASM, RDBMS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-------------------------------------------------------------------------------------------------------
                                                Oracle Stack Status
-------------------------------------------------------------------------------------------------------
Host Name  CRS Installed  ASM HOME       RDBMS Installed  CRS UP    ASM UP    RDBMS UP  DB Instance Name
-------------------------------------------------------------------------------------------------------
rac1        Yes             Yes             Yes             Yes        Yes      Yes      RACDB1  
rac2        Yes             Yes             Yes             Yes        Yes      Yes      RACDB2  
-------------------------------------------------------------------------------------------------------
Copying plug-ins
. . . . . . . . . . . . . . . . . .
. . . . . .

113 of the included audit checks require root privileged data collection . If sudo is not configured or the root password is
not available, audit checks which  require root privileged data collection can be skipped.

1. Enter 1 if you will enter root password for each  host when prompted
2. Enter 2 if you have sudo configured for oracle user to execute root_raccheck.sh script
3. Enter 3 to skip the root privileged collections
4. Enter 4 to exit and work with the SA to configure sudo  or to arrange for root access and run the tool later.

Please indicate your selection from one of the above options for root access[1-4][1]:-1 <=========root密码输入方式,选择1表示手工输入

注:
选项1:在执行阶段根据提示输入root密码
选项2:表示为oracle用户配置了sudo。
选项3:跳过需要使用root权限进行的检查,不推荐。
选项4:退出RACcheck来进行root权限相关的配置。


Is root password same on all nodes?[y/n][y]y 《===root的密码是否在所有节点都一致
Enter root password :  <==输入root用户的密码
Verifying root password.
. . .

*** Checking Best Practice Recommendations (PASS/WARNING/FAIL) *** 《========开始进行检查

Collections and audit checks log file is
/home/oracle/raccheck/raccheck_rac1_RACDB_111013_185118/log/raccheck.log

Checking for prompts in /home/oracle/.bash_profile on rac1 for oracle user...

Checking for prompts in /home/oracle/.bash_profile on rac2 for oracle user...

Starting to run raccheck in background on rac2 <==========对远程节点也进行检查

=============================================================
                    Node name - rac1
=============================================================

Collecting - ASM DIsk I/O stats
Collecting - ASM Disk Groups
Collecting - ASM Diskgroup Attributes
Collecting - ASM disk partnership imbalance
Collecting - ASM diskgroup attributes
Collecting - ASM initialization parameters

完成后,将显示以下(或类似)内容:
Detailed report (html) - /home/oracle/raccheck/raccheck_rac1_RACDB_111013_185118/raccheck_rac1_RACDB_111013_185118.html
UPLOAD(if required) - /home/oracle/raccheck/raccheck_rac1_RACDB_111013_185118.zip

    两个节点的RACcheck一般需要运行10多分钟,每个节点大概需要5分钟。RACcheck 占用的资源很少,在我的测试库上大概占用了10%左右的CPU。另外,RACcheck生成的结果一般在5M左右,自动压缩生成的.zip文件大概几百K。

  3. 再看一下RACcheck生成的报告


   RACcheck 检查完成之后会生成一个html报告,这个报告的命名为:racheck_节点名_数据库名_时间.html,比如raccheck_rac1_RACDB_111013_185118.html。同时,它还会把所有的输出文件都打包为一个.zip文件,比如raccheck_rac1_RACDB_111013_185118.zip,可以把这个.zip文件从RAC服务器上下载到本地的windows,解压后查看其中的生成的racheck_节点名_数��库名_时间.html 这一个文件就可以。

   生成的报告也非常
简单、清晰,在报告最上部会列出这次检查的分数,满分是100分。



   在html报告中会列出下面的内容:

Findings Needing Attention  <==检查失败的项目,分别为FAIL、WARNING、INFO
   On Database Server
MAA Scorecard               <==MAXIMUM AVAILABILITY ARCHITECTURE,也就是最大可用架构
Findings Passed             <==通过的项目
   On Database Server
   Cluster Wide
GRID and RDBMS patch recommendation Summary report   <==补丁检查结果
GRID and RDBMS patch recommendation Detailed report <==推荐打的补丁

    对于每一项失败的项目,点击对应的“View"按钮会,会列出这项检查为何失败、这个问题会导致的影响、 推荐的解决方案,相关文档等。





   4. RACcheck 升级检查功能


   RACcheck 还有一个很赞的功能就是升级前和升级后的检查,当前的RACcheck版本2.2.3_20131007已经支持升级到版本11.2.0.3/11.2.0.4/12c时的升级检查。进行升级检查的目的是为了保障集群和RAC升级的过程尽量平稳和顺利,尽量避免遇到已知的问题。使用RACcheck进行升级检查的好处是它整合了许多升级方面常用的文档,这样就可以统一入口,用RACcheck这个工具进行检查就可以。


   升级检查分两个阶段:
o 升级前:
    $./raccheck -u -o pre 
  o 升级后:
    $./raccheck -u -o post


  5. 什么时候适宜运行RACcheck呢?

  o 在系统负载较低的时候运行,这样系统影响最小。RACcheck 不会对系统的性能状况进行分析,因此不需要在系统发生性能情况时执行。
  o 另外在RAC环境部署完毕之后推荐运行一下来检查一下系统的配置健康情况。
  o 还推荐在计划内的维护前和维护后都执行一下
  o 在升级前和升级后也要执行
  o 在日常维护中,至少每三个月执行一次,因为RACcheck每两到三个月会更新一次

   默认方式执行 ./raccheck 后只会执行一次,但是可以在执行RACcheck时以自动任务的方式让它定期执行,并发送邮件通知。具体的配置方式请参考RACcheck的用户手册章节“How to Run RACcheck Using the RACcheck Daemon”(也是在MOS文档 1268927.1中下载)。

   比如:
首先设置自动任务的参数:
$ ./raccheck -set "AUTORUN_INTERVAL=1d;AUTORUN_FLAGS= -o v;NOTIFICATION_EMAIL=firstname.lastname@company-DOT-com;PASSWORD_CHECK_INTERVAL=1"

用daemon方式启动RACcheck:
$ ./raccheck –d start

   RACcheck 不会像OSWatcher一样自动维护它的输出文件,需要手工清除或者设置cron等自动任务来清除。
   另外,不可以在一台server上同时启动多个RACcheck,同一时刻只能执行一个RACcheck。

   需要注意的是,RACcheck不是诊断工具,不是性能调优工具,也不是数据收集工具,比如RAC节点发生了重启,那么RACcheck不能告诉你重启的原因,它也不会收集诊断重启问题的数据,所以它不能代替RDA ,diagcollection等工具。另外,RACcheck也不能代替cluster verification utility,这是因为他们两个工具是互补的CVU 是集群自带的工具,而且GI会定时调用CVU来进行一些RAC的检查,但是CVU的版本是确定的,不像RACcheck会定期被更新。

  RACcheck 的支持是通过MOS的社区来进行的,在RAC/Scalability 这个社区中有一个专门用于RACcheck的帖子RAC/Scalability Community Forum,如果有RACcheck的问题,可以在这个帖子提问,注意这个帖子是英文的。还可以在中文数据库社区进行讨论。


  我们在2013年11月份进行了一个关于RACcheck的网上讲座,讲座的录像和讲义可以在在MOS文档1456176.1=》“Archived 2013”=》使用RACCheck诊断和预防RAC问题=》点击Recording 或者 .pdf 进行下载。

  附:我用目前最新的RACcheck版本进行了测试,单实例上也可以运行RACcheck,下面是在AIX上利用RACcheck对10.2.0.5的单实例数据库进行检查的过程:


$ ./raccheck
This computer is for [S]ingle instance database or part of a [C]luster to run RAC database [S|C] [C]:S

raccheck did not find the RDBMS binaries on nascds5 from environment.
Please set RAT_ORACLE_HOME to ORACLE_HOME in current shell to override and re-run it.
eg export RAT_ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1

$export RAT_ORACLE_HOME=/opt/oracle/products/10.2.0.5

$ ./raccheck
This computer is for [S]ingle instance database or part of a [C]luster to run RAC database [S|C] [C]:S
RDBMS binaries found at /opt/oracle/products/10.2.0.5 and ORACLE_HOME not set. Do you want to set ORACLE_HOME to
/opt/oracle/products/10.2.0.5?[y/n][y]y

Checking Status of Oracle Software Stack - Clusterware, ASM, RDBMS
. . . . . . . . .
-------------------------------------------------------------------------------------------------------
                                                 Oracle Stack Status                            
-------------------------------------------------------------------------------------------------------
Host Name  CRS Installed  ASM HOME       RDBMS Installed  CRS UP    ASM UP    RDBMS UP  DB Instance Name
-------------------------------------------------------------------------------------------------------
nascds5    No             ./raccheck: line 9508: [: -eq: unary operator expected
Yes            Yes              No        No        No                                 
-------------------------------------------------------------------------------------------------------
raccheck did not find the Clusterware version from environment.
Please set RAT_DB to cluster version in current shell to override and re- run it.
eg export RAT_DB=112020

$ export RAT_DB=102050

$ ./raccheck
This computer is for [S]ingle instance database or part of a [C]luster to run RAC database [S|C] [C]:S
RDBMS binaries found at /opt/oracle/products/10.2.0.5 and ORACLE_HOME not set. Do you want to set ORACLE_HOME to
/opt/oracle/products/10.2.0.5?[y/n][y]y

Checking Status of Oracle Software Stack - Clusterware, ASM, RDBMS

. . . . . . . . .
-------------------------------------------------------------------------------------------------------
                                                 Oracle Stack Status                            
-------------------------------------------------------------------------------------------------------
Host Name  CRS Installed  ASM HOME       RDBMS Installed  CRS UP    ASM UP    RDBMS UP  DB Instance Name
-------------------------------------------------------------------------------------------------------
nascds5    No             ./raccheck: line 9508: [: -eq: unary operator expected
Yes            Yes              No        No        No                                 
-------------------------------------------------------------------------------------------------------

Copying plug-ins
. . . . . . . . . . . . . . . . . .
. . . . . .

*** Checking Best Practice Recommendations (PASS/WARNING/FAIL) ***

Collections and audit checks log file is
/home/oracle/raccheck/raccheck_nascds5_112113_094623/log/raccheck.log
Checking for prompts in /home/oracle/.profile on nascds5 for oracle user...
=============================================================
                    Node name - nascds5                                
=============================================================

Collecting - AIX Packages
Collecting - CPU Information
Collecting - Disk Information
Collecting - Memory Information
Collecting - Network tunable parameters
Collecting - OS fixes or patches
Collecting - Patches for RDBMS Home
Collecting - System and Kernel Settings

Data collections completed. Checking best practices on nascds5.
--------------------------------------------------------------------------------------
 WARNING => OS Patch IZ97457 is recommended but not installed
 FAIL =>    OS Patch IZ89165 is recommended but not installed
 FAIL =>    OS Patch IZ41855 is recommended but not installed
 FAIL =>    OS Patch IZ52319 is recommended but not installed
 FAIL =>    OS Patch IZ51456 is recommended but not installed
 WARNING => kernel paramater tcp_ephemeral_low is not set to recommended value of 9000
 WARNING => kernel paramater udp_ephemeral_low is not set to recommended value of 9000
 WARNING => kernel paramater maxuproc is not set to recommended value of 13684
 WARNING => kernel paramater maxreqs is not set to recommended value of 65536

Best Practice checking completed.Checking recommended patches on nascds5.
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
              RDBMS homes patches summary report
---------------------------------------------------------------------------------
Total patches  Applied on RDBMS Applied on ASM ORACLE_HOME         
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
Detailed report (html) - /home/oracle/raccheck/raccheck_nascds5_112113_094623/raccheck_nascds5_112113_094623.html

UPLOAD(if required) - /home/oracle/raccheck/raccheck_nascds5_112113_094623.zip

星期二 九月 17, 2013

RAC 性能诊断实例 --- TX - index contention


最近,很多读者反应,希望能够写一些实际案例分析的文章。这种文章会和大家的实际工作更接近一些。
而且,最近解决了一些RAC 的性能问题。在这里,找到了一个比较有代表性的例子,和大家分享一下,也欢迎大家一起讨论。



问题的症状很明确,在一个双节点的RAC 数据库中,数据库大概hang住了10分钟,之后自动恢复正常了。而且,问题只发生在实例1上,实例2是正常的。



首先,我们搜集了问题期间的实例1 AWR报告(实例2AWR也被搜集了,但是并没有什么异常,所以没有贴出来),发现了以下的信息。



Top 5 Timed Foreground Events



Event Waits Time(s) Avg wait (ms) % DB time Wait
Class


enq: TX - index contention 448 90,738 202540 51.18 Concurrency


enq: US - contention 134,660 64,312 478 36.27 Other


resmgr:cpu quantum 98,992 12,204 123 6.88 Scheduler


gc current grant busy 21,377 7,352 344 4.15 Cluster


latch: enqueue hash chains 2,126 6,422 3021 3.62 Other



我们能看到,等待事件“enq: TX - index contention” 是等待时间最长的事件,而且平均等待时间很长。



Instance Activity Stats


=================


branch node splits 6 0.00 0.00


leaf node 90-10 splits 124 0.09 0.00


leaf node splits 674 0.47 0.00



Segments by Row Lock Waits


=================



Owner Tablespace Name Object Name Subobject
Name Obj. Type Row Lock Waits % of Capture


XXXX XXXX A
INDEX 836 71.03


XXXX XXXX B
INDEX 185 15.72


XXXX XXXX C
INDEX 68 5.78


XXXX XXXX D
TABLE 59 5.01


XXXX XXXX E
TABLE 20 1.70



我们能看到,产生最高的row lock等待时间的对象是一个索引。



另外,客户确认以下的sql 语句是执行最频繁的。


insert into XXXX (......) values (:1, :2, :3, :4, :5, :6,
:7......);



从以上的信息,似乎我们很容易认为这个问题是由于过多的索引块分裂,或者由于过多相近的值被insert 到表里,导致了索引的争用。




但是,在和客户进一步确认后,发现上面的想法应该是错误的,因为我们得到了以下的反馈。


1. 经过和正常性能时的AWR报告相比,等待事件 “enq: TX - index contention” 的确在数据性能正常时没有出现。


2. 和正常性能时的AWR比较后,并没有看到索引分裂有明显增加。


3. 和性能正常时比较,insert语句执行的次数并没有增加。而且,数据库的负载并没有增长。


4. 另外,根据TX等待事件的平均等待时间(202540ms,
也就是超过200), 看起来更象是类似于某些进程hang住导致的。



接下来 ,我们查看了DBA_HIST_ACTIVE_SESS_HISTORY的信息,但是很遗憾,有大概10分钟的信息是空白的。比较幸运的是,问题开始的几分钟还是有信息出现的。所以,我们取到了最初几分钟的ASH报告,并发现,下面的进程阻塞了上面我们提到的insert 语句。


Blocking Sid (Inst) %
Activity Event Caused % Event User Program # Samples Active XIDs


1234, 5678( 1) 46.92
enq: TX - index contention 46.92 XXXX JDBC Thin Client 25/150 [ 17%] 1



另外,根据DBA_HIST_ACTIVE_SESS_HISTORY 中的信息,我们发现上面的blocker进程(1234,
5678( 1)
)一直在等待“latch: object queue header operation”。问题到这一步,有些朋友可能会得出结论,问题是由于DRM导致的,因为等待事件“latch: object queue header
operation
”是在DRM时产生的。但是,我们并没有相关的信息来支持我们的判断,而且,这时候我们只能确认问题和DRM 相关,但是不能确定就是DRM导致的,而是有两种可能性:


1. 问题的确是由于DRM导致的。


2. DRM在问题期间的确发生了,但是由于数据库性能的问题,DRM也是受害者之一。



我们知道,对于DRMlms,lmd lmon进程都会参与。所以,接下来要做的事情是查看这些进程的trace file OSW报告,来确认这些进程的状态。幸运的是,我们很快有了新的发现。


lmon 跟踪文件


......


*** 2013-xx-xx 00:00:00.000


==============================


kjfmHBcheck: LMS0
(ospid: xxxxxx) not moving for 21 sec (1367110915.1367110894)


: Not in wait; last wait ended 0 secs ago.


: last wait_id 655230104 at 'latch: gc
element'.



*** 2013-xx-xx 00:00:00.000


==============================


kjfmHBcheck: LMS1
(ospid: xxxxxx) not moving for 20 sec (1367110916.1367110896)


: Not in wait; last wait ended 0 secs ago.


: last wait_id 671495420 at 'latch: gc
element'.



看起来lms 进程的确有性能问题。


lms 跟踪文件


......


*** 2013-xx-xx 00:00:00.000


DRM(516) win(1) lms 0
finished replaying gcs resources


kjfmHBupdateTime: took
33 seconds for 255 heartbeats


lms 0 finished fixing
gcs write protocol



*** 2013-xx-xx 00:00:00.000


DRM(517) win(1) lms 0
finished replaying gcs resources



*** 2013-xx-xx 00:00:00.000


lms 0 finished fixing
gcs write protocol



*** 2013-xx-xx 00:00:00.000


SKGXP_TRACE_FLUSH:
output truncated 11 traces lost


SKGXP_TRACE_FLUSH:
start


SKGXP: (16520 <-
7836)SKGXPDOCON:can't accept new connections under timed wait context


SKGXP: (16520 <-
7390)SKGXPDOCON:can't accept new connections under timed wait context


SKGXP: (16520 <-
7404)SKGXPDOCON:can't accept new connections under timed wait context


SKGXP: (16520 <-
9004)SKGXPDOCON:can't accept new connections under timed wait context


SKGXP: (16520 <-
9089)SKGXPDOCON:can't accept new connections under timed wait context


SKGXP: (16520 <-
7344)SKGXPDOCON:can't accept new connections under timed wait context


SKGXP: (16520 <-
7470)SKGXPDOCON:can't accept new connections under timed wait context


SKGXP: (16520 <-
9495)SKGXPDOCON:can't accept new connections under timed wait context


SKGXP: (16520 <-
7676)SKGXPDOCON:can't accept new connections under timed wait context


SKGXP: (16520 <-
9192)SKGXPDOCON:can't accept new connections under timed wait context


SKGXP: (16520 <-
8758)SKGXPDOCON:can't accept new connections under timed wait context


SKGXP_TRACE_FLUSH: end


看起来,lms的确能够完成DRM的工作,但是正在忙于接受新的数据库链接。对于RAC数据库,当新的数据库连接被建立时lms进程需要在实例之间对新的会话进行一些数据的传递,这是正常的。而且,虽然客户没有安装OSW,但是从客户安装的第三方操作系统监控软件,我们发现在问题期间lms进程占用了100% cpu时间。


所以,我们可以看到,DRM并不是导致问题的原因,而是受害者之一。而问题的真正的原因可能有以下的两种可能。


1. 过多的数据库连接导致lms 忙于处理新的数据库连接,而无法处理其他的请求。


2. Oracle 存在bug,导致了lms 进程在处理新的连接时spin 在了某个地方。这种判断的主要依据是lms进程占用了100% cpu,这说明lms进程很忙。


最后,我们搜集到了问题期间的listener 日志。但是无法拿到lms进程的堆栈信息(diag lmon进程并没dump
lms
进程的堆栈信息,而且客户也没有在问题期间搜集lms进程的pstack信息输出)。接下来,问题的原因水落石出----“连接风暴”。因为我们在问题出现之前的大概5分钟到问题结束,每分钟会有大概300个链接尝试连接数据库,而在正常期间,每分钟大概只有10个链接左右。当连接风暴结束之后,数据库也恢复正常运行了。


总结:实际工作中我们会遇到很多常见的问题,可以利用经验进行判断,并直接给出所谓的原因和解决方案,而且有时候的确是正确的。但是,从oracle support的角度来讲,在诊断问题过程中,我们需要的是了解在问题期间系统到底发生了什么,同时运用我们的知识来进行分析,并且找到相应的证据支持自己的分析,最后找到问题真正的原因,并给出相应的解决方案。而且,即使我们不能得到足够的信息进行完整的分析,我们也需要利用我们的知识和已有的信息,来给出问题可能的原因和比较“靠谱”的解决方案,而不能仅仅依靠我们的经验。


注意:以上问题中AWR和跟踪文件中的涉及客户系统的信息已经被修改或者没有贴出来。



如果您对本文感兴趣,请在这里进行讨论。

星期三 八月 21, 2013

如何诊断RAC系统中的'gc cr multi block request'?

     'gc cr multi block request' 是RAC数据库上比较常见的一种等待事件,在RAC 上进行全表扫描(Full Table Scan)或者全索引扫描(Index Fast Full Scan)时,容易产生这样的多块读等待。

     这种等待产生的主要原因:
1. 数据库参数db_file_multiblock_read或者db_block_size设置太大,导致多块读时GC传输量太大;
2. OS上UDP相关的参数设置不够大导致接收发送UDP的缓存区溢出;
3. 私网性能;
4. LMS设置问题(个数不足或者不是实时运行(real time))导致LMS的处理能力不够,不能及时传输global cache data/message。

    这方面的Bug比较少,在11.2之前有一个BUG 8464597,当db_block_size = 32k时,引发大量"gc cr multi block request" 而且性能下降,这个Bug在11.2已经修复。
    很多情况下,降低DB_FILE_MULTIBLOCK_READ_COUNT 并且 加大OS UDP相关参数会将极大缓解'gc cr multi block request' 等待。

     最近处理了一个问题,从10.2升级到11.2.0.3后产生大量'gc cr multi block request' 等待,发现DB_FILE_MULTIBLOCK_READ_COUNT, UDP 参数等都没有改变,只是升级后LMS的个数在不同实例间不同而且下降了很多,后来把LMS个数增加并且各个实例值保持一致后,问题得到解决。

                                                                Avg
                                                          wait   % DB
Event                                 Waits     Time(s)   (ms)   time Wait Class
------------------------------ ------------ ----------- ------ ------ ----------
gc cr multi block request           632,923      32,441     51   35.5 Cluster
DB CPU                                           13,518          14.8
gc cr grant 2-way                   327,717      10,900     33   11.9 Cluster
gc current grant 2-way              190,856       6,855     36    7.5 Cluster
gc current block 2-way              101,154       3,792     37    4.1 Cluster


如果发现AWR TOP5 等待中存在'gc cr multi block request' 而且它的Avg wait(ms)较高,那么请参考下面的诊断步骤:


第一步,查看db_file_multiblock_read_count和db_block_size参数设置。

SQL>show parameter db_block_size
SQL>show parameter db_file_multiblock_read_count

db_block_size一般为8192, db_file_multiblock_read_count一般为16.

第二步,参看OS udp相关参数设置,udp 的参数在不同的OS上是不同的,这些参数会设置UDP的接收缓存区和发送缓存区的大小,一般来说接收缓存区要>=发送缓存区。 如果在生产库修改这些参数,最好咨询OS厂商了解注意事项。

AIX上:
#no –a
                udp_recvspace
                udp_sendspace

o 设置udp_sendspace >=[(DB_BLOCK_SIZE * DB_FILE_MULTIBLOCK_READ_COUNT) + 4096],但是不低于 65536.
  比如,DB_BLOCK_SIZE=8192, DB_FILE_MULTIBLOCK_READ_COUNT=16,那么udp_sendspace>= (8192 * 16) + 4096=135168.注意这个值只是最低值,并不是Oracle要求必须设置这么大。
o 设置udp_recvspace 为 4到10倍 udp_sendpace
o 由于sb_max 必须 >= udp_recvspaceIf ,可能需要增加sb_max的值(默认为1048576)
o 如果udp的参数设置不合理,可能会产生“socket buffer overflows”,如果这个值非0, 需要增加udp_recvspace:
 netstat -s | grep "socket buffer overflows"
o 参考资料:http://www-03.ibm.com/support/techdocs/atsmastr.nsf/WebIndex/WP100883
  Minimum Software Versions and Patches Required to Support Oracle Products on IBM Power Systems (Doc ID 282036.1)

Linux上:
#More /etc/sysctl.conf

net.core.rmem_default
net.core.rmem_max
net.core.wmem_default
net.core.wmem_max

官方文档上要求的最低值:
http://docs.oracle.com/cd/E11882_01/install.112/e24321/pre_install.htm#BABDAEDB
Oracle Database Installation Guide
11g Release 2 (11.2) for Linux
E24321-07
rmem_default     262144     
rmem_max     4194304
wmem_default     262144     
wmem_max     1048576

可以将这几个值都设为4k:
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 4194304
net.core.wmem_max = 4194304

HP上:

请检查UDP设置是否足够大:
$ /bin/ndd -get /dev/sockets socket_udp_rcvbuf_default
$ /bin/ndd -get /dev/sockets socket_udp_sndbuf_default

确保socket_udp_rcvbuf_default至少是socket_udp_sndbuf_default的两倍。

Sun:
可以用下面的命令查看UDP设置:
ndd /dev/udp udp_xmit_hiwat
ndd /dev/udp udp_recv_hiwat
ndd /dev/udp udp_max_buf

可以用下面的命令设置这两个值为OS最大允许的:
ndd -set /dev/udp udp_xmit_hiwat
ndd -set /dev/udp udp_recv_hiwat
ndd -set /dev/udp udp_max_buf <1M or higher>

更多信息,可以参考MOS文档:
Tuning Inter-Instance Performance in RAC and OPS (Doc ID 181489.1)

第三步,查看网络情况。
比如用netstat -s 命令查看是否有bad data length, bad checksums, incomplete headers, socket buffer overflows等,注意这些值是累计的,需要查看它们在发生问题的时候是否有增加。
另外可以查看AWR中是否有 "Global Cache Blocks Lost" ,理想情况下这个值是0,如果有较大的block lost,说明网络有问题(按照MOS 文档563566.1进行网络检查)。
还可以请网管查看私网的性能情况。

第四步,检查LMS。
1. 查看LMS的trace file,查看是否有异常。
2. 查看LMS进程的优先级是否是实时的(real time)的?

比如AIX:
# ps -elf|grep lms

ps -elf|grep lms
F      S      UID      PID     PPID   C PRI NI ADDR    SZ    WCHAN    STIME    TTY  TIME CMD
240103 A   oracle  4719002        1   5  39 -- 8ae40b590 248856            Jul 28      - 570:45 ora_lms0_rac1

priority 越小说明优先级越高,PRI小于40说明是Real Time的:
http://aix4admins.blogspot.co.uk/2011/08/commands-and-processes-process-you-use.html

3. 查看LMS的个数:
SQL>show parameter GCS_SERVER_PROCESSES
这个值决定了LMS的个数

这个值依赖于CPU的个数(cpu_count),根据11.2官方文档:
http://docs.oracle.com/cd/E11882_01/server.112/e25513/initparams094.htm#REFRN10259
Default value
If 1 - 3 CPUS, then 1
If 4 - 15 CPUs, then 2
If 16 or more CPUs, then 2 + (CPUs / 32). If the result includes a fraction, then the fraction is disregarded. For example, if you had 20 CPUs, then 2 + (20 / 32) would equal 2 GCS processes.
If CLUSTER_DATABASE is set to false, then 0
If ASM, then 1

在AIX上,有的时候CPU可能是动态增加的,那么一定要注意检查LMS进程的个数是否随之调整了。


有关这个问题的讨论,可以在中文社区帖子中进行 如何诊断RAC系统中的'gc cr multi block request'?

星期三 八月 14, 2013

如何在11.2集群中添加/删除资源?

     在11.2,数据库、监听、VIP、ASM、磁盘组等都属于GI所管理的资源,有的时候需要添加、删除、修改资源属性等,都是使用crsctl命令来操作的。
     注意在集群中添加和删除资源只是将它从OCR中注册或者移除,并不是真正的将这个资源删掉。比如diskgroup这个资源,用crsctl add/delete并不会把这个磁盘组删除。


     下面列出了GI所管理的资源:
-bash-3.00$ crsctl stat res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS       
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.dg
               ONLINE  ONLINE       rac1                                     
               ONLINE  ONLINE       rac2                                     
ora.LISTENER.lsnr
               ONLINE  ONLINE       rac1                                     
               ONLINE  OFFLINE      rac2                                     
ora.OCR_VOTE.dg
               ONLINE  ONLINE       rac1                                     
               ONLINE  ONLINE       rac2                                     
ora.RECO.dg
               ONLINE  ONLINE       rac1                                     
               ONLINE  ONLINE       rac2                                     
ora.asm
               ONLINE  ONLINE       rac1                 Started             
               ONLINE  ONLINE       rac2                 Started             
ora.gsd
               ONLINE  OFFLINE      rac1                                     
               ONLINE  OFFLINE      rac2                                     
ora.net1.network
               ONLINE  ONLINE       rac1                                     
               ONLINE  OFFLINE      rac2                                     
ora.ons
               ONLINE  ONLINE       rac1                                     
               ONLINE  OFFLINE      rac2                                     
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       rac1                                     
ora.cvu
      1        ONLINE  ONLINE       rac1                                     
ora.rac1.vip
      1        ONLINE  ONLINE       rac1                                     
ora.rac2.vip
      1        ONLINE  INTERMEDIATE rac1                 FAILED OVER         
ora.oc4j
      1        ONLINE  ONLINE       rac1                                     
ora.rac11g2.db
      1        ONLINE  ONLINE       rac1                 Open                
      2        ONLINE  ONLINE       rac2                 Open                
ora.scan1.vip
      1        ONLINE  ONLINE       rac1                          

官方文档中有添加、删除、修改资源的详细命令和解释:
http://docs.oracle.com/cd/E11882_01/rac.112/e16794/crsref.htm#CHDFEFBJ
Oracle Clusterware Administration and Deployment Guide
11g Release 2 (11.2)
E16794-17

添加资源:
crsctl add resource resource_name -type resource_type [-file file_path |
-attr "attribute_name=attribute_value,attribute_name=attribute_value,..."]
[-i] [-f]

resource_name A short, descriptive name for the resource. (
resource_name: 资源名)
-type resource_type The type of resource that you are adding preceded by the -type flag.(-type 资源类型)
-file file_path Path name (either absolute or relative) for a text file containing line-separated attribute name-value pairs that define the resource.
-attr "attribute_name= attribute_value (-attr: 资源属性以及对应的值,不同类型的资源对应的属性不同)
-i If you specify -i, then the command returns an error if processing this command requires waiting for Oracle Clusterware to unlock the resource or its dependents. Sometimes, Oracle Clusterware locks resources or other objects to prevent commands from interfering with each other.
-f Use the force option:(-f : 强制添加,忽略依赖性)
    To add a resource that has dependencies on other resources that do not yet exist. The force option overrides checks that would prevent a command from being completed.
    To add a resource if the resource has hard dependencies on other resources and the owner of the resources does not execute permissions on one or more of the dependencies. If you do not specify the force option in this case, an error displays.
    To add resources of application type because you may need to move servers into the Generic server pool. If the servers currently host resources that must be stopped, then the force option is required

删除资源:
crsctl delete resource resource_name [-i] [-f]

resource_name Specify the name of the resource you want to remove.
-i If you specify -i, then the command returns an error if processing this command requires waiting for Oracle Clusterware to unlock the resource or its dependents. Sometimes, Oracle Clusterware locks resources or other objects to prevent commands from interfering with each other.
-f Use the force option to remove either running resources, or remove this resource even though other resources have a hard dependency on it.(-f 强制删除,即使这个资源在运行或者有其他资源依赖于它)

修改资源:
crsctl modify resource resource_name -attr "attribute_name=attribute_value"
[-i] [-f] [-delete]

resource_name The name of the resource you want to modify.
-attr "attribute_name=attribute_value"
-i If you specify -i, then the command returns an error if processing this command requires waiting for Oracle Clusterware to unlock the resource or its dependents. Sometimes, Oracle Clusterware locks resources or other objects to prevent commands from interfering with each other.
-f Use the -f option when:
    The resource has a hard dependency on a non-existing resource
    The owner of the resource does not have execute permissions on one or more hard dependencies
    The modification results in servers being moved into the Generic pool and resources being stopped or relocated to accomplish the server move
-delete If you specify the -delete option, then Oracle Clusterware deletes the named attribute.

下面是在11.2.0.3上删除和添加diskgroup ora.RECO.dg的例子:

主要用到的命令:
su - grid

1. 停止依赖于磁盘组ora.RECO.dg的所有数据库:
$ srvctl stop database -d <db_name>

2. 查看ora.RECO.dg的配置信息:
-bash-3.00$ crsctl stat  res ora.RECO.dg -p   
NAME=ora.RECO.dg                                                          
TYPE=ora.diskgroup.type                                                    
ACL=owner:grid:rwx,pgrp:oinstall:rwx,other::r-- <===这个信息在添加资源的使用需要                           
...
VERSION=11.2.0.3.0    

3. 停止ora.RECO.dg:
-bash-3.00$ crsctl stop  res ora.RECO.dg -f                            

4. 从集群中移除ora.RECO.dg:
-bash-3.00$ crsctl delete  res ora.RECO.dg -f  

5. 将ora.RECO.dg添加到集群中:
-bash-3.00$ crsctl add  res ora.RECO.dg -type ora.diskgroup.type -attr "ACL='owner:grid:rwx,pgrp:oinstall:rwx,other::r-
-',AUTO_START=always,VERSION=11.2.0.3.0" -i


6. 检查资源的配置信息是正确的:
-bash-3.00$ crsctl stat  res ora.RECO.dg -p

7. 将这个资源启动:
-bash-3.00$ crsctl start  res ora.RECO.dg        
-bash-3.00$ crsctl stat  res -t

8. 启动所有依赖于这个磁盘组的数据库:
$ srvctl start database -d <db_name>

具体的测试过程及输出:

su - grid

1. 停止依赖于磁盘组ora.RECO.dg的所有数据库:
$ srvctl stop database -d RAC11G2

2. 查看ora.RECO.dg的配置信息:

-bash-3.00$ crsctl stat  res ora.RECO.dg -p                                
NAME=ora.RECO.dg                                                          
TYPE=ora.diskgroup.type                                                    
ACL=owner:grid:rwx,pgrp:oinstall:rwx,other::r--                            
ACTION_FAILURE_TEMPLATE=                                                  
ACTION_SCRIPT=                                                            
AGENT_FILENAME=%CRS_HOME%/bin/oraagent%CRS_EXE_SUFFIX%                    
ALIAS_NAME=                                                                
AUTO_START=always                                                          
CHECK_INTERVAL=300                                                        
CHECK_TIMEOUT=30                                                          
DEFAULT_TEMPLATE=                                                          
DEGREE=1                                                                  
DESCRIPTION=CRS resource type definition for ASM disk group resource      
ENABLED=1                                                                  
LOAD=1                                                                    
LOGGING_LEVEL=1                                                            
NLS_LANG=                                                                  
NOT_RESTARTING_TEMPLATE=                                                  
OFFLINE_CHECK_INTERVAL=0                                                  
PROFILE_CHANGE_TEMPLATE=                                                  
RESTART_ATTEMPTS=5                                                        
SCRIPT_TIMEOUT=60                                                          
START_DEPENDENCIES=hard(ora.asm) pullup(ora.asm)                          
START_TIMEOUT=900                                                          
STATE_CHANGE_TEMPLATE=                                                    
STOP_DEPENDENCIES=hard(intermediate:ora.asm)                              
STOP_TIMEOUT=180                                                          
TYPE_VERSION=1.2                                                          
UPTIME_THRESHOLD=1d                                                        
USR_ORA_ENV=                                                              
USR_ORA_OPI=false                                                          
USR_ORA_STOP_MODE=                                                        
VERSION=11.2.0.3.0                                                        

3. 停止ora.RECO.dg:
-bash-3.00$ crsctl stop  res ora.RECO.dg -f                            
CRS-2673: Attempting to stop 'ora.RECO.dg' on 'rac2'              
CRS-2673: Attempting to stop 'ora.RECO.dg' on 'rac1'              
CRS-2677: Stop of 'ora.RECO.dg' on 'rac2' succeeded                
CRS-2677: Stop of 'ora.RECO.dg' on 'rac1' succeeded                

4. 从集群中移除ora.RECO.dg:
-bash-3.00$ crsctl delete  res ora.RECO.dg   <==如果有不加-f, 当有资源依赖于这个磁盘组时会报错                          
CRS-2730: Resource 'ora.rac11g2.db' depends on resource 'ora.RECO.dg'   
CRS-4000: Command Delete failed, or completed with errors.            

-bash-3.00$ crsctl delete  res ora.RECO.dg -f      <=====需要使用-f来强制删除

5. 将ora.RECO.dg添加到集群中:
-bash-3.00$ crsctl add  res ora.RECO.dg -type ora.diskgroup.type -attr "ACL='owner:grid:rwx,pgrp:oinstall:rwx,other::r-

-',AUTO_START=always,VERSION=11.2.0.3.0" -i

6. 检查资源的配置信息是正确的:

-bash-3.00$ crsctl stat  res ora.RECO.dg -p
NAME=ora.RECO.dg
TYPE=ora.diskgroup.type
ACL=owner:grid:rwx,pgrp:oinstall:rwx,other::r--
ACTION_FAILURE_TEMPLATE=
ACTION_SCRIPT=
AGENT_FILENAME=%CRS_HOME%/bin/oraagent%CRS_EXE_SUFFIX%
ALIAS_NAME=
AUTO_START=always
CHECK_INTERVAL=300
CHECK_TIMEOUT=30
DEFAULT_TEMPLATE=
DEGREE=1
DESCRIPTION=CRS resource type definition for ASM disk group resource
ENABLED=1
LOAD=1
LOGGING_LEVEL=1
NLS_LANG=
NOT_RESTARTING_TEMPLATE=
OFFLINE_CHECK_INTERVAL=0
PROFILE_CHANGE_TEMPLATE=
RESTART_ATTEMPTS=5
SCRIPT_TIMEOUT=60
START_DEPENDENCIES=hard(ora.asm) pullup(ora.asm)
START_TIMEOUT=900
STATE_CHANGE_TEMPLATE=
STOP_DEPENDENCIES=hard(intermediate:ora.asm)
STOP_TIMEOUT=180
TYPE_VERSION=1.2
UPTIME_THRESHOLD=1d
USR_ORA_ENV=
USR_ORA_OPI=false
USR_ORA_STOP_MODE=
VERSION=11.2.0.3.0

7. 将这个资源启动:
-bash-3.00$ crsctl start  res ora.RECO.dg        
CRS-2672: Attempting to start 'ora.RECO.dg' on 'rac1'
CRS-2672: Attempting to start 'ora.RECO.dg' on 'rac2'
CRS-2676: Start of 'ora.RECO.dg' on 'rac1' succeeded
CRS-2676: Start of 'ora.RECO.dg' on 'rac2' succeeded

-bash-3.00$ crsctl stat  res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS       Local Resources
--------------------------------------------------------------------------------
ora.RECO.dg
              ONLINE  ONLINE       rac1                                    
              ONLINE  ONLINE       rac2                                    

8.启动所有依赖于这个磁盘组的数据库:
$ srvctl start database -d RAC11G2 


 参与此主题的后续讨论,可以访问我们的中文社区,跟帖“如何在11.2集群中添加/删除资源?"。

星期四 六月 27, 2013

在11.2RAC上如何手工添加一个数据库实例

       有些情况下,需要添加一个新的实例到数据库上,推荐用dbca来添加新的实例,但是有的情况下无法使用dbca,比如这个数据库是从11.2之下升级上来的,还在使用裸设备,但是dbca中已经不支持用裸设备来添加数据库文件,这种情况下需要手工添加这个实例。

    下面是在11.2上添加一个实例RACDB2的过程,已有实例为RACDB1。 已有节点为rac1,新节点为rac2。
     在11.2上,一般会使用grid用户来管理GI,使用oracle用户来管理数据库,下面的操作都是用oracle用户来执行。

1. 确保参数文件中日志相关的路径已经存在,如果不存在,需要提前创建相关的目录:
audit_file_dest, background_dump_dest, user_dump_dest 和core_dump_dest等。

比如audit_file_dest=/u01/app/oracle/admin/RACDB/adump,如果这个目录不存在,那么启动实例会报错:
ORA-09925: Unable to create audit trail file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 9925

2. 在已有的数据库实例上执行下面的命令来添加新实例相关的参数:

SQL> alter system set instance_number=2 scope=spfile sid='RACDB2';
SQL> alter system set thread=2 scope=spfile sid='RACDB2';
SQL> alter system set undo_tablespace='UNDOTBS2' scope=spfile sid='RACDB2';
SQL> alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.0.2.122)(PORT=1521))))' sid='RACDB2'; <=====192.0.2.122是节点2的VIP


3. 拷贝已有节点的DB的$ORACLE_HOME/dbs/init<sid>.ora 到新节点的DB的$ORACLE_HOME/dbs/init<sid>.ora,一定要修改对应的实例名。
保证init<sid>.ora 只有一行,用来指定spfile的位置:
=======================
SPFILE='+DATA/racdb/spfileracdb.ora'

比如:
[oracle@rac1 ~]$ scp $ORACLE_HOME/dbs/initRACDB1.ora rac2:$ORACLE_HOME/dbs/initRACDB2.ora <===文件名修改为实例2

4.  修改新节点的/etc/oratab,保证其中有类似下面的内容:
RACDB2:/u01/app/oracle/product/11.2.0/dbhome_1:N      

5.  拷贝已有节点的密码文件: DB的$ORACLE_HOME/dbs/ora<sid>.pwd 到新节点DB的$ORACLE_HOME/dbs/ora<sid>.pwd,一定要修改对应的实例名。

比如:
[oracle@rac1 dbs]$ scp $ORACLE_HOME/dbs/orapwRACDB1 rac2:$ORACLE_HOME/dbs/orapwRACDB2 <==修改为实例2

6.  在已有的实例执行下面的命令,为新建的实例添加UNDO TABLESPACE。

比如:
SQL>CREATE UNDO TABLESPACE "UNDOTBS2" DATAFILE '/dev/….' SIZE 4096M ;

或者使用磁盘组:
SQL>CREATE UNDO TABLESPACE "UNDOTBS2" DATAFILE '+DATA' SIZE 4096M ;

7.  在已有的实例执行下面的命令,为新建的实例添加redo thread和redo log:

比如:
SQL> alter database add logfile thread 2
     group 3 ('/dev/...', '/dev/...') size 1024M,
     group 4 ('/dev/...','dev/...') size 1024M;

或者使用磁盘组:
SQL> alter database add logfile thread 2
     group 3 ('+DATA','+RECO') size 1024M,
     group 4 ('+DATA','+RECO') size 1024M;

SQL> alter database enable thread 2; <==启动这个thread

8.  在新节点上启动新实例,保证环境变量设置的是正确的:
[oracle@rac2 admin]$su - oracle
[oracle@rac2 admin]$export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
[oracle@rac2 admin]$export ORACLE_SID=RACDB2

[oracle@rac2 admin]$ sqlplus / as sysdba
SQL> startup <==如果启动成功,说明之前的实例2相关的参数应该设置正确了

9. 添加实例到OCR中来被GI管理,这个命令可以在任意节点执行:
$srvctl add instance -d <database name> -i <new instance name> -n <new node name>

Example of srvctl add instance command:
============================
[oracle@rac2 ~]$ srvctl add instance -d racdb -i RACDB2 -n rac2  <==注意实例的大小写,可以执行ps -ef|grep smon来查看

[oracle@rac2 dbs]$ ps -ef|grep smon
root      3453     1  1 Jun12 ?        04:03:05 /u01/app/11.2.0/grid/bin/osysmond.bin
grid      3727     1  0 Jun12 ?        00:00:19 asm_smon_+ASM2
oracle    5343  4543  0 14:06 pts/1    00:00:00 grep smon
oracle   28736     1  0 Jun25 ?        00:00:03 ora_smon_RACDB2 <========实例名大写的

10. 查看实例的状态:
$su - grid
[grid@rac2 ~]$ crsctl stat res -t
...
ora.racdb.db
      1        ONLINE  ONLINE       rac1                     Open               
      2        OFFLINE OFFLINE            

rac2已经添加,但是状态显示offline,实际上这个实例之前已经被sqlplus启动了
可以用sqlplus把实例先停掉,然后用srvctl启动:

[grid@rac2 ~]$ su  - oracle
Password:
[oracle@rac2 ~]$ sqlplus / as sysdba
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit

[oracle@rac2 ~]$ srvctl start instance -d racdb -i RACDB2

[oracle@rac2 ~]$ su - grid
Password:
[grid@rac2 ~]$ crsctl stat res -t
ora.racdb.db
      1        ONLINE  ONLINE       rac1                     Open               
      2        ONLINE  ONLINE       rac2                     Open               

11. 检查数据库的依赖性:
[oracle@rac2 ~]$ crsctl stat res ora.racdb.db -p
NAME=ora.racdb.db
TYPE=ora.database.type
ACL=owner:oracle:rwx,pgrp:oinstall:rwx,other::r--
ACTION_FAILURE_TEMPLATE=
ACTION_SCRIPT=
ACTIVE_PLACEMENT=1
AGENT_FILENAME=%CRS_HOME%/bin/oraagent%CRS_EXE_SUFFIX%
AUTO_START=restore
CARDINALITY=2
CHECK_INTERVAL=1
CHECK_TIMEOUT=30
CLUSTER_DATABASE=true
DATABASE_TYPE=RAC
DB_UNIQUE_NAME=RACDB
DEFAULT_TEMPLATE=PROPERTY(RESOURCE_CLASS=database) PROPERTY(DB_UNIQUE_NAME= CONCAT(PARSE(%NAME%, ., 2), %USR_ORA_DOMAIN%, .))
ELEMENT(INSTANCE_NAME= %GEN_USR_ORA_INST_NAME%) ELEMENT(DATABASE_TYPE= %DATABASE_TYPE%)
DEGREE=1
DESCRIPTION=Oracle Database resource
ENABLED=1
FAILOVER_DELAY=0
FAILURE_INTERVAL=60
FAILURE_THRESHOLD=1
GEN_AUDIT_FILE_DEST=/u01/app/oracle/admin/RACDB/adump
GEN_START_OPTIONS=
GEN_START_OPTIONS@SERVERNAME(rac1)=open
GEN_START_OPTIONS@SERVERNAME(rac2)=open
GEN_USR_ORA_INST_NAME=
GEN_USR_ORA_INST_NAME@SERVERNAME(rac1)=RACDB1
HOSTING_MEMBERS=
INSTANCE_FAILOVER=0
LOAD=1
LOGGING_LEVEL=1
MANAGEMENT_POLICY=AUTOMATIC
NLS_LANG=
NOT_RESTARTING_TEMPLATE=
OFFLINE_CHECK_INTERVAL=0
ONLINE_RELOCATION_TIMEOUT=0
ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
ORACLE_HOME_OLD=
PLACEMENT=restricted
PROFILE_CHANGE_TEMPLATE=
RESTART_ATTEMPTS=2
ROLE=PRIMARY
SCRIPT_TIMEOUT=60
SERVER_POOLS=ora.RACDB
SPFILE=+DATA/RACDB/spfileRACDB.ora
START_DEPENDENCIES=hard(ora.DATA.dg,ora.RECO.dg) weak
(type:ora.listener.type,global:type:ora.scan_listener.type,uniform:ora.ons,global:ora.gns) pullup(ora.DATA.dg,ora.RECO.dg)
START_TIMEOUT=600
STATE_CHANGE_TEMPLATE=
STOP_DEPENDENCIES=hard(intermediate:ora.asm,shutdown:ora.DATA.dg,shutdown:ora.RECO.dg)
STOP_TIMEOUT=600
TYPE_VERSION=3.2
UPTIME_THRESHOLD=1h
USR_ORA_DB_NAME=RACDB
USR_ORA_DOMAIN=
USR_ORA_ENV=
USR_ORA_FLAGS=
USR_ORA_INST_NAME=
USR_ORA_INST_NAME@SERVERNAME(rac1)=RACDB1
USR_ORA_INST_NAME@SERVERNAME(rac2)=RACDB2
USR_ORA_OPEN_MODE=open
USR_ORA_OPI=false
USR_ORA_STOP_MODE=immediate
VERSION=11.2.0.3.0

由于在11.2,在OCR中只有database资源,没有实例资源,所以实例的属性都是通过database来设置的。
由于database的属性已经存在,而且是正确的,所以不需要再对这个实例设置针对ASM或者磁盘组的的依赖性了。


 附:dbca 中添加新实例的大概步骤:

在已有的节点上用oracle用户打开dbca:
su - oracle
dbca
选择 RAC database
选择 Instance Management
选择 add an instance
会列出active rac database
输入新的实例名
添加undo和redo信息

星期四 六月 13, 2013

TFA Collector 介绍

1.TFA的目的:
TFA是个11.2版本上推出的用来收集Grid Infrastructure/RAC环境下的诊断日志的工具,它可以用非常简单的命令协助用户收集RAC里的日志,以便进一步进行诊断;TFA是类似diagcollection的一个oracle 集群日志收集器,而且TFA比diagcollection集中和自动化的诊断信息收集能力更强大。TFA有以下几个特点:
1.    TFA可以在一台机器上执行一条简单的命令把所有节点的日志进行打包,封装;
2.    TFA可以在收集的过程中对日志进行”trim”操作,减少数据的收集量;
3.    TFA可以收集用来诊断用的“一段时间内”的数据;
4.    TFA可以把所有节点的日志收集并封装好放在某一个节点上以便传输阅读;
5.    TFA可以指定Cluster中的某一部分组件进行日志收集,如:ASM ,RDBMS,Clusterware
6.    TFA可以根据条件配置对告警日志进行实时扫描(DB Alert Logs, ASM Alert Logs, Clusterware Alert Logs, etc);
7.    TFA可以根据实时扫描的结果自动的收集诊断日志;
8.    TFA可以根据指定的错误进行对告警日志的扫描;
9.    TFA可以根据指定的错误扫描后的结果收集诊断日志;    
2.    TFA的安装要求:

平台:

目前TFA支持以下几种平台:    
Intel Linux(Enterprise Linux, RedHat Linux, SUSE Linux)
Linux Itanium
Oracle Solaris SPARC
Oracle Solaris x86-64
AIX (requires bash shell version 3.2 or higher installed)
HPUX Itanium
HPUX PA-RISC

2.支持的数据库版本:

TFA目前的设计是脱离RDBMS和CRS进行设计的,所以设计的初衷是针对所有的版本而设计的,不受RDBMS或者CRS的版本限制;

下载 TFA Collector:

该版本的TFA和相关TFA用户指南可以通过点击下面的相关下载链接。

TFA 收集器:

https://mosemp.us.oracle.com/epmos/main/downloadattachmentprocessor?attachid=1513912.1:TFA_NOJRE&clickstream=no
TFA 用户手册:
https://mosemp.us.oracle.com/epmos/main/downloadattachmentprocessor?attachid=1513912.1:TFA_USER_GUIDE&clickstream=no

3.    TFA快速安装指南:

安装:

注意:在安装之前请确保您的环境上已经安装了JRE1.6或者是更高版本的JRE,如果没有,请先安装JRE1.6
1.    请使用root用户登录系统
2.    在所有的节点上为TFA准备一个安装的位置,注意这个位置不要放在Cluster file system中;
3.    在节点1上执行installTFALite.sh来启动安装过程:
---------------------------------
[root@rac1 tmp]# ./installTFALite.sh
Starting TFA installation
---------------------------------
4.    当系统提示安装位置,输入在第2步中选择的位置的TFA安装,:
---------------------------------
Enter a location for installing TFA [/opt/oracle/tfa]:/opt/oracle/tfa
Checking for available space in /opt/oracle/tfa/
---------------------------------
5.    请输入之前安装了JRE1.6的JAVA_HOME,注意这个位置需要在所有的节点上都相同:
---------------------------------
Enter a Java Home that contains Java 1.6 or later : /usr/java/jre1.7.0_11
Running Auto Setup for TFA as user root...
---------------------------------
6.    按照以下说明完成安装:
------------------------------------------------------------------
Would you like to do a [L]ocal only or [C]lusterwide installation ? [L|l|C|c] [C] :
The following installation requires temporary use of SSH.
If SSH is not configured already then we will remove SSH
when complete.
  Do you wish to Continue ? [Y|y|N|n] [N] Y
Installing TFA at /opt/oracle/tfa in all hosts
Discovering Nodes and Oracle resources
Checking whether CRS is up and running

Getting list of nodes in cluster

Checking ssh user equivalency settings on all nodes in cluster

Node rac2 is configured for ssh user equivalency for root user


Searching for running databases . . . . .

.
List of running databases registered in OCR
1. ORCL
. .

Checking Status of Oracle Software Stack - Clusterware, ASM, RDBMS

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

TFA Will be Installed on the Following Nodes
++++++++++++++++++++++++++++++++++++++++++++

Install Nodes
=============
rac1
rac2
Do you wish to make changes to the Node List ? [Y/y/N/n] [N]

TFA will scan the following Directories
++++++++++++++++++++++++++++++++++++++++++++

.----------------------------------------------------------------.
|                             rac2                               |
+-----------------------------------------------------+----------+
| Trace Directory                                     | Resource |
+-----------------------------------------------------+----------+
| /u01/app/11.2.0/grid/cfgtoollogs                    | INSTALL  |
| /u01/app/11.2.0/grid/crs/log                        | CRS      |
| /u01/app/11.2.0/grid/css/log                        | CRS      |
| /u01/app/11.2.0/grid/cv/log                         | CRS      |
| /u01/app/11.2.0/grid/evm/admin/log                  | CRS      |
| /u01/app/11.2.0/grid/evm/admin/logger               | CRS      |
| /u01/app/11.2.0/grid/evm/log                        | CRS      |
| /u01/app/11.2.0/grid/install                        | INSTALL  |
| /u01/app/11.2.0/grid/log/                           | CRS      |
| /u01/app/11.2.0/grid/network/log                    | CRS      |
| /u01/app/11.2.0/grid/oc4j/j2ee/home/log             | CRSOC4J  |
| /u01/app/11.2.0/grid/opmn/logs                      | CRS      |
| /u01/app/11.2.0/grid/racg/log                       | CRS      |
| /u01/app/11.2.0/grid/rdbms/log                      | ASM      |
| /u01/app/11.2.0/grid/scheduler/log                  | CRS      |
| /u01/app/11.2.0/grid/srvm/log                       | CRS      |
| /u01/app/oraInventory/ContentsXML                   | INSTALL  |
| /u01/app/oraInventory/logs                          | INSTALL  |
| /u01/app/oracle/cfgtoollogs                         | CFGTOOLS |
| /u01/app/oracle/diag/asm/+asm/+ASM2/trace           | ASM      |
| /u01/app/oracle/diag/rdbms/orcl/ORCL2/trace         | RDBMS    |
| /u01/app/oracle/diag/tnslsnr                        | TNS      |
| /u01/app/oracle/diag/tnslsnr/rac2/listener/trace    | TNS      |
| /u01/app/oracle/product/11.2.0/dbhome_1/cfgtoollogs | INSTALL  |
| /u01/app/oracle/product/11.2.0/dbhome_1/install     | INSTALL  |
'-----------------------------------------------------+----------'

.----------------------------------------------------------------.
|                             rac1                               |
+-----------------------------------------------------+----------+
| Trace Directory                                     | Resource |
+-----------------------------------------------------+----------+
| /u01/app/11.2.0/grid/cfgtoollogs                    | INSTALL  |
| /u01/app/11.2.0/grid/crs/log                        | CRS      |
| /u01/app/11.2.0/grid/css/log                        | CRS      |
| /u01/app/11.2.0/grid/cv/log                         | CRS      |
| /u01/app/11.2.0/grid/evm/admin/log                  | CRS      |
| /u01/app/11.2.0/grid/evm/admin/logger               | CRS      |
| /u01/app/11.2.0/grid/evm/log                        | CRS      |
| /u01/app/11.2.0/grid/install                        | INSTALL  |
| /u01/app/11.2.0/grid/log/                           | CRS      |
| /u01/app/11.2.0/grid/network/log                    | CRS      |
| /u01/app/11.2.0/grid/oc4j/j2ee/home/log             | CRSOC4J  |
| /u01/app/11.2.0/grid/opmn/logs                      | CRS      |
| /u01/app/11.2.0/grid/racg/log                       | CRS      |
| /u01/app/11.2.0/grid/rdbms/log                      | ASM      |
| /u01/app/11.2.0/grid/scheduler/log                  | CRS      |
| /u01/app/11.2.0/grid/srvm/log                       | CRS      |
| /u01/app/oraInventory/ContentsXML                   | INSTALL  |
| /u01/app/oraInventory/logs                          | INSTALL  |
| /u01/app/oracle/cfgtoollogs                         | CFGTOOLS |
| /u01/app/oracle/diag/asm/+asm/+ASM1/trace           | ASM      |
| /u01/app/oracle/diag/rdbms/orcl/ORCL1/trace         | RDBMS    |
| /u01/app/oracle/diag/tnslsnr                        | TNS      |
| /u01/app/oracle/diag/tnslsnr/rac1/listener/trace    | TNS      |
| /u01/app/oracle/product/11.2.0/dbhome_1/cfgtoollogs | INSTALL  |
| /u01/app/oracle/product/11.2.0/dbhome_1/install     | INSTALL  |
'-----------------------------------------------------+----------'

Do you wish to change the Trace Directory List ? [Y/y/N/n] [N]
Installing TFA on rac1
Installing TFA on rac2
TFA is running
Successfully added host: rac2
.--------------------------------.
| Host   | Status of TFA | PID   |
+--------+---------------+-------+
| rac1 | RUNNING         | 11685 |
| rac2 | RUNNING         |  5081 |
'--------+---------------+-------'
Setting TFA cookie in all nodes
Successfully set cookie=77411b8fff446d2954d5c080225052ac
TFA Cookie: 77411b8fff446d2954d5c080225052ac
Summary of TFA Installation
.-----------------------------------------------------------.
|                           rac1                            |
+---------------------+-------------------------------------+
| Parameter           | Value                               |
+---------------------+-------------------------------------+
| Install location    | /opt/oracle/tfa/tfa_home            |
| Repository location | /opt/oracle/tfa/tfa_home/repository |
| Repository usage    | 0 MB out of 10240 MB                |
'---------------------+-------------------------------------'

.-----------------------------------------------------------.
|                           rac2                            |
+---------------------+-------------------------------------+
| Parameter           | Value                               |
+---------------------+-------------------------------------+
| Install location    | /opt/oracle/tfa/tfa_home            |
| Repository location | /opt/oracle/tfa/tfa_home/repository |
| Repository usage    | 0 MB out of 10240 MB                |
'---------------------+-------------------------------------'

TFA is successfully installed..
------------------------------------------------------------------

4.TFA启动和停止:

TFA运行在Linux和Unix平台上的init,所以,这将是在服务器启动时自动启动。
默认的情况我们把这个脚本命名为init.tfa;
所在位置取决于不同平台,如:
Linux and Solaris: /etc/init.d/init.tfa
Aix: /etc/init.tfa
HP-UX: /sbin/init.d/init.tfa
以下命令式在Linux平台下作为例子:
启动:
# /etc/init.d/init.tfa start
停止:
# /etc/init.d/init.tfa stop
重启:
# /etc/init.d/init.tfa restart

5.手动收集诊断信息:

我们通过调用tfactl的命令和诊断动词diagnostic来控制TFA收集我们期望的诊断信息。Tfactl 提供给用户多种可选择的模式进行收集,如 ,收集一个时间段内的日志信息来减少我们收集日志的量;
具体操作的命令您可以通过以下方式看到:
--------------------------------------------------------------
#$TFA_HOME/bin/tfactl diagcollect -h
Usage: /u01/app/tfa/tfa_home/bin/tfactl diagcollect [-all | -database | -asm | -crs | -os | -install | -node | -tag ]
        [-since <n><h|d>| -from <time> -to <time> | -for <time>]
        [-copy | -nocopy] [-symlink][-notrim]

Options:
  -all       Collect logs of all types
  -crs        Collect only CRS logs
  -asm        Collect only ASM logs
  -database  Collect only database logs from databases specified
  -os         Collect only OS files
  -install    Collect only INSTALL files
  -node       Specify comma separated list of host names for collection.
  -copy       Copy back the zip files to master node from all nodes
  -nocopy    Does not copy back the zip files to master node from all nodes
  -notrim     Does not trim the files collected
  -symlink    This option should be used with -for.
              Creates symlinks for files which are updated during the input time.
  -since <n><h|d>   Files from past 'n' [d]ays or 'n' [h]ours
  -from <time>        From time
  -to <time>         To time
  -for <time>        Specify a incident time.
  -z <file>           Output file name
  -tag <description>  Enter a tag for the zip(s) created

--------------------------------------------------------------


在下面的例子中,我们使用了 -all,并告诉TFA收集诊断所有类型的日志,从午夜1月21日至1月21日13:00 进行收集。该命令将启动指定的诊断在后台收集所有群集节点上,压缩成zip文件放置在每个节点的TFA_HOME中:


--------------------------------------------------------------


# $TFA_HOME/bin/tfactl diagcollect -all -from "Jan/21/2013" -to "Jan/21/2013 13:00:00"


time: Jan/21/2013
Valid pattern
Month : 1
time: Jan/21/2013 13:00:00
Valid pattern
Month : 1
rac1:startdiagcollection: -database -asm -crs -os -install -from Jan/21/2013 -to Jan/21/2013 13:00:00 -z Mon_Jan_21_11_52_20_EST_2013 -node all -copy
Logs are collected to:
/opt/oracle/tfa/tfa_home/repository/rac1.Mon_Jan_21_11_52_20_EST_2013.zip
/opt/oracle/tfa/tfa_home/repository/rac2.Mon_Jan_21_11_52_20_EST_2013.zip

--------------------------------------------------------------
6.诊断问题or上传诊断信息给Oracle Support工程师:

无论我们用哪种方法对诊断信息进行收集,日志信息都会被打包好放置在$TFA_HOME/repository的目录下,以便您上传该文件给Oracle的support工程师

7.推荐参考文档:
TFA Collector- The Preferred Tool for Automatic or ADHOC Diagnostic Gathering Across All Cluster Nodes [ID 1513912.1]

如何 Relink 11.2 Grid Infrastructure(GI) 和 11.2 RAC?

     对于Oracle Clusterware(CRS) 10g 和11.1, CRS 的binary 不能被 relink。CRS 中的client shared libraries可以被relink, 但是这个relink只有当OS升级或者给OS打补丁出现问题后才需要,大部分时候不需要relink CRS。

     如果想对CRS中的client shared libraries做relink, 请参考MOS文档中的步骤:
     Will an Operating System Upgrade Affect Oracle Clusterware? [ID 743649.1]

     对于Oracle Grid Infrastructure(GI) 11.2 及之后的版本,在GRID HOME中有一些binary需要在OS升级或者打补丁后被relink。
     对于数据库软件(RDBMS binary),在OS升级或者OS打补丁后推荐做relink, RAC 的binary也是一样的,需要relink。

     下面是在11.2 集群环境中执行relink的过程,包括了对GI和RAC做relink的步骤:

1. 首先停止这个节点上的所有数据库实例,这是因为之后停止CRS时虽然会停止数据库实例,但是是以shutdown abort的方式,我们需要以shutdown immediate或者normal来停止数据库实例:
$su - oracle
$srvctl stop instance -d <db_name> -i <instance_name> -o immediate

2. 如果业务需要高可用性,确保这个实例上的service已经切换到了其它节点的实例上。
$ srvctl status service -d <db_name>

3. 用root用户执行<GRID_HOME>/crs/install/rootcrs.pl -unlock来修改相应目录权限并停止GI:
[root@rac1 ~]# cd /u01/app/11.2.0/grid/crs/install
[root@rac1 install]# perl rootcrs.pl -unlock
Using configuration parameter file: ./crsconfig_params


CRS-2791: Starting shutdown of Oracle High Availability Services-managed resources on 'rac1'
CRS-2673: Attempting to stop 'ora.crsd' on 'rac1'
CRS-2790: Starting shutdown of Cluster Ready Services-managed resources on 'rac1'
CRS-2673: Attempting to stop 'ora.rac2.vip' on 'rac1'
CRS-2673: Attempting to stop 'ora.oc4j' on 'rac1'
CRS-2673: Attempting to stop 'ora.LISTENER_SCAN1.lsnr' on 'rac1'
CRS-2673: Attempting to stop 'ora.cvu' on 'rac1'
CRS-2677: Stop of 'ora.rac2.vip' on 'rac1' succeeded
CRS-2677: Stop of 'ora.LISTENER_SCAN1.lsnr' on 'rac1' succeeded
CRS-2673: Attempting to stop 'ora.scan1.vip' on 'rac1'
CRS-2677: Stop of 'ora.scan1.vip' on 'rac1' succeeded
CRS-2677: Stop of 'ora.oc4j' on 'rac1' succeeded
CRS-2677: Stop of 'ora.cvu' on 'rac1' succeeded
CRS-2673: Attempting to stop 'ora.LISTENER.lsnr' on 'rac1'
CRS-2673: Attempting to stop 'ora.CRS.dg' on 'rac1'
CRS-2673: Attempting to stop 'ora.racdb.db' on 'rac1'
CRS-2677: Stop of 'ora.LISTENER.lsnr' on 'rac1' succeeded
CRS-2673: Attempting to stop 'ora.rac1.vip' on 'rac1'
CRS-2677: Stop of 'ora.rac1.vip' on 'rac1' succeeded
CRS-2677: Stop of 'ora.CRS.dg' on 'rac1' succeeded
CRS-2677: Stop of 'ora.racdb.db' on 'rac1' succeeded
CRS-2673: Attempting to stop 'ora.DATA.dg' on 'rac1'
CRS-2673: Attempting to stop 'ora.RECO.dg' on 'rac1'
CRS-2677: Stop of 'ora.DATA.dg' on 'rac1' succeeded
CRS-2677: Stop of 'ora.RECO.dg' on 'rac1' succeeded
CRS-2673: Attempting to stop 'ora.asm' on 'rac1'
CRS-2677: Stop of 'ora.asm' on 'rac1' succeeded
CRS-2673: Attempting to stop 'ora.ons' on 'rac1'
CRS-2677: Stop of 'ora.ons' on 'rac1' succeeded
CRS-2673: Attempting to stop 'ora.net1.network' on 'rac1'
CRS-2677: Stop of 'ora.net1.network' on 'rac1' succeeded
CRS-2792: Shutdown of Cluster Ready Services-managed resources on 'rac1' has completed
CRS-2677: Stop of 'ora.crsd' on 'rac1' succeeded
CRS-2673: Attempting to stop 'ora.mdnsd' on 'rac1'
CRS-2673: Attempting to stop 'ora.crf' on 'rac1'
CRS-2673: Attempting to stop 'ora.ctssd' on 'rac1'
CRS-2673: Attempting to stop 'ora.evmd' on 'rac1'
CRS-2673: Attempting to stop 'ora.asm' on 'rac1'
CRS-2677: Stop of 'ora.mdnsd' on 'rac1' succeeded
CRS-2677: Stop of 'ora.crf' on 'rac1' succeeded
CRS-2677: Stop of 'ora.evmd' on 'rac1' succeeded
CRS-2677: Stop of 'ora.ctssd' on 'rac1' succeeded
CRS-2677: Stop of 'ora.asm' on 'rac1' succeeded
CRS-2673: Attempting to stop 'ora.cluster_interconnect.haip' on 'rac1'
CRS-2677: Stop of 'ora.cluster_interconnect.haip' on 'rac1' succeeded
CRS-2673: Attempting to stop 'ora.cssd' on 'rac1'
CRS-2677: Stop of 'ora.cssd' on 'rac1' succeeded
CRS-2673: Attempting to stop 'ora.gipcd' on 'rac1'
CRS-2677: Stop of 'ora.gipcd' on 'rac1' succeeded
CRS-2673: Attempting to stop 'ora.gpnpd' on 'rac1'
CRS-2677: Stop of 'ora.gpnpd' on 'rac1' succeeded
CRS-2793: Shutdown of Oracle High Availability Services-managed resources on 'rac1' has completed
CRS-4133: Oracle High Availability Services has been stopped.
Successfully unlock /u01/app/11.2.0/grid

注意,如果在$GRID_HOME/rdbms/audit下面的audit文件很多,会导致rootcrs.pl执行很长时间,这样的话可以将$GRID_HOME/rdbms/audit/*.aud 文件备份到GRID_HOME之外,然后删除。

4. 禁止GI在OS重启后自动启动,这是因为升级OS或者打OS补丁后,可能需要重启主机,这样的话,需要在relink之前禁止GI启动。
用root用户:
[root@rac1 install]# crsctl disable crs
CRS-4621: Oracle High Availability Services autostart is disabled.

5. 备份GI和RDBMS的ORACLE_HOME。

6. 升级OS或者给OS打补丁,包括重启主机等(如果需要)。

7. 用GI的属主用户来对GI binary进行relink:

[root@rac1 audit]# su - grid
[grid@rac1 ~]$ export ORACLE_HOME=/u01/app/11.2.0/grid

确保GI是停止的,然后再执行relink:
[grid@rac1 ~]$ ps -ef|grep d.bin
grid      3408  3360  0 17:09 pts/0    00:00:00 grep d.bin

[grid@rac1 ~]$ crsctl stat res -t
CRS-4535: Cannot communicate with Cluster Ready Services
CRS-4000: Command Status failed, or completed with errors.

[grid@rac1 ~]$ $ORACLE_HOME/bin/relink
writing relink log to: /u01/app/11.2.0/grid/install/relink.log

[grid@rac1 ~]$ <===relink结束后,并不会有任何信息提示,只是显示命令提示符。

需要检查/u01/app/11.2.0/grid/install/relink.log, 查看是否有错误。

下面截取了末尾的一些行,如下:
...
 - Linking Oracle
rm -f /u01/app/11.2.0/grid/rdbms/lib/oracle
gcc  -o /u01/app/11.2.0/grid/rdbms/lib/oracle -m64 -L/u01/app/11.2.0/grid/rdbms/lib/ -L/u01/app/11.2.0/grid/lib/ -
...
lsnls11 -lnls11 -lcore11 -lnls11 -lasmclnt11 -lcommon11 -lcore11 -laio    `cat /u01/app/11.2.0/grid/lib/sysliblist` -Wl,-
rpath,/u01/app/11.2.0/grid/lib -lm    `cat /u01/app/11.2.0/grid/lib/sysliblist` -ldl -lm   -L/u01/app/11.2.0/grid/lib
test ! -f /u01/app/11.2.0/grid/bin/oracle ||\
           mv -f /u01/app/11.2.0/grid/bin/oracle /u01/app/11.2.0/grid/bin/oracleO
mv /u01/app/11.2.0/grid/rdbms/lib/oracle /u01/app/11.2.0/grid/bin/oracle
chmod 6751 /u01/app/11.2.0/grid/bin/oracle

8. 用RDBMS的属主对数据库binary做relink:
su - oracle
确保$ORACLE_HOME设置为了数据库的ORACLE_HOME,然后执行:

[oracle@rac1 ~]$ $ORACLE_HOME/bin/relink all
writing relink log to: /u01/app/oracle/product/11.2.0/dbhome_1/install/relink.log
<===relink结束后,并不会有任何信息提示,只是显示命令提示符。

需要检查/u01/app/oracle/product/11.2.0/dbhome_1/install/relink.log, 查看是否有错误。

截取relink.log中部分内容:

Starting Oracle Universal Installer... <<<<<<开头
...
le/product/11.2.0/dbhome_1/lib/sysliblist` -ldl -lm   -L/u01/app/oracle/product/11.2.0/dbhome_1/lib
test ! -f /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle ||\
           mv -f /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle /u01/app/oracle/product/11.2.0/dbhome_1/bin/
oracleO
mv /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/lib/oracle /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
chmod 6751 /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle <<<<<<结尾

9. 用root用户执行<GRID_HOME>/crs/install/rootcrs.pl -patch来修改相应目录权限并启动GI:

[root@rac1 ~]# cd /u01/app/11.2.0/grid/crs/install
[root@rac1 install]# perl rootcrs.pl -patch
Using configuration parameter file: ./crsconfig_params
CRS-4123: Oracle High Availability Services has been started.

10. Enable CRS来保证主机重启后可以自动启动GI:
[root@rac1 install]# crsctl enable crs
CRS-4622: Oracle High Availability Services autostart is enabled.

11. 确认所有的应启动的资源都已启动:
[root@rac1 install]#  crsctl stat res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS      
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.CRS.dg
               ONLINE  ONLINE       rac1                                        
               ONLINE  ONLINE       rac2                                        
ora.DATA.dg
               ONLINE  ONLINE       rac1                                        
               ONLINE  ONLINE       rac2                                        
ora.LISTENER.lsnr
               ONLINE  ONLINE       rac1                                        
               ONLINE  ONLINE       rac2                                        
ora.RECO.dg
               ONLINE  ONLINE       rac1                                        
               ONLINE  ONLINE       rac2                                        
ora.asm
               ONLINE  ONLINE       rac1                     Started            
               ONLINE  ONLINE       rac2                     Started            
ora.gsd
               OFFLINE OFFLINE      rac1                                        
               OFFLINE OFFLINE      rac2                                        
ora.net1.network
               ONLINE  ONLINE       rac1                                        
               ONLINE  ONLINE       rac2                                        
ora.ons
               ONLINE  ONLINE       rac1                                        
               ONLINE  ONLINE       rac2                                        
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       rac2                                        
ora.cvu
      1        ONLINE  ONLINE       rac2                                        
ora.oc4j
      1        ONLINE  ONLINE       rac2                                        
ora.rac1.vip
      1        ONLINE  ONLINE       rac1                                        
ora.rac2.vip
      1        ONLINE  ONLINE       rac2                                        
ora.racdb.db
      1        ONLINE  ONLINE       rac2                     Open               
      2        OFFLINE OFFLINE                               Instance Shutdown  
ora.scan1.vip
      1        ONLINE  ONLINE       rac2                                        

如果发现实例没有启动,可以手工启动:
$srvctl start instance -d <db_name> -i <instance_name>

12. 可以用下面的MOS文档中的方法来确认oracle 的binary是RAC的:
How to Check Whether Oracle Binary/Instance is RAC Enabled and Relink Oracle Binary in RAC [ID 284785.1]

方法1:如果下面的命令能查出kcsm.o ,说明binary是RAC的:
su - oracle
$ar -t $ORACLE_HOME/rdbms/lib/libknlopt.a|grep kcsm.o
kcsm.o

在AIX上命令是不同的:
 ar -X32_64 -t $ORACLE_HOME/rdbms/lib/libknlopt.a|grep kcsm.o

方法2:查看RAC特有的后台进程是否存在,比如:
[grid@rac1 ~]$ ps -ef|grep lmon
grid      7732     1  0 17:59 ?        00:00:17 asm_lmon_+ASM1
oracle   18605     1  0 20:49 ?        00:00:00 ora_lmon_RACDB1 <===========
grid     20992 10160  0 21:10 pts/2    00:00:00 grep lmon

上面的所有步骤需要在集群的各个节点上依次执行。

上述relink GI的过程来源于下面MOS文档中章节 “Do I need to relink the Oracle Clusterware / Grid Infrastructure home after an OS upgrade?”
 RAC: Frequently Asked Questions [ID 220970.1]


参与此主题的后续讨论,可以访问我们的中文社区,跟帖“分享: 如何 Relink 11.2 Grid Infrastructure(GI) 和 11.2 RAC?"


注意上面的过程适用于集群环境,对于单机版的GI (即Restart),请参考MOS下面的文档来进行relink:
How To Relink The Oracle Grid Infrastructure Standalone (Restart) Installation (Non-RAC). [ID 1536057.1]

星期四 五月 23, 2013

在AIX上运行RAC时网络方面的一些最佳经验

在AIX上运行RAC时网络方面的一些最佳经验

1. Oracle推荐使用Etherchannel来配置网卡绑定,推荐主/备模式的网卡绑定,主/主(Active/Active)模式不推荐,因为主/备模式更稳定一些。注意:从11.2.0.2开始,Oracle 的集群软件Grid Infrastructure(GI)中新增了Redundant Interconnect with Highly Available IP(HAIP),以实现集群私网的高可用性和负载均衡。也就是说,有了HAIP之后,无需使用网卡绑定就可以实现私网网卡的冗余( 关于HAIP的更多信息,请参考 Redundant Interconnect with Highly Available IP (HAIP) 简介)。

2. Oracle针对网络的另外一个推荐是使用Jumbo Frames,网卡和交换机支持9000 MTU 大小就可以启用。MTU (Maximum Transmission Unit)是指最大的网络传输单位,默认一般是1500 bytes。由于在RAC实例间传输的数据可能在2K to 64K或者更大,当MTU是1500时,会导致这些数据被分割,对性能产生影响。启动Jumbo Frames后,MTU可以达到9000 bytes,这样可以降低数据被分割的次数。 更多信息,请参考MOS文档:
Recommendation for the Real Application Cluster Interconnect and Jumbo Frames (Note 341788.1)

3. 如果网络的一些参数设置不合理,可能会产生"gc cr multi block request" 这样的等待事件。如果在AWR中发现了这个等待事件很高,需要检查UDP 参数udp_sendspace和udp_recvspace的设置是否满足下面的要求:

针对AIX:
o 设置udp_sendspace >=[(DB_BLOCK_SIZE * DB_FILE_MULTIBLOCK_READ_COUNT) + 4096],但是不低于 65536.
o 设置udp_recvspace 为 4到10倍的udp_sendpace
o 由于sb_max 必须 >= udp_recvspaceIf ,可能需要增加sb_max的值(默认为1048576)
o 如果udp的参数设置不合理,可能会产生“socket buffer overflows”,如果这个值非0, 需要增加udp_recvspace:
 netstat -s | grep "socket buffer overflows"

4. 针对交换机使用哪种协议,CRS 和 RAC 没有要求,如果使用了Etherchannel,只要这种协议和Etherchannel兼容并且稳定就可以。

下面的文档中有针对网络方面的一些要求:
Minimum Software Versions and Patches Required to Support Oracle Products on IBM Power Systems (Note 282036.1)
10 Gigabit Ethernet
. LACP timeout: Use the “long timeout” switch setting for the amount of time to wait
before sending LACPDUs.
· Flow control: Enable flow control at the switch port and on the server side ports
(using HMC) for the 10GE adapter or 10GE HEA configuration.

星期三 五月 08, 2013

RAC 中锁的管理—Buffer Lock

本文是前一篇文章《RAC 中锁(排队)的管理》的继续,在这篇文章中,我们会介绍RAC

中buffer lock(也称为PCM lock)是如何工作的。


首先,在数据库中,当我们需要访问一个buffer的时候,我们需要在对应的buffer上面加一个锁,而当一个进程持有这个buffer的lock时,其他的进程如果以不兼容的方式访问相同的buffer,就需要等待,对应的等待事件是’buffer busy wait’(不同的版本等待事件可能不同)。在RAC 数据库中,事情变得更加复杂了,由于所有实例访问相同的数据文件,我们需要在多个实例之间保证数据的一致性,所以, 在RAC 环境下buffer lock的结构更加的复杂。


RAC下的buffer lock 由3部分构成:

锁模式(lock mode):对于buffer lock,只有三种 N(空), S(共享)和X(独占)模式。下面的表格说明了各种模式的兼容性。  



锁角色(lock role):本地或共享。本地表示对应的块只在本地被修改过,全局表示对应的块在一个或多个远程缓存中被修改过。

旧镜象(past image):这部分的值为1 或 0。1 表示对应的块存在PI(past image), 0表示不存在。 PI的存在主要是加快RAC 介质恢复,在今后的文章我们会详细的介绍PI的功能。


另外,和RAC中的排队(enqueue)类似,每一个buffer lock都有一个主(master)节点,每个块的主节点是通过hash算法决定的(具体的算法在本文中不作讨论)。主节点包含了对应lock 的全局信息,而每个访问过对应块的节点都包含了本实例的锁信息。


接下来,我们通过下面的的例子说明在RAC 数据库中访问某个block时会发生什么事情。

1. 节点C要求读取块1008。



1)1008块的主节点被hash到D节点,之后节点C向主节点发送请求,要求以S模式锁定块1008。这时buffer lock的模式是SL0(S?hared ,L?local, 0?没有PI)。

2)主节点把对应的锁赋予节点C。

3)节点C 从数据文件中读取块108。

4)读取完成,节点C 以 获得对应的锁,属性为SL0。


2.节点B要求读取块1008。



1) 节点B向主节点D发出请求,要求以S模式锁定块1008。

2) 主节点D发现节点C已经以S模式获得了对应的锁,而且S锁之间是可兼容的,所以,不需要锁的转换,主节点D要求实例C发送块1008 给实例B。

3) 节点C发送对应的块给节点B。

4) 节点B通知主节点D,已经获得了块1008上的S 锁,属性为SL0。


3.节点B要求修改块1008 中的信息。



1) 节点B向主节点D发出请求,要求以X模式锁定块1008。

2) 主节点D发现节点C已经以S模式获得了对应的锁,而且S锁于X锁之间是不兼容的,所以,需要锁的转换,主节点D要求节点C将对应的锁级别降低为N,所得属性为NL0

3) 节点B将自己的所降级,并且将本地的块1008 标识为CR。之后,节点B将块1008 修改为块1009,同时将通知主节点锁的属性为XL0。

4.节点A要求修改块1009。


 1) 节点A向主节点D发出请求,要求以X模式锁定块1009。

2) 节点D发现节点B已经以X模式持有了对应的锁,而且X模式的锁是不能兼容的,所以,主节点D 要求节点B降级锁到N模式,同时由于块在节点A和B都被修改,所以,锁的角色变为全局(Global),而且节点B上的块会变成一个PI。也就是说这时,节点B上的锁的属性为NG1(模式—> N, 角色—>G, 存在PI—>1)。

3) 节点B完成锁的降级之后,把块1009传递给节点A。

4) 节点A修改块1009 为1013,同时将自己节点的锁设置为XG0,并且通知主节点。


5. 节点C 查询块1013。



1) 节点C发送请求给主节点D,要求以S模式锁定块1013.

2) 主节点发现节点A拥有最新的块1013,而且这个节点以X模式锁定了这个块,因为X和S锁是不兼容的,主节点发送请求给节点A,要求降级锁。

3) 节点A降级锁为S模式,同时,由于最新的块会发送给节点C,所以在节点A上的块1013变为PI。接下来,节点A把块1013发送给节点C。这是节点A上的锁为SG1。

4) 节点C收到最新的块1013,并且以S模式锁定块,并把自己的锁更新为SG0。最后,通知主节点D。


根据以上的说明,我们能够看到,对于RAC系统,当一个进程需要访问一个块时,一定要首先获得块上对应的锁,之后才能对块进行相应的操作。而且,在RAC系统中,无论数据库包含多少个节点,当访问一个buffer时,最多会有3个节点参与其中,他们是主节点,持有者节点和申请者节点。而且,每一次访问的时候,都要有消息在节点间不断的传递。另外,我们能看到,如果锁的角色是全局,那么我们要做的事情更多,也意味着我们要访问的代码深度也越多。这也从一个角度解释了为什么oracle 会在RAC中推出DRM,read mostly,reader bypass等新特性(关于后两个新特性,我们会在今后的文章介绍)。



最后,对于PCM lock,以上过程都是由 lms进程完成的。而对于enqueue,是由lmdj进程完成的。


以上的描述,希望对大家理解RAC数据库中锁的管理的机制有所帮助。在接下来的文章中,我们会通过详细的例子对以上的内容进行讲解。


参与此主题的后续讨论,可以访问我们的中文社区,跟帖“共享:RAC 中锁的管理—Buffer Lock��。

星期一 三月 04, 2013

如何升级10.2单实例数据库到11.2 RAC

通过一个例子介绍如何从10.2 单机升级到11.2 RAC,原有的单机作为RAC的一个节点。
本例环境:
单机:10.2.0.5, 数据库文件位于文件系统,OS为Linux x86。ORACLE_HOME为:/u02/app/oracle/product/10.2.0/dbhome_1
RAC: 11.2.0.1,数据库文件位于ASM,OS为Linux x86。 ORACLE_HOME为:/u01/app/oracle/product/11.2.0/dbhome_1

具体过程请下载附件:如何升级10.2单实例数据库到11.2 RAC

星期四 二月 28, 2013

RAC数据库后台进程介绍

   在RAC数据库上会比单实例数据库多一些进程,这些进程是RAC特有的,为了实现集群数据库功能而设置的。

10g RAC特有进程:
$ ps -ef|grep ora_
oracle    4721     1  0 Feb26 ?        00:00:00 ora_diag_ONEPIECE1
oracle    4725     1  0 Feb26 ?        00:02:26 ora_lmon_ONEPIECE1
oracle    4727     1  0 Feb26 ?        00:00:02 ora_lmd0_ONEPIECE1
oracle    4729     1  0 Feb26 ?        00:00:01 ora_lms0_ONEPIECE1
oracle    4733     1  0 Feb26 ?        00:00:01 ora_lms1_ONEPIECE1
oracle    4761     1  0 Feb26 ?        00:00:07 ora_lck0_ONEPIECE1
oracle    4772     1  0 Feb26 ?        00:00:00 ora_asmb_ONEPIECE1
oracle    4776     1  0 Feb26 ?        00:00:00 ora_rbal_ONEPIECE1
oracle    4840     1  0 Feb26 ?        00:00:00 ora_o001_ONEPIECE1

11g RAC特有进程:
$ ps -ef|grep ora_
oracle     426     1  0 Feb27 ?        00:00:08 ora_o000_RAC11G21
oracle    9082     1  0 Feb25 ?        00:01:09 ora_diag_RAC11G21
oracle    9086     1  0 Feb25 ?        00:00:27 ora_ping_RAC11G21
oracle    9088     1  0 Feb25 ?        00:00:06 ora_acms_RAC11G21
oracle    9092     1  0 Feb25 ?        00:05:27 ora_lmon_RAC11G21
oracle    9094     1  0 Feb25 ?        00:01:32 ora_lmd0_RAC11G21
oracle    9096     1  0 Feb25 ?        00:02:07 ora_lms0_RAC11G21
oracle    9100     1  0 Feb25 ?        00:00:06 ora_rms0_RAC11G21
oracle    9102     1  0 Feb25 ?        00:00:14 ora_lmhb_RAC11G21
oracle    9116     1  0 Feb25 ?        00:00:09 ora_rbal_RAC11G21
oracle    9118     1  0 Feb25 ?        00:00:05 ora_asmb_RAC11G21
oracle    9136     1  0 Feb25 ?        00:04:25 ora_lck0_RAC11G21
oracle    9138     1  0 Feb25 ?        00:00:14 ora_rsmn_RAC11G21
oracle    9295     1  0 Feb25 ?        00:00:07 ora_gtx0_RAC11G21
oracle    9297     1  0 Feb25 ?        00:00:07 ora_rcbg_RAC11G21

这篇文章会对这些RAC特有的进程做一些介绍。

LMD: Global Enqueue Service Daemon。LMD 进程主要处理从远程节点发出的资源请求。大概过程如下:
+ 一个连接发出了global enqueue 请求
+ 这个请求会被发给本节点的LMD0进程
+ 这个前台进程会处于等待状态
+ LMD0会找到这个资源的master节点是谁
+ LMD0会把这个请求发送给master节点
+ 如果需要的话,master节点会增加一个新的master资源
+ 这时从master节点可以获知谁是owner, waiter
+ 当这个资源被grant给requestor后, master节点的LMD0进程会告知requestor节点的LMD0
+ 然后requestor节点的LMD0会通知申请资源的前台进程

也就是说LMD主要处理global enqueue 的请求, 而LCK0主要处理本实例的lock.
另外,RAC上的global deadlock 也是由LMD来发现的。

LCK0: Instance Enqueue Process。LCK0进程主要处理非cache fustion的资源请求,比如library 和row cache 请求。
LCK0处理在实例一级的锁:
 Row cache entries
 Library cache entries
 Result cache entries
这些实例级的锁的owner, waiter是LCK0进程。
只要这个实例的锁的owner是LCK0,那么这个实例的任何一个连接都可以使用这种cached的metedata.
如果本地的实例没有拥有这个lock,那么需要申请这个lock,前台进程会等待DFS Lock Handle。

另外,当shared pool出现压力需要释放一些内存来存放新的cursor时,LCK进程会将dictionary cache 的一些内存进行释放。

LMON: Global Enqueue Service Monitor。LMON用于监控整个集群的global enqueues和resources, 而且会执行global enqueue recovery。实例异常终止后,会由LMON来进行GCS内存方面的处理。当一个实例加入或者离开集群后,LMON会对lock和resource进行reconfiguration.另外LMON会在不同的实例间进行通讯检查,如果发现对方通讯超时,就会发出节点eviction,所以很多时候节点发生eviction后(ORA-481, ORA-29740等),我们需要查看LMON的trace来了解eviction的原因。

还有,在DRM(Dynamic Resource management)中,LMD会监控需要进行remaster的queue,然后把任务发送给LMON进程,LMON进程来实施remaster。

LMS: Global Cache Service Process。 LMS进程会维护在Global Resource Directory (GRD)中的数据文件以及每个cached block的状态。LMS用于在RAC的实例间进行message以及数据块的传输。LMS是Cache Fusion的一个重要部分。LMS进程可以说是RAC上最活跃的后台进程,会消耗较多的CPU.一般每个实例会有多个LMS进程,每个Oracle版本的默认的LMS进程数目会有所不同,大部分版本的默认值是:MIN(CPU_COUNT/2, 2))

DIAG: Diagnostic Capture Process。用来打印诊断信息。diag进程会响应别的进程发出的dump请求,将相关的诊断信息写到diag trace文件中。在RAC上,当发出global oradebug请求时,会由每个实例的diag进程来打印诊断信息到diag trace中。

比如:下面的命令用了“-g”,那么生成的dump信息会分别写到每个实例的diag trace文件中:
SQL>oradebug -g all hanganalyze 3
SQL>oradebug -g all dump systemstate 266

ASMB: ASM Background Process。用于和ASM实例进行通讯,用来管理storage和提供statistics。当使用ASMCMD的cp命令时,需要用到ASM实例上的ASMB进程,数据库实例的spfile如果位于存于ASM上,那么也会用到ASMB进程。如果OCR存放在ASM中,也会用到ASMB。

RBAL:ASM Rebalance Master Process。作为ASM磁盘组进行rebalance时的协调者(Coordinator)。在数据库实例上,由它来管理ASM磁盘组。

Onnn:ASM Connection Pool Process。是从数据库实例连接到ASM实例上的一些连接池,通过这些连接池,数据库可以发送
消息给ASM实例。比如,由它将打开文件的请求发送给ASM实例,这些连接池只处理一些较短的请求,不处理创建文件这种较长的请求。

PZ:PQ slaves。PZnn进程(从99开始)用于查询GV$视图,这种查询需要在每个实例上并行执行。如果需要更多的PZ进程,会自动生成PZ98, PZ97,...(降序)。

11G 特有的:
PING:Interconnect Latency Measurement Process。用来检查集群中各个实例间的私网通讯状况。每个实例每隔几秒会发送给其它实例一些消息,这些消息会由其它实例的PING进程收到。发送和接收信息花费的时间会被记录下来并判断是否正常。

LMHB: Global Cache/Enqueue Service Heartbeat Monitor。监控本地的LMON, LMD, LCK0,RMS0 and LMSn等进程是否运行正常,是否被阻塞或者已经hang了。

RMSn:Oracle RAC Management Process。完成对RAC的一些管理任务,比如当一个新的实例加入到集群后,给这个实例创建相关的资源。

RSMN: Remote Slave Monitor Process。管理后台的slave进程的创建,作为远程实例的协调者来完成一些任务。

GTXn: Global Transaction Process。在RAC环境中对于XA 事务提供透明支持,维护在RAC中的XA事务的global信息,完成global事务的两阶段提交。

RCBG: Result Cache Background Process。这个进程用来处理RAC上Result Cache相关的消息。

ACMS: Atomic Control File to Memory Service Process。作为每个实例上的agent来保证SGA的更新在RAC的所有实例上都是同步的,或者是全局成功提交,或者由于一些问题而导致全局回滚。

请参考官方文档:
http://docs.oracle.com/cd/E11882_01/server.112/e25513/bgprocesses.htm#REFRN104
Oracle® Database Reference
11g Release 2 (11.2)
Part Number E25513-03
F Background Processes

My Oracle Support文档:
New Background Processes In 11g (Doc ID 444149.1)

星期二 一月 29, 2013

如何重建RAC的控制文件?

在下面的一些情况下,可能需要重建控制文件:

o 所有控制文件都已损坏或丢失
o 没有针对控制文件的备份或者备份已损坏
o 或者在一些情况下,Oracle Support建议这么做

下面是针对RAC环境下重建控制文件的具体过程, 包括两个例子。一个是以noresetlogs模式来重建控制文件,一个是以resetlogs模式来重建控制文件。如果redo logs都存在而且没有被损坏,那么可以采用noresetlogs。 使用resetlogs会将所有redo log清空而且重置log sequence为1.

在RAC上重建控制文件与单实例有一些小区别: 在重建控制文件前必须设置cluster_database=false,而且只启动一个实例来执行操作,否则会报错
ORA-01503: CREATE CONTROLFILE failed
ORA-12720: operation requires database is in EXCLUSIVE mode


重建完控制文件后,需要再将cluster_database设为true.


TESTCASE1
---------------------------
用noresetlog模式重建控制文件


过程:

1.首先生成
重建控制文件的脚本:
SQL> alter database backup controlfile to trace;

Database altered.

2. 所生成的控制文件的脚本会在udump下:

SQL> show parameter user_dump_dest

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest                       string      /u01/app/oracle/diag/rdbms/racdb/RACDB1/trace

数据库的Alert log中也会详细输出这个文件的路径和名字:
alter database backup controlfile to trace
Backup controlfile written to trace file /u01/app/oracle/diag/rdbms/racdb/RACDB1/trace/RACDB1_ora_10076.trc


(注意: 例子中使用到的具体脚本,比如创建控制文件和添加临时数据文件的命令都在上面生成的trace文件中,其它步骤和命令也基本都在这个trace中)。

3. 停止所有数据库实例:
[oracle@rac1 trace]$ srvctl stop database -d RACDB


4. 用noresetlog重建控制文件:
[oracle@rac1 trace]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Tue Jan 8 11:23:44 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup nomount; <==启动一个实例
ORACLE instance started.

Total System Global Area  739065856 bytes
Fixed Size                  2232032 bytes
Variable Size             549454112 bytes
Database Buffers          184549376 bytes
Redo Buffers                2830336 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "RACDB" NORESETLOGS  ARCHIVELOG
 2      MAXLOGFILES 192
 3      MAXLOGMEMBERS 3
 4      MAXDATAFILES 1024
 5      MAXINSTANCES 32
 6      MAXLOGHISTORY 292
 7  LOGFILE
 8    GROUP 1 (
 9      '+DATA/racdb/onlinelog/group_1.261.783272805',
10      '+RECO/racdb/onlinelog/group_1.257.783272807'
11    ) SIZE 50M BLOCKSIZE 512,
12    GROUP 2 (
13      '+DATA/racdb/onlinelog/group_2.262.783272807',
14      '+RECO/racdb/onlinelog/group_2.258.783272809'
15    ) SIZE 50M BLOCKSIZE 512,
16    GROUP 3 (
17      '+DATA/racdb/onlinelog/group_3.269.804115405',
18      '+RECO/racdb/onlinelog/group_3.261.804115405'
19    ) SIZE 50M BLOCKSIZE 512,
20    GROUP 4 (
21      '+DATA/racdb/onlinelog/group_4.270.804115405',
22      '+RECO/racdb/onlinelog/group_4.263.804115407'
23    ) SIZE 50M BLOCKSIZE 512
24  -- STANDBY LOGFILE
25  DATAFILE
26    '+DATA/racdb/datafile/system.256.783272707',
27    '+DATA/racdb/datafile/sysaux.257.783272707',
28    '+DATA/racdb/datafile/undotbs1.258.783272707',
29    '+DATA/racdb/datafile/users.259.783272707',
30    '+DATA/racdb/datafile/example.264.783272831',
31    '+DATA/racdb/datafile/undotbs2.265.783273081'
32  CHARACTER SET AL32UTF8
33  ;
CREATE CONTROLFILE REUSE DATABASE "RACDB" NORESETLOGS  ARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-12720: operation requires database is in EXCLUSIVE mode  <============由于没有设置cluster_database=false,所以报错

需要将设置cluster_database=false:
SQL> alter system set cluster_database=false scope=spfile;

System altered.

SQL> shutdown immediate
ORA-01507: database not mounted


ORACLE instance shut down.

SQL> startup nomount;
ORACLE instance started.

Total System Global Area  739065856 bytes
Fixed Size                  2232032 bytes
Variable Size             549454112 bytes
Database Buffers          184549376 bytes
Redo Buffers                2830336 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "RACDB" NORESETLOGS  ARCHIVELOG
 2      MAXLOGFILES 192
 3      MAXLOGMEMBERS 3
 4      MAXDATAFILES 1024
 5      MAXINSTANCES 32
 6      MAXLOGHISTORY 292
 7  LOGFILE
 8    GROUP 1 (
 9      '+DATA/racdb/onlinelog/group_1.261.783272805',
10      '+RECO/racdb/onlinelog/group_1.257.783272807'
11    ) SIZE 50M BLOCKSIZE 512,
12    GROUP 2 (
13      '+DATA/racdb/onlinelog/group_2.262.783272807',
14      '+RECO/racdb/onlinelog/group_2.258.783272809'
15    ) SIZE 50M BLOCKSIZE 512,
16    GROUP 3 (
17      '+DATA/racdb/onlinelog/group_3.269.804115405',
18      '+RECO/racdb/onlinelog/group_3.261.804115405'
19    ) SIZE 50M BLOCKSIZE 512,
20    GROUP 4 (
21      '+DATA/racdb/onlinelog/group_4.270.804115405',
22      '+RECO/racdb/onlinelog/group_4.263.804115407'
23    ) SIZE 50M BLOCKSIZE 512
24  -- STANDBY LOGFILE
25  DATAFILE
26    '+DATA/racdb/datafile/system.256.783272707',
27    '+DATA/racdb/datafile/sysaux.257.783272707',
28    '+DATA/racdb/datafile/undotbs1.258.783272707',
29    '+DATA/racdb/datafile/users.259.783272707',
30    '+DATA/racdb/datafile/example.264.783272831',
31    '+DATA/racdb/datafile/undotbs2.265.783273081'
32  CHARACTER SET AL32UTF8
33  ;

Control file created.

SQL> select * from v$log; <===确认redo log,thread#是正确的

   GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC
---------- ---------- ---------- ---------- ---------- ---------- ---
STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------------- ------------- --------- ------------ ---------
        1          1         11   52428800        512          2 NO
CURRENT                6876599 08-JAN-13   2.8147E+14

        2          1        10   52428800        512          2 NO
INACTIVE               6825446 07-JAN-13      6876599 08-JAN-13

        3          2          7   52428800        512          2 NO
INACTIVE               6877338 08-JAN-13      6960724 08-JAN-13


   GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC
---------- ---------- ---------- ---------- ---------- ---------- ---
STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------------- ------------- --------- ------------ ---------
        4          2        6   52428800        512          2 NO
INACTIVE               6815353 07-JAN-13      6877338 08-JAN-13

SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required

SQL> alter system  archive log all;

System altered.

SQL> alter database open;

Database altered.

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '+DATA/racdb/tempfile/temp.263.783272821'
 2       SIZE 39845888  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M; 《==别忘了添加原来的临时文件到临时表空间中

Tablespace altered.

6.将cluster_database设为true :
SQL> alter system set cluster_database=true scope=spfile;

System altered.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options

7. 启动所有实例:
[oracle@rac1 trace]$ srvctl start database -d RACDB
[oracle@rac1 trace]$ srvctl status database -d RACDB
Instance RACDB1 is running on node rac1
Instance RACDB2 is running on node rac2

TESTCASE2
---------------------------
用resetlogs模式重建控制文件


Test Process:

1.首先生成
重建控制文件的脚本:
SQL> alter database backup controlfile to trace;

Database altered.

2. 数据库的Alert log中也会详细输出这个文件的路径和名字:
alter database backup controlfile to trace
Backup controlfile written to trace file /u01/app/oracle/diag/rdbms/racdb/RACDB1/trace/RACDB1_ora_5649.trc

3. 设置cluster_database=false:
SQL> alter system set cluster_database=false scope=spfile;
System altered.

否则,在重建控制文件的时候会报下面的错误:

CREATE CONTROLFILE REUSE DATABASE "RACDB" RESETLOGS  ARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-12720: operation requires database is in EXCLUSIVE mode

4. 停止所有数据库实例:
[oracle@rac1 trace]$ srvctl stop database -d RACDB
[oracle@rac1 trace]$ srvctl status database -d RACDB
Instance RACDB1 is not running on node rac1
Instance RACDB2 is not running on node rac2

5. 用resetlogs模式重建控制文件:

[oracle@rac1 trace]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Tue Jan 8 12:45:25 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup nomount;
ORACLE instance started.

Total System Global Area  739065856 bytes
Fixed Size                  2232032 bytes
Variable Size             549454112 bytes
Database Buffers          184549376 bytes
Redo Buffers                2830336 bytes

SQL> CREATE CONTROLFILE REUSE DATABASE "RACDB" RESETLOGS  ARCHIVELOG
 2      MAXLOGFILES 192
 3      MAXLOGMEMBERS 3
 4      MAXDATAFILES 1024
 5      MAXINSTANCES 32
 6      MAXLOGHISTORY 292
 7  LOGFILE
 8    GROUP 1 (
 9      '+DATA/racdb/onlinelog/group_1.261.783272805',
10      '+RECO/racdb/onlinelog/group_1.257.783272807'
11    ) SIZE 50M BLOCKSIZE 512,
12    GROUP 2 (
13      '+DATA/racdb/onlinelog/group_2.262.783272807',
14      '+RECO/racdb/onlinelog/group_2.258.783272809'
15    ) SIZE 50M BLOCKSIZE 512
16  -- STANDBY LOGFILE
17  DATAFILE
18    '+DATA/racdb/datafile/system.256.783272707',
19    '+DATA/racdb/datafile/sysaux.257.783272707',
20    '+DATA/racdb/datafile/undotbs1.258.783272707',
21    '+DATA/racdb/datafile/users.259.783272707',
22    '+DATA/racdb/datafile/example.264.783272831',
23    '+DATA/racdb/datafile/undotbs2.265.783273081'
24  CHARACTER SET AL32UTF8
25  ;

Control file created.

SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;  <=========必须使用UNTIL CANCEL,否则数据库无法open
ORA-00279: change 6976933 generated at 01/08/2013 12:45:12 needed for thread 1
ORA-00289: suggestion : +RECO
ORA-00280: change 6976933 for thread 1 is in sequence #2


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL 
Media recovery cancelled.


接下来需要��加其他thread,因为用resetlogs重建controlfile只是增加了thread为1的redo log:


SQL> ALTER DATABASE ADD LOGFILE THREAD 2
 2    GROUP 3 (
 3      '+DATA/racdb/onlinelog/group_3.269.804115405',
 4      '+RECO/racdb/onlinelog/group_3.261.804115405'
 5    ) SIZE 50M BLOCKSIZE 512 REUSE,
 6    GROUP 4 (
 7      '+DATA/racdb/onlinelog/group_4.270.804115405',
 8      '+RECO/racdb/onlinelog/group_4.263.804115407'
 9    ) SIZE 50M BLOCKSIZE 512 REUSE;
ALTER DATABASE ADD LOGFILE THREAD 2
*
ERROR at line 1:
ORA-01276: Cannot add file +DATA/racdb/onlinelog/group_3.269.804115405.  File
has an Oracle Managed Files file name. 


对于ASM,使用了OMF命名规则时不能指定具体的文件名,只需要指定diskgroup名即可:

SQL> ALTER DATABASE ADD LOGFILE THREAD 2
 2    GROUP 3 (
 3      '+DATA',
 4      '+RECO'
 5    ) SIZE 50M BLOCKSIZE 512 REUSE,
 6    GROUP 4 (
 7      '+DATA',
 8      '+RECO'
 9    ) SIZE 50M BLOCKSIZE 512 REUSE;

Database altered.

SQL> ALTER DATABASE OPEN RESETLOGS;

Database altered.

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '+DATA/racdb/tempfile/temp.263.783272821'
 2           SIZE 39845888  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

Tablespace altered.

6. 设置cluster_database=true :
SQL> alter system set cluster_database=true scope=spfile;

System altered.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

7. 启动所有实例:

[oracle@rac1 trace]$ srvctl start database -d RACDB
[oracle@rac1 trace]$ srvctl status database -d RACDB
Instance RACDB1 is running on node rac1
Instance RACDB2 is running on node rac2 

在My Oracle Support中有针对重建控制文件的一些说明:
How to Recreate a Controlfile (Doc ID 735106.1)

About

本博客由Oracle全球技术支持中国区的工程师维护。为中文用户提供数据库相关的技术支持信息,包括常用的诊断工具、诊断方法、产品新特性、案例分析等。此外,MOS也陆续推出各类中文内容:技术通讯统一发布在Note 1529795.1 中,中文文档列表更新在Note 1533057.1 中,网上讲座请查看MOS文档 1456176.1,在"Archived"中可以下载历史的录音和文档。

Search

Archives
« 四月 2014
星期日星期一星期二星期三星期四星期五星期六
  
1
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
今天