AI can fly !!

AI がやりたい Web エンジニアのアウトプット (AI の知識は無い)

【Oracle Database 12c / 19c】データ移行まとめ【Oracle Data Pump】

ORACLE Database 19c

はじめに

プライベートで使用している Oracle Database のデータ移行を行ったので、ざっくりと手順をまとめました。

Oracle Database 9i までは export / import ユーティリティを使用してデータの入出力を行っていましたが、 10g で Oracle Data Pump が導入され、11g 以降では export / import ユーティリティは非推奨になりました。

ということで、今回は Oracle Data Pump を使用してデータ移行を行います。

TL;DR

  • Oracle Data Pump で入出力する ディレクトリ・オブジェクトを作る
  • ユーザに必要な権限を付与する
  • Oracle Data Pump (expdp / impdp) を使用してダンプファイルを入出力する

動作環境

移行元

OS Version
Windows 10 Pro 1909
Application Version
PowerShell 5.1.18362.752
Database Version
Oracle Database 12c 12.1.0

移行先

OS Version
Windows 10 Pro 1909
Application Version
PowerShell 5.1.18362.752
Database Version
Oracle Database 19c 19.3.0

移行先マシンには、既に Oracle Database 19c がインストールされ、新しいデータベース (CDB と PDB) が作成された状態を前提としています。

Oracle Database 19c のインストールとデータベース作成については、別記事をご参照ください。

ai-can-fly.hateblo.jp

ai-can-fly.hateblo.jp

データ移行

移行概要

移行元データベース (CDB) の PDBスキーマを、移行先データベース (CDB) の PDBOracle Data Pump (expdp / impdp) を使用して移行する。

1. 移行元データベースでの操作

1). ディレクトリ・オブジェクト (DIRECTORY) 作成

SQL*Plus で 移行元データベースの PDB に SYS ユーザで接続し、ディレクトリ・オブジェクト (DIRECTORY) を作成します。

DIRECTORY を作成したら、移行対象のユーザに DIRECTORY への READ / WRITE 権限を付与します。

# SQL*Plus を起動
sqlplus /nolog
-- SYSDBA 権限でログイン
connect sys/[password] as sysdba;

-- PDB へ接続
alter session set container=[pdb_name];

-- DIRECTORY の作成
create or replace directory [directory_name] as [directory_path];

-- ユーザへの権限付与
grant read, write on directory [directory_name] to [user_name];

[directory_path] には、物理ディレクトリをフルパスで指定します。

ディレクトリ・オブジェクト (DIRECTORY) とは

Oracle Database が稼働しているファイルシステム上の物理ディレクトリを表す論理構造で、ディレクトリパスが格納されているオブジェクトです。

DIRECTORY は Oracle Data Pump の入出力先の指定以外に、外部データファイルや外部表データなどの配置場所を指定する際にも使用します。

DIRECTORY の作成には CREATE ANY DIRECTORY システム権限が必要で、DIRECTORY 内のオブジェクトにアクセスするには READ 権限や WRITE 権限が必要です。

2). エクスポート

今回はスキーマ単位で移行を行うため、Oracle Data Pumpのエクスポートをスキーマ・モードで実行します。

docs.oracle.com

SQL*Plus を終了し、PowerShellexpdp コマンドを実行してエクスポートを行います。

# エクスポート
expdp [user_name]/[password]@//[host]:[port]/[pdb_name].[db_domain] directory=[directory_name] dumpfile=[dump_file_name] schemas=[schema_name]

ジョブが正常に完了した旨のログが出力されたら、エクスポートは完了です。

指定したディレクトリ・オブジェクト内に、ダンプファイルが作成されていることを確認してください。

2. 移行先データベースでの操作

1). ユーザ作成

SQL*Plus で移行先データベースへ接続し、データをインポートするユーザを作成します。

# SQL*Plus を起動
sqlplus /nolog
-- SYSDBA 権限でログイン
connect sys/[password] as sysdba;

-- PDB へ接続
alter session set container=[pdb_name];

-- ユーザ作成
create user [user_name] identified by [password];

2). ユーザへの権限付与

DIRECTORY の作成権限、および Oracle Data Pump を使用するための権限をユーザに与えます。

-- ロール
grant "DATAPUMP_EXP_FULL_DATABASE" to [user_name];
grant "DATAPUMP_IMP_FULL_DATABASE" to [user_name];

-- システム権限
grant create any directory to [user_name];
grant create session to [user_name];

-- 表領域割当制限
grant unlimited tablespace to [user_name];

※上記では必要最低限の権限しか与えていないので、実際にデータベースを運用する際には、別途必要な権限を付与してください。

3). ディレクトリ・オブジェクト (DIRECTORY) 作成

ディレクトリ・オブジェクト (DIRECTORY) を作成し、作成したユーザへ READWRITE 権限を付与します。

-- DIRECTORY の作成
create or replace directory [directory_name] as [directory_path];

-- ユーザへの権限付与
grant read, write on directory [directory_name] to [user_name];

[directory_path] には、物理ディレクトリをフルパスで指定します。

4). ダンプファイル格納

移行元データベースのディレクトリ・オブジェクト内にあるダンプファイルを、移行先データベースのディレクトリ・オブジェクトへ移動します。

5). インポート実行

インポートもエクスポートと同じくスキーマ単位で移行を行うため、 Oracle Data Pump のインポートをスキーマ・モードで実行します。

docs.oracle.com

PowerShellimpdp コマンドを実行してインポートを行います。

# インポート
impdp [user_name]/[password]@//[host]:[port]/[pdb_name]/[db_domain] directory=[directory_name] dumpfile=[dump_file_name] schemas=[schema_name]

エクスポートと同様に、ジョブが正常に完了した旨のログが出力されたら、インポートは完了です。

ORA-02291 (整合性制約 (外部キー) 違反) が発生する場合

テーブルに参照整合性 (外部キー) 制約が定義されている場合、インポートされるテーブルの順番の関係でエラーが発生する可能性があります。

その場合は、先にテーブル定義のみをインポートし、対象テーブルの参照整合性 (外部キー) 制約を無効にした上で、次にデータのみインポートを行う必要があります。

# テーブル定義のみインポート
impdp [user_name]/[password]@//[host]:[port]/[pdb_name]/[db_domain] directory=[directory_name] dumpfile=[dump_file_name] schemas=[schema_name] content=metadata_only

# 対象テーブルの参照整合性 (外部キー) 制約を無効にする

# データのみインポート
impdp [user_name]/[password]@//[host]:[port]/[pdb_name]/[db_domain] directory=[directory_name] dumpfile=[dump_file_name] schemas=[schema_name] content=data_only

# 対象テーブルの参照整合性 (外部キー) 制約を有効にする

対象テーブルが多い場合は、全ての参照整合性 (外部キー) 制約を一括で有効化・無効化するプロシージャを作成すると便利です。

おわりに

聡明な Oracle マスターであれば既にお気付きかと思いますが、今回は PDB に存在するスキーマを新 CDB の新 PDB へ移行する方法を紹介しました。

おそらく、こう思われたことでしょう。

「それって、旧 CDB の PDB をアンプラグして、新しい CDB にプラグインすれば済む話じゃ…?」

そうですね、分かってます、僕はその、 Oracle Data Pump を使ってみたくてですね、わざわざこんな回りくどい方法をね、したわけではもちろんないですよ。

Oracle Data Pump でデータ移行してから気付いたんだよ!バーカバーカ!

同じようなデータ移行をするときは、 PDB のアンプラグとプラグインでやりましょうね (๑´ڡ`๑)