技术时刻丨GaussDB使用DBLINK连接到Oracle

GaussDB 自内核506版本(2025年4 月30日发布)起,支持通过 DBLINK 功能连接至 Oracle 数据库,相关配置及使用说明如下。(官方文档参考链接:https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/25.1.30/devg-cent/gaussdb-42-0811.html)

安装

使用 DBLINK 连接 Oracle 前,需先在实例机器上部署 Oracle 客户端。这里提供两种部署方案,我推荐优先选择纯白屏化操作的 TPOPS 平台方案:

方案一

手动部署(不推荐)

手动将 instantclient 压缩包上传至每个数据节点,解压后配置 LD_LIBRARY_PATH 环境变量。该方案无官方完整操作步骤支撑,易出现配置疏漏,不建议采用。(官方文档参考链接:https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/25.1.30/devg-cent/gaussdb-42-0813.html)

方案二

TPOPS 平台插件化部署(推荐)

通过云数据库 GaussDB 管理平台(TPOPS)上传并安装插件,全程无需 SSH 登录服务器,操作流程如下:

<上传插件包>

https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/25.1.30/usermanual/qlh_02_0431.html

<插件安装>

https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/25.1.30/usermanual/qlh_02_0426.html

需要注意的是,TPOPS 这个版本仅支持以下表格中的 instantclient 版本上传,并且需要保证填写的 cksum 和 Oracle 官方页面上保持一致,但由于 Oracle 官方下载页面只会保留最新的版本,因此就算通过某种方式得到了原本的官方包,也没有官方页面可以获得 cksum 值了,只能通过 GaussDB 文档里来获取这些版本的 cksum 值。

|------|-----------------------------------------------------|------------|------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------|
| 系统架构 | OCI插件包名 | cksum | SHA 256 | url |
| X86 | instantclient-basic-linux.x64-12.2.0.1.0.zip | 3923339140 | 5015e3c9fba84e009f7519893f798a1622c37d1ae2c55104ff502c52a0fe5194 | https://download.oracle.com/otn/linux/instantclient/122010/instantclient-basic-linux.x64-12.2.0.1.0.zip(这个版本下载需要登录ORACLE账号,或者使用迅雷下载) |
| | instantclient-basic-linux.x64-19.26.0.0.0dbru.zip | 3459128350 | f5f5f7e8eb8e1f057a33a8b8f5aef096544535365dedd31324f5f411abab339e | https://download.oracle.com/otn_software/linux/instantclient/1926000/instantclient-basic-linux.x64-19.26.0.0.0dbru.zip |
| | instantclient-basic-linux.x64-21.17.0.0.0dbru.zip | 937263543 | 70e3a0107a4847e2644a97df5102065c9ca133db36d81b3f3429f6e3426ff10f | https://download.oracle.com/otn_software/linux/instantclient/2117000/instantclient-basic-linux.x64-21.17.0.0.0dbru.zip |
| ARM | instantclient-basic-linux.arm64-19.26.0.0.0dbru.zip | 2071078872 | f8bd362bde8834c458493c14a654c97f6a9f8d1dcbbb38e1b67f8d3102851964 | https://download.oracle.com/otn_software/linux/instantclient/1926000/instantclient-basic-linux.arm64-19.26.0.0.0dbru.zip |

安装原理解析

  1. 插件包上传后,instantclient 压缩包会存储至 TPOPS 服务器的 /opt/sftphome/sftpservice/package/plugin/OracleOCI/ 目录(SFTP 服务器专属目录);

  2. 执行插件安装时,各数据节点会从 SFTP 服务器下载压缩包,并存至 /home/Ruby/oci_proxy 目录解压;

  3. 解压后,系统会将 instantclient_19_26 目录内的文件移动至上级目录,删除原压缩包(可能残留 instantclient_19_26 空目录),且会自动重启实例以完成配置生效。

使用

安装完后,通过create database link语法即可创建连接到Oracle的DBLINK。如下,表示创建一个名为public_dblink_to_o的DBLINK,使用用户名hr密码hr123,连接到192.168.1.123:1521/pdb1,并且对象标识符大小写不敏感(不配置则默认敏感,比如查ORACLE的表要手动双引号大写,不加双引号或者小写会报错表不存在)。其中的OCI即表示使用OCI插件连接Oracle数据库,去掉OCI即表示连接GaussDB数据库。(其他连接参数详见官方文档:https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/25.1.30/devg-cent/gaussdb-42-0629.html)

sql 复制代码
CREATE PUBLIC DATABASE LINK public_dblink_to_o CONNECT TO 'hr' IDENTIFIED BY 'hr123' OCI USING (dbserver '192.168.1.123:1521/pdb1' ,case_insensitive 'on');

@的用法和Oracle一样,就不举例了。(使用限制详见官方文档:https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/25.1.30/devg-cent/gaussdb-42-0813.html)

这里只提3点重要的功能限制:

  1. 该版本的 DBLINK 只支持 delete/insert/update/select,不支持调用远端的函数和存储过程;

  2. 支持通过本地同义词访问远端的表、视图,但不支持远端为嵌套同义词,也不支持远端为一个 DBLINK 对象的同义词;

  3. 不支持操作远端的 clob/blob/long/long raw 类型。

DBLINK函数

新增了一批DBLINK的函数,主要涉及关闭DBLINK连接、查看DBLINK信息、DBLINK占用内存大小等。(详见官方文档:https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/25.1.30/devg-cent/gaussdb-42-0500.html)

实现分析

  1. 内核新建了 gs_database_link 表,用于存储创建的 DBLINK 信息,该表内记录了 DBLINK 名称、DBLINK 所有者(为0表示public)、使用的 fdw(外部数据封装器)、创建者、连接及参数设置、用户名密码(密码是加密存储的)、权限;

  2. 新建了视图 sys."v$dblink",结构参考 Oracle 同名视图;

  3. 连接到 Oracle 的 DBLINK 的 fdw 用的是"12223 gs_ora_fdw";

  4. 原本的 pg_foreign_server 和 pg_user_mapping 里不会新增记录,可以理解为是存到了 gs_database_link 里;

  5. 第一次访问远端表的时候,会自动插入 pg_foreign_table,即创建了外部表,在 pg_class 和 pg_attribute 中可以查到该表,表名是大写的(暂没测是否与 case_insensitive 有关)。因此可以判断,该功能在备机上无法使用;

  6. 在 pg_namespace 中会创建一条用户名@dblink名称的记录,外部表的 namespace 对应这个记录,也就是说,实际上它创建了一个 schema(周边生态工具和运维脚本要注意了);

  7. 可以使用 select * from"用户名@dblink名称"."大写外部表名"的方式访问曾经通过 DBLINK 的@方式访问的表(注意要加双引号,而且文档里没有描述这种方法,不能保证后续版本这种方法是否会被禁用);

  8. 发送到远端的 SQL,每个表的查询都会加上一串8个字节的 hash 值注释,同一表被多次查询时,hash 值也不一样,并且所有表会自动加上别名,r1、r2...rn;

  9. 从 gs_ora_fdw.control 这个文件里看,里面的 comment 和 oracle_fdw 一样,都是 foreign data wrapper for Oracle access,但是没有找到对应的 so(疑似打包到了主程序里);

  10. gs_ora_fdw 极有可能是基于 oracle_fdw 改的,文档中的 oracle_fdw 还没有替换干净,不过 gs_ora_fdw 很多下推场景是 oracle_fdw 所不具备的,应该是做了不少优化。

王勇昱

云和恩墨高级技术顾问

拥有十余年PL/SQL设计开发经验,维护过数百套Oracle应用数据库。2021年起开始投入国产数据库建设,多次获得墨天轮SQL挑战赛奖项及墨力之星,获评CSDN领军人物,参与过多个数据库相关开源项目的开发。

相关推荐
李广坤13 小时前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区2 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1772 天前
《从零搭建NestJS项目》
数据库·typescript
加号32 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏2 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐2 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再2 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest2 天前
数据库SQL学习
数据库·sql
jnrjian2 天前
ORA-01017 查找机器名 用户名 以及library cache lock 参数含义
数据库·oracle
十月南城2 天前
数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略
大数据·数据库·数据仓库·hive·hadoop·spark