動手為王 | Oracle 資料庫跨版本升級遷移實踐
作者簡介
李真旭
Oracle ACE 專家,擁有超過10年的 Oracle 運維管理使用經驗,參與過眾多移動、電信、聯通、銀行等大型資料庫交付專案,具有豐富的運維管理經驗,對 Oracle 資料庫管理執行機制、鎖機制、優化機制等具有深入理解;擅長 Oracle 資料庫的Performance Tunning、Troubleshooting 以及異常恢復。
個人技術部落格:http://www.killdb.com
實施背景
今年春節加班期間,將某客戶的核心資料庫從 Oracle 10.2.0.4 RAC 遷移升級至 12.2 RAC。原庫是使用的 Raw,而且版本較低,無法直接升級到 12.2 版本,因此整個升級過程相對麻煩。
實施思路
我們在新環境部署了10g、11.2、12.2 的 Database 軟體(其中 10g,11.2 均為單機,12.2 為已經安裝好的 Oracle RAC 環境);
然後配置好主庫到新環境的 DataGuard 資料同步,在正式割接之前確認主備同步正常。由於需要將資料庫從 10gR2 遷移到新環境並且升級到 12.2,且需要使用 CDB 模式,因此整個過程相對繁瑣。
如下是大致步驟:
1. 停止 Job(將 job_queue_processes 引數提前置為0,並 kill 相關程序);
2. 檢查分散式事務,並進行相關處理(實際上我們檢查確實發現了部分分散式事務需要手工介入);
select ' exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('||chr(39)||LOCAL_TRAN_ID||chr(39)||');'||chr(10)||'commit;' from dba_2pc_pending;
3. 在確認主備資料同步之後,進行 switchover,如下是主備切換簡約步驟:
--主庫
alter database commit to switchover to physical standby WITH SESSION SHUTDOWN;
startup mount;
alter database open read only;
--備庫
alter database commit to switchover to primary;
startup force
4. 新主庫升級到 11.2 之前需要先建立還原點,防止有問題可以回退;
alter database flashback on; alter database open; alter system switch logfile; create restore point restore_point_10g guarantee flashback database;
5. 執行升級指令碼,將資料庫升級到 11.2;
6. 確認升級成功之後,drop 還原點並建立新的還原點,準備將資料庫升級到 12.2;
drop restore point restore_point_10g;
create restore point restore_point_11g guarantee flashback database;
這裡需要注意的是,在升級到 12.2 之前需要將例項引數 compatible 設定為11.2.0.4,否則在升級過程中可能會遭遇 ORA-00600 錯誤。
7. 執行升級指令碼將資料庫升級到 12.2;
@/home/oracle/shell/log/preupgrade_fixups.sql
$ORACLE_HOME/perl/bin/perl -I $ORACLE_HOME/perl/lib $ORACLE_HOME/rdbms/admin/catctl.pl -n 8 $ORACLE_HOME/rdbms/admin/catupgrd.sql
@/home/oracle/shell/log/postupgrade_fixups.sql
8. 確認升級後資料庫元件正常且無相關報錯之後,drop 還原點;
select comp_name,VERSION,STATUS from dba_registry;
drop restore point restore_point_11g;
9. 資料庫升級到 12.2 之後,需要將 DB 從 NO-CDB 模式轉換成 CDB 模式,將資料庫作為 PDB 插入到 12.2 RAC 叢集中;
如下是轉 CDB 模式是相關簡單步驟:
1)啟動例項到只讀模式
startup mount exclusive
;
alter database open read only;
2)建立 xml 元資料檔案
EXEC DBMS_PDB.DESCRIBE( pdb_descr_file => '/tmp/XXXDB.xml');
3)檢查相容性
DECLARE
compatible CONSTANT VARCHAR2(3) :=
CASE
DBMS_PDB.CHECK_PLUG_COMPATIBILITY(pdb_descr_file => '/tmp/XXDB.xml',pdb_name => 'xxdb')
WHEN TRUE THEN 'YES'
ELSE 'NO'
END;
BEGIN
DBMS_OUTPUT.PUT_LINE(compatible);
END;
/
4)進行 nocopy 操作
CREATE PLUGGABLE DATABASE pdbcdrs USING '/tmp/XXDB.xml' NOCOPY;
5) 啟動 PDB 進行並進行轉換
alter session set container= pdbcdrs;
alter pluggable database pdbcdrs open;
shutdown immediate
;
@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql
10. 建立 Redo、Undo 以及修改相應引數,將資料庫轉成 RAC 例項。
問題討論
在整個升級過程中,我們遇到了幾個小問題,分別如下:
1. DataGuard 的檔案 convert 引數沒有加入 tempfile,導致 DG 切換之後,主庫 open 有問題,需要先 drop tempfile 之後才行;
2. 在升級到 12.2 的過程中,遇到 ORA-01722 錯誤,如下所示:
根據 Oracle Mos 文件 Upgrade to 12.2 Fails with Error:”ORA-01722: Invalid number : NONUPGRADED_TABLEDATA” (文件 ID 2279497.1) 的描述,可以通過如下的方式來解決:
set serveroutput on
@?/rdbms/admin/catuptabdata.sql
@?/rdbms/admin/utluptabdata.sql
execute dbms_preup.run_fixup_and_report('INVALID_SYS_TABLEDATA');
execute dbms_preup.run_fixup_and_report('INVALID_USR_TABLEDATA');
set serveroutput off
3. 將資料庫作為 PDB 插入到 CDB 之後,開啟 PDB 時提示為受限模式。
該問題經查是由於我們在執行的過程中漏掉了一個步驟(exec dbms_pdb.sync_pdb();),導致 PDB 的資訊與 CDB 的資訊不一致,本質上元件資訊不一致。
實際上從 Oracle 官方的解釋來看,只要 PDB 的元件屬於 CDB 的子集就行,我們當時查詢結果卻是顯示正常的,但是 PDB 的元件狀態顯示異常,因此讓 Oracle 認為 PDB 的元件與 CDB 有巨大差異,將 PDB 置於受限模式“OPTION WARNING Database option mismatch: PDB installed version NULL” in PDB_PLUG_IN_VIOLATIONS(文件 ID 2020172.1)。
該文件中有詳細的描述,認為這是 12.2 的一個加強。
Some warnings in PDB_PLUG_IN_VIOLATIONS prevent you from actually opening the PDB in READ WRITE mode; this is not one of them. You can ignore these messages. It is okay for a PDB to have a subset (fewer) options installed than the CDB into which it is plugged. (The reverse is NOT true, however -- the CDB must always have the same or more options as its PDBs). Unpublished Bug 16192980 : NO SIMPLE WAY TO CLEAN ROWS FROM PDB_PLUG_IN_VIOLATIONS AFTER DBMS_PDB CALL has been filed to request a way to clear out no-impact warnings from PDB_PLUG_IN_VIOLATIONS. This enhancement is implemented in versions > 12.2.0.1.
我們嘗試過將元件 Reinstall 然後再 Install 是可以的,但是元件較多,大約8個元件,尤其是 Java 或 xdb 相關元件比較麻煩,因此我們將 PDB 刪除然後重新建立了 PDB 進行載入,最終解決了該問題。
總的來接,整個過程遇到了幾個小問題,但是還算順利!
參考文件:
- PDB Opens up in Restricted mode after migrating from Non-CDB To CDB environment (Doc ID 2202516.1)
- PDB does not come out of Restricted Mode due to ORA-959 in PDB_PLUG_IN_VIOLATIONS (Doc ID 2167662.1)
- PDB Is Always In Restricted Mode (Doc ID 1933110.1)
- PDB in Restrict Mode Causes Issues (Doc ID 1949188.1)
- Pluggable Databases Opened in Restricted Mode After PSU Patching (Doc ID 2225006.1)
相關閱讀:
2. 雲和恩墨 zData 多租戶整合,青海移動資料庫雲化起航
4. 時過境遷:Oracle 跨平臺遷移之 XTTS 方案與實踐
資源下載
關注公眾號:資料和雲(OraNews)回覆關鍵字獲取
‘2017DTC’,2017 DTC 大會 PPT
‘DBALIFE’,“DBA 的一天”海報
‘DBA04’,DBA 手記4 經典篇章電子書
‘RACV1’, RAC 系列課程視訊及 PPT
‘122ARCH’,Oracle 12.2 體系結構圖
‘2017OOW’,Oracle OpenWorld 資料
‘PRELECTION’,大講堂講師課程資料