4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

oracle_fdw を使ってPostgreSQLからOracle ADWへのデータ連携方式の検証

Last updated at Posted at 2019-12-12

#はじめに
PostgreSQLには、外部データの種類に応じた外部データラッパー( Foreign Data Wrapper : FDW)を適用することで、様々な外部データをPostgreSQL内のテーブルと同様に扱うことができます。
oracle_fdw は外部データラッパーの1つで Oracle Database に対応しています。
この記事は、oracle_fdw を使ってPostgreSQLからOracle ADW(Autonomous Data Warehouse)へのデータ連携方式を検証します。

#検証環境に関する説明

  • Oracle ADW (18c)
    image.png
  • PostgreSQLサーバー(10.11)
    image.png
    image.png

:pushpin: oracle_fdw を利用する場合、PostgreSQLのバージョンは9.1以降になる必要があります。

  • 補足説明

PostgreSQLサーバーは利用者のオンプレミス環境に存在する場合、 ADW へのアクセスはインターネット経由、または VPN 経由のいずれも可能です。接続のイメージを下記の構成図で示されます。
image.png

ADW へのアクセスは、TCPS プロトコルを利用しますから、インターネット経由で接続する場合も、データの安全性を確保できます。
より安全性がもっと高い VPN 経由での接続について、利用者のオンプレミス環境のネットワーク構成に応じて、 VPN 接続の設定を行う必要があります。詳細については、オラクル社の資料 VPN Connect をご参照ください。

#oracle_fdw の導入

  • OCI ライブラリのインストール

oracle_fdw は OCI(Oracle Call Interface)ライブラリを使って Oracle ADW にアクセスします。
そのため、PostgreSQL稼動サーバに OCI ライブラリのインストールが必要になります。本記事では Oracle Instant Client 18.5をインストールします。
Oracle Instant Clientは (https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html) からダウンロードします。
image.png

:pushpin: oracle_fdw を利用する場合、Oracle Instant Client のバージョンは10.1以上になる必要があります。

opcのhomeディレクトリ (/home/opc) にて、ZIPファイルを解凍します。解凍後に「instantclient_18_5」ディレクトリが生成されました。

$ unzip instantclient-basic-linux.x64-18.5.0.0.0dbru.zip
$ unzip instantclient-sdk-linux.x64-18.5.0.0.0dbru.zip
$ unzip instantclient-sqlplus-linux.x64-18.5.0.0.0dbru.zip
$ cd instantclient_18_5
$ ls -a

必要なモジュールやOCIライブラリの準備ができたことを確認します。
image.png

  • ADW Walletの準備
    image.png
    image.png
    image.png

ダウンロードした ADW Wallet のZIPファイルをPostgreSQLサーバー (/home/opc) にアップロードします。
本記事では、下記のようにopcのhomeディレクトリの下にADW Walletを格納するディレクトリ (/home/opc/adw_wallet) を作成し、アップロードじた ADW Wallet のZIPファイルを解凍します。

$ mkdir adw_wallet
$ mv Wallet_kyokuADW.zip /home/opc/adw_wallet
$ cd adw_wallet 
$ unzip Wallet_kyokuADW.zip

解凍された「sqlnet.ora」ファイルを編集します(実際のADW Walletの格納先を指定)。

$ vi sqlnet.ora

image.png

  • oracle_fdwのインストール

oracle_fdwのページ(https://github.com/laurenz/oracle_fdw) からリポジトリ上の最新コードをZIP形式でダウンロードすることにします。
ダウンロードした oracle_fdw のZIPファイルをPostgreSQLサーバー (/home/opc) にアップロードします。
image.png
root ユーザーで環境変数の設定、oracle_fdwのインストール、ライブラリ構成の追加や変更の反映など一連の操作を行います。

$ sudo -s
# cd ~
# vi .bash_profile

以下の内容を「.bash_profile」ファイルの最後に追加します。

export PATH=$PATH:/home/opc/instantclient_18_5:/usr/pgsql-10/bin
export ORACLE_HOME=/home/opc/instantclient_18_5
export OCI_LIB_DIR=$ORACLE_HOME
export OCI_INC_DIR=$ORACLE_HOME/sdk/include
export LD_LIBRARY_PATH=$ORACLE_HOME
export TNS_ADMIN=/home/opc/adw_wallet

設定した環境変数を有効にして、引き続き後の操作を行います。

# source .bash_profile
# cd /home/opc
# unzip oracle_fdw-master.zip
# cd oracle_fdw-master
# make
# make install
# vi /etc/ld.so.conf.d/postgresql-pgdg-libs.conf

以下の内容を「postgresql-pgdg-libs.conf」ファイルに追加します。

/usr/pgsql-10/lib/
/home/opc/instantclient_18_5/

root ユーザーで ldconfig コマンドを実行します。

# ldconfig

oracle_fdw のインストールは完了後に、ライブラリの依存関係が正しく構築されたことを確認します。
image.png

#ADWへのアクセス

postgres ユーザーで環境変数の設定、PostgreSQLサーバーの再起動、ADW に存在するテーブルをPostgreSQLの外部テーブルに定義する処理など一連の操作を行います。
image.png

  • 環境変数の設定
$ vi .bash_profile

以下の内容を「.bash_profile」ファイルの最後に追加します。

export PATH=$PATH:/home/opc/instantclient_18_5:/usr/pgsql-10/bin
export ORACLE_HOME=/home/opc/instantclient_18_5
export OCI_LIB_DIR=$ORACLE_HOME
export OCI_INC_DIR=$ORACLE_HOME/sdk/include
export LD_LIBRARY_PATH=$ORACLE_HOME
export TNS_ADMIN=/home/opc/adw_wallet

設定した環境変数を有効にします。

$ source .bash_profile
  • PostgreSQLサーバーの再起動
$ pg_ctl restart 
  • PostgreSQLの外部テーブルの作成
$ psql postgres
psql (10.11)
Type "help" for help.

postgres=# CREATE EXTENSION oracle_fdw;
CREATE EXTENSION
postgres=# \dx oracle_fdw
                      List of installed extensions
    Name    | Version | Schema |              Description
------------+---------+--------+----------------------------------------
 oracle_fdw | 1.1     | public | foreign data wrapper for Oracle access
(1 row)

ここまで、PostgreSQL から ADW へのデータ連携の準備ができました。
下記の図で示されている Oracle ADW 側にある TEST テーブルをPostgreSQLの外部テーブルとして定義してみましょう。
image.png
image.png
image.png

Oracle ADW にアクセスするための接続情報を外部サーバー(oradb_adw)として定義します。

postgres=# create server oradb_adw foreign data wrapper oracle_fdw options(dbserver 'kyokuadw_high');
CREATE SERVER
postgres=# \des oradb_adw
           List of foreign servers
   Name    |  Owner   | Foreign-data wrapper
-----------+----------+----------------------
 oradb_adw | postgres | oracle_fdw
(1 row)

ユーザー postgres が定義した外部サーバー(oradb_adw)を使用できるように、権限を付与します。

postgres=# grant usage on foreign server oradb_adw to postgres;
GRANT

外部サーバー(oradb_adw)とユーザ(postgres)の対応付けの定義を行います。

postgres=# create user mapping for postgres server oradb_adw options(user 'ADMIN',password 'admin_user_pw');
CREATE USER MAPPING
postgres=# \deu[+] oradb_adw
                       List of user mappings
  Server   | User name |                FDW options
-----------+-----------+--------------------------------------------
 oradb_adw | postgres  | ("user" 'ADMIN', password 'admin_user_pw')
(1 row)

:pushpin: 上記の "admin_user_pw" = ADW の ADMIN ユーザーの実際のパスワード

Oracle ADW 上のテーブルをPostgreSQLの外部テーブルとして定義します。ここでは Oracle ADW 上のテーブル TEST を外部テーブル adw_test として定義します。

postgres=# create foreign table ADW_TEST(
postgres(# id int options(key 'true') not null,
postgres(# item text,
postgres(# upd_date date
postgres(# ) server oradb_adw options(schema 'ADMIN', table 'TEST');
CREATE FOREIGN TABLE
postgres=# \det[+] adw_test
                             List of foreign tables
 Schema |  Table   |  Server   |           FDW options            | Description
--------+----------+-----------+----------------------------------+-------------
 public | adw_test | oradb_adw | (schema 'ADMIN', "table" 'TEST') |
(1 row)

ここまで、Oracle ADW 上のテーブル(TEST)が PostgreSQL の外部テーブル(adw_test)として定義しました。

#差分データの挿入例

Oracle ADW 上のテーブルが PostgreSQL の外部テーブルとして定義されたことを踏まえて、PostgreSQL から Oracle ADW へのデータ連携は簡単に実現できます。
本記事では、 PostgreSQL 側の日付別のデータを差分データとして ADW 側に追加する例(差分データの挿入例)を紹介します。

まずは、PostgreSQL から ADW に差分データ挿入前の状況を再確認します。
image.png

続いては、PostgreSQL 側の日付別のデータを差分データとして ADW 側に追加します。
image.png

差分データの投入は、確かに ADW 側に反映したことを確認します。
image.png

#参照資料

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?