【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插件包名 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
安装原理解析

执行上传插件包,会把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所不具备的,应该是做了不少优化
相关推荐
清幽竹客1 小时前
redis数据持久化和配置-15(备份和还原 Redis 数据)
数据库·redis·缓存
捡星星同学1 小时前
MySQL与Redis数据同步实践与优化
数据库·redis·mysql
Ao0000002 小时前
数据库5——审计及触发器
android·数据库
maray2 小时前
对 Lambda 架构问题的深入理解
大数据·数据库·架构
明天不下雨(牛客同名)3 小时前
介绍一下 MVCC
java·服务器·数据库
神奇萝卜头3 小时前
MySQL中的Change Buffer是什么,它有什么作用?
数据库·mysql
23级二本计科3 小时前
对Web界面进行简单自动化测试Selenium
前端·数据库
清风序来4 小时前
Python中的并发编程
数据库
喝养乐多长不高4 小时前
深入探讨redis:哨兵模式
数据库·redis·缓存·docker·主从复制·哨兵模式
杨凯凡7 小时前
MySQL安全加固:权限管控与加密实践
数据库·mysql·安全