Oracle 11g から 19c へ Data Pump によるメジャーバージョン移行実践

概要

検証環境の Oracle 11g (11.2.0.4) を新規構築した 19c インスタンスへ 1.2 TB のデータを含めて完全移行する。RMAN ではバージョン差が大きすぎるため、Data Pump のトランスポート可能表領域機能を利用し、短時間のダウンタイムで完了させる。

1. ソース側での準備

1.1 業務表領域を読み取り専用に変更

-- 対象表領域一覧
SELECT tablespace_name, status FROM dba_tablespaces;

-- 読み取り専用化
ALTER TABLESPACE app_data   READ ONLY;
ALTER TABLESPACE app_idx    READ ONLY;
ALTER TABLESPACE hist_data  READ ONLY;
ALTER TABLESPACE hist_idx   READ ONLY;
ALTER TABLESPACE users      READ ONLY;

1.2 ディレクトリ作成とフルエクスポート

CREATE OR REPLACE DIRECTORY dpdir AS '/u01/dp_export';

expdp \'/ as sysdba\' \
  directory=dpdir \
  full=y \
  dumpfile=full_%U.dmp \
  logfile=full_exp.log \
  transportable=always \
  version=12

エラー ORA-29335 が出た場合は、該当表領域を READ ONLY にし直して再実行。

1.3 必要データファイル一覧の確認

エクスポート完了時に出力されるリストをメモしておく。例:

Datafiles required for transportable tablespace APP_DATA:
  /u01/oradata/ORCL/app_data01.dbf
  /u01/oradata/ORCL/app_data02.dbf
Datafiles required for transportable tablespace APP_IDX:
  /u01/oradata/ORCL/app_idx01.dbf
...

2. ファイル転送

2.1 ダンプファイルのコピー

scp /u01/dp_export/full_*.dmp oracle@19chost:/u01/dp_import/

2.2 データファイルのコピー

rsync -av /u01/oradata/ORCL/*.dbf oracle@19chost:/u01/oradata/ORCL19c/

SYSTEM / SYSAUX / TEMP / UNDO は不要。

2.3 エンディアン確認

SELECT tp.platform_name, tp.endian_format
  FROM v$transportable_platform tp, v$database d
 WHERE tp.platform_name = d.platform_name;

Linux x86-64 同士であれば変換不要。

2.4 ソース側を読み書き可能に戻す

ALTER TABLESPACE app_data   READ WRITE;
ALTER TABLESPACE app_idx    READ WRITE;
ALTER TABLESPACE hist_data  READ WRITE;
ALTER TABLESPACE hist_idx   READ WRITE;
ALTER TABLESPACE users      READ WRITE;

3. ターゲット側でのインポート

3.1 ディレクトリ作成

CREATE OR REPLACE DIRECTORY dpdir AS '/u01/dp_import';

3.2 パラメータファイル作成 (par.imp)

full=y
directory=dpdir
dumpfile=full_01.dmp
logfile=full_imp.log
transport_datafiles=
 '/u01/oradata/ORCL19c/app_data01.dbf',
 '/u01/oradata/ORCL19c/app_data02.dbf',
 '/u01/oradata/ORCL19c/app_idx01.dbf',
 ...
 '/u01/oradata/ORCL19c/users01.dbf'

3.3 インポート実行

impdp \'/ as sysdba\' parfile=par.imp

3.4 USERS 表領域重複時の対処

-- 既存 USERS を退避
ALTER TABLESPACE users RENAME TO users_old;

-- インポート再実行
impdp ... exclude=tablespace:\"IN ('USERS_OLD')\"

4. 移行後の作業

  • DB リンクおよび統計情報はエクスポート時に除外してもよい。
    exclude=db_link,statistics
  • インポート後、DB リンクを再作成し、無効になったプロシージャ/ビューを再コンパイル。
  • アプリケーション接続文字列を 19c ホストへ切り替えて稼働開始。

タグ: Oracle Data Pump 跨版本迁移 Transportable Tablespace Oracle 19c Oracle 11g

6月19日 20:29 投稿