安裝oraInventory和使用opatch給Oracle打補丁

viadeazhu發表於2010-01-27

    opatch是給Oracle打補丁的工具,命令使用起來簡單方便。他預設地址在$ORACLE_HOME/OPatch/opatch,直接執行會顯示所有可用命令。

> $ORACLE_HOME/OPatch/opatch
Invoking OPatch 10.2.0.3.0

Oracle interim Patch Installer version 10.2.0.3.0
Copyright (c) 2005, Oracle Corporation.  All rights reserved..


 Usage: opatch [ -help ] [ -r[eport] ] [ command ]

            command := apply
                       lsinventory
                       query
                       rollback
                       version
                       prereq
                       util

  := -help       Displays the help message for the command.
                       -report     Print the actions without executing.

 example:
   'opatch -help'
   'opatch apply -help'
   'opatch lsinventory -help'
   'opatch rollback -help'
   'opatch prereq -help'
   'opatch util -help'
  


OPatch succeeded.

但是對於初學者,有幾個錯誤很容易發生。

1.沒有oraInst.loc檔案

這其實是一個簡單的配置檔案,用來定義oraInventory的位置。他的預設地址是在/var/opt/oracle/oraInst.loc。

他的格式為:

> cat /var/opt/oracle/oraInst.loc
inventory_loc=/export/home/oracle/products/10203/oraInventory
inst_group=dba

如果沒有這個檔案,當我們檢視當前有哪些patch時會出報104錯:

> opatch lsinventory
Invoking OPatch 10.2.0.3.0

Oracle interim Patch Installer version 10.2.0.3.0
Copyright (c) 2005, Oracle Corporation.  All rights reserved..


Oracle Home       : /export/home/oracle/products/10203
Central Inventory : n/a
   from           :
OPatch version    : 10.2.0.3.0
OUI version       : 10.2.0.3.0
OUI location      : /export/home/oracle/products/10203/oui
Log file location : n/a

OPatch cannot find a valid oraInst.loc file to locate Central Inventory.

OPatch failed with error code 104

當這個檔案不在預設的路徑時,我們可以加“-invPtrLoc ”來指明oraInst.loc的地址:

$ORACLE_HOME/OPatch/opatch lsinventory  -invPtrLoc /var/opt/oracle/oraInst.loc.2

2.沒有正確/完整安裝oraInventory(Central Inventory)

此時,雖然/var/opt/oracle/oraInst.loc檔案存在,並且假設其指向的oraInventory沒有被正確或者完全安裝,那麼opatch lsinventory時會報如下錯:

> opatch lsinventory
Invoking OPatch 10.2.0.3.0

Oracle interim Patch Installer version 10.2.0.3.0
Copyright (c) 2005, Oracle Corporation.  All rights reserved..


Oracle Home       : /export/home/oracle/products/10203
Central Inventory : /export/home/oracle/products/10203/myinventory
   from           : /var/opt/oracle/oraInst.loc
OPatch version    : 10.2.0.3.0
OUI version       : 10.2.0.3.0
OUI location      : /export/home/oracle/products/10203/oui
Log file location : /export/home/oracle/products/10203/cfgtoollogs/opatch/opatch2010-01-27_20-06-34PM.log

List of Homes on this system:

Inventory load failed... OPatch cannot load inventory for the given Oracle Home.
Possible causes are:
   Oracle Home dir. path does not exist in Central Inventory
   Oracle Home is a symbolic link
   Oracle Home inventory is corrupted
LsInventorySession failed: OracleHomeInventory::load() gets null oracleHomeInfo

OPatch failed with error code 73

此時,我們需要安裝metalink Doc id 556834.1來重建oraInventory(Central Inventory)。

對於類unix系統,我們只需很簡單的執行如下命令重建即可(注意替換你自己的ORACLE_HOME和ORACLE_HOME_NAME):

> ./runInstaller -silent -ignoreSysPrereqs -attachHome ORACLE_HOME="/export/home/oracle/products/10203" ORACLE_HOME_NAME="home1"
Starting Oracle Universal Installer...

No pre-requisite checks found in oraparam.ini, no system pre-requisite checks will be executed.

>>> Ignoring required pre-requisite failures. Continuing...

The inventory pointer is located at /var/opt/oracle/oraInst.loc
The inventory is located at /export/home/oracle/products/10203/oraInventory
'AttachHome' was successful.

   

    在以上兩個錯誤解決之後(或者你根本就沒遇到),opatch lsinventory 可以正確看到當前binary已經安裝了哪些patch。

其實還有一種辦法,前提是你從來只是安裝patch,沒有rollback過patch,那麼你可以 cd $ORACLE_HOME/.patch_storage ,然後ls -altr檢視所有的patch。

但是如果你rollback了一個patch,用這種辦法還是會看到這個patch,所以,最好的辦法還是透過opatch lsinventory來檢視。

    下面以我在10203環境中打patch 7706062為例:

1.在metalink上下載patch p7706062_10203_SOLARIS64.zip

2.unzip p7706062_10203_SOLARIS64.zip

3.cd 7706062

4.$ORACLE_HOME/OPatch/opatch apply(注意,在停掉所有使用當前binary的資料庫之後再進行)

此時,我們遇到問題:

Patch(es) 5605370 conflict with the patch currently being installed (7706062).

If you continue, patch(es) 5605370 will be rolled back and the new patch (7706062) will be installed.

If a merge of the new patch (7706062) and the conflicting patch(es) (5605370) is required, contact Oracle Support Services and request a Merged patch.

因為兩個patch衝突,所以要麼2選1,要麼找oracle請求一個merged patch。(你自己選擇。。。)

這裡我強行安裝patch 7706062會導致patch 5605370 rollback.

5.如果你後悔了,也可以rollback這個patch:

$ORACLE_HOME/OPatch/opatch rollback -id 7706062

並且記得重新安裝前面被rollback的patch 5605370 。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15415488/viewspace-626194/,如需轉載,請註明出處,否則將追究法律責任。

相關文章