2017年9月20日水曜日

[Oracle] Oracle Database Gateway機能を使用してOracleからPostgreSQLのテーブルをアクセスする方法

概要

Oracle Database Gateway機能を使用するとOracleとOracle以外の異機種間サービスでデータのアクセスが可能となる。ここでは、Oracle Database Gateway機能を使用して、Solarisサーバで動作するOracleからLinuxサーバで動作するPostgreSQLのテーブルをアクセスする方法を記載する。
なお、Oracle Database Gateway機能の使用にあたり、追加のライセンスは不要。

事前準備

unixODBCドライバとPostgreSQL ODBCドライバをダウンロードしてOralceが動作するSolarisサーバの/var/tmpへのコピーと、Oracleユーザ環境変数の設定を行う。

unixODBCドライバのダウンロード

以下のURLからunixODBC-2.3.2.tar.gzをダウンロードする。

http://www.unixodbc.org/download.html

PostgreSQL ODBCドライバのダウンロード

以下のURLからpsqlodbc-09.06.0500.tar.gzをダウンロードする。

https://www.postgresql.org/ftp/odbc/versions/src/

oracleユーザ環境変数の設定

oralceユーザのLD_LIBRARY_PATH_64とPATHを更新する。

# su - oracle
Password:
$ vi .profile
LD_LIBRARY_PATH_64=$HOME/lib:/usr/sfw/lib/sparcv9:/usr/lib/sparcv9:/usr/postgres/8.2/lib/sparcv9:$LD_LIBRARY_PATH_64
PATH=$HOME/bin:$PATH
$ exit
# su - oracle
$

TIPS:
導入・設定および確認はoracleユーザで実行すること。

導入・設定

unixODBCのインストール

ファイルを展開する。

$ cd /var/tmp
$ gzip -d unixODBC-2.3.4.tar.gz
$ tar xvf unixODBC-2.3.4.tar
$ cd unixODBC-2.3.4

環境変数を設定する。

$ PATH=/usr/ccs/bin:/usr/sfw/bin:$PATH
$ export PATH
$ CFLAGS="-m64 -DBUILD_REAL_64_BIT_MODE"
$ export CFLAGS

コンパイル・インストールする。

$ ./configure --prefix=$HOME --enable-gui=no --enable-drivers=no
$ make
$ make install

PostgreSQL ODBCドライバのインストール

ファイルを展開する。

$ cd /var/tmp
$ gzip -d psqlodbc-09.06.0500.tar.gz
$ tar xvf psqlodbc-09.06.0500.tar.gz
$ cd psqlodbc-09.06.0500.tar.gz

コンパイル・インストールする。

$ ./configure --prefix=$HOME
$ make
$ make install

ODBC接続の設定

環境変数を設定する。

$ ODBCINI=$HOME/etc/odbc.ini
$ export ODBCINI

定義ファイルを更新する。(testdbデータベースに接続する場合)

$ vi $ODBCINI
[ODBC Data Sources]
TESTDBDSN = PostgreSQL ODBC Data Source
    
[TESTDBDSN]
Driver=/export/home/oracle/lib/psqlodbcw.so
Servername=PostgreSQLが動作するサーバのIPアドレス
Port=PostgreSQLをサービスしているポート番号(デフォルトは5432)
Database=testdb
UserName=PostgreSQLデータベース接続ユーザ
Password=PostgreSQLデータベース接続ユーザのパスワード

接続確認を行う。

$ $HOME/bin/isql -v TESTDBDSN

接続できない場合は以下のポイントを確認する。

  • odbc.iniの設定内容が正しいこと。
  • PostgreSQLが動作するサーバのfirewalld等で接続が許可されていること。

Oracle Database Gateway機能の設定

Oracle Database Gateway機能用にlistenerを追加する。

$ vi $ORACLE_HOME/network/admin/listener.ora
SID_LIST_TESTDB_LISTENER=
(SID_LIST =
      (SID_DESC =
       (SID_NAME=TESTDB)
      (ORACLE_HOME=/opt/oracle/product/11.2.0/db)
      (ENV="LD_LIBRARY_PATH=/export/home/oracle/lib:/opt/oracle/product/11.2.0/db/lib")
      (PROGRAM=dg4odbc)
      )
   )

TESTDB_LISTENER=
(DESCRIPTION_LIST =
      (DESCRIPTION =
         (ADDRESS_LIST =
            (ADDRESS = (PROTOCOL = TCP)(HOST = Oracleが動作するサーバのIPアドレス) (PORT = Oracle Database Gateway機能をサービスするポート))
         )
      )
   )

Oracle Database Gateway機能用にtnsnamesを追加する。

$ vi $ORACLE_HOME/network/admin/tnsnames.ora
TESTDBTNS=(DESCRIPTION=
      (ADDRESS=(PROTOCOL=tcp)(HOST=Oracleが動作するサーバのIPアドレス)(PORT=Oracle Database Gateway機能をサービスするポート))
      (CONNECT_DATA=(SID=TESTDB))
      (HS=OK)
   )

Oracle Database Gateway機能の初期化ファイルを作成する。

$ cp -p  $ORACLE_HOME/hs/admin/initdg4odbc.ora $ORACLE_HOME/hs/admin/initTESTDB.ora
$ vi $ORACLE_HOME/hs/admin/initTESTDB.ora
HS_FDS_CONNECT_INFO=TESTDBDSN
HS_FDS_TRACE_LEVEL=off
HS_FDS_SHAREABLE_NAME=/export/home/oracle/lib/libodbc.so
set ODBCINI=/export/home/oracle/etc/odbc.ini

Oracle Database Gateway機能用にlistenerを起動する。

$ lsnrctl start TESTDB_LISTENER
$ tnsping TESTDBTNS

OracleにPostgreSQLデータベースへのデータベースリンクを作成する。

$ sqlplus Oracleデータベース接続ユーザ/Oracleデータベース接続ユーザのパスワード@$ORACLE_SID
SQL> create database link TESTDBLNK connect to "PostgreSQLデータベース接続ユーザ" identified by "PostgreSQLデータベース接続ユーザのパスワード" using 'TESTDBTNS';

TIPS:
Oracleデータベース接続ユーザには以下の権限が必要。
grant connect to oracle;
grant ALTER SESSION to oracle;
grant CREATE VIEW to oracle;
grant CREATE DATABASE LINK to oracle;
grant CREATE SESSION to oracle;
grant unlimited tablespace to oracle;

確認

PostgreSQLデータベースアクセス確認

describeとselectの結果が表示されることを確認する。

$ sqlplus Oracleデータベース接続ユーザ/Oracleデータベース接続ユーザのパスワード@$ORACLE_SID
SQL> describe "PostgreSQLデータベースのテーブル名"@TESTDBLNK;
SQL> select * from "PostgreSQLデータベースのテーブル名"@TESTDBLNK where rownum <= 10;

制限事項

  • 接続先がPostgreSQLの場合、トランザクション制御が動作しない。(AUTO COMMITになる)
  • データ型が変換される。
PostgreSQL Oracle 変換理由
bigint number 最大値とを満たすデータ型として、oracle側ではNUMBER型に変換が行われる。
bit [(n)] long oracle側の数値データ型では取り扱っていない為、LONG型の文字列に変換が行われる。
bit varying [(n)] long oracle側の数値データ型では取り扱っていない為、LONG型の文字列に変換が行われる。
boolean long 論理地データ型をoracleでは取り扱っていない為、"真"状態に対するリテラル値を1に、"偽"状態に対するリテラル値を0に変換し、LONG型の文字列に変換が行われている。
character varying [(n)] varchar2 oracle側の文字型データであるVARCHAR2型やCHAR型に変換される。
character [(n)] char oracle側の文字型データであるVARCHAR2型やCHAR型に変換される。
date date oracle側日付/時刻データ型であるDATE型に変換される。
double precision float oracle側の浮動小数点データ型であるFLOAT型に変換される。
integer number 最大値とを満たすデータ型として、oracle側ではNUMBER型に変換が行われる。
interval [fields] [(p)] long oracle側に時刻を取り扱うデータ型が存在しない為、LONG型の文字列に変換が行われている。
numeric [(p, s)] number 最大値とを満たすデータ型として、oracle側ではNUMBER型に変換が行われる。
real float oracle側の浮動小数点データ型であるFLOAT型に変換される。
smallint number 最大値とを満たすデータ型として、oracle側ではNUMBER型に変換が行われる。
time [(p)] [without time zone] char oracle側に時刻を取り扱うデータ型が存在しない為、CHAR型の文字列に変換が行われている。
time [(p)] with time zone long oracle側に時刻を取り扱うデータ型が存在しない為、LONG型の文字列に変換が行われている。
timestamp [(p)] [without time zone] date oracle側日付/時刻データ型であるDATE型に変換される。
timestamp [(p)] with time zone date oracle側日付/時刻データ型であるDATE型に変換される。

参考

  • http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05708-01/configodbc.htm

0 件のコメント:

コメントを投稿