Ccmmutty logo
Commutty IT
0 pv6 min read

初めてでも簡単!OracleDatapumpでデータ移行を始めよう

https://cdn.magicode.io/media/notebox/blob_cYnuKT5

1.はじめに

業務で急遽OracleDatapumpを使うことになったものの、事前知識がなく戸惑っていました。 自分なりに調査を進め、データ移行の基本から実際の使い方までを学んだ内容をまとめました。これからData Pumpを使ってみたいという方の参考になれば幸いです。 Datapumpの詳細なアーキテクチャなどは今回は省略します。

2.実行環境

Ubuntu 20.04 OracleDatabase 19c

3.エクスポート実行手順

  1. ダンプファイルの出力先のフォルダ作成
    • 環境によっては作成せず、既存のフォルダに作成する場合はスキップ
mkdir /tmp/data_pump
chmod 777 /tmp/data_pump
  1. 作成したフォルダをOracleのディレクトリオブジェクトとして設定
-- 作成コマンド
SQL> create directory <ディレクトリオブジェクト名> as '<ディレクトリパス>';

-- 確認コマンド
SQL> select directory_name,directory_path from dba_directories where directory_name='<ディレクトリオブジェクト名>';
  1. エクスポートの実行ユーザの作成
    • SYSユーザでの実施ではなく新たにエクスポート実施用の新規ユーザを作成することをOracleが推奨しています。
    • なお、ユーザの作成および権限の付与は付与権限のあるユーザーで実施すること。
SQL> create user <ユーザ名> identified by <パスワード>;
SQL> alter user <ユーザ名> quota unlimited on users; 
SQL> grant read, write on directory <ディレクトリオブジェクト名> to <ユーザ名>;
SQL> grant datapump_exp_full_database to <ユーザ名>;
  1. 初期値パラメータの設定
    • datapumpではメモリ領域であるSTREAMS_POOL_SIZEを使用するらしいのである程度確保が必要。
    • oracle推奨値は 64MB ~ 256MB
-- 確認コマンド
SQL> select current_size/1024/1024 as current_size_mb
    from v$sga_dynamic_components
    where component='stream pool';
-- 確認結果
CURRENT_SIZE_MB
----------------
            256

-- 設定緒の変更
SQL> alter system set stream_pool_size=256m scope=both;
  1. 統計情報の収集
SQL> begin
        dbms_stats.gather_schema_stats('SYS');
        dbms_stats.gather_schema_stats('SYSTEM');
    end;
  1. エクスポート動作確認
    • ここではあくまで動作するかの確認なので移行対象は最低限にしている。
expdp <ユーザ名>/<パスワード>@<ORACLE_SID> tables=<table_name> directory=<ディレクトリオブジェクト名> logfile=<logfile_name>.log estimate_only=y
  1. エクスポート実施用のパラメータファイルの作成
    • expdpのオプション設定のテキストファイルを作成。オプションのみ記述可能
    • 今回自分が使用したもののみ記載しているのでこのほかにもたくさんオプションはある。
# エクスポートのモード設定
TABLES=<テーブル名> # スペース区切りで複数選択可能
# 出力先ディレクトリ名
directory=<ディレクトリオブジェクト名>
# 出力dumpファイル名
dumpfile=<ダンプファイル名>
# 圧縮設定(アルゴリズムはmedium推奨  デフォルトではbasic)
compression=all
compression_algorithm=medium
# エクスポートデータの一貫性を保つ設定(数値での設定も可能)
flashback_time=systimestamp
# エクスポートするデータの内容の設定
content=data_only
# ログファイルに関する設定
logfile=<ログファイル名>
logtime=all
# 詳細情報をlogに出力する設定
metrics=yes
  1. エクスポートの実行
expdp <ユーザ名>/<パスワード>@<ORACLE_SID> parfile=<パラメータファイル名>
  1. ダンプファイルの転送
    • 環境によって移行方法が異なるのでここでは割愛します。
    • SCPコマンド, DBLINK, 記憶媒体に保存etc...

4.インポート実行手順

  1. ディレクトリオブジェクトの設定
    • ダンプファイルの格納先を指定
-- 作成コマンド
SQL> create directory <ディレクトリオブジェクト名> as '<ディレクトリパス>';

-- 確認コマンド
SQL> select directory_name,directory_path from dba_directories where directory_name='<ディレクトリオブジェクト名>';
  1. インポートの実行ユーザの作成
SQL> create user <ユーザ名> identified by <パスワード>;
SQL> alter user <ユーザ名> quota unlimited on users; 
SQL> grant read, write on directory <ディレクトリオブジェクト名> to <ユーザ名>;
SQL> grant datapump_imp_full_database to <ユーザ名>;
  1. インポート実施用のパラメータファイルの作成
    • 今回はメタデータを'含めず'にエクスポートをしたので、すでに移行先にテーブルがあることが前提になっている。
    • 今回は記載の省略するが、外部キー制約などの設定がある場合は無効化してから出ないとインポート時にエラーが発生し、一部データが取り込めない場合があるので注意。
# インポートのモード設定
TABLES=<テーブル名> # スペース区切りで複数選択可能
# ダンプファイルの保存先ディレクトリ名
directory=<ディレクトリオブジェクト名>
# 入力dumpファイル名
dumpfile=<ダンプファイル名>
# ログファイルに関する設定
logfile=<ログファイル名>
logtime=all
# 詳細情報をlogに出力する設定
metrics=yes
# 既存表との衝突処理(デフォルトではappend)
table_extst_action=truncate
# SecureFileLOB(よくわかんないが推奨されているので...)
transform=lob_strage:securefile
  1. インポートの実行
impdp <ユーザ名>/<パスワード>@<ORACLE_SID> parfile=<パラメータファイル名>
  1. 統計情報の収集
SQL> begin
        dbms_stats.gather_schema_stats('SYS');
        dbms_stats.gather_schema_stats('SYSTEM');
    end;

最後に

実際の業務では、一連のコマンド実施をシェルスクリプトに落とし込んで実行しました。 その方が実行時にミスらないし事前に確認したコマンドを確実に実行できるので安心ですからね。備忘録としての走り書きなので記載ミスがありましたらコメント等で教えてもらえるとありがたいです。

参考

Discussion

コメントにはログインが必要です。