異種データベースへのDBリンク


(8.0.22)

MySQLは異種DBへのDBリンクをサポートしていない

 


(19c)

Oracle(19c) mmm065(CentOS7) --> PostgreSQL(14) mmm070(CentOS8)
https://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=Oracle%A4%AB%A4%E9Postgresql%A4%D8ODBC%C0%DC%C2%B3%A4%B9%A4%EB
https://dbaspot.wordpress.com/2013/05/29/how-to-access-postgresql-from-oracle-database/
https://community.oracle.com/tech/developers/discussion/4269392/unable-to-connect-from-oracle-19c-to-postgresql-10-3


前提:PostgreSQLにリモート接続可能

以下すべて、mmm065で実行する

-- 1. PostgreSQLODBCドライバをインストール

yum install -y postgresql-odbc

-- 2. ODBCの設定

vim /etc/odbc.ini

[PG_LINK]
Description = PG_LINK
Driver = /usr/lib64/psqlodbc.so
Servername = mmm070
Username = postgres
Password = postgres
Port = 5432
Database = test
TRACE =Yes
TraceFile = /tmp/sql.log
Debug = 1
CommLog = 1

[Default]
Driver = /usr/lib64/liboplodbcS.so.2

 

-- 3. initSID.oraの編集
su - oracle
vim $ORACLE_HOME/hs/admin/initPG_LINK.ora

HS_FDS_CONNECT_INFO = PG_LINK
HS_FDS_TRACE_LEVEL = on
HS_FDS_SHAREABLE_NAME = /usr/lib64/psqlodbc.so
HS_NLS_NCHAR = UCS2
HS_LANGUAGE = AMERICAN_AMERICA.WE8ISO8859P1
set ODBCINI=/etc/odbc.ini

-- 4. 静的Listenerの追加

vim $ORACLE_HOME/network/admin/listener.ora


LISTENER2=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=mmm65.example.com)(PORT=1522) )
     ) )

SID_LIST_LISTENER2=
   (SID_LIST =
      (SID_DESC=
         (ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1)
         (ENV="LD_LIBRARY_PATH=/u01/app/oracle/product/19.0.0/dbhome_1/lib:/usr/lib64")
         (SID_NAME=PG_LINK)
         (PROGRAM=dg4odbc)
      )
  )

lsnrctl stop LISTENER2
lsnrctl start LISTENER2
lsnrctl status LISTENER2

 

-- 5. tnsnames.oraの編集
vim $ORACLE_HOME/network/admin/tnsnames.ora

PG_LINK =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=mmm65.example.com)(PORT=1522) )
    (CONNECT_DATA=
      (SERVER = DEDICATED)
      (SID=PG_LINK)
    )
    (HS=OK)
  )


-- 6. データベースリンクの作成

drop public database link PG_LINK;
create public database link PG_LINK connect to "postgres" identified by "postgres" using 'PG_LINK';

-- 7. 動作確認

select * from "tab1"@PG_LINK;

※日本語は文字化けする。回避方法不明

※エラーが出る場合はログを確認する
ログの場所 = /u01/app/oracle/product/19.0.0/dbhome_1/hs/log

行1でエラーが発生しました。:
ORA-28500: OracleからOracle以外のシステムへの接続で次のメッセージが戻されました:  ORA-02063:
先行のエラー・メッセージを参照してくださいline(PG_LINK)。

→このエラーはHS_LANGUAGEを設定で解消する

 

Oracle(19c) mmm065(CentOS7) --> MySQL(8.0.22) mmm066(CentOS7)
https://qiita.com/mossi/items/d2a8c8c113738bee9f2d

前提:MySQLにリモート接続可能

以下すべて、mmm065で実行する

-- 1. unixODBC (ODBC Driver Manager)のインストール

yum install -y unixODBC

odbcinst -j

-- 2. mysql-connector-odbc (MySQLODBCドライバ) のインストール


yum install -y https://dev.mysql.com/get/Downloads/Connector-ODBC/8.0/mysql-connector-odbc-8.0.26-1.el7.x86_64.rpm

cat /etc/odbcinst.ini

-- 3. ODBCの設定

vim /etc/odbc.ini

[MYDB]
Driver     = MySQL ODBC 8.0 Unicode Driver
SERVER     = mmm066
PORT       = 3306
DATABASE   = test
USER       = root
PASSWORD   = password
CHARSET    = utf8

isql MYDB -v

select user();


-- 4. ODBCドライバマネージャーライブラリのパスを確認
ldd `which isql`


-- 5. initSID.oraの編集
su - oracle
vim $ORACLE_HOME/hs/admin/initMYDB.ora

HS_FDS_CONNECT_INFO = MYDB
HS_NLS_NCHAR = UCS2
HS_LANGUAGE = JAPANESE_JAPAN.AL32UTF8
HS_FDS_SHAREABLE_NAME = /lib64/libodbc.so.2

set ODBCINI=/etc/odbc.ini


-- 6. 静的Listenerの追加

vim $ORACLE_HOME/network/admin/listener.ora


LISTENER2=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=mmm65.example.com)(PORT=1523) )
     ) )

SID_LIST_LISTENER2=
   (SID_LIST =
      (SID_DESC=
         (ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1)
         (SID_NAME=MYDB)
         (PROGRAM=dg4odbc)
      )
  )

lsnrctl stop LISTENER2
lsnrctl start LISTENER2
lsnrctl status LISTENER2


-- 7. tnsnames.oraの編集
vim $ORACLE_HOME/network/admin/tnsnames.ora

MYDB =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=mmm65.example.com)(PORT=1523) )
    (CONNECT_DATA=
      (SERVER = DEDICATED)
      (SID=MYDB)
    )
    (HS=OK)
  )


-- 8. データベースリンクの作成

drop public database link MYDB;
create public database link MYDB connect to "root" identified by "password" using 'MYDB';

-- 9. 動作確認

select * from "tab1"@MYDB;

 

Oracle(19c) mmm065(CentOS7) --> SQL Server(2019) mmm061(Windows Server 2019)
https://ameblo.jp/norinori-monta/entry-12189037036.html
https://tech-oracle.blog.ss-blog.jp/2021-10-10


前提:SQL Serverにリモート接続可能

以下すべて、mmm065で実行する

-- 1. Oracle GatewaySQL Server)のインストール
unzip LINUX.X64_193000_gateways.zip
cd gateways
LANG=C ./runInstaller


Software location: /u01/app/oracle/product/19.0.0/dbhome_1

Oracle Database Gateway for Microsoft SQL Serverにチェック

Microsft SQL Server Database Server Host Name: mmm061
Microsft SQL Server Database Server Port Number: 1433
Microsft SQL Server Server Name: MSSQLSERVER
Microsft SQL Server Database Name: test

ls -ltr $ORACLE_HOME/dg4msql

cat $ORACLE_HOME/dg4msql/admin/initdg4msql.ora


-- 2. 静的Listenerの追加

vim $ORACLE_HOME/network/admin/listener.ora


LISTENER2=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=mmm65.example.com)(PORT=1524) )
     ) )

SID_LIST_LISTENER2=
   (SID_LIST =
      (SID_DESC=
         (ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1)
         (SID_NAME=dg4msql)
         (PROGRAM=dg4msql)
      )
  )

lsnrctl stop LISTENER2
lsnrctl start LISTENER2
lsnrctl status LISTENER2


-- 3. tnsnames.oraの編集
vim $ORACLE_HOME/network/admin/tnsnames.ora

dg4msql =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=mmm65.example.com)(PORT=1524) )
    (CONNECT_DATA=
      (SERVER = DEDICATED)
      (SID=dg4msql)
    )
    (HS=OK)
  )

tnsping dg4msql


-- 4. データベースリンクの作成

drop public database link dg4msql;
create public database link dg4msql connect to "sa" identified by "password" using 'dg4msql';

-- 5. 動作確認

select * from "tab1"@dg4msql;

 


(14)
PostgreSQL(14) mmm070(CentOS8) --> Oracle(19c) mmm065(CentOS7)
https://lets.postgresql.jp/documents/technical/fdw
https://www.fujitsu.com/jp/products/software/resources/feature-stories/postgres/article-index/oracle-fdw-basic/
https://www.postgresql.org/about/news/oracle_fdw-240-released-2313/

前提:Oracleにリモート接続可能


以下すべて、mmm070で実行する

-- 1. OCIライブラリーのインストール
インスタントクライアントのサイトからrpm版をもってくる

dnf install -y oracle-instantclient19.12-basic-19.12.0.0.0-1.x86_64.rpm
dnf install -y oracle-instantclient19.12-devel-19.12.0.0.0-1.x86_64.rpm
dnf install -y oracle-instantclient19.12-sqlplus-19.12.0.0.0-1.x86_64.rpm


-- 2. 環境変数の設定
su - postgres

export LD_LIBRARY_PATH=/usr/lib/oracle/19.12/client64/lib
export NLS_LANG=JAPANESE_JAPAN.AL32UTF8
export PATH=$PATH:/usr/pgsql-14/bin
export ORACLE_HOME=/usr/lib/oracle/19.12/client64/lib


-- 3. oracle_fdwのエクステンション(EXTENTION)の作成

git clone https://github.com/laurenz/oracle_fdw.git
cd oracle_fdw


make
exit
export PATH=$PATH:/usr/pgsql-14/bin
cd ~postgres/oracle_fdw
make install

su - postgres


psql test
CREATE EXTENSION oracle_fdw;
\dew


-- 4. 外部サーバーの作成
CREATE SERVER ora_sv FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver 'mmm065:1521/pdb1.example.com');
\des+

GRANT USAGE ON FOREIGN SERVER ora_sv TO postgres;


-- 5. ユーザーマップの作成
CREATE USER MAPPING FOR postgres SERVER ora_sv OPTIONS ( USER 'test', PASSWORD 'test');
\deu+

-- 6. 外部テーブルの作成

CREATE FOREIGN TABLE f_tab1(
  col1 int OPTIONS (key 'true'),
  col2 varchar(10) )
SERVER ora_sv OPTIONS (SCHEMA 'TEST' , TABLE 'TAB1');

\det+
\d f_tab1

-- 7. 動作確認

select * from f_tab1;


PostgreSQL(14) mmm070(CentOS8) --> MySQL(8.0.22) mmm066(CentOS7)
https://qiita.com/msrx9/items/734d644b7b2aad796b09

前提:MySQLにリモート接続可能

以下すべて、mmm070で実行する

-- 1. mysql_fdwのエクステンション(EXTENTION)の作成

dnf install -y mysql-devel

su - postgres

export PATH=$PATH:/usr/pgsql-14/bin

git clone https://github.com/EnterpriseDB/mysql_fdw.git

cd mysql_fdw

make USE_PGXS=1

exit
export PATH=$PATH:/usr/pgsql-14/bin
cd ~postgres/mysql_fdw
make USE_PGXS=1 install

su - postgres

psql test
CREATE EXTENSION mysql_fdw;
\dew


-- 2. 外部サーバーの作成
CREATE SERVER mpi_mysql FOREIGN DATA WRAPPER mysql_fdw OPTIONS (
    host 'mmm066',
    port '3306'
);

\des+

GRANT USAGE ON FOREIGN SERVER mpi_mysql TO postgres;


-- 3. ユーザーマップの作成
CREATE USER MAPPING FOR postgres SERVER mpi_mysql OPTIONS (
    username 'root',
    password 'password'
);

\deu+

-- 4. 外部テーブルの作成
CREATE FOREIGN TABLE f_tab1 (
    col1 int,
    col2 varchar(10)
)
SERVER mpi_mysql
OPTIONS (
    dbname 'test',
    table_name 'tab1'
);

\det+
\d f_tab1

-- 5. 動作確認

select * from f_tab1;


PostgreSQL(14) mmm070(CentOS8) --> SQL Server(2019) mmm061(Windows Server 2019)
https://toshtone.hatenablog.jp/entry/2018/05/29/001729

前提:SQL Serverにリモート接続可能

以下すべて、mmm070で実行する

-- 1. tds_fdwのエクステンション(EXTENTION)の作成

dnf install -y epel-release
dnf install -y freetds-devel


su - postgres

git clone https://github.com/tds-fdw/tds_fdw.git
cd tds_fdw

make USE_PGXS=1 PG_CONFIG=/usr/pgsql-14/bin/pg_config
sudo make USE_PGXS=1 PG_CONFIG=/usr/pgsql-14/bin/pg_config install


psql test
CREATE EXTENSION tds_fdw;
\dew

-- 2. 外部サーバーの作成
create server ms_sv foreign data wrapper tds_fdw options (
    servername 'mmm061',
    port '1433',
    database 'test',
    tds_version '4.2',
    character_set 'UTF-8');


\des+

GRANT USAGE ON FOREIGN SERVER ms_sv TO postgres;


-- 3. ユーザーマップの作成
create user mapping for postgres server ms_sv options (username 'sa', password 'password');

\deu+

-- 4. 外部テーブルの作成
create foreign table f_tab1 (
    col1 int,
    col2 varchar(10)
)
server ms_sv options (table 'tab1');


\det+
\d f_tab1

-- 5. 動作確認

select * from f_tab1;

 

 

(2019)
SQL Server(2019) mmm061(Windows Server 2019) --> Oracle(19c) mmm065(CentOS7)
https://qiita.com/shisho/items/31837ad38b8bc7f203b8
https://tech-oracle.blog.ss-blog.jp/2021-10-04

前提:Oracleにリモート接続可能

以下すべて、mmm061で実行する

-- 1. OSユーザ追加
net user
net user oracle password /add

-- 2. Oracle Clientのインストール


使用したインストーラWINDOWS.X64_193000_client.zip

インストールタイプ: 管理者
インストール先ユーザ: oracle
ORACLEBASE: C:\app\oracle
ORACLEHOME: C:\app\oracle\product\19.0.0\client_1

-- 3. tnsnames.oraの設定

cd C:\app\oracle\product\19.0.0\client_1\network\admin

notepad tnsnames.ora
pdb1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mmm065)(PORT = 1521) )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdb1.example.com)
    )
  )

tnsping pdb1

-- 4. Oracle OLE DBのプロパティを変更

USE [master]
GO
EXEC master.dbo.sp_MSset_oledb_prop N'OraOLEDB.Oracle', N'AllowInProcess', 1
GO

-- 5. Linked Serverの構成

USE [master]
GO
EXEC master.dbo.sp_addlinkedserver @server = N'PDB1', @srvproduct=N'Oracle', @provider=N'OraOLEDB.Oracle', @datasrc=N'pdb1'


EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'PDB1', @locallogin = NULL , @useself = N'False', @rmtuser = N'test', @rmtpassword = N'test'
GO

 

-- 6. 動作確認

select * from リンクサーバー名..スキーマ名.テーブル名


select * from PDB1..TEST.TAB1;

 

SQL Server(2019) mmm061(Windows Server 2019) --> PostgreSQL(14) mmm070(CentOS8)

https://qiita.com/AkihiroTakamura/items/2da977e9362533611cfc
https://gist.github.com/alg0002/d2fc1b4ede87390478ff1f850b0a3ebd

前提:PostgreSQLにリモート接続可能

以下すべて、mmm061で実行する


-- 1. Postgres ODBC Driverのインストール

使用したインストーラ: psqlodbc_13_02_0000-x64.zip

 

-- 2. Linked Serverの構成

use master;
GO

EXEC MASTER.dbo.sp_addlinkedserver @server = N'pg14'
,@srvproduct = N'PostgreSQL'
,@provider = N'MSDASQL'
,@provstr = 'Driver={PostgreSQL UNICODE};Server=mmm070;Port=5432;Database=test;UID=postgres;Password=postgres;Network=dbmssocn;'


-- 3. 動作確認

select * from リンクサーバー名.データベース名.スキーマ名.テーブル名

select * from pg14.test.[public].tab1;


SQL Server(2019) mmm061(Windows Server 2019) --> MySQL(8.0.22) mmm066(CentOS7)

https://akarui-nippon.com/blog/sql-server%E3%81%8B%E3%82%89mysql%E3%82%92%E8%A6%97%E3%81%8F%EF%BD%9E%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A%EF%BD%9E
https://itfun.jp/2014/10/sql-servermysql.html


前提:MySQLにリモート接続可能

以下すべて、mmm061で実行する


-- 1. MySQL ODBC Driverのインストール

使用したインストーラmysql-connector-odbc-8.0.26-winx64.msi

Visual Studio 2019 x64 Redistributableも必要

 

-- 2. Linked Serverの構成

USE [master]
GO

EXEC master.dbo.sp_addlinkedserver @server = N'MYSQL8'
,@srvproduct=N'MySQL'
,@provider=N'MSDASQL'
,@provstr=N'DRIVER={MySQL ODBC 8.0 UNICODE Driver};SERVER=mmm066;PORT=3306;DATABASE=test;USER=root;PASSWORD=password;OPTION=3;'

 

-- 3. 動作確認

select * from openquery (MYSQL8, 'select * from tab1');

select * from リンクサーバー名.データベース名.スキーマ名.テーブル名

select * from MYSQL8.test..tab1;