概要
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になる)
データ型が変換される。
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