【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所不具备的,应该是做了不少优化
相关推荐
Arva .1 小时前
深度分页、读写分离、分库分表后 SQL 该如何优化?
数据库·sql
九章-2 小时前
中国能建风电项目数据库国产化实践:构建安全可控的新能源数据底座
数据库
v***5652 小时前
SpringBoot集成Flink-CDC,实现对数据库数据的监听
数据库·spring boot·flink
q***23922 小时前
MySQL数据库误删恢复_mysql 数据 误删
数据库·mysql·adb
IUGEI2 小时前
【MySQL】SQL慢查询如何排查?从慢查询排查到最终优化完整流程
java·数据库·后端·mysql·go
张较瘦_3 小时前
[论文阅读] AI + 数据库 | 拆解智能数据库:交互、管理、内核三层革新,AI 如何重塑数据处理
数据库·论文阅读·人工智能
paperxie_xiexuo3 小时前
如何高效完成科研数据的初步分析?深度体验PaperXie AI科研工具中数据分析模块在统计描述、可视化与方法推荐场景下的实际应用表现
大数据·数据库·人工智能·数据分析
w***4813 小时前
Springboot项目本地连接并操作MySQL数据库
数据库·spring boot·mysql
司铭鸿4 小时前
图论中的协同寻径:如何找到最小带权子图实现双源共达?
linux·前端·数据结构·数据库·算法·图论