暂无图片
暂无图片
3
暂无图片
暂无图片
2
暂无图片

Oracle dblink 连接PostgreSQL 数据库

原创 BBK 2022-12-06
3486

一、目标

实现通过Oracle dblink 调用PostgreSQL

二、环境

  • CentOS 7.6.1810
  • PostgreSQL 14.6
  • Oralce 19c

三、步骤

下载介质

介质 地址
odbc https://www.postgresql.org/ftp/odbc/versions/src/
PostgreSQL https://www.postgresql.org/ftp/source/v14.6/

3.1. 安装unixODBC 和 PostgreSQL ODBC驱动

Oracle dblink的底层是通过ODBC连接PostgreSQL执行SQL的,需安装unixODBC和PostgreSQL ODBC驱动(它们的配置文件是:odbcinst.ini和odbc.ini),还需配置Oracle网络使用这个驱动。以下操作都是在Oracle服务器上进行

3.1.1. root安装unixODBC:

yum install unixODBC unixODBC-devel.x86_64
复制

unixODBC相当于Linux中管理所有数据库ODBC驱动的管理器

3.1.2. root安装PostgreSQL ODBC驱动

-- 编译安装,root执行:
-- 安装postgresql14.6 
tar -xvf postgresql-14.6.tar.gz
cd postgresql-14.6/
./configure --prefix=/opt/pg14.6/ --with-pgport=1921
gmake world
gmake install-world

ln -s /opt/pg14 /opt/pgsql

-- 设置环境变量
PATH=$PATH:/opt/pgsql/bin

lib库:
cat /etc/ld.so.conf.d/postgresql-x86_64.conf
/opt/pgsql/lib

-- 生效
ldconfig

-- 驱动安装
tar xf psqlodbc-13.02.0000.tar.gz
cd psqlodbc-13.02.0000
./configure
make
make install

-- 默认安装到/user/local/lib
复制

3.2. 配置odbcinst.ini和odbc.ini

root用户执行:

vim /etc/odbcinst.ini(不区分大小写)

# Driver from the postgresql-odbc package

# Setup from the unixODBC package

[PostgreSQL]

Description     = ODBC for PostgreSQL

Driver64        = /usr/local/lib/psqlodbcw.so

Setup64         = /usr/lib64/libodbcpsqlS.so

FileUsage       = 1
复制

/usr/local/lib/psqlodbcw.so 是PostgreSQL ODBC驱动的库
/usr/lib64/libodbcpsqlS.so 是unixODBC的库

[root@ora19c ~]# cat /etc/odbc.ini

[PG]

Description = Test to pg

Driver = PostgreSQL

Database = postgres

Servername = 192.168.150.132

UserName = testuser

Password = postgres

Port = 1921

ReadOnly = 0

ConnSettings = set client_encoding to UTF8

复制

这里Driver应与odbcinst.ini中的[PostgreSQL]对应,可以取任何名字,但两者需要相同。其它参数视具体PostgreSQL服务器而定。[PG]是一个连接PostgreSQL的配置名称,其它应用程序(如Oracle)就是引用这个名称访问PostgreSQL。

3.3.测试ODBC连接能否工作:

[root@ora19c ~]# isql -v pg

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                    |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select * from bar;

+------------+---------------------------------------------------+
| id         | name                                              |
+------------+---------------------------------------------------+
| 1          | a                                                 |
| 2          | c                                                 |
+------------+---------------------------------------------------+
SQLRowCount returns 2
2 rows fetched
复制

3.4. 配置Oracle网络

grid用户配置listener.ora;oracle用户配置其余两个文件,涉及3个配置文件的修改:

$ORACLEHOME/network/admin/listener.ora
$ORACLEHOME/hs/admin/init<SID_NAME>.ora
$ORACLEHOME/network/admin/tnsnames.ora
复制

3.4.1. 在listener.ora中,增加一项静态监听配置,代表PostgreSQL提供的数据库服务

解释:Oracle将PostgreSQL也看成一个Oracle实例,SID_NAME = pginstance是给它定义一个实例名,这个名称任意,但此名称决定第二个配置文件$ORACLEHOME/hs/admin/init<SID_NAME>.ora的文件名,例如initpginstance.ora。

#Backup file is  /oracle/app/grid/crsdata/ora19c/output/listener.ora.bak.ora19c.grid line added by Agent

# listener.ora Network Configuration File: /oracle/app/19.0.0/grid/network/admin/listener.ora

# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ora19c)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON              # line added by Agent
VALID_NODE_CHECKING_REGISTRATION_LISTENER=ON            # line added by Agent

SID_LIST_LISTENER =
(SID_LIST =
    (SID_DESC =
        (GLOBAL_DBNAME = pdb)
        (ORACLE_HOME = /oracle/app/19.0.0/grid)
        (SID_NAME = orcl)
    )
    (SID_DESC =
        (PROGRAM = dg4odbc)
        (ORACLE_HOME = /oracle/app/oracle/product/19.0.0/dbhome_1)
        (SID_NAME = pginstance)
    )
)

复制

3.4.2. $ORACLEHOME/hs/admin/init<SID_NAME>.ora

实例pginstance连接PostgreSQL数据库时,Oracle会到$ORACLE_HOME/hs/admin/下找名为initpginstance.ora的配置文件,里面是关于ODBC连接的信息,Oracle使用这些信息连接PostgreSQL,例如,在测试环境中文件内容如下:

# This is a sample agent init file that contains the HS parameters that are
# needed for the Database Gateway for ODBC
#
# HS init parameters
#
HS_FDS_CONNECT_INFO = PG
HS_FDS_TRACE_LEVEL = 0
HS_FDS_SHAREABLE_NAME = /usr/local/lib/psqlodbcw.so

# postgresql encoding=utf8
HS_NLS_NCHAR=UCS2
HS_LANGUAGE=AMERICAN_AMERICA.AL32UTF8

#
# ODBC specific environment variables
#
set ODBCINI=/etc/odbc.ini
#
# Environment variables required for the non-Oracle system
#
#set <envvar>=<value>

复制

HS_FDS_CONNECT_INFO = PG 这个参数指向odbc.ini文件中的ODBC连接名称[PG],参考前面。HS_FDS_SHAREABLE_NAME =/usr/local/lib/psqlodbcw.so 这个参数设置PostgreSQL ODBC驱动的路径,与odbcinst.ini中Driver64相同。

如果PostgreSQL的字符编码是UTF8,那么下面两个参数应该这样设置:

注意:字符编码必须一致,不然会报错 ORA-28500: Connection From ORACLE To A Non-Oracle System Returned This Message: C (Doc ID 2325424.1)

HS_NLS_NCHAR=UCS2
HS_LANGUAGE=AMERICAN_AMERICA.AL32UTF8
复制

3.4.3. $ORACLE_HOME/network/admin/tnsnames.ora中,增加一项黄底字体:

# tnsnames.ora Network Configuration File: /oracle/app/oracle/product/19.0.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

PDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST =xx.xx.xx.xx)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdb)
    )
)

pglink =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.150.135)(PORT=1521))
    (CONNECT_DATA=(SID=pginstance))
    (HS=OK)
  )

复制

pglink是客户端到PostgreSQL实例的连接配置,只要注意一点:“SID = pginstance”中,SID应设置为listener.ora中PostgreSQL的实例名,例如这里是pginstance。

pglink这个名称,将在创建dblink时使用。

3.4.4. 创建dblink

在sqlplus或其它终端执行

drop database link dl_pgsql;
create database link dl_pgsql connect to "testuser" identified by "postgres" using 'pglink';
复制

其中’pglink’是tnsnames.ora文件里定义的,这里把Oracle数据库作为客户端,去连接pglink所指的实例。
“testuser” identified by “postgres” 是指PostgreSQL中的用户。

这各名称为dl_pgsql的dblink所连接的PostgreSQL数据库名由odbc.ini的Database参数指定。postgres用户应该对Database所指的数据库,有足够访问权限。

3.5. 通过dblink访问PostgreSQL

假设emp表在名为postgres的数据库中的名为public的schema下,Oracle完成上面的配置后,可以这样访问:

注意:查询时用户名与表名 一定带双引号。oracle 默认大写;pg默认都是小写。

SQL> select * from "pniuser"."test_dblink"@dl_pgsql;

        id

----------

         1

SQL> select * from "pniuser"."bar"@dl_pgsql;

        id name

---------- --------------------------------------------------

         1 a

         2 c

复制

3.6. 创建和使用同义词:

SQL> CREATE SYNONYM test_dblink FOR "pniuser"."bar"@dl_pgsql;
Synonym created.

SQL> select * from test_dblink;
        id name
---------- --------------------------------------------------

         1 a

         2 c

复制

四、 参考

ORA-28500: Connection From ORACLE To A Non-Oracle System Returned This Message: C (Doc ID 2325424.1)
复制

五、 问题解决

cd psqlodbc-13.02.0000
./configure 时报错:

configure: error: libpq library version >= 9.2 is required

解决:

**1.安装postgresql14.6 **

2.pg bin path设置环境变量 
PATH=$PATH:/opt/pgsql/bin

**3.lib库**
cat /etc/ld.so.conf.d/postgresql-x86_64.conf
/opt/pgsql/lib

-- 生效
ldconfig

复制
最后修改时间:2022-12-08 09:20:15
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

布衣
暂无图片 暂无图片
2年前
评论
暂无图片 0
2年前
暂无图片 点赞
评论
duke
暂无图片 暂无图片
2年前
评论
暂无图片 0
👍
2年前
暂无图片 点赞
评论
目录
  • 一、目标
  • 二、环境
  • 三、步骤
    • 下载介质
    • 3.1. 安装unixODBC 和 PostgreSQL ODBC驱动
      • 3.1.1. root安装unixODBC:
      • 3.1.2. root安装PostgreSQL ODBC驱动
    • 3.2. 配置odbcinst.ini和odbc.ini
    • 3.3.测试ODBC连接能否工作:
    • 3.4. 配置Oracle网络
      • 3.4.1. 在listener.ora中,增加一项静态监听配置,代表PostgreSQL提供的数据库服务
      • 3.4.2. $ORACLEHOME/hs/admin/init<SID_NAME>.ora
      • 3.4.3. $ORACLE_HOME/network/admin/tnsnames.ora中,增加一项黄底字体:
      • 3.4.4. 创建dblink
    • 3.5. 通过dblink访问PostgreSQL
    • 3.6. 创建和使用同义词:
  • 四、 参考
  • 五、 问题解决