问题描述
数据库启动报ORA-20001错
2020-09-16T13:04:29.357786+08:00
Unable to obtain current patch information due to error: 20001, ORA-20001: Latest xml inventory is not loaded into table
ORA-06512: at “SYS.DBMS_QOPATCH”, line 777
ORA-06512: at “SYS.DBMS_QOPATCH”, line 864
ORA-06512: at “SYS.DBMS_QOPATCH”, line 2222
ORA-06512: at “SYS.DBMS_QOPATCH”, line 740
ORA-06512: at “SYS.DBMS_QOPATCH”, line 2247
报错显示QOPATCH的问题,进入OPatch目录(%ORACLE_HOME%/OPatch),使用 opatch lsinventory
命令查看,信息如下:
F:\Oracle\OracleDB\product\12.2.0\dbhome_1\OPatch>opatch lsinventory
Oracle 中间补丁程序安装程序版本 12.2.0.1.6
版权所有 © 2020, Oracle Corporation。保留所有权利。
Oracle Home : F:\Oracle\OracleDB\product\12.2.0\dbhome_1
Central Inventory : C:\Program Files\Oracle\Inventory
from :
OPatch version : 12.2.0.1.6
OUI version : 12.2.0.1.4
Log file location : F:\Oracle\OracleDB\product\12.2.0\dbhome_1\cfgtoollogs\opatch\opatch2020-09-16_15-20-55下午_1.log
List of Homes on this system:
LsInventorySession 失败: RawInventory gets null OracleHomeInfo
OPatch failed with error code = 73
OUI-67073:LsInventorySession 失败: RawInventory gets null OracleHomeInfo 错误
问题原因
DBMS_QOPATCH包是提供PLSQL/SQL接口方式访问数据库补丁安装情况,oracle在启动的时候会去调用这个包查询patch情况,由于OPatch通过OracleHomeInfo检索Oracle的home目录,而Central Inventory记录了Oracle安装的所有组件路径,但是Central Inventory中记录的信息是从上面信息的from :
这个文件中来的,但是这个地方显示路径是空,通过注册表查看inst_Ioc注册项,发现C:\Program Files\Oracle\Inventory
下是空的
from:
后面的这个文件叫Central Inventory Pointer File。
这个指向文件在不同的操作系统上有不同的默认位置,例如: Linux And AIX — /etc/oraInst.loc Other
Unix Platforms — /var/opt/oracle/oraInst.loc Windows — The pointer is
located in the registry key:
\HKEY_LOCAL_MACHINE\Software\Oracle\inst_loc Opatch就是通过Central
Inventory Pointer File找到< Central Inventory> 的路径,然后读取ORACLE_HOME的详细信息的。
解决办法
oracle重建Central Inventory
linux重建的办法网上很多,此次在windows系统重建
- 进入
%ORACLE_HOME%\oui\bin
目录 - 执行
setup.exe -silent -ignoreSysPrereqs -attachHome ORACLE_HOME="<Oracle_Home_Location>" ORACLE_HOME_NAME="<Name_Of _Oracle_Home>"
例如:
ORACLE_HOME=F:\Oracle\OracleDB\product\12.2.0\dbhome_1
ORACLE_HOME_NAME=OraDB12Home1
setup.exe -silent -ignoreSysPrereqs -attachHome ORACLE_HOME="F:\Oracle\OracleDB\product\12.2.0\dbhome_1" ORACLE_HOME_NAME="OraDB12Home1"