【故障处理】DBCA建库诡异问题处理--rac环境不能创建rac库
BLOG文档结构图
前言部分
导读和注意事项
各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:
① dbca静默创建rac库
② Inventory目录作用及其2种重建方法(重点)
③ rac环境dbca工具不能创建rac库的解决办法
④ dbca静默建库常见问题处理
⑤ 重建CRS集群环境执行root.sh脚本
Tips:
① 本文在ITpub(http://blog.itpub.net/26736162)和博客园(http://www.cnblogs.com/lhrbest)有同步更新
② 文章中用到的所有代码,相关软件,相关资料请前往小麦苗的云盘下载(http://blog.itpub.net/26736162/viewspace-1624453/)
③ 若文章代码格式有错乱,推荐使用搜狗、360或QQ浏览器,也可以下载pdf格式的文档来查看,pdf文档下载地址:http://blog.itpub.net/26736162/viewspace-1624453/
④ 本篇BLOG中命令的输出部分需要特别关注的地方我都用灰色背景和粉红色字体来表示,比如下边的例子中,thread 1的最大归档日志号为33,thread 2的最大归档日志号为43是需要特别关注的地方;而命令一般使用黄色背景和红色字体标注;对代码或代码输出部分的注释一般采用蓝色字体表示。
本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力。
故障分析及解决过程
故障环境介绍
项目 | source db |
db 类型 | RAC |
db version | 11.2.0.4 |
db 存储 | ASM |
OS版本及kernel版本 | AIX 64位 6.1.0.0 |
故障发生现象及报错信息
小麦苗采用dbca -silent+nodeinifo创建rac库,原来用的好好的命令,结果在这个rac环境上创建出来的库成了单实例的,很是郁闷,,,,且看故障发生的现象:
大家看到这里的安装百分比是1%->3%->10%-17%.....,而rac库创建的时候进度百分比应该是1%->3%->9%-15%.....,如下图所示:
接下来小麦苗尝试了如下的几种方式:①dbca采用响应文件的形式,②dbca图形界面的方式,都是同样的情况。
我的环境dbca图形界面的第一张图:
而正常rac环境下dbca图形界面的第一步图应该是:
以上都是目前出现的问题,初步预估是哪个配置文件出错了,dbca不能判断集群环境。
故障分析及解决过程
起初小麦苗以为是集群出现了问题,在万般无奈的情况下执行root.sh重建了集群,按照以前的经验,这个终极大招执行后集群肯定可以恢复到正常的情况下,结果呢?结果还是令小麦苗很伤心,情况依旧没有解决。重新执行root.sh的命令如下(注:重新执行root.sh并不会清掉db的数据):
ocrconfig -showbackup
ocrconfig -manualbackup
$ORACLE_HOME/crs/install/rootcrs.pl -deconfig -force -verbose
ls -l $ORACLE_BASE/Clusterware/ckptGridHA*
find $ORACLE_HOME/gpnp/* -type f
find $ORACLE_HOME/gpnp/* -type f -exec rm -rf {} \;
$ORACLE_HOME/crs/install/rootcrs.pl -deconfig -force -verbose -lastnode -keepdg
ls -l $ORACLE_BASE/Clusterware/ckptGridHA*
find $ORACLE_HOME/gpnp/* -type f
find $ORACLE_HOME/gpnp/* -type f -exec rm -rf {} \;
ipcs
$ORACLE_HOME/root.sh
/oracle/app/11.2.0/grid/perl/bin/perl -I/oracle/app/11.2.0/grid/perl/lib -I/oracle/app/11.2.0/grid/crs/install /oracle/app/11.2.0/grid/crs/install/rootcrs.pl
ipcs
$ORACLE_HOME/root.sh
---crs的配置文件
---$ORACLE_HOME/crs/install/crsconfig_params
-- GRID
export DISPLAY=22.188.216.132:0.0
$ORACLE_HOME/crs/config/config.sh
这个终极大招已经使用过了,问题没有解决只能说明不是权限的问题,也不是集群的问题,而是DB环境的问题。
于是硬着头皮分析分析dbca的日志,dbca创建库的时候日志在:11g:$ORACLE_BASE/cfgtoollogs/dbca , 10g:$ORACLE_HOME/cfgtoollogs/dbca
里边有trace.log文件,拿到手,搜了下cluster,发现一个错误:
[main] [ 2016-07-05 17:37:30.694 GMT+08:00 ] [HAUtils.getDefaultListenerProperties:1666] PRCR-1001 : Resource ora.LISTENER.lsnr does not exist
PRCR-1001 : Resource ora.LISTENER.lsnr does not exist
at oracle.cluster.impl.common.SoftwareModuleImpl.crsResource(SoftwareModuleImpl.java:776)
at oracle.cluster.impl.nodeapps.ListenerImpl.crsResource(ListenerImpl.java:1107)
ora.LISTENER.lsnr该资源不存在,那就手动创建该资源:
报错了,应该是监听已经存在了,重新添加进crs中:
原本以为就是这个原因导致的,结果添加完ora.LISTENER.lsnr后还是单实例的,郁闷。。。更郁闷的是第二次创建后,trace文件中已经没有任何错误了,无论搜error或fail都搜不到,但是创建的数据库还是单实例,,,第二次创建的日志:
有种深深的挫败感,于是解决同事碰到的那个DG问题,参考:http://blog.itpub.net/26736162/viewspace-2121688/。时间就这样过了2天,到了7月8号,手头又没什么事情了,想起来dbca这个问题,想来想去还是得从日志入手,老子一行一行的看,总能看出点东西来,但这次我比对的看,就是找一个dbca可以创建rac的环境,生成日志来分析差异,结果令我震惊了。
当小麦苗看到第5行的日志的时候,发现一个null的问题,Current Version From Inventory: null,截图如下:
错误环境截图:
而正常环境的rac是这个样子的:
可以看到正常环境下,可以获取到Homeinfo和Current Version From Inventory的值,当看到Inventory这个词的时候我就想我已经找到问题的答案了。应该是Inventory这个目录出现了问题,标准点的说法应该是/oracle/app/oraInventory/ContentsXML/inventory.xml这个文件的内容有问题了。Inventory目录存放的是Oracle软件安装的目录信息,Oracle升级也需要这个目录,执行opatch lspatches也需要这个目录。oraInventory目录的位置在/etc/oraInst.loc中记录,11g中我们可以通过$ORACLE_HOME/oui/bin/attachHome.sh来重建这个目录。
在其中的1个节点上分别用oracle和grid来执行:
[ZFLHRDB1:root]:/oracle/app/oraInventory>$ORACLE_HOME/oui/bin/attachHome.sh
The user is root. Oracle Universal Installer cannot continue installation if the user is root.
A file or directory in the path name does not exist.
[ZFLHRDB1:root]:/oracle/app/oraInventory>su - grid
[ZFLHRDB1:grid]:/home/grid>$ORACLE_HOME/oui/bin/attachHome.sh
Starting Oracle Universal Installer...
Checking swap space: must be greater than 500 MB. Actual 8192 MB Passed
The inventory pointer is located at /etc/oraInst.loc
The inventory is located at /oracle/app/oraInventory
'AttachHome' was successful.
[ZFLHRDB1:grid]:/home/grid>cd /oracle/app/oraInventory/ContentsXML
[ZFLHRDB1:grid]:/oracle/app/oraInventory/ContentsXML>more inv*
<?xml version="1.0" standalone="yes" ?>
<!-- Copyright (c) 1999, 2013, Oracle and/or its affiliates.
All rights reserved. -->
<!-- Do not modify the contents of this file by hand. -->
<INVENTORY>
<VERSION_INFO>
<SAVED_WITH>11.2.0.4.0</SAVED_WITH>
<MINIMUM_VER>2.1.0.6.0</MINIMUM_VER>
</VERSION_INFO>
<HOME_LIST>
<HOME NAME="Ora11g_gridinfrahome1" LOC="/oracle/app/11.2.0/grid" TYPE="O" IDX="1" CRS="true">
<NODE_LIST>
<NODE NAME="ZFLHRDB1"/>
<NODE NAME="ZFLHRDB2"/>
</NODE_LIST>
</HOME>
</HOME_LIST>
<COMPOSITEHOME_LIST>
</COMPOSITEHOME_LIST>
</INVENTORY>
[ZFLHRDB1:grid]:/oracle/app/oraInventory/ContentsXML>exit
[ZFLHRDB1:root]:/oracle/app/oraInventory>su - oracle
[ZFLHRDB1:oracle]:/oracle>$ORACLE_HOME/oui/bin/attachHome.sh
Starting Oracle Universal Installer...
Checking swap space: must be greater than 500 MB. Actual 8192 MB Passed
The inventory pointer is located at /etc/oraInst.loc
The inventory is located at /oracle/app/oraInventory
'AttachHome' was successful.
[ZFLHRDB1:oracle]:/oracle>cd /oracle/app/oraInventory/ContentsXML
[ZFLHRDB1:oracle]:/oracle/app/oraInventory/ContentsXML>more inv*
<?xml version="1.0" standalone="yes" ?>
<!-- Copyright (c) 1999, 2013, Oracle and/or its affiliates.
All rights reserved. -->
<!-- Do not modify the contents of this file by hand. -->
<INVENTORY>
<VERSION_INFO>
<SAVED_WITH>11.2.0.4.0</SAVED_WITH>
<MINIMUM_VER>2.1.0.6.0</MINIMUM_VER>
</VERSION_INFO>
<HOME_LIST>
<HOME NAME="Ora11g_gridinfrahome1" LOC="/oracle/app/11.2.0/grid" TYPE="O" IDX="1" CRS="true">
<NODE_LIST>
<NODE NAME="ZFLHRDB1"/>
<NODE NAME="ZFLHRDB2"/>
</NODE_LIST>
</HOME>
<HOME NAME="DbHome1" LOC="/oracle/app/oracle/product/11.2.0/db" TYPE="O" IDX="2">
<NODE_LIST>
<NODE NAME="ZFLHRDB1"/>
<NODE NAME="ZFLHRDB2"/>
</NODE_LIST>
</HOME>
</HOME_LIST>
<COMPOSITEHOME_LIST>
</COMPOSITEHOME_LIST>
</INVENTORY>
重建Inventory这个目录后重新执行建库脚本:
已经正常了,唉,o(︶︿︶)o 唉,折腾了这么久原来是这个文件的问题,至于新环境为啥这个目录的配置文件不全,这个估计得追溯到rac的安装过程了,这个就不去纠结了。
模拟让故障重现
我们再来看看/oracle/app/oraInventory/ContentsXML/inventory.xml文件的内容:
对了,看仔细了,文件中有2个部分,若把蓝色字体的部分删掉,或者把/oracle/app/oraInventory/ContentsXML/inventory.xml的权限修改为root用户,那么执行dbca的时候将又回到单库的时代,原来dbca会从这里去获取是否集群环境,小麦苗阅读了dbca这个shell脚本,无奈最后发现是调用的java,但java这是个二进制文件不是shell脚本,所以就无法知道到底从哪里获取的集群环境信息。
小麦苗已亲自测试过,各位朋友测试过了吗????
关于重建Inventory目录的2种办法
重建Inventory目录的时候,生成的log文件在/oracle/app/oraInventory/logs下。
方法一:$ORACLE_HOME/oui/bin/attachHome.sh
这篇文档中提到有一个脚本$ORACLE_HOME/oui/bin/attachHome.sh可以重建Inventory目录,但是我们可以看到在不同的用户下(grid和oracle),其OHOME的变量值不同,所以若单独创建可以执行该脚本即可。
备份2个节点的Inventory目录,并重建空的Inventory目录,然后分别在grid和oracle用户下执行$ORACLE_HOME/oui/bin/attachHome.sh命令即可,注意只需要在其中的一个节点上执行即可。
方法二:集群下统一创建
可以去小麦苗的云盘下载该文档:
根据MOS(MOS:413939.1)的介绍,重建Inventory的步骤:
接下来分别备份2个节点的Inventory目录,并重建空的Inventory目录:
以下命令用grid用户在节点一执行即可,节点二自动创建:
注意的2点:
a-Do not try attachHome in all the nodes, which may corrupt the inventory and it results in OUI-10197:Unable to create a new Oracle Home at /u01/app/oracle/product/10.2.0/crs_1. Oracle Home already exists at this location. Select another location. Attaching Home in one node will be propagated to other nodes.
b-Make absolutely sure you are have backed up the original inventory before starting this procedure, so that you can revert if necessary.
故障处理总结
rac环境不能创建rac库
在集群环境中, dbca不能创建rac库,那很可能就是/oracle/app/oraInventory/ContentsXML/inventory.xml文件中丢失了db部分的内容,我们可以使用$ORACLE_HOME/oui/bin/attachHome.sh来重建该目录,或手动修改该文件。
若执行attachHome.sh报如下的错误,那么删除/oracle/app/oraInventory/ContentsXML下的3个文件后继续执行即可。
org.xml.sax.SAXParseException: : XML-20108: (Fatal Error) Start of root element expected.
at oracle.xml.parser.v2.XMLError.flushErrorHandler(XMLError.java:415)
其它dbca静默建库常见错误的解决办法
The Oracle system identifier(SID) "xxx" already exists. Specify another SID
用root用户编辑/etc/oratab,删除相应的记录: xxx:/u01/oracle:N ,保存退出问题解决。
The cluster database(DB_NAME) "racdb" already exists. Please specify another DB_NAME.
原因:说明集群环境中已经有racdb这个数据库了。
解决办法:若数据库无用了,可以dbca -silent -deleteDatabase -sourceDB racdb来删除数据库,若数据库不能启动,则可以直接从crs中删除数据库的注册信息:srvctl remove db -d racdb -f后重新运行脚本即可。
DBCA建库报错CRS-2566 PRCR-1071 PRCR-1006
PRCR-1006 : Failed to add resource ora.lhrdg.db for lhrdg
PRCR-1071 : Failed to register or update resource ora.lhrdg.db
CRS-2566: User 'oracle' does not have sufficient permissions to operate on resource 'ora.LISTENER_LHRDG.lsnr', which is part of the dependency specification.
DBCA_PROGRESS : 100%
权限不对,应该用grid来创建监听:srvctl config listener -l LISTENER_LHRDG -a
具体参考我的blog:http://blog.itpub.net/26736162/viewspace-2114484/
用到的SQL集合
RAC建库脚本:
dbca -silent -createDatabase -templateName General_Purpose.dbc -responseFile NO_VALUE \
-gdbname racdb -sid racdb \
-sysPassword lhr -systemPassword lhr \
-datafileDestination 'DATA/' -recoveryAreaDestination 'DATA/' \
-redoLogFileSize 50 \
-storageType ASM -asmsnmpPassword lhr -diskGroupName 'DATA' \
-characterset ZHS16GBK -nationalCharacterSet AL16UTF16 \
-sampleSchema true \
-automaticMemoryManagement true -totalMemory 2048 \
-databaseType OLTP \
-emConfiguration NONE \
-nodelist ZFLHRDB1,ZFLHRDB2
静默创建监听:netca -silent -responsefile $ORACLE_HOME/assistants/netca/netca.rsp
添加监听:srvctl add listener -l LISTENER -p 1521 -o $ORACLE_HOME
oraInventory目录:/oracle/app/oraInventory/ContentsXML/inventory.xml
重建的话,方法一: 备份2个节点的Inventory目录,并重建空的Inventory目录,然后分别在grid和oracle用户下执行$ORACLE_HOME/oui/bin/attachHome.sh命令即可,注意只需要在其中的一个节点上执行即可。方法二,在grid用户下执行:
$ORACLE_HOME/oui/bin/runInstaller -silent -ignoreSysPrereqs \
-attachHome ORACLE_HOME="/oracle/app/11.2.0/grid" ORACLE_HOME_NAME="GridHome1" \
LOCAL_NODE="ZFLHRDB1" CLUSTER_NODES="{ZFLHRDB1,ZFLHRDB2}" CRS=true
$ORACLE_HOME/oui/bin/runInstaller -silent -ignoreSysPrereqs \
-attachHome ORACLE_HOME="/oracle/app/oracle/product/11.2.0/db" ORACLE_HOME_NAME="DbHome1" \
LOCAL_NODE="ZFLHRDB1" CLUSTER_NODES="{ZFLHRDB1,ZFLHRDB2}"
重新执行root.sh脚本:
ocrconfig -showbackup
ocrconfig -manualbackup
$ORACLE_HOME/crs/install/rootcrs.pl -deconfig -force -verbose
ls -l $ORACLE_BASE/Clusterware/ckptGridHA*
find $ORACLE_HOME/gpnp/* -type f
find $ORACLE_HOME/gpnp/* -type f -exec rm -rf {} \;
$ORACLE_HOME/crs/install/rootcrs.pl -deconfig -force -verbose -lastnode -keepdg
ls -l $ORACLE_BASE/Clusterware/ckptGridHA*
find $ORACLE_HOME/gpnp/* -type f
find $ORACLE_HOME/gpnp/* -type f -exec rm -rf {} \;
ipcs
$ORACLE_HOME/root.sh
/oracle/app/11.2.0/grid/perl/bin/perl -I/oracle/app/11.2.0/grid/perl/lib -I/oracle/app/11.2.0/grid/crs/install /oracle/app/11.2.0/grid/crs/install/rootcrs.pl
ipcs
$ORACLE_HOME/root.sh