Oracle中央目录文件inventory.xml缺失CRS配置导致rac安装db软件时找不到节点
现象
1、静默安装不报错,但是也不执行,会直接跳出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ./runInstaller -silent -force -noconfig -ignorePrereq \ oracle.install.option=INSTALL_DB_SWONLY \ UNIX_GROUP_NAME=oinstall \ INVENTORY_LOCATION=/u01/app/oraInventory \ ORACLE_BASE=/u01/app/oracle \ oracle.install.db.InstallEdition=EE \ oracle.install.db.OSDBA_GROUP=dba \ oracle.install.db.OSOPER_GROUP=oper \ oracle.install.db.OSBACKUPDBA_GROUP=dba \ oracle.install.db.OSDGDBA_GROUP=dba \ oracle.install.db.OSKMDBA_GROUP=dba \ oracle.install.db.OSRACDBA_GROUP=dba \ oracle.install.db.CLUSTER_NODES=rac1,rac2 \ oracle.install.db.config.starterdb.type=GENERAL_PURPOSE |
2、界面不能显示rac的节点,如下:
解决
这个问题是由于中央目录文件/u01/app/oraInventory/ContentsXML/inventory.xml
缺失CRS="true"
导致的。
所以解决办法是手动修改该文件,类似:
1 | <HOME NAME="Ora11g_gridinfrahome1" LOC="/u01/app/11.2.0.4/grid" TYPE="O" IDX="1" CRS="true"> |
也可以通过命令生成文件:
1 2 3 4 5 6 7 8 9 10 11 12 | oraInventory目录的位置是由oraInst.loc文件决定的: AIX和Linux平台:/etc/oraInst.loc /oracle/app/oraInventory/ContentsXML/inventory.xml oracle执行:$ORACLE_HOME/oui/bin/attachHome.sh 步骤1:添加GI_HOME: ./runInstaller -silent -ignoreSysPrereqs -attachHome ORACLE_HOME="/u01/app/11.2.0/grid" ORACLE_HOME_NAME="OraGI11Home1" CLUSTER_NODES=test1,test2 CRS=true "INVENTORY_LOCATION=/u01/app/oraInventory" LOCAL_NODE=test1 步骤2:添加RDBMS_HOME: $./runInstaller -silent -ignoreSysPrereqs -attachHome ORACLE_HOME="/u02/app/oracle/product/11.2.0/db_1" ORACLE_HOME_NAME="OraDB11Home1" CLUSTER_NODES=test1,test2 CRS=true "INVENTORY_LOCATION=/u01/app/oraInventory" LOCAL_NODE=test1 |
如果该文件内容不完整,也会导致rac环境不能创建rac库的诡异问题。
inventory.xml文件内容 模板
1 2 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | [root@oracle-01 ~]# more /u01/app/oraInventory/ContentsXML/inventory.xml <?xml version="1.0" standalone="yes" ?> <!-- Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. --> <!-- Do not modify the contents of this file by hand. --> <INVENTORY> <VERSION_INFO> <SAVED_WITH>12.1.0.2.0</SAVED_WITH> <MINIMUM_VER>2.1.0.6.0</MINIMUM_VER> </VERSION_INFO> <HOME_LIST> <HOME NAME="OraGI12Home1" LOC="/u01/app/12.1.0.2/grid" TYPE="O" IDX="1" CRS="true"> <NODE_LIST> <NODE NAME="oracle-01"/> <NODE NAME="oracle-02"/> </NODE_LIST> </HOME> <HOME NAME="OraDB12Home1" LOC="/u01/app/oracle/product/12.1.0.2/dbhome_1" TYPE="O" IDX="2"> <NODE_LIST> <NODE NAME="oracle-01"/> <NODE NAME="oracle-02"/> </NODE_LIST> </HOME> </HOME_LIST> <COMPOSITEHOME_LIST> </COMPOSITEHOME_LIST> </INVENTORY> [root@rac1 ~]# more /u01/app/oraInventory/ContentsXML/inventory.xml <?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="/u01/app/11.2.0.4/grid" TYPE="O" IDX="1" CRS="true"> <NODE_LIST> <NODE NAME="rac1"/> <NODE NAME="rac2"/> </NODE_LIST> </HOME> <HOME NAME="OraDb11g_home1" LOC="/u01/app/oracle/product/11.2.0.4/dbhome_1" TYPE="O" IDX="2"> <NODE_LIST> <NODE NAME="rac1"/> <NODE NAME="rac2"/> </NODE_LIST> </HOME> </HOME_LIST> <COMPOSITEHOME_LIST> </COMPOSITEHOME_LIST> </INVENTORY> |
中央目录的作用
由于Oracle支持将多个Oracle软件(或者多版本的数据库软件)安装到同一台服务器上,这就需要一个位置统一记录安装的软件信息。中央目录(Central Inventory)实际上就是一台主机上安装的Oracle产品清单。在这个清单里记录了每一个Oracle软件主目录的名称和位置、安装的组件,以及一些其他的信息。OUI在安装产品时会读取中央目录来确认已经安装过的产品信息,确保新安装的产品不会和已存在的产品冲突,而且不会覆盖掉原有的产品。另外,Oracle的集群和数据库软件在进行升级时,OUI也是通过读取中央目录中的信息来确认哪些软件应被安装的。中央目录(Central Inventory)所有的Oracle软件安装都依赖于该目录,所以,要确保该目录已经备份,删除或丢失oraInventory目录的内容,都有可能导致安装或升级报错。另外,Oracle的软件产品通常比较复杂,包含很多组件,所以还需要一个更加细致的清单来记录每一个oracle_home下所安装的产品组件。而本地目录(Local Inventory)就是这样一个清单,它记录了每个产品所安装的组件,以及每个组件上应用过的补丁程序信息。
oraInventory目录的位置是由oraInst.loc文件决定的:
AIX和Linux平台:/etc/oraInst.loc
Solaris和HP-UX平台:/var/opt/oracle/OraInst.loc
Windows平台:HKEY_LOCAL_MACHINE/Software/Oracle/inst.loc
默认情况下它保存在$ORACLE_BASE上一层路径的oraInventory路径下,例如:
1 2 3 | [oracle@orcltest ~]$ more /etc/oraInst.loc inventory_loc=/u01/app/oraInventory inst_group= oinstall |
一旦中央目录文件出现了损坏,请尝试使用以下的两种方式恢复该文件:
方式1:如果其他节点的inventory.xml没有损坏,可以将其复制到本地节点以覆盖原有文件。
方式2:使用$GRID_HOME/oui/bin/runInstaller工具重建inventory.xml文件。例如:
步骤1:添加GI_HOME:
1 | ./runInstaller -silent -ignoreSysPrereqs -attachHome ORACLE_HOME="/u01/app/11.2.0/grid" ORACLE_HOME_NAME="OraGI11Home1" CLUSTER_NODES=test1,test2 CRS=true "INVENTORY_LOCATION=/u01/app/oraInventory" LOCAL_NODE=test1 |
步骤2:添加RDBMS_HOME:
1 | ./runInstaller -silent -ignoreSysPrereqs -attachHome ORACLE_HOME="/u02/app/oracle/product/11.2.0/db_1" ORACLE_HOME_NAME="OraDB11Home1" CLUSTER_NODES=test1,test2 CRS=true "INVENTORY_LOCATION=/u01/app/oraInventory" LOCAL_NODE=test1 |
麦老师就曾遇到过一次与该目录有关的异常:RAC环境中,但是DBCA创建的数据库是单库,最后查到的原因竟然是/u01/app/oraInventory/ContentsXML/inventory.xml文件中缺少了DB的部分。
这里顺便介绍一下Local Inventory的作用。Local Inventory用于保存某一个ORACLE_HOME下所安装的组件清单,它位于$ORACLE_HOME/inventory
下。由于Local Inventory针对特定的软件主目录,所以并不存在inventory.xml文件。文件$ORACLE_HOME/inventory/ContentsXML/comps.xml
记录了对应主目录下安装的所有组件。通常情况下,由于每一个Oracle产品都包含了很多组件,所以comps.xml文件的结构也很复杂。
原因
从11g的rac安装过程来看,文件inventory.xml的更新在root.sh执行之前和执行之后都会更新该文件,所以,在静默安装之前,必须配置如下的路径:
1 2 3 4 5 6 7 8 9 10 11 12 13 | mkdir -p /u01/app/oraInventory chown -R grid:oinstall /u01/app/oraInventory chmod -R 775 /u01/app/oraInventory cat > /etc/oraInst.loc <<"EOF" inventory_loc=/u01/app/oraInventory inst_group=oinstall EOF chown oracle:oinstall /etc/oraInst.loc chmod 664 /etc/oraInst.loc |
至于inventory.xml文件为何不完整,有可能由于执行完root.sh脚本后,忘记跑configToolAllCommands脚本所致:
1 2 3 4 5 6 7 | -- 以grid用户运行在节点1运行即可 cat > /home/grid/cfgrsp.properties <<"EOF" oracle.assistants.asm|S_ASMPASSWORD=oracle oracle.assistants.asm|S_ASMMONITORPASSWORD=oracle oracle.crs|S_BMCPASSWORD=oracle EOF /u01/app/11.2.0.4/grid/cfgtoollogs/configToolAllCommands RESPONSE_FILE=/home/grid/cfgrsp.properties |
总结
1、修改时2个节点都需要修改
2、该文件会导致rac db安装,dbca建库等找不到节点问题
3、日志位置:/u01/app/oraInventory/logs/
4、若已存在,可以考虑更新:
1 | /u01/app/11.2.0.4/grid/oui/bin/runInstaller -silent -ignoreSysPrereqs -updateNodeList ORACLE_HOME="/u01/app/11.2.0.4/grid" ORACLE_HOME_NAME="OraGI11Home1" CLUSTER_NODES=rac1,rac2 CRS=true "INVENTORY_LOCATION=/u01/app/oraInventory" LOCAL_NODE=rac1 |
报错
1 2 3 4 | Remote 'AttachHome' failed on nodes: 'rac1'. Refer to '/u01/app/oraInventory/logs/installActions2022-08-05_02-17-27PM.log' for details. It is recommended that the following command needs to be manually run on the failed nodes: /u01/app/11.2.0.4/grid/oui/bin/runInstaller -attachHome -noClusterEnabled ORACLE_HOME=/u01/app/11.2.0.4/grid ORACLE_HOME_NAME=Ora11g_gridinfrahome1 CLUSTER_NODES=localhost,rac1,rac2 "INVENTORY_LOCATION=/u01/app/oraInventory" LOCAL_NODE=<node on which command is to be run>. Please refer 'AttachHome' logs under central inventory of remote nodes where failure occurred for more details. |
解决:
1 2 3 4 5 6 | -- 节点1 /u01/app/11.2.0.4/grid/oui/bin/runInstaller -silent -ignoreSysPrereqs -updateNodeList ORACLE_HOME="/u01/app/11.2.0.4/grid" "CLUSTER_NODES={rac1,rac2}" CRS=true "INVENTORY_LOCATION=/u01/app/oraInventory" LOCAL_NODE=rac1 -- 节点2 /u01/app/11.2.0.4/grid/oui/bin/runInstaller -silent -ignoreSysPrereqs -updateNodeList ORACLE_HOME="/u01/app/11.2.0.4/grid" "CLUSTER_NODES={rac1,rac2}" CRS=true "INVENTORY_LOCATION=/u01/app/oraInventory" LOCAL_NODE=rac2 |