技术时刻丨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领军人物,参与过多个数据库相关开源项目的开发。

相关推荐
静听山水2 小时前
StarRocks系统表
数据库
运维行者_2 小时前
Applications Manager 引入持续剖析技术,突破传统 APM 监控瓶颈
java·运维·网络·jvm·数据库·安全·web安全
静听山水2 小时前
StarRocks 数据类型全面详解(对比 MySQL)
数据库
安科瑞刘鸿鹏172 小时前
企业能源物联网,本质是一场数据整合能力的较量
运维·数据库·物联网·能源
大厂技术总监下海2 小时前
向量数据库“卷”向何方?从Milvus看“全功能、企业级”的未来
数据库·分布式·go·milvus·增强现实
FinTech老王2 小时前
2026年国产主流时序数据库选型指南
数据库·时序数据库·时序数据
快乐非自愿2 小时前
Redis和 Redisson 集成踩坑日记
数据库·redis·bootstrap
zgl_200537792 小时前
源代码:ZGLanguage 解析SQL数据血缘 之 显示 WITH SQL 结构图
大数据·数据库·数据仓库·sql·数据治理·etl·数据血缘
五阿哥永琪2 小时前
MySQL 核心机制精讲:B+树查询、Buffer Pool、COUNT 优化与 CHAR/VARCHAR 实战指南
数据库·b树·mysql