oracle 11g 创建 dblink 连接 postgreSQL

本文详细介绍如何在Windows环境下实现Oracle数据库与PostgreSQL数据库之间的跨库连接。具体步骤包括:安装并配置PostgreSQL的ODBC驱动,为Oracle配置HS,以及在Oracle中建立数据库链接。适用于需要在不同数据库间进行数据交互的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在项目上遇到需要使用我们公司后台数据库操作客户现场postgreSQL数据库的需求,在此总结一下相关的实践过程,以便后续遇到同样的问题时查阅。

windows下的跨数据库连接

环境参数:
+ oracle version: 11g
+ postgreSQL version: 10.4
+ 操作系统: windows10

1、在Oracle服务器为PostgreSQL数据库建立ODBC数据源

  • 安装PostgreSQL的ODBC驱动

    odbc下载地址:https://www.postgresql.org/ftp/odbc/versions/msi/

  • 下载安装后,到控制面板中找到管理工具,打开
    ODBC数据源配置
    点击添加按钮新增系统ODBC数据源
    添加ODBC数据源
    配置数据源属性
    配置数据源属性
    配置完成后点击test若通过测试,点击save。至此,PostgreSQL的ODBC数据源创建成功。

2、为Oracle 数据库配置HS

  • $ORACLE_HOME/hs/admin路径下新建initPG_LINK.ora文件,添加内容如下:
    HS_FDS_CONNECT_INFO = PG_LINK
    HS_FDS_TRACE_LEVEL = 0

ps:上述ora文件名中PG_LINK为之前创建的数据源的名称。

  • 修改$ORACLE_HOME/NETWORK/admin路径下tnsnames.ora文件,添加内容如下:

    PG_LINK  =
      (DESCRIPTION=
        (ADDRESS=(PROTOCOL=tcp)(HOST=<ORA_DB_HOSTNAME>)(PORT=<ORA_DB_PORT>))
        (CONNECT_DATA=(SID=PG_LINK))
        (HS=OK)
      )
  • 修改$ORACLE_HOME/NETWORK/admin路径下listener.ora添加如下内容(在SID_LIST中):

    SID_LIST_<your_LISTENER_NAME>=
      (SID_LIST=
          (SID_DESC=
             (SID_NAME=PG_LINK)
             (ORACLE_HOME=<your_ORACLE_HOME>)
             (PROGRAM=dg4odbc)
          )
      )
  • 重新加载listener配置

    以系统管理员身份运行cmd,执行下述命令:
    lsnrctl reload <your_LISTENER_NAME>

create database link PG_LINK connect to "pguser" identified by "pgpass" using 'PG_LINK';
ps:注意语句中的双引号的使用,在postgreSQL中未被双引号包围的内容自动转为小写;oracle中则是自动转为大写,若关键内容不用双引号包围,则会引发错误。
同样的,在通过dblink进行跨库查询时也要注意同样的问题。

eg:

SQL> select * from "testtable"@PG_LINK;
 col1
 ----------------------------------------------------------------
 test row 1

若不用双引号,会产生如下ORA-28500错误:

SQL> select * from testtable@PG_LINK;
  select * from testtable@PG_LINK
  *
  ERROR at line 1:
  ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
  ERROR: relation "TESTTABLE" does not exist;
  No query has been executed with that handle {42P01,NativeErr = 1}
  ORA-02063: preceding 3 lines from PG_LINK

参考文章:https://dbaspot.wordpress.com/2013/05/29/how-to-access-postgresql-from-oracle-database/

<think>好的,用户想要了解如何在PostgreSQL数据库中通过DBLink连接Oracle数据库。首先,我需要回忆一下DBLink的基本概念和作用。DBLinkPostgreSQL的一个扩展,允许跨数据库访问,但默认情况下可能只支持PostgreSQL之间的连接。要连接Oracle的话,可能需要额外的工具或扩展,比如oracle_fdw或者ODBC的方式。 接下来,我需要确认用户的需求。用户提到的是使用DBLink,但可能实际上需要的是类似功能的解决方案,因为原生的DBLink可能不支持直接连接Oracle。这时候需要区分清楚,可能需要使用外部数据包装器(Foreign Data Wrapper),比如oracle_fdw,这是一个常用的扩展,允许PostgreSQL访问Oracle的数据。 然后,我应该整理步骤。首先安装必要的软件,比如oracle_fdw扩展,这可能需要安装依赖包,比如Oracle Instant Client。然后配置环境变量,创建扩展,定义外部服务器,用户映射,最后创建外部表或者直接查询。 需要注意权限问题,确保PostgreSQL用户有权限访问Oracle数据库。另外,版本兼容性也是一个关键点,比如PostgreSQLOracle的版本是否被oracle_fdw支持。可能还需要处理字符集和时区设置,以避免数据不一致的问题。 用户可能遇到的问题包括安装过程中的依赖缺失,连接字符串的配置错误,或者权限不足。在回答中需要提到常见错误的解决方法,比如检查网络连通性,确认Oracle监听器的配置,以及正确的用户名和密码。 此外,可能还需要比较不同的方法,比如使用ODBC或其他中间件,但oracle_fdw通常是更直接的选择。要确保步骤清晰,分点说明,让用户能够逐步操作。同时提醒用户在实际生产环境中注意性能和安全问题,比如使用加密连接,限制访问权限等。 最后,总结整个过程,强调关键步骤和注意事项,确保用户能够顺利实现跨数据库的查询。</think>在 PostgreSQL 中通过 DBLink 连接 Oracle 数据库的实现步骤如下: ==================== 一、核心原理 ==================== 1. 使用 `oracle_fdw` 扩展(Foreign Data Wrapper) 2. 通过 Oracle Instant Client 实现协议通信 3. 建立跨数据库的虚拟映射关系 ==================== 二、详细步骤 ==================== 1. **环境准备** - 安装 Oracle Instant Client ```bash wget https://download.oracle.com/otn_software/linux/instantclient/211000/instantclient-basic-linux.x64-21.1.0.0.0.zip unzip instantclient-*.zip export LD_LIBRARY_PATH=/path/to/instantclient:$LD_LIBRARY_PATH ``` 2. **安装扩展** ```sql CREATE EXTENSION oracle_fdw; ``` 3. **创建服务器定义** ```sql CREATE SERVER oracle_server FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//oracle_host:1521/service_name'); ``` 4. **配置用户映射** ```sql CREATE USER MAPPING FOR postgres SERVER oracle_server OPTIONS (user 'oracle_user', password 'oracle_password'); ``` 5. **创建外部表** ```sql CREATE FOREIGN TABLE oracle_table ( id integer, name text ) SERVER oracle_server OPTIONS (schema 'SCHEMA_NAME', table 'TABLE_NAME'); ``` ==================== 三、查询验证 ==================== ```sql -- 直接查询 SELECT * FROM oracle_table WHERE id = 100; -- 使用DBLink式查询 SELECT * FROM dblink('oracle_server', 'SELECT * FROM remote_table') AS t(col1 int, col2 text); ``` ==================== 四、注意事项 ==================== 1. **版本兼容性** - Oracle 11g/12c/19c 已验证支持 - PostgreSQL 9.5+ 推荐版本 2. **性能优化** $$ \text{建议使用 WHERE 条件过滤减少数据传输量} $$ $$ \text{批量操作时设置 fetch_size 参数} $$ 3. **常见错误处理** - ORA-12154: 检查 TNS 配置 - 字符集问题:设置 `NLS_LANG=AMERICAN_AMERICA.AL32UTF8` - 时区不一致:协调数据库时区设置 ==================== 五、替代方案 ==================== 1. 使用 ODBC 桥接 2. 通过 ETL 工具中转 3. 使用 PostgreSQL 的 `dblink_plus` 商业扩展 建议根据实际场景选择方案,简单查询推荐 `oracle_fdw`,复杂ETL建议采用专业工具。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值