Oracle作為大型商用關系型資料庫,從其更新檔體系就可以看出其考慮的全面性。首先我們看下Oracle Patch的主要類型[參考1和2]:
Version/維護版本
針對前一個維護版本的所有更新檔進行整理,增加新的功能或對軟體有較大的改動,進行整體測試,得到一個軟體版本”包”,稱為版本Version。比如 11.2。
One-off patches (e.g. a bug fix)
One-off patches也稱之為一次性更新檔,通常針對特定的版本資料庫或運作平台。此類更新檔通常較小,使用的最為頻繁。One-off patch隻需要用Opatch工具apply即可,不需要更新/修正資料字典。如在資料庫使用過程中出現某些異常後如較常見的ORA-00600、ORA-07445錯誤等可以通過一次性更新檔來搞定。
Critical Patch Update (CPU)
簡稱CPU,一般來說CPU包含了Oracle産品安全漏洞的修複更新檔集(set of security bug fix),通常一年釋出四期,一般是每季度提供一次的一組高優先級修複程式(往往針對安全性問題),對于以前的安全性修複程式而言,這些CPU是累積的,隻需要安裝最近最後一個就可以,它就包含了之前的所有CPU更新檔,但也可包含其他修複程式,目的是解決與非安全性更新檔之間的更新檔沖突問題(即降低合并請求的必要性)。該類patch的安裝和安裝one-off patch一樣,同樣使用”opatch apply”指令來完成。安裝完成後應針對既有的資料庫(已經建立在使用的資料庫),應在資料庫級别運作資料字典更新腳本。
Bundled patches (For Windows and Exadata only)
用于解決在Windows平台無法利用替換共享庫檔案後relink的方式來更新Oracle binary,是以Oracle特别針對Windows釋出差別于Unix上Normal/Molecular CPU的CPU Bundle patch。通常情況下,Bundle Patch會别較大,Windows bundle patches通常每一個季度都會釋出。
PSR(Patch Set Release)/Patch Set Update(PSU)
PSR就是大家常見的大更新檔合集,通常1GB左右,也就是oracle版布号的第四位即為PSR号。也就是說oracle版布号的第四位會被修改。每一個PSR是都整合了之前的一些bug,并且經過了嚴格的測試,通常更新PSR風險相對較小。10.2,10.2.0.1.0是基礎發行版,至今已有五個PSR釋出,最新10.2的PSR為10.2.0.5.0。
PSU就是在每個PSR釋出之間的更新檔,由于新舊PSR之間周期較長,而資料庫在運作期間難以保證不會出現新的bug,是以有了PSU。PSU是對于PSR的一個重要補充,每個PSU修改5位版本号的第5位。如,11.1版本更新為11.1.0.7.1;10.2版本為10.2.0.4.2。PSU包含CPU,是以建議盡量安裝PSU,PSU通常也是增量的,大部分PSU可以直接安裝,但有些PSU則必須要求安裝了上一 個版本的PSU之後才能繼續安裝,要仔細看各個PSU的Readme文檔。PSU與CPU一樣,定期釋出,計劃一年釋出四次,釋出日期與CPU釋出日期相同。PSU同樣使用Opatch工具安裝/删除,指令仍是apply和rollback。一個PSU可視作一個個别更新檔,安裝和删除操作同樣簡便。
[參考3]PSU有三個優勢,
(1) 低風險高價值,PSU包括:
Critical technical issues with fixes that may affect a large number of customers and that are already proven in the field Critical Patch Update fixes
PSU不包括:
Changes that require re-certification (for example, Database fixes that cause optimizer plan changes) Fixes that require configuration changes
每個PSU會限制包含bug fix的數量,一般在25到100個之間。會從使用者下載下傳量最多,以及釋出的關鍵安全事件中選擇出這些更新檔。資料庫PSU確定可以支援滾動RAC安裝。
(2) PSU會通過嚴格的測試,保證各種fix可以正常運作,不會互相影響。
(3) Oracle版本号的第五位是作為每個PSU的增量版本号。例如初始PSU版本号是11.1.0.7.1,第二個針對11.1.0.7的PSU版本号就是11.1.0.7.2。
實驗:
1.測試安裝如下PSU,
Bug 24006111 - 11.2.0.4.161018 (Oct 2016) Database Patch Set Update (DB PSU) (文檔 ID 24006111.8)

選擇作業系統版本進行下載下傳,進入目錄中執行opatch apply,
提示patch安裝需要OPatch的版本是11.2.0.3.5,使用OPatch version檢視目前版本是11.2.0.3.4,是以第一步需要更新OPatch。
2.更新OPatch,
如下選擇對應作業系統版本,下載下傳OPatch,p17836989_112000_Linux-x86-64.zip,
更新檔程式17836989: OPatch patch of version 11.2.0.3.5 for Oracle software releases 11.2.0.x (NOV 2013)
解壓縮,并複制至$ORACLE_HOME下,可以提前備份下舊版的OPatch。再執行OPatch version,
更新至11.2.0.3.6。
3.繼續安裝,
執行失敗,從錯誤資訊看,有下面三個可執行程式處于激活狀态,
需要停止這些激活的可執行程式,首先查找sqlplus,
接下來需要關閉資料庫,以確定libclntsh.so.11.1停止,
仍舊不行,說明仍有程序使用,嘗試關閉監聽,可參考這篇文章:《opatch error code 73: Prerequisite check “CheckActiveFilesAndExecutables” failed. (文檔 ID 1942237.1)》
此時再次執行opatch apply,
4.驗證安裝,
可以看出已安裝了相應的patch。
總結:
1.要了解Oracle Patch更新檔體系中,各種類型更新檔的關系、适用範圍,這樣才能在需要打更新檔的時候選擇正确的更新檔并完成安裝步驟了。
2.某些更新檔要求最低的OPatch版本,OPatch的更新僅需要下載下傳對應作業系統版本的OPatch壓縮包,直接解壓縮至$ORACLE_HOME即可,以防萬一可以備份之前的OPatch。
3.OPatch有一系列的指令參數,可以檢視幫助繼續了解,例如有些更新檔可以不用停機,線上打使用online參數。
參考文章:
參考1:
<a href="http://blog.csdn.net/wenzhongyan/article/details/16858683">http://blog.csdn.net/wenzhongyan/article/details/16858683</a>
參考2:
<a href="http://blog.csdn.net/haiross/article/details/18620413">http://blog.csdn.net/haiross/article/details/18620413</a>
參考3:
Patch Set Updates for Oracle Products (文檔 ID 854428.1)
參考4:
opatch error code 73: Prerequisite check “CheckActiveFilesAndExecutables” failed. (文檔 ID 1942237.1)
參考5:
Quick Reference to Patch Numbers for Database PSU, SPU(CPU), Bundle Patches and Patchsets (文檔 ID 1454618.1)