それでもかぶはぬけません

それでもかぶはぬけません

OracleのDBLINKとDataPumpを利用してデータ移行をやってみた

たまには技術的な記事も書いておこうかなということで。

今回は意外と苦戦するOracleのDBLinkを使ったデータ移行の手順を書いてみようと思います。

 

 

OracleDBのデータ移行の手法

まず、データベース間のデータの移行のやり方は以下の3パターンがあります。(※オリジナルEXPORT、IMPORTはほとんど使うことがなくなったので割愛)

①EXPDPコマンドで移行元サーバにdumpfileを出力する方法

f:id:nikorichsmbc:20170818013020p:plain

②DBLINKを使って移行先サーバにdumpfileを出力する方法

f:id:nikorichsmbc:20170818013038p:plain

③dumpfileを出力せずにDBLINKを使って移行先に直接データをインポートする方法

f:id:nikorichsmbc:20170818013056p:plain

 

DBLINKを利用して移行先のデータベースに直接インポートする手順

今回私が試してみたのは③のDBLINKを利用して移行先のデータベースに直接データをインポートする手法です。
メリットは中間生成物であるdumpfileを出力する手間がいらないということ!
dumpfileを出力するだけの空き容量がないという場合にも有効な手法ですね。
早速、具体的な手順に入っていきましょう。

移行先データベースのtnsnames.oraに移行元データベースへの接続情報を記述

移行先データベースのtnsnames.oraに移行元データベースの接続情報を追記します。IPアドレス、ポート番号、サービスネームは移行元データベースで設定した値を記述してください。

OLDDB =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 移行元サーバIP)(PORT = 1521))
      (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = orcl)
      )
   )

移行先サーバにログ出力先ディレクトリを作成

 ログディレクトリの作成

D:DATA_IKODATAPUMP_DIR

 SYSユーザーでディレクトリの割り当て

$ sqlplus sys/pass as sysdba
SQL> create directory IKO_DIR as 'D:DATA_IKODATAPUMP_DIR';

移行先のインポート実行ユーザーへの権限割り当て

 移行先でインポートを実行するユーザーに各種権限、ロールを適用する。
 インポートモードがデータベース全体の場合、インポート実行ユーザーに
 datapump_imp_full_databaseロールが必要です。

$ sqlplus sys/pass as sysdba
SQL> grant read, write on directory IKO_DIR to impuser1;
SQL> grant create database link to impuser1;
SQL> grant datapump_imp_full_database to impuser1;

移行元のエクスポート実行ユーザーへの権限割り当て

 移行元でエクスポートを実行するユーザーにdatapump_exp_full_database
 ロールを適用する。
 移行元で実行するインポートモードがデータベース全体の場合、エクスポート
 実行ユーザーにdatapump_exp_full_databaseロールが必要です。

$ sqlplus sys/pass as sysdba
SQL> grant datapump_exp_full_database to expuser;

移行先のインポート実行ユーザーでデータベースリンクを作成

移行先でインポートを実行するユーザーで接続して、移行元データベースに接続するためのDBLINKを作成します。
移行先でログインするユーザー名/パスワードを記述してください。

$ sqlplus impuser1/pass
SQL> create database link DBLINK_OLDDB
     2 connect to expuser identified pass 
     3 using 'OLDDB';

データベースリンクの移行元データベースへの接続確認

データベースリンクに接続して移行元テーブルのデータ数を確認します。
移行元サーバで確認したデータ数と同じであることを確認してください。

$ sqlplus impuser1/pass
SQL> select count(*) from 移行元テーブル@DBLINK_OLDDB;

移行先でインポートを実行

移行先でimpdpコマンドを実行しますデータベースリンク名はnetwork_linkに記述します。
インポートモードはデータベース全体(full=y)としていますが、用途によって変更してください。

$ impdp impuser1/pass@NEWDB network_link=DBLINK_OLDDB directory=IKO_DIR logfile=IKO_DIR:import_olddb.log full=y;

まとめ

一応、上記手順でデータベース全体のインポートはできた。

しかしデータベース全体をインポートした結果、パスワードファイルが変更され、SYSユーザーのパスワードがデフォルトのchange_on_installになってしまうという不思議な現象が発生しました。

また、スキーマ単位で直接インポートも試みたが、なぜかうまくいきませんでした。

直接インポートする方法は便利だけど、いまいちうまく使いこなせないのは私のスキル不足かな。

まだまだ勉強が必要ですね。