數據庫管理333期 2025-06-04
- 數據庫管理-第333期 Oracle 23ai:RAC打補丁完全不用停機(20250604)
- 1 概念
- 2 要求
- 3 操作流程
- 4 轉移失敗處理
- 總結
數據庫管理-第333期 Oracle 23ai:RAC打補丁完全不用停機(20250604)
作者:胖頭魚的魚缸(尹海文)
Oracle ACE Pro: Database
PostgreSQL ACE Partner10年數據庫行業經驗
擁有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等認證
墨天輪MVP,ITPUB認證專家
圈內擁有“總監”稱號,非著名社恐(社交恐怖分子)公眾號:胖頭魚的魚缸
CSDN:胖頭魚的魚缸(尹海文)
墨天輪:胖頭魚的魚缸
ITPUB:yhw1809。
除授權轉載并標明出處外,均為“非法”抄襲
在Oracle Database 23ai之前的版本中,在RAC集群環境下打補丁,是需要使用滾動升級的方式來執行補丁升級操作的,如果不配置TAF/TAC的話,勢必會出現在停機節點上的應用連接會中斷的現象,如果應用配置不合理很可能造成業務異常現象。
在23ai中Oracle引入了一個新技術叫本地滾動數據庫維護(Local Rolling Database Maintenance),可以實現RAC打補丁的完全不停機。
1 概念
從23ai開始,可以在本地為Oracle RAC和Oracle RAC One Node部署應用滾動補丁并執行其他維護操作。
本地滾動是從同一節點上的第二個Oracle家目錄創建并啟動第二個數據庫實例,而不是停止數據庫實例并將工作負載重新定位到另一個節點上的另一個實例。本地滾動數據庫維護減少了遷移連接的時間。此功能通過將工作負載保持在本地節點上來減少停機時間。必須確保有足夠的CPU、內存和其他計算資源來臨時運行兩個實例。
本地滾動可確保在兩個Oracle家目錄之間滾動遷移數據庫期間,群集中至少運行相同數量的Oracle RAC和Oracle RAC One Node實例。使用此功能,您可以在單個集群節點內進行錯位滾動補丁加載。
當您使用本地滾動式就地修補時,Oracle RAC會在新的Oracle家目錄中創建第二個實例,啟動第二個示例,然后在您要修補的節點上停止舊Oracle家目錄的第一個實例。此功能還保留了PDB的位置和服務,因此節點繼續執行與補丁加載之前相同的工作。
2 要求
使用本地滾動數據庫維護需要滿足以下條件:
- 使用OMF(Oracle Managed Files)
- 使用spfile(Server Parameters File)
- 在本地滾動操作完成后重新配置初始化參數THREAD和UNDO_TABLESPACE
- 在本地滾動升級過程中不要執行srvctl add instance、srvctl remove instance或srvctl modify instance命令
- 必須確保有足夠的可用存儲空間為每個實例創建新的redo線程(redo thread)和新的undo表空間。當您一次使用此功能時,此功能會為每個新實例創建一個新的redo線程和一個新的undo表空間。第二次和后續使用此功能時,將使用以前使用的舊的redo線程和undo表空間,而不會創建新的redo和undo。
3 操作流程
本地滾動升級的流程:
- 創建新Oracle家目錄并解壓軟件
mkdir -p /u01/app/oracle/product/23.4.0/dbhome_1
chgrp oinstall /u01/app/oracle/product/23.4.0/dbhome_1
cd /u01/app/oracle/product/23.4.0/dbhome_1
unzip -q /tmp/db_home.zip
- 執行新Oracle家目錄的升級操作
cd /u01/app/oracle/product/23.4.0/dbhome_1
./runInstaller -applyRU patch_directory_location
- 為數據庫開啟本地滾動升級
srvctl modify database –db [db_name] -oraclehome new_Oracle_home -localrolling
- 將RAC和RAC One Node的PDB和服務從舊家目錄轉換到新的家目錄
$ srvctl transfer instance –d mydb [-node node_list]
{[-stopoption stop_option] | -rollback} [-drain_timeout timeout] [-verbose]
新實例從新的Oracle家目錄啟動,并等待-drain_timeout參數中指定的時間,以便會話遷移到新實例。當所有會話遷移到新實例時,舊實例停止。
如果不指定-drain_timeout,則使用指定節點上數據庫所有運行服務的最大配置超時時間。
- 驗證
srvctl config database -db [db_name]
- 根據需求添加或修改service和連接字符串
4 轉移失敗處理
在本地滾動數據庫維護期間,某些實例可能無法轉移到目標Oracle家目錄。使用下面任何一個方式,在本地滾動模式下從失敗的轉移中恢復。
- 將所有實例從新的家目錄恢復至舊的家目錄
a. 恢復數據庫家目錄配置
srvctl modify database -db [db_name] -localrolling_revertb. 恢復所有實例至舊的家目錄
srvctl transfer instance -db [db_name]
此過程將數據庫還原到本地滾動之前的原始狀態。所有實例都從舊的Oracle家目錄開始運行。您可以刪除之前的目標Oracle家目錄,創建新的Oracle家目錄,然后再次啟動本地滾動過程。
- 將部分實例從新的家目錄恢復至舊的家目錄
a. 恢復數據庫家目錄配置
srvctl modify database -db [db_name] -localrolling_revertb. 恢復指定實例至舊的家目錄
srvctl transfer instance -db [db_name] -node node_list
# 在轉移的節點上修復本地滾動目標Oracle家目錄。如果仍有任何實例在本地滾動目標Oracle家目錄上運行,則數據庫將進入本地滾動REVERT狀態。c. 使用相同的目標Oracle家目錄將數據庫修改為TRANSFER狀態以轉移實例
srvctl modify database -db [db_name] -localrolling -oraclehome target_Oracle_home
- 將部分實例從新的家目錄恢復至舊的家目錄
a. 恢復指定實例至舊的家目錄
srvctl transfer instance -db [db_name] -node node_list -rollbackb. 修復目標家目錄c. 將實例轉移回目標家目錄
srvctl transfer instance -db [db_name]
總結
本期簡單介紹了Oracle Database 23ai引入的可以實現完全不停機打補丁的本地滾動維護,但由于還沒有本地部署版本放出,待對應版本放出后再演示。
老規矩,知道寫了些啥。