一 補丁升級實施方案
1.1 總體步驟
1.主庫禁用日志傳送到備庫,備庫停止MRP進程
2.關閉備庫應用補丁,但不執行腳本(catpatch.sql等),啟動到mount,不啟用日志恢復
3.關閉主庫應用補丁,執行腳本(run catpatch/catbundle/catcpu等)
4.啟動主庫,重新開啟日志傳送到備庫
5.備庫開啟實時應用
1.2 上傳補丁至主備上並解壓
上傳補丁包p28204707_112040_Linux-x86-64.zip至服務器/oracle/software上 unzip p28204707_112040_Linux-x86-64.zip
1.3 停止主庫日志傳輸
#停止DG同步,主庫停止傳輸日志 SQL> show parameter log_archive_dest_state_2 SQL> alter system set log_archive_dest_state_2=defer scope=both;
1.4 備份主備庫數據庫軟件
#備份主庫oracle及oraInventory目錄 $ echo $ORACLE_HOME /oracle/app/oracle/product/11.2.0/db_1 tar -cvf /oracle/db_1`date+%y%m%d`.tar /oracle/app/oracle/product/11.2.0/db_1 cat /oracle/oraInventory/oraInst.loc inventory_loc=/oracle/oraInventory inst_group=oinstall tar -cvf /oracle/oraInventory`date+%y%m%d`.tar /oracle/oraInventory #備庫亦是如此
1.5 更新Opatch
#查看主備數據庫當前Opatch版本 $ $ORACLE_HOME/OPatch/opatch version OPatch Version: 11.2.0.3.4 OPatch succeeded. #官方建議Opacth至少11.2.0.3.6及以上版本,目前數據庫的Opatch為11.2.0.3.4,進行更新,上傳p6880880_112000_Linux-x86-64.zip至/oracle/software,解壓並更新Opatch upzip p6880880_112000_Linux-x86-64.zip mv /oracle/app/oracle/product/11.2.0/db_1/OPatch /oracle/app/oracle/product/11.2.0/db_1/Opatch.bak2018 mv /oracle/software/OPacth /oracle/app/oracle/product/11.2.0/db_1 $ $ORACLE_HOME/OPatch/opatch version OPatch Version: 11.2.0.3.20 OPatch succeeded.
1.6 關閉備庫應用補丁不執行相關腳本
1.6.1 校驗補丁沖突
unzip p28204707_112040_Linux-x86-64.zip cd 28204707 opatch prereq CheckConflictAgainstOHWithDetail -ph ./
1.6.2 關閉備庫數據庫服務
#停止備庫MRP進程 SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; #停止監聽 $lsnrctl status $lsnrctl stop #檢查監聽狀態 $lsnrctl status $ps -ef|grep tns #停止數據庫 SQL> shutdown immediate; #檢查數據庫告警日志 $tail -1000f /oracle/app/oracle/diag/rdbms/cdcadg/cdcadg/trace/alert_cdcdg.log
1.6.3 檢查oracle active進程,避免數據庫psu應用失敗
su – oracle $ $ORACLE_HOME/OPatch/opatch prereq CheckActiveFilesAndExecutables -phBaseDir /oracle/software/28204707 注意:如果存在active.so的進程,則通過下面的方法將其kill掉,如: fuser $ORACLE_HOME/歷史n/oracle ps -ef|grep pid(上一步獲得的進程號,確認是什么進程) kill -9 pid 然后再次執行active.so的檢查,直至沒有活動的進程。
1.6.4 補丁應用
cd 28204707 $ $ORACLE_HOME/OPatch/opatch apply
1.6.5 啟動數據庫服務
#啟動數據庫到mount狀態 SQL> startup mount #啟動監聽 $ lsnrctl start $ lsnrctl status #檢查數據庫告警日志 $ tail -1000f /oracle/app/oracle/diag/rdbms/cdc/cdc/trace/alert_cdc.log
1.7 關閉主庫應用補丁並執行相關腳本
1.7.1 校驗補丁沖突
unzip p28204707_112040_Linux-x86-64.zip cd 28204707 $ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -ph ./
1.7.2 檢查數據庫補丁信息,組件狀態及無效對象信息
#組件信息 col comp_id for a10 col comp_name for a40 col version for a20 col status for a7 select comp_id, comp_name, version, status from dba_registry; #無效對象 col owner for a15 col object_name for a35 col object_type for a20 col status for a10 select owner,object_name,object_type,status from dba_objects where status='INVALID' order by owner; #補丁信息 col action format a10 col version format a25 col comments format a25 col action_time format a20 alter session set nls_timestamp_format = "yyy-mm-dd hh24:mi:ss"; select ACTION_TIME,ACTION,VERSION,COMMENTS from dba_registry_history;
1.7.3 檢查oracle active進程,避免數據庫psu應用失敗
su – oracle $ $ORACLE_HOME/OPatch/opatch prereq CheckActiveFilesAndExecutables -phBaseDir /oracle/software/28204707 注意:如果存在active.so的進程,則通過下面的方法將其kill掉,如: fuser $ORACLE_HOME/歷史n/oracle ps -ef|grep pid(上一步獲得的進程號,確認是什么進程) kill -9 pid 然后再次執行active.so的檢查,直至沒有活動的進程。
1.7.4 關閉主庫數據庫服務
#停止監聽 $lsnrctl status $lsnrctl stop #檢查監聽狀態 $lsnrctl status $ps -ef|grep tns #檢查剩余會話連接 $ ps -ef |grep LOCAL=NO | wc -l #殺掉正在連接的會話 $ps -ef |grep LOCAL=NO |awk '{print $2}' |xargs kill -9 #停止數據庫 SQL> shutdown immediate; #檢查數據庫告警日志 $tail -1000f /oracle/app/oracle/diag/rdbms/cdc/cdc/trace/alert_cdc.log
1.7.5 數據庫軟件補丁應用
cd 28204707 $ORACLE_HOM/OPatch/opatch apply
1.7.6 進入數據庫應用PSU升級腳本
#刷新數據字典 sqlplus /nolog sql> connect / as sysdba sql> startup sql> @?/rdbms/admin/catbundle.sql psu apply #無效對象修復 SQL> @?/rdbms/admin/utlrp.sql sql> quit
1.8 啟動數據庫服務並開啟日志傳輸
$lsnrctl start $lsnrctl status SQL> alter system set log_archive_dest_state_2=enable scope=both; SQL>show parameter log_archive_dest_state_2
1.9 開啟備庫日志恢復
SQL> alter database recover managed standby database disconnect;
二 *實施完成后的驗證
2.1 檢查主備庫補丁信息,組件狀態及無效對象信息
#檢查數據庫軟件補丁應用情況 $ORACLE_HOME/OPatch/opatch lsinventory #組件信息 col comp_id for a10 col comp_name for a40 col version for a20 col status for a7 select comp_id, comp_name, version, status from dba_registry; #無效對象 col owner for a15 col object_name for a35 col object_type for a20 col status for a10 select owner,object_name,object_type,status from dba_objects where status='INVALID' order by owner; #補丁信息 col action format a10 col version format a25 col comments format a25 col action_time format a20 alter session set nls_timestamp_format = "yyy-mm-dd hh24:mi:ss"; select ACTION_TIME,ACTION,VERSION,COMMENTS from dba_registry_history;
2.2 確認DataGuard正常
#主庫檢查 set line 9999 col DEST_NAME format a20 col DESTINATION format a15 col GAP_STATUS format a10 col DB_UNIQUE_NAME format a15 col error format a10 col APPLIED_SCN for 999999999999999 SELECT al.thread#, ads.dest_id, ads.DEST_NAME, (SELECT ads.TYPE || ' ' || ad.TARGET FROM v$archive_dest AD WHERE AD.DEST_ID = ADS.DEST_ID) TARGET, ADS.DATABASE_MODE, ads.STATUS, ads.error, ads.RECOVERY_MODE, ads.DB_UNIQUE_NAME, ads.DESTINATION, ads.GAP_STATUS, (SELECT MAX(sequence#) FROM v$log na WHERE na.thread# = al.thread#) Current_Seq#, MAX(sequence#) Last_Archived, max(CASE WHEN al.APPLIED = 'YES' AND ads.TYPE <> 'LOCAL' THEN al.sequence# end) APPLIED_SEQ#, (SELECT ad.applied_scn FROM v$archive_dest AD WHERE AD.DEST_ID = ADS.DEST_ID) applied_scn FROM (SELECT * FROM v$archived_log V WHERE V.resetlogs_change# = (SELECT d.RESETLOGS_CHANGE# FROM v$database d)) al, v$archive_dest_status ads WHERE al.dest_id(+) = ads.dest_id AND ads.STATUS != 'INACTIVE' GROUP BY al.thread#, ads.dest_id, ads.DEST_NAME, ads.STATUS, ads.error, ads.TYPE, ADS.DATABASE_MODE, ads.RECOVERY_MODE, ads.DB_UNIQUE_NAME, ads.DESTINATION, ads.GAP_STATUS ORDER BY al.thread#, ads.dest_id;
三 *回退措施
遇到風險:數據庫補丁應用失敗 回退措施:補丁回滾 #確認腳本的存在 $ORACLE_HOME/rdbms/admin/catbundle_PSU_<database SID>_ROLLBACK.sql #關閉數據庫和監聽 $lsnrctl stop SQL> shut immediate #回滾補丁 opatch rollback -id 28204707 #啟動數據庫並應用腳本 cd $ORACLE_HOME/rdbms/admin sqlplus /nolog SQL> CONNECT / AS SYSDBA SQL> STARTUP SQL> @?/rdbms/admin/catbundle_PSU_<database SID>_ROLLBACK.sql SQL> QUIT
四 參考文獻
How do you apply a Patchset,PSU or CPU in a Data Guard Physical Standby configuration (文檔 ID 278641.1)
Patch 28204707 - DATABASE PATCH SET UPDATE 11.2.0.4.181016 ReadMe.html