1. 什麼是PSU/CPU?
CPU: Critical Patch Update
Oracle對於其產品每一個季度發行一次的安全補丁包,一般是爲了修復產品中的安全隱患。html
PSU: Patch Set Updates
Oracle對於其產品每一個季度發行一次的補丁包,包含了bug的修復。Oracle選取被用戶下載數量多的,而且被驗證過具備較低風險的補丁放入到每一個季度的PSU中。在每一個PSU中不但包含Bug的修復並且還包含了最新的CPU。sql
2. 如何查找最新的PSU?
每一個數據庫版本都有本身的PSU,PSU版本號體如今數據庫版本的最後一位,好比最新的10.2.0.5的PSU是10.2.0.5.3,而11.2.0.2的最新PSU則是11.2.0.2.2。
MOS站點中Oracle Recommended Patches — Oracle Database [ID 756671.1] 文檔中查到各個產品版本最新的PSU。
若是你記不住這個文檔號,那麼在MOS中以「PSU」爲關鍵字搜索,一般這個文檔會顯示在搜索結果的最前面。數據庫
注意:必須購買了Oracle基本服務獲取了CSI號之後纔有權限登錄MOS站點。安全
3. 如何正確安裝PSU?
每一個PSU安裝包中都包含一個README.html文檔,其中描述瞭如何安裝該PSU,有些PSU是能夠直接安裝的,而有些PSU則必需要求安裝了上一 個版本的PSU以後才能繼續安裝。好比對於10.2.0.4版本的數據庫來講,PSU 10.2.0.4.4能夠直接安裝在最原始的10.2.0.4.0版本中,而最新的PSU 10.2.0.4.8則必需要求先安裝10.2.0.4.4。這些信息在README.html中均可以找到,因此請仔細閱讀該文檔。oracle
一般安裝PSU是比較簡單的,步驟以下:
1) 安裝PSU須要使用到opatch,在README.html中有描述該PSU須要的最低版本opatch,若是當前opatch版本太低,則須要先下載 Patch 6880880,該Patch中包含最新的opatch,只須要解壓覆蓋原先的$ORACLE_HOME/OPatch目錄便可。app
查看當前的opatch版本,可使用opatch version命令。ide
$ opatch versionspa
Invoking OPatch 10.2.0.5.2
orm
OPatch Version: 10.2.0.5.2
htm
OPatch succeeded.
2)安裝PSU,請仔細閱讀README.html,確認安裝命令,一般是簡單的opatch apply。
$opatch apply
3)更新數據庫,將修改過的SQL文件應用到數據庫中,不少DBA在執行完上述安裝命令之後就再也不進行這一步,那麼實際上PSU是沒有完整安裝的。
cd $ORACLE_HOME/rdbms/admin
sqlplus / as sysdba
SQL> STARTUP
SQL> @catbundle.sql psu apply
SQL> QUIT
注意:若是PSU是overlay PSU,好比10.2.0.4.8,則須要執行@catbundle.sql opsu apply,一樣這些在README.html中都有詳細描述。
4)從新編譯CPU相關視圖。該步驟在一個數據庫上永遠只須要執行一次,是爲了完成在2008年1月份第一次發佈CPU補丁時的後續工做,若是在安 裝之前的PSU或者CPU時執行過這個步驟那麼就能夠無需再次執行,另外,即便不執行該步驟,數據庫也是正常運行的,只不過意味着2008年1月份的 CPU補丁沒有正常結束安裝。
cd $ORACLE_HOME/cpu/view_recompile
sqlplus / as sysdba
SQL> @recompile_precheck_jan2008cpu.sql
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP UPGRADE
SQL> @view_recompile_jan2008cpu.sql
SQL> SHUTDOWN;
SQL> STARTUP;
SQL> QUIT
注意:該步驟因爲須要從新編譯大量視圖,所以要啓動數據庫到upgrade狀態才能夠完成。也就是將引發停機時間。
4. 如何確認當前數據庫已經安裝了什麼PSU/CPU?
不管是從V$VERSION或者DBA_REGISTRY或者PRODUCT_COMPONENT_VERSION視圖中,都沒法查找到PSU的信息,這些視圖中始終顯示的是最原始的版本,好比10.2.0.4.0。
最經常使用的方法是使用opatch命令。在打完最新的PSU 10.2.0.4.8的10.2.0.4數據庫中會有如下顯示。
$ opatch lsinventory -bugs_fixed | grep -i 'DATABASE PSU'
9654991 11724977 Wed May 25 16:37:17 CST 2011 DATABASE PSU 10.2.0.4.5 (REQUIRES PRE-REQUISITE
9952234 11724977 Wed May 25 16:37:17 CST 2011 DATABASE PSU 10.2.0.4.6 (REQUIRES PRE-REQUISITE
10248636 11724977 Wed May 25 16:37:17 CST 2011 DATABASE PSU 10.2.0.4.7 (REQUIRES PRE-REQUISITE
11724977 11724977 Wed May 25 16:37:17 CST 2011 DATABASE PSU 10.2.0.4.8 (REQUIRES PRE-REQUISITE
8576156 9352164 Wed May 25 15:10:48 CST 2011 DATABASE PSU 10.2.0.4.1 (INCLUDES CPUJUL2009)
8833280 9352164 Wed May 25 15:10:48 CST 2011 DATABASE PSU 10.2.0.4.2 (INCLUDES CPUOCT2009)
9119284 9352164 Wed May 25 15:10:48 CST 2011 DATABASE PSU 10.2.0.4.3 (INCLUDES CPUJAN2010)
9352164 9352164 Wed May 25 15:10:48 CST 2011 DATABASE PSU 10.2.0.4.4 (INCLUDES CPUAPR2010)
另外的方法是查看registry$history表。
SQL> select action,comments from registry$history;
ACTION COMMENTS
------------------------------- --------------------
APPLY PSU 10.2.0.4.4
APPLY PSU 10.2.0.4.8
CPU view recompilation
注意:該表的內容是在上述安裝PSU步驟的第三步中運行catbundle.sql纔會插入的,所以若是該步驟忘記執行,則此表中無記錄。所以咱們在做數據庫健康檢查的時候不但要用opatch檢查當前數據庫最新的PSU補丁,也要檢查registry$history表,以確認其它DBA是否正確地完成了PSU的安裝。
若是多個PSU的安裝都忘記了執行上述第三步,能夠經過如下方法依次補做。
$ ls -l $ORACLE_HOME/psu
total 0
drwxrwxrwx 2 oracle dba 96 Oct 16 2010 10.2.0.4.4
drwxrwxrwx 2 oracle dba 96 Oct 16 2010 10.2.0.4.5
$sqlplus / as sysdba
SQL> @?/psu/10.2.0.4.4/catpsu.sql
SQL> @?/psu/10.2.0.4.5/catopsu.sql
更多關於CPU的信息,能夠參看:Maclean的瞭解Oracle Critical Patch Update。
5. 參考文檔。
Oracle Recommended Patches — Oracle Database [ID 756671.1]
Patch Set Updates for Oracle Products [ID 854428.1]
Introduction To Oracle Database catbundle.sql [ID 605795.1]
How to confirm that a Critical Patch Update (CPU) has been installed in Linux / UNIX [ID 821263.1]