什麼是CPU/PSU
Oracle CPU的全稱是Critical Patch Update, Oracle對于其産品每個季度發行一次安全更新檔包,通常是為了修複産品中的安全隐患。
Oracle PSU的全稱是Patch Set Update,
Oracle對于其産品每個季度發行一次的更新檔包,包含了bug的修複。Oracle選取被使用者下載下傳數量多,且被驗證過具有較低風險的更新檔放入到每個季度的PSU中。在每個PSU中不但包含Bug的修複而且還包含了最新的CPU。PSU通常随CPU一起釋出。
CPU是累積的(Cumulative),即最新的CPU更新檔已經包含以往的CPU更新檔,是以隻要安裝最新的CPU更新檔即可。
PSU通常也是增量的,大部分PSU可以直接安裝,但有些PSU則必須要求安裝了上一 個版本的PSU之後才能繼續安裝,要仔細看各個PSU的Readme文檔。
如何下載下傳CPU/PSU
注意:要下載下傳CPU/PSU,必須要有Oracle Support賬号才行!
到Oracle CPU首頁 ,可以看到每個季度釋出的CPU更新檔清單(如下圖所示),根據你的需要選擇相應的CPU更新檔即可,這裡選擇July2011年的更新檔。

每個更新檔隻針對特定的資料庫版本,你要找到對應的資料庫版本(如下圖所示),這裡的資料庫版本為11.2.0.1,如果找不到,說明該更新檔不支援該版本資料庫。
右邊點選Database連結,就是該更新檔的一個詳細說明文檔,找到3.1.3 Oracle Database,并點選相應的資料庫版本(如下圖所示)
在相應的資料庫版本裡,可以看到各個平台下CPU和PSU版本号,前面已經說過,PSU包含CPU,是以建議盡量安裝PSU,注意:這裡的UNIX平台也包括Linux
點選上面的版本号,會自動跳到Oracle Support下載下傳頁面,如下圖所示。選擇相應的平台後,點選Readme可以檢視Readme文檔,點選Download下載下傳
閱讀Readme文檔
每個CPU/PSU都有一個Readme文檔,關于該CPU/PSU的所有資訊都在Readme文檔裡,一定要仔細閱讀。
有兩個部分要特别注意:
1)OPatch的版本,你可以通過opatch version指令檢視Oracle Home目前的OPatch版本,如果低于Readme規定的最低版本,一定要先更新OPatch才能打更新檔。
可以參考這篇文章《OPatch - Where Can I Find the Latest Version of OPatch? [Video] [ID 224346.1]》下載下傳最新的OPatch。
2)打Patch步驟:基本上所有的CPU/PSU都大同小異,具體步驟将在下面的例子中展示。
安裝CPU/PSU更新檔
1)事先檢查:檢視資料庫打更新檔前資訊,保留現場
在打更新檔前最好把資料庫的一些基本資訊保留下來,以備不時之需。
set line 150
set pagesize 99
col action_time for a30
col action for a30
col comments for a90
col object_name for a30
col object_type for a30
col comp_name for a50
col comp_id for a20
--檢視執行個體名
sys@ORCL>select instance_name,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
orcl OPEN
--檢視資料庫版本
sys@ORCL>select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
--檢視資料庫大小
sys@ORCL>select sum(bytes)/1024/1024||'M' from dba_segments;
SUM(BYTES)/1024/1024||'M'
-----------------------------------------
68058.375M
--檢視元件資訊
sys@ORCL>select COMP_ID,COMP_NAME,VERSION,STATUS from DBA_REGISTRY;
COMP_ID COMP_NAME VERSION STATUS
-------------------- -------------------------------------------------- ------------------------------ ----------------------
OWB OWB 11.2.0.1.0 VALID
APEX Oracle Application Express 3.2.1.00.10 VALID
EM Oracle Enterprise Manager 11.2.0.1.0 VALID
AMD OLAP Catalog 11.2.0.1.0 VALID
SDO Spatial 11.2.0.1.0 VALID
ORDIM Oracle Multimedia 11.2.0.1.0 VALID
XDB Oracle XML Database 11.2.0.1.0 VALID
CONTEXT Oracle Text 11.2.0.1.0 VALID
EXF Oracle Expression Filter 11.2.0.1.0 VALID
RUL Oracle Rules Manager 11.2.0.1.0 VALID
OWM Oracle Workspace Manager 11.2.0.1.0 VALID
CATALOG Oracle Database Catalog Views 11.2.0.1.0 VALID
CATPROC Oracle Database Packages and Types 11.2.0.1.0 VALID
JAVAVM JServer JAVA Virtual Machine 11.2.0.1.0 VALID
XML Oracle XDK 11.2.0.1.0 VALID
CATJAVA Oracle Database Java Packages 11.2.0.1.0 VALID
APS OLAP Analytic Workspace 11.2.0.1.0 VALID
XOQ Oracle OLAP API 11.2.0.1.0 VALID
18 rows selected.
--檢視更新檔情況
sys@ORCL>select ACTION_TIME, ACTION, COMMENTS from sys.DBA_REGISTRY_HISTORY;
no rows selected
--檢視無效對象
sys@ORCL>select count(*) from dba_objects where status<>'VALID';
COUNT(*)
----------
123
sys@ORCL> select object_name,object_type,owner,status from dba_objects where status<>'VALID';
sys@ORCL>spool off
2)備份資料庫
這裡對全庫進行備份,以防打更新檔出現意外,可以從備份集中恢複資料。
先關閉監聽器,關閉資料庫執行個體,将其啟到mount狀态,然後用rman進行冷備。
3)備份Oracle軟體
把Oracle軟體打包備份
4)安裝Opatch
--首先,檢視目前的OPatch版本
[oracle@data ~]$ opatch version
Invoking OPatch 11.1.0.6.6
OPatch Version: 11.1.0.6.6
OPatch succeeded.
--如果目前的Opatch版本不夠,下載下傳最新的Opatch,覆寫原來的opatch即可
[oracle@data psu_jul_2011]$ unzip p6880880_112000_Linux-x86-64.zip
--unzip之後,在目前檔案夾下出現OPatch檔案夾
[oracle@data psu_jul_2011]$ mv $ORACLE_HOME/OPatch $ORACLE_HOME/OPatch_20130705
[oracle@data psu_jul_2011]$ cp -r ./OPatch $ORACLE_HOME
[oracle@data psu_jul_2011]$ opatch version
OPatch Version: 11.2.0.3.4
OPatch succeeded.
5)安裝更新檔(Oracle軟體部分)
首先,通過opatch lsinventory 檢視之前打過的更新檔資訊。
然後解壓縮更新檔檔案:
[oracle@data psu_jul_2011]$ unzip p12419378_112010_Linux-x86-64.zip
[oracle@data psu_jul_2011]$ cd 12419378
最後在更新檔的主目錄下執行opatch apply,等待5~10分鐘即可(注意:一定要先完全關閉資料庫和監聽器)
[oracle@data 12419378]$ pwd
/home/oracle/psu_jul_2011/12419378
[oracle@data 12419378]$ opatch apply
如果最後有warnings一般都沒什麼問題,隻要不是error就好。
6)安裝更新檔(資料庫部分)
這步比較簡單,就是跑catbundle腳本,但時間比較長,10分鐘左右(視機器性能而定)
cd $ORACLE_HOME/rdbms/admin
sqlplus /nolog
SQL> CONNECT / AS SYSDBA
SQL> STARTUP
SQL> @catbundle.sql psu apply
SQL> QUIT
7)重新編譯CPU相關視圖 (如果是PSU可略過次步驟)
該步驟在一個資料庫上永遠隻需要執行一次,是為了完成在2008年1月份第一次釋出CPU更新檔時的後續工作,如果在安裝以前的PSU或者CPU時執行過這個步驟那麼就可以無需再次執行,另外,即使不執行該步驟,資料庫也是正常運作的,隻不過意味着2008年1月份的 CPU更新檔沒有正常結束安裝。
SQL> SELECT * FROM registry$history where ID = '6452863';
上面這條語句用于判斷是否已經執行過,如果有行數傳回,說明已經執行過,可跳過該步驟;
如果沒有行數傳回,則可根據以下步驟重新編譯CPU/PSU相關視圖:
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
8)事後檢查
該步驟可以和第1)步的事先檢查對照
先編譯無效對象:
@?/rdbms/admin/utlrp.sql
set line 150
set pagesize 99
col action_time for a30
col action for a30
col comments for a90
col object_name for a30
col object_type for a30
col comp_name for a50
col comp_id for a20
SQL> spool post_check.log
SQL> select instance_name,status from v$instance;
SQL> select COMP_ID,COMP_NAME,VERSION,STATUS from DBA_REGISTRY;
SQL> select ACTION_TIME, ACTION, COMMENTS from DBA_REGISTRY_HISTORY;
SQL> select owner,object_name,object_type,status from dba_objects where status<>'VALID';
SQL> select count(*) from dba_objects where status<>'VALID';
SQL> spool off