Oracle 创建访问 KingbaseES(人大金仓) 的 DBLink

Oracle 原生 DBLink 仅支持 Oracle 之间互通,访问 Kingbase(异构数据库,PostgreSQL 内核) 必须使用:
Oracle 透明网关 DG4ODBC + Kingbase ODBC 驱动 
Oracle 数据库 → DG4ODBC透明网关 → Kingbase ODBC驱动 → 远程Kingbase数据库
 

1. 安装依赖

  1. 安装 KingbaseES ODBC 驱动
     
    去金仓官网下载对应版本(V8R6)的 KingbaseES ODBC Driver,安装在Oracle 所在服务器。
  2. 确认 Oracle DG4ODBC 组件已安装
     
    11gR2 及以上版本默认自带,无需单独下载。

2. 网络要求

Oracle 服务器能 ping 通 Kingbase 服务器 IP + 端口(默认 54321),防火墙放行。
 

步骤 1:配置 ODBC 系统数据源(连接 Kingbase)

  1. 打开服务器 ODBC 数据源管理器(64位) → 切换到 系统 DSN → 添加
  2. 选择 KingbaseES 8 ODBC Driver → 完成
  3. 填写配置:
    • Data Source Name(数据源名):KINGBASE_DSN (固定记住这个名字)
    • Database:Kingbase 数据库名
    • Server:Kingbase IP
    • Port:54321
    • User Name:Kingbase 用户名
    • Password:Kingbase 密码
     
  4. 点击 Test 显示 Connection Successful 即配置成功。

步骤 2:配置网关初始化文件

  1. 找到路径:$ORACLE_HOME/hs/admin
  2. 新建文件:initKINGBASE.ora (文件名固定格式:init+DSN 名.ora)
  3. 写入以下配置(直接复制):
HS_FDS_CONNECT_INFO = KINGBASE_DSN    # 对应ODBC数据源名
HS_FDS_TRACE_LEVEL = OFF              # 关闭日志
HS_LANGUAGE = AMERICAN_AMERICA.AL32UTF8
HS_NLS_NCHAR = UCS2
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so  # Linux ODBC库路径

步骤 3:配置监听 listener.ora

  1. 路径:$ORACLE_HOME/network/admin/listener.ora
  2. 添加以下配置(直接复制):
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = KINGBASE)            # 对应init文件名
      (ORACLE_HOME = 你的Oracle_HOME路径)
      (PROGRAM = dg4odbc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
    )
  )

步骤 4:配置 tnsnames.ora

  1. 路径:$ORACLE_HOME/network/admin/tnsnames.ora
  2. 添加以下配置:
 
KINGBASE_LINK =                       # 自定义服务名
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = Oracle服务器IP)(PORT = 1521))
    (CONNECT_DATA = (SID = KINGBASE))
    (HS = OK)                         # 关键:开启异构网关
  )
 

步骤 5:重启 Oracle 监听

lsnrctl stop
lsnrctl start
lsnrctl status  # 查看监听正常加载dg4odbc即成功

步骤 6:Oracle 中创建 DBLink

用 DBA 权限 执行:
 
-- 创建dblink(名称自定义,如 to_kingbase)
CREATE DATABASE LINK to_kingbase
CONNECT TO "Kingbase用户名" IDENTIFIED BY "Kingbase密码"
USING 'KINGBASE_LINK';  -- 对应tnsnames.ora里的服务名
 

测试 DBLink(验证是否成功)

-- 查询Kingbase的表(必须写 schema.表名)
SELECT * FROM 表名@to_kingbase;

-- 示例:查询public下的test表
SELECT * FROM public.test@to_kingbase;
posted @ 2026-06-26 09:06  网络大法师  阅读(24)  评论(0)    收藏  举报