實施背景
今年春節加班期間,將某客戶的核心資料庫從 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 模式,因此整個過程相對繁瑣。
如下是大致步驟:
- 停止 Job(將 job_queue_processes 引數提前置為0,並 kill 相關程式);
- 檢查分散式事務,並進行相關處理(實際上我們檢查確實發現了部分分散式事務需要手工介入);
select ' exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('||chr(39)||LOCAL_TRAN_ID||chr(39)||');'||chr(10)||'commit;'
from dba_2pc_pending;
複製程式碼
- 在確認主備資料同步之後,進行 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
複製程式碼
- 新主庫升級到 11.2 之前需要先建立還原點,防止有問題可以回退;
alter database flashback on;
alter database open;
alter system switch logfile;
create restore point restore_point_10g guarantee flashback database;
複製程式碼
- 執行升級指令碼,將資料庫升級到 11.2;
- 確認升級成功之後,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 錯誤。
- 執行升級指令碼將資料庫升級到 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
複製程式碼
- 確認升級後資料庫元件正常且無相關報錯之後,drop 還原點;
select comp_name,VERSION,STATUS from dba_registry;
drop restore point restore_point_11g;
複製程式碼
- 資料庫升級到 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
複製程式碼
- 建立 Redo、Undo 以及修改相應引數,將資料庫轉成 RAC 例項。
問題討論
在整個升級過程中,我們遇到了幾個小問題,分別如下:
- DataGuard 的檔案 convert 引數沒有加入 tempfile,導致 DG 切換之後,主庫 open 有問題,需要先 drop tempfile 之後才行;
- 在升級到 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
複製程式碼
- 將資料庫作為 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 進行載入,最終解決了該問題。
原文釋出時間為:2018-02-27
本文作者:李真旭
本文來自雲棲社群合作伙伴“資料和雲”,瞭解相關資訊可以關注“資料和雲”微信公眾號
用雲棲社群APP,舒服~