動手為王 | Oracle 資料庫跨版本升級遷移實踐

暖夏未眠丶發表於2018-03-01

摘要:
實施背景 今年春節加班期間,將某客戶的核心資料庫從 Oracle 10.2.0.4 RAC 遷移升級至 12.2 RAC。原庫是使用的 Raw,而且版本較低,無法直接升級到 12.2 版本,因此整個升級過程相對麻煩。

實施背景

今年春節加班期間,將某客戶的核心資料庫從 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;
複製程式碼
  1. 在確認主備資料同步之後,進行 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
複製程式碼
  1. 新主庫升級到 11.2 之前需要先建立還原點,防止有問題可以回退;
alter database flashback on;


alter database open;

alter system switch logfile;

create restore point restore_point_10g guarantee flashback database;
複製程式碼
  1. 執行升級指令碼,將資料庫升級到 11.2;
  1. 確認升級成功之後,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 錯誤。

  1. 執行升級指令碼將資料庫升級到 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
複製程式碼
  1. 確認升級後資料庫元件正常且無相關報錯之後,drop 還原點;
select comp_name,VERSION,STATUS from dba_registry;

drop restore point restore_point_11g;
複製程式碼
  1. 資料庫升級到 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
複製程式碼
  1. 建立 Redo、Undo 以及修改相應引數,將資料庫轉成 RAC 例項。

問題討論

在整個升級過程中,我們遇到了幾個小問題,分別如下:

  1. DataGuard 的檔案 convert 引數沒有加入 tempfile,導致 DG 切換之後,主庫 open 有問題,需要先 drop tempfile 之後才行;
  1. 在升級到 12.2 的過程中,遇到 ORA-01722 錯誤,如下所示:

    13


根據 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
複製程式碼
  1. 將資料庫作為 PDB 插入到 CDB 之後,開啟 PDB 時提示為受限模式。

    14


該問題經查是由於我們在執行的過程中漏掉了一個步驟(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
本文作者:李真旭
本文來自雲棲社群合作伙伴“資料和雲”,瞭解相關資訊可以關注“資料和雲”微信公眾號

如果您發現本社群中有涉嫌抄襲的內容,歡迎傳送郵件至:yqgroup@service.aliyun.com 進行舉報,並提供相關證據,一經查實,本社群將立刻刪除涉嫌侵權內容。
動手為王 | Oracle 資料庫跨版本升級遷移實踐

用雲棲社群APP,舒服~

原文連結


相關文章