【Oracle Database 12c / 19c】データ移行まとめ【Oracle Data Pump】
はじめに
プライベートで使用している 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 のインストールとデータベース作成については、別記事をご参照ください。
データ移行
移行概要
移行元データベース (CDB) の PDB のスキーマを、移行先データベース (CDB) の PDB に Oracle 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のエクスポートをスキーマ・モードで実行します。
SQL*Plus を終了し、PowerShell で expdp
コマンドを実行してエクスポートを行います。
# エクスポート 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) を作成し、作成したユーザへ READ
と WRITE
権限を付与します。
-- 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 のインポートをスキーマ・モードで実行します。
PowerShell で impdp
コマンドを実行してインポートを行います。
# インポート 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 でデータ移行してから気付いたんだよ!バーカバーカ!