一、簡單介紹:
Oracle更新檔一般分為2類:CPU和PSU
Ø CPU:Critical Patch Update,緊急更新檔更新。每季度釋出一次,用來修複安全方面的累積型更新檔,即最新的CPU更新檔已經包含以往的CPU更新檔,隻需安裝最新的CPU更新檔即可。CPU已更名為SPU(Security Patch Update)。
Ø PSU:Patch Set Update,更新檔集更新。Oracle選取在每個季度使用者下載下傳數量最多、且得到驗證具有較低風險的更新檔放入到每個季度的PSU中。在每個PSU中不但包含Bug的修複,還包含了最新的CPU。PSU通常随CPU一起釋出。PSU通常是增量的,大部分PSU可以直接安裝,但有些PSU必須要求安裝上一個版本的PSU之後才能繼續安裝。
二、示範環境:
1、IP:192.168.1.220
2、作業系統:CentOS 6.10 x86_64
3、Oracle軟體安裝包:p13390677_112040_Linux-x86-64_1of7.zip、p13390677_112040_Linux-x86-64_2of7.zip
4、Oracle版本:11.2.0.4.0
5、OPatch軟體安裝包:p6880880_112000_Linux-x86-64.zip(大小為108M)
6、OPatch版本:11.2.0.3.20
7、Patch更新檔包:p28729262_112040_Linux-x86-64.zip
8、Patch ID:Patch 28729262(Oracle Database Patch Set Update 11.2.0.4.190115)
三、打PSU更新檔:
1、檢視目前OPatch版本:$ $ORACLE_HOME/OPatch/opatch version

備注:根據更新檔包中的README.html幫助文檔,Patch 28729262要求的OPatch最低版本為11.2.0.3.5
2、更新OPatch版本:
# unzip -q p6880880_112000_Linux-x86-64.zip
# chown -R oracle.oinstall OPatch
# su - oracle
$ mv $ORACLE_HOME/OPatch $ORACLE_HOME/OPatch_bak
$ mv OPatch $ORACLE_HOME/
$ $ORACLE_HOME/OPatch/opatch version
3、檢視系統中已打過的更新檔:
$ $ORACLE_HOME/OPatch/opatch lspatches
$ $ORACLE_HOME/OPatch/opatch lsinv
SQL> col ACTION format a6
SQL> col VERSION format a8
SQL> col BUNDLE_SERIES format a13
SQL> col COMMENTS format a19
SQL> select ACTION,VERSION,BUNDLE_SERIES,COMMENTS from dba_registry_history;
4、關閉資料庫執行個體和監聽,結束所有Oracle相關程序:
SQL> shutdown immediate
SQL> !lsnrctl stop
5、使用expdp資料泵備份全庫資料
6、使用tar指令備份整個資料庫目錄
7、解壓更新檔包,并設定權限:
# unzip -q p28729262_112040_Linux-x86-64.zip
備注:解壓後得到目錄28729262和檔案PatchSearch.xml
# chown -R oracle.oinstall 28729262
$ cd 28729262
$ ls
備注:打更新檔前務必仔細閱讀README.html幫助文檔
8、檢查PSU更新檔是否有沖突:
$ $ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -ph ./
備注:必須要在28729262目錄中執行上述指令
9、手動生成OPatch所需的OCM(Oracle Configuration Manager)檔案ocm.rsp:
$ $ORACLE_HOME/OPatch/ocm/bin/emocmrsp
$ ll -lh | grep ocm.rsp
10、打更新檔:$ $ORACLE_HOME/OPatch/opatch apply -silent -ocmrf ocm.rsp
備注:上述提示資訊可忽略
11、更新資料字典:
$ sqlplus /nolog
SQL> connect / as sysdba
SQL> !lsnrctl start
SQL> startup
SQL> @$ORACLE_HOME/rdbms/admin/catbundle.sql psu apply
12、重新編譯無效對象:
SQL> @$ORACLE_HOME/rdbms/admin/utlrp.sql
備注:可檢視日志确認執行是否成功,此處SID為TESTDB
$ less /oracle/cfgtoollogs/catbundle/catbundle_PSU_TESTDB_APPLY_2019Jan27_20_02_44.log
$ less /oracle/cfgtoollogs/catbundle/catbundle_PSU_TESTDB_GENERATE_2019Jan27_20_02_43.log
13、打OJVM(Oracle JavaVM Component Database PSU)更新檔:
SQL > @$ORACLE_HOME/rdbms/admin/dbmsjdev.sql
SQL > exec dbms_java_dev.disable
14、檢視系統中已打過的更新檔:
四、删除PSU更新檔:
1、執行ROLLBACK.sql:
SQL> @$ORACLE_HOME/rdbms/admin/catbundle_PSU_TESTDB_ROLLBACK.sql
SQL> quit
備注:此處SID為TESTDB
2、執行utlrp.sql,并關閉資料庫執行個體和監聽,結束所有Oracle相關程序:
3、更新檔回退:
$ $ORACLE_HOME/OPatch/opatch rollback -id 28729262
4、使用tar指令解壓更新前備份的資料庫目錄
5、使用impdp資料泵導入更新前備份的全庫資料
6、啟動資料庫執行個體和監聽:
7、檢視系統中已打過的更新檔:
SQL> col ACTION format a8