OceanBase 4.1解读:读写兼备的DBLink让数据共享“零距离”
梁长青,OceanBase 高级研发工程师,从事 SQL 执行引擎相关工作,目前主要负责 DBLink、单机引擎优化等方面工作。
沈大川,OceanBase 高级研发工程师,从事 SQL 执行引擎相关工作,曾参与 TPC-H 项目攻坚,目前主要负责并行执行、DBLink、数据类型等方面的工作。
我们发现,由于不同业务需求之间存在较大差异,不少用户会在实际业务中同时使用多种数据库产品。这些不同的数据库之间并不能直接进行数据访问,这为数据共享和流转带来了障碍。我们假设这样一个场景:某公司各部门的销售数据存储在各自的数据库中,当需要统计全公司的销售数据时,就得对所有数据库中的数据进行汇总。可以预想到,一种可行的方式是使用 ETL 工具,或自行编写脚本来实现数据的抽取和转换,进而将所有数据导入到同一数据库中再进行分析。很明显,这种方式需要编写更多的代码和脚本,开发和维护成本较高。进一步讲,如果用户频繁执行汇总操作,数据导出、导入的时间成本,以及数据存储成本也将变得非常高。
是否有方法能省去业务跨数据库时的繁琐步骤呢?数据库链接(Database Link,简称为 DBLink)可以为我们提供解决思路,这是一项在不同数据库之间进行连接和通信的功能。使用 DBLink,用户可以将一个数据库视为另一数据库的外部表,从而执行跨数据库的查询和数据操作。针对上述场景,我们便可以在一个数据库中建立到各个部门数据库的 DBLink,通过 DBLink 读取各个部门的销售数据并进行汇总分析。使用 DBLink 的优点是可以实时获取远端数据库的最新数据,同时,可以利用 DBLink 进行数据写入,将汇总数据同步给各个部门。
此前,OceanBase 已经支持了 OceanBase 到 Oracle 数据库的 DBLink 读功能。4.1 版本中,我们以 XA 事务能力为基础,进一步支持了跨 OceanBase 和 Oracle 的写事务能力,并支持了 OceanBase 到 OceanBase 的写事务能力。读写兼备的 DBLink 能力,可以让用户轻松实现跨数据库的数据共享与一体化,使得数据处理分析更便捷。本文将分享我们对 DBLink 功能的认识及使用方法。

OceanBase DBLink 功能对于用户来说,在跨库数据访问,数据迁移,数据一致性等方面具有实际意义。
-  数据迁移:在数据库需要迁移数据时,使用 DBLink 可以简化迁移过程。通过建立 DBLink,用户可以在原数据库中查询并获取需要迁移的数据,然后在目标数据库中插入这些数据,从而快速实现数据迁移; 
-  跨库数据访问:有些应用需要将数据分散到不同的集群或同一集群的不同租户中,这时可以使用 DBLink 来实现跨集群、跨租户的数据共享和交互。如本文开头介绍的场景,某公司各部门的数据记录在各自的数据库中,在需要汇总分析全公司数据时,使用 DBLink 即可实时访问各部门数据; 
-  数据一致性:基于 OceanBase 本身的 XA 事务能力,OceanBase 的 DBLink 不仅提供了读取远程数据的能力,还支持写事务。例如,一个应用程序需要在多个数据库中进行数据更新和插入,使用 DBLink 可以保证前述操作在一个事务中执行,从而保证数据的一致性和可靠性。 

DBLink 功能主要分为读功能和写功能,下表是对读写功能的使用场景和版本支持情况的介绍。


为了验证 OceanBase 的 DBLink 能力,我们假设以下业务场景进行实验:A 客户需要将业务系统从 Oracle 迁移至 OceanBase:大部分业务场景完全迁移至 OceanBase 的多个 Oracle 模式租户,小部分业务场景仍保留在 Oracle,最终数据分散存放在 OceanBase 的 Oracle 租户 1、Oracle 租户 2 以及 Oracle 数据库上。
此时创建一个从 Oracle 租户 1 到 Oracle 租户 2 的 DBLink,命名为 OB_LINK;创建一个从 Oracle 租户 1 到 Oracle 数据库的 DBLink,命名为 ORCL_LINK。下文将具体展示 OceanBase DBLink 功能可以在实际业务中为用户带来的便利。
一、无需修改代码,正常使用 Oracle DBLink 功能
A 客户原本在业务系统上使用了 Oracle 的 DBLink 功能,将业务场景迁移至 OceanBase 之后,A 客户无需修改原有业务代码,在 Oceanbase 的 Oracle 租户下创建同名的 DBLink 即可无缝使用原有的业务代码。
二、平滑迁移 Oracle 表数据或 OceanBase 租户表数据
A 客户的大部分业务数据都已通过 OMS 从 Oracle 迁移至 OceanBase 的 Oracle 租户 1 上,临时发现还有名为 orders 的表被遗漏在 Oracle 数据库上未完成迁移。此时,可以使用 OceanBase DBLink 功能方便快捷地迁移数据,避免导出导入数据的繁琐操作。
obclient> create table orders as select * from orders@ORCL_LINK;Query OK, 9999 rows affected (0.36 sec)
A 客户的业务数据分布在不同的 OceanBase 的 Oracle 租户上,如果需要将 Oracle 租户 1 的 lineitem 表数据迁移到 Oracle 租户 2,OceanBase DBLink 功能同样可以进行迁移操作。
obclient> create table lineitem as select * from lineitem@OB_LINK;Query OK, 37641 rows affected (1.66 sec)
三、OceanBase 读异构的 Oracle 数据
A 客户的完成了业务数据的迁移过渡,有部分 sql 查询场景要同时访问位于 OceanBase 租户 1 上的 orders 表和 Oracle 上的 customer 表数据,OceanBase DBLink 支持从 Oracle 租户查询 Oracle 表数据的能力。
obclient> select a.O_CUSTKEY, b.C_NAME from orders a, customer@ORCL_LINK b where a.O_CUSTKEY = b.C_CUSTKEY;+-----------+--------------------+| O_CUSTKEY | C_NAME |+-----------+--------------------+| 665509 | Customer#000665509 || 1978019 | Customer#001978019 || 1855835 | Customer#001855835 || 525559 | Customer#000525559 || 103387 | Customer#000103387 || 28801 | Customer#000028801 |+-----------+--------------------+6 rows in set (0.01 sec)
四、OceanBase 跨租户读数据
A 客户的业务数据分布在不同的 OceanBase 的 Oracle 租户上, 有部分 sql 查询场景要同时访问位于 OceanBase 的 Oracle 租户 1 的 lineitem 表数据和 Oracle 租户 2 上的 partsupp 表数据,OceanBase DBLink 支持跨租户查询表数据的能力。
obclient> select a.L_ORDERKEY, b.PS_SUPPKEY from lineitem a, partsupp@OB_LINK b where a.L_PARTKEY = b.PS_PARTKEY;+------------+------------+| L_ORDERKEY | PS_SUPPKEY |+------------+------------+| 5010944 | 291423 || 5010944 | 41423 || 5010944 | 791423 || 5010944 | 541423 || 7808165 | 903434 || 7808165 | 653434 || 7808165 | 403434 |+------------+------------+7 rows in set (0.01 sec)
五、XA 事务保证下的写异构 Oracle 或写其他 OceanBase 租户
A 客户的业务数据分布在不同的 OceanBase 的 Oracle 租户上, 业务需要在 OceanBase 的 Oracle 租户 1 上向 Oracle 租户 2 和 Oracle 数据库写入数据并提交事务修改,三方将共同参与一个 XA 事务。XA 事务在使用 DBLink 写入数据前将自动开启,事务内有以下操作:
第一,向 Oracle 数据库的 customer 表的插入数据
obclient> insert into Customer@ORCL_LINK values(9989, 'Customer#01', 'abcdefg', 8, '123456789', -240.92, 'building', 'etc.');Query OK, 1 row affected (0.32 sec)obclient> select * from Customer@ORCL_LINK where C_CUSTKEY = 9989;+-----------+-------------+-----------+-------------+-----------------+-----------+--------------+-----------+| C_CUSTKEY | C_NAME | C_ADDRESS | C_NATIONKEY | C_PHONE | C_ACCTBAL | C_MKTSEGMENT | C_COMMENT |+-----------+-------------+-----------+-------------+-----------------+-----------+--------------+-----------+| 9989 | Customer#01 | abcdefg | 8 | 123456789 | -240.92 | building | etc. |+-----------+-------------+-----------+-------------+-----------------+-----------+--------------+-----------+1 row in set (0.00 sec)
第二,将 OceanBase 的 Oracle 1 租户的 lineitem 表的指定数据插入到 OceanBase 的 Oracle 2 租户的 lineitem 表上。
obclient> select * from lineitem@OB_LINK where L_ORDERKEY = 897;Empty set (0.04 sec)obclient> insert into lineitem@OB_LINK select * from lineitem where L_ORDERKEY = 897;Query OK, 4 rows affected (0.03 sec)obclient> select * from lineitem@OB_LINK where L_ORDERKEY = 897;+------------+-----------+-----------+--------------+------------+-----------------+------------+-------+--------------+--------------+---------------------+---------------------+---------------------+---------------------------+------------+--------------------------------------+| L_ORDERKEY | L_PARTKEY | L_SUPPKEY | L_LINENUMBER | L_QUANTITY | L_EXTENDEDPRICE | L_DISCOUNT | L_TAX | L_RETURNFLAG | L_LINESTATUS | L_SHIPDATE | L_COMMITDATE | L_RECEIPTDATE | L_SHIPINSTRUCT | L_SHIPMODE | L_COMMENT |+------------+-----------+-----------+--------------+------------+-----------------+------------+-------+--------------+--------------+---------------------+---------------------+---------------------+---------------------------+------------+--------------------------------------+| 897 | 9044941 | 544960 | 1 | 15 | 28282.35 | .07 | .04 | R | F | 1995-05-25 00:00:00 | 1995-05-09 00:00:00 | 1995-06-07 00:00:00 | COLLECT COD | REG AIR | r ideas. slyly spec || 897 | 18316926 | 66981 | 2 | 26 | 50492.26 | .05 | .08 | N | O | 1995-07-01 00:00:00 | 1995-06-10 00:00:00 | 1995-07-14 00:00:00 | COLLECT COD | MAIL | tions sleep according to the special || 897 | 12570365 | 820378 | 3 | 13 | 18651.62 | .07 | 0 | A | F | 1995-03-30 00:00:00 | 1995-05-17 00:00:00 | 1995-04-21 00:00:00 | TAKE BACK RETURN | MAIL | bold accounts mold carefully! braids || 897 | 10118182 | 618203 | 4 | 2 | 2399.36 | .08 | .08 | R | F | 1995-05-22 00:00:00 | 1995-05-07 00:00:00 | 1995-06-16 00:00:00 | COLLECT COD | RAIL | into beans. slyly special fox |+------------+-----------+-----------+--------------+------------+-----------------+------------+-------+--------------+--------------+---------------------+---------------------+---------------------+---------------------------+------------+--------------------------------------+4 rows in set (0.03 sec)
第三,将 Oracle 上更新后 customer 表和 Oracle 租户 2 上更新后的 lineitem 表做 join,并把 join 结果插入到 Oracle 租户 1 的 lineitem 表。
obclient> insert into lineitem select b.* from customer@ORCL_LINK a, lineitem@OB_LINK b where a.C_CUSTKEY = b.L_ORDERKEY;Query OK, 9990 rows affected (1.12 sec)Records: 9990 Duplicates: 0 Warnings: 0
第四,提交 XA 事务,OceanBase 的 Oracle 租户 1、OceanBase 的 Oracle 租户 2 和 Oracle 上对应的表更新一起提交事务内改动。
obclient> commit;Query OK, 0 rows affected (0.04 sec)
通过以上场景的实际操作,我们验证了 OceanBase DBLink 功能的读能力和支持 XA 事务的写能力,在帮助用户降低从 Oracle 到 OceanBase 数据迁移成本的同时,提供跨租户迁移数据、查询 Oracle 或其他租户数据以及 XA 事务保证下的写数据能力。

本文介绍了 OceanBase 数据库目前 DBLink 功能的具体情况,未来我们将持续升级这些功能。
近期我们会从两方面对 DBLink 功能进行增强:一是支持访问更多的远程对象类型,例如近期将支持访问远程 PROCEDURE 和 SEQUENCE 对象;二是为了更好地支持 OLAP 场景,我们也将支持更多的数据源类型,支持连接 OceanBase 和 Oracle 以外的数据库。
在即将发布的 4.2 版本中,OceanBase 将会提供跨 MySQL 租户的 DBLink 读能力。我们相信 OceanBase DBLink 功能可以让用户的业务数据共享与流转更简单便捷,也欢迎大家向我们反馈使用感受。
相关文章:
 
OceanBase 4.1解读:读写兼备的DBLink让数据共享“零距离”
梁长青,OceanBase 高级研发工程师,从事 SQL 执行引擎相关工作,目前主要负责 DBLink、单机引擎优化等方面工作。 沈大川,OceanBase 高级研发工程师,从事 SQL 执行引擎相关工作,曾参与 TPC-H 项目攻坚&#x…...
 
STM32的HAL库的定时器使用
用HAL库老是忘记了定时器中断怎么配置,该调用哪个回调函数。今天记录一下,下次再忘了就来翻一下。 系统的时钟配置,定时器的时钟是84MHz 这里定时器时钟是84M,分频是8400后,时基就是1/10000s,即0.1ms。Per…...
 
Flink+Paimon多流拼接性能优化实战
目录 (零)本文简介 (一)背景 (二)探索梳理过程 (三)源码改造 (四)修改效果 1、JOB状态 2、Level5的dataFile总大小 3、数据延迟 (五&…...
 
cocos 2.4 版本 设置物理引擎步长 解决帧数不一致的设备 物理表现不一致问题 设置帧刷新率
官网地址Cocos Creator 3.8 手册 - 2D 物理系统 官网好像写的不太对 下面是我自己运行好使的 PhysicsManager.openPhysicsSystem()var manager cc.director.getPhysicsManager();// 开启物理步长的设置manager.enabledAccumulator true;// cc.PhysicsManagercc.PhysicsManag…...
 
Spark及其生态简介
一、Spark简介 Spark 是一个用来实现快速而通用的集群计算的平台,官网上的解释是:Apache Spark™是用于大规模数据处理的统一分析引擎。 Spark 适用于各种各样原先需要多种不同的分布式平台的场景,包括批处理、迭代算法、交互式查询、流处理…...
 
从Instagram到TikTok:利用社交媒体平台实现业务成功
自 2000年代初成立和随后兴起以来,社交媒体一直被大大小小的品牌用作高度针对性的营销工具,自 Facebook推出近二十年以来,这些网站继续彻底改变企业处理广告的方式。 在这篇博文中,我们将讨论订阅企业应该如何从整体上对待社交媒…...
单元测试
1. 单元测试Junit 1.1 什么是单元测试?(掌握) 对部分代码进行测试。 1.2 Junit的特点?(掌握) 是一个第三方的工具。(把别人写的代码导入项目中)(专业叫法:…...
 
科技云报道:AI+云计算共生共长,能否解锁下一个高增长空间?
科技云报道原创。 在过去近一年的时间里,AI大模型从最初的框架构建,逐步走到落地阶段。 然而,随着AI大模型深入到千行百业中,市场开始意识到通用大模型虽然功能强大,但似乎并不能完全满足不同企业的个性化需求。 大…...
 
ReactPy:使用 Python 构建动态前端应用程序
在 Web 开发领域,ReactJS 已成为主导者,为开发人员提供了用于创建动态和交互式用户界面的强大工具集。但是,如果您更喜欢 Python 的多功能性和简单性作为后端,并且希望在前端也利用它的功能,该怎么办?ReactPy 是一个 Python 库,它将熟悉的 ReactJS 语法和灵活性带入了 P…...
安全攻防基础以及各种漏洞库
安全攻防基础以及各种漏洞库 信息搜集企业信息搜集1. 企业架构2. ICP备案查询,确定目标子域名3. 员工信息(搜集账号信息、钓鱼攻击)4. 社交渠道 域名信息搜集IP搜集信息泄露移动端搜集打点进内网命令和控制(持续控制)穿…...
 
护眼灯值不值得买?开学给孩子买什么样的护眼台灯
如果不想家里的孩子年纪小小的就戴着眼镜,从小就容易近视,那么护眼灯的选择就非常重要了,但是市场上那么多品类,价格也参差不齐,到底怎么选呢?大家一定要看完本期内容。为大家推荐五款热门的护眼台灯 一、…...
 
windows安装Scala
Windows安装Scala 下载地址:https://downloads.lightbend.com/scala/2.11.11/scala-2.11.11.zip 解压完成之后 配置环境变量...
 
API类型和集成规范指南
在我们的常见应用中,往往包含着大量服务于各种数据交换的API类型、以及各种常见的API架构与协议。下面,我将从集成的角度和您讨论,在准备将多个服务相互集成时,使用不同类型、架构和协议的API意味着什么?我们可以使用哪些工具&am…...
 
[ES]mac安装es、kibana、ik分词器
一、安装es和kibana 1、创建一个网络,网络内的框架(eskibana)互联 docker network create es-net 2、下载es和kibana docker pull elasticsearch:7.12.1 docker pull kibana:7.12.1 3、运行docker命令部署单点eskibana(用来操作es) doc…...
 
YOLO目标检测——视觉显著性检测MSRA1000数据集下载分享
MSRA1000数据集是一个常用的视觉显著性检测数据集,它包含了1000张图像和对应的显著性标注。在以下几个应用场景中,MSRA1000数据集可以发挥重要作用:图像编辑和后期处理、图像检索和分类、视觉注意力模型、自动驾驶和智能交通等等 数据集点击下…...
 
【基于空间纹理的残差网络无监督Pansharpening】
Unsupervised Pansharpening method Using Residual Network with Spatial Texture Attention (基于空间纹理的残差网络无监督泛锐化方法) 近年来,深度学习已经成为最受欢迎的泛锐化工具之一,许多相关方法已经被研究并反映出良好…...
 
2023年信息安全管理与评估(赛项)评分标准第三阶段夺旗挑战CTF(网络安全渗透)
全国职业院校技能大赛 高职组 信息安全管理与评估 (赛项) 评分标准 第三阶段 夺旗挑战CTF(网络安全渗透) 竞赛项目赛题 本文件为信息安全管理与评估项目竞赛-第三阶段赛题,内容包括:夺旗挑战CTF(…...
 
开启智能时代:深度解析智能文档分析技术的前沿与应用
开启智能时代:深度解析智能文档分析技术的前沿与应用 本章主要介绍文档分析技术的理论知识,包括背景介绍、算法分类和对应思路。通过本文学习,你可以掌握:1. 版面分析的分类和典型思想 2. 表格识别的分类和典型思想 3. 信息提取的…...
 
高级时钟项目
高级时钟项目 笔者来介绍一下一个简单的时钟项目,主要功能就是显示时间 1、背景 2、数码管版本(第一版) 3、OLED屏幕版本(第二版) 3.1、Boot 3.2、app 3.3、上位机 界面一:时间天气显示 界面二 &…...
 
跨境海淘攻略:如何实现自己批量养买家账号海淘
近年来,随着互联网的发展,网购已经成为人们日常生活中不可或缺的一部分。不仅在国内购买商品,在跨境电商行业越来越成熟,很多的消费者开始选择购买国外平台商品,价格相比国内专柜来说会更为优惠。因此,海淘…...
 
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
 
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
 
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
 
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
 
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
 
ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
