【GaussDB】使用DBLINK连接到ORACLE

GaussDB 从内核 506版本(20250430发布)起,支持通过DBLINK连接到ORACLE数据库

https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/25.1.30/devg-cent/gaussdb-42-0811.html

安装

使用这个功能,首先需要在实例机器上部署ORACLE客户端,

<上传插件包>

<插件安装>

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

系统架构 OCI插件包名
X86 instantclient-basic-linux.x64-12.2.0.1.0.zip
instantclient-basic-linux.x64-19.26.0.0.0dbru.zip
instantclient-basic-linux.x64-21.17.0.0.0dbru.zip
ARM instantclient-basic-linux.arm64-19.26.0.0.0dbru.zip
cksum SHA 256
3923339140 5015e3c9fba84e009f7519893f798a1622c37d1ae2c55104ff502c52a0fe5194
3459128350 f5f5f7e8eb8e1f057a33a8b8f5aef096544535365dedd31324f5f411abab339e
937263543 70e3a0107a4847e2644a97df5102065c9ca133db36d81b3f3429f6e3426ff10f
2071078872 f8bd362bde8834c458493c14a654c97f6a9f8d1dcbbb38e1b67f8d3102851964

安装原理解析

执行上传插件包,会把instantclient压缩包上传到 tpops服务器的 /opt/sftphome/sftpservice/package/plugin/OracleOCI/ 目录下,该目录是sftp服务器的目录。

安装插件,会把instantclient压缩包分发(实际是各个节点从sftp服务器下载)到各个数据节点的 /home/Ruby/oci_proxy目录下并解压,然后将文件从 instantclient_19_26目录里mv到上一层,再删除instantclient压缩包(残留了一个 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数据库。

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');

其他连接参数详见官方文档

CREATE DATABASE LINK- https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/25.1.30/devg-cent/gaussdb-42-0629.html

@的用法和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占用内存大小等,详见官方文档

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所不具备的,应该是做了不少优化
相关推荐
上海红同电子几秒前
红同电子线束工厂100问|绝缘护套采购,材质PVC、TPE、PP该如何选型?
数据库·经验分享·职场和发展·产品运营·制造·材质
泡海椒24 分钟前
JQuick-SQL “数据源 SPI”辨析:应用适配器与 Function SPI 的正确边界
数据库·驱动开发·sql
无毁的湖光-Al30 分钟前
高可用之路-观测篇-那些年遇到过的指标幻觉
linux·数据库·tcp
段一凡-华北理工大学1 小时前
高炉能源系统智能化:热风炉、煤气与极致能效~系列文章02:走进热风炉:蓄热、换炉、送风的工艺机理
大数据·数据库·能源·高炉能源管控·热风炉·热风炉工作原理
紧跟先前的步伐1 小时前
Go AI Agent 实战 18|Tool Calling 的基本原理与完整执行流程
前端·数据库·人工智能·ai·golang·1024程序员节
EnCi Zheng1 小时前
AI Agent工具误调用怎么解决-从参数校验到高危二次确认的四层工程防线
大数据·数据库·人工智能
泡海椒1 小时前
JQuick-SQL 逻辑数据仓库:以注册数据集构建轻量分析层
数据库·数据仓库·sql
l1t2 小时前
DeepSeek辅助编写连接sqlite的CLI
数据库·golang·sqlite
翔云1234562 小时前
Gaea中配置如何更新
运维·数据库·mysql
泡海椒3 小时前
JQuick-SQL JQuickTable 模型:XML 动态 SQL 的表封装边界
xml·数据库·sql