一隼に翔ける!!

~直観と閃きの赴くままに壊進撃するハヤブサ系ブロガー・ファルコンの翔時間(ショウタイム)~

Oracleで別DBからDBLINK経由でテーブルをインポート

time 2016/09/20

Oracleで別DBからDBLINK経由でテーブルをインポート

たまにはインフラエンジニアのブログらしく技術の覚書を書くことにします。

今回は別のスキーマからDBLINK経由でDBのテーブルをコピーする際の手法を記します。


イメージとして以下のような図のケースが考えられます。

それぞれA,BというOracleDatabaseサーバがあり、Cスキーマ、C’スキーマがあります。

要件としてBサーバのC’スキーマのテーブル等のオブジェクトを

AサーバのCスキーマに、C’スキーマとオブジェクトは同一名で取り込んでほしい

といったケースです。

db1

そういったケースで私はネットを参考にしながらこのように対処しました。

  1. DBLINKを作成する
  2. この場合AサーバにログインしてSQLPLUSでもほかのDBツールでも良いのでCスキーマに接続します。

    $ sqlplus C/パスワードを入力

    DBLINK作成の前提でDBLINK作成の際はCスキーマに

    スーパーユーザー経由でCREATE DATABASE LINKの権限の付与を忘れずに。

    $ sqlplus / as sysdba

    SQL> GRANT CREATE DATABASE LINK to C;

    DBLINKを作成します。

    SQL> CREATE DATABASE LINK C’

    CONNECT TO C’ IDENTIFIED BY パスワードを入力

    USING ‘B’;

    ※USINGの接続識別子を指定するところは直接BサーバのIPやポートを書きなぐっても良いですが

    下記のようにtnsnames.oraに記載したものを描いた方がスマートです。

    B =

      (DESCRIPTION =

       (ADDRESS = (PROTOCOL = TCP)(HOST = BサーバのIP)(PORT = 1521))

       (CONNECT_DATA =

        (SERVER = DEDICATED)

        (SERVICE_NAME = b)

       )

      )

  3. Datapumpを実行する前にディレクトリを作成する
  4. 今回の場合Datapumpでもコピーだけでログしか出さないので

    デフォルトのものを使っても良いですが、Datapump時に自作のディレクトリを指定する前提で。

    ディレクトリを作成できるユーザーでディレクトリを作成します。

    AサーバでDATA_PUMP_DIRという名前で任意のディレクトリを指定して作成します。

    SQL> CREATE or REPLACE directory DATA_PUMP_DIR as ‘Datapump用の任意のディレクトリ’;

    Cスキーマに作成ディレクトリの全権振っておく。

    SQL> GRANT all on directory DATA_PUMP_DIR to C;

  5. Datapumpを実行する
  6. IMPDPをAサーバのoracleユーザーで実行します。

    $ impdp C/パスワード NETWORK_LINK=C’ directory=DATA_PUMP_DIR TABLE_EXISTS_ACTION=REPLACE logfile=DATA_PUMP_DIR:XXXX.log

    ・NETWORK_LINKのところは作成したDBLINK名を記載します。

    ・TABLE_EXISTS_ACTIONはREPLACEかTRUNCATEを指定します。なにも指定しない場合、

    TABLE_EXISTS_ACTION オプションはデフォルトでは SKIP に設定されているので

    同名のテーブルが存在する場合はインポートがスキップされて同期処理が空振りになります。

    ・DATA_PUMP_DIR以下には作業ログが出力されるのでそこで結果が確認可能なはずです。

    後はバッチ等で仕込んで定期処理させるようにすれば完成です。

sponsored link



sponsored link