1. 程式人生 > 其它 >動手為王 | Oracle 資料庫跨版本升級遷移實踐

動手為王 | 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)

相關閱讀:

1. 動手為王 - 整合遷移與資料恢復實踐

2. 雲和恩墨 zData 多租戶整合,青海移動資料庫雲化起航

3. 從商用到開源:DB2 遷移至 MySQL 的最佳實踐

4. 時過境遷:Oracle 跨平臺遷移之 XTTS 方案與實踐

資源下載

關注公眾號:資料和雲(OraNews)回覆關鍵字獲取

‘2017DTC’,2017 DTC 大會 PPT

‘DBALIFE’,“DBA 的一天”海報

‘DBA04’,DBA 手記4 經典篇章電子書

‘RACV1’, RAC 系列課程視訊及 PPT

‘122ARCH’,Oracle 12.2 體系結構圖

‘2017OOW’,Oracle OpenWorld 資料

‘PRELECTION’,大講堂講師課程資料