OceanBase V4.2 MySQL模式下,如何通过DBLINK实现跨数据源访问

概述

跨数据源访问可通过 DBLINK(以下简称DBLINK)实现,从而使得业务代码能够像访问本地数据库一样轻松访问远端数据库。原先,DBLINK主要服务于Oracle模式,但由于OceanBase 的MySQL模式租户同样存在访问远端数据库的需求,因此在OceanBase 4.2版本及以后的版本中,我们开放了Mysql模式下的DBLINK读功能。

当前MySQL模式DBLINK读功能仅限于本地OceanBase集群的MySQL租户读取远端的OceanBase集群的MySQL租户的数据(同一集群下不同MySQL租户之间也可以使用MySQL DBLINK读功能)。暂不支持OceanBase的MySQL租户读取原生MySQL数据,或者原生MySQL读取OceanBase的MySQL租户数据。

MySQL DBLINK支持如下数据类型的读取。需要注意的是,受限于obclient,当前MySQL DBLINK功能拉取table schema时会把远端数据库表上enum和set类型的列当作varchar类型列处理。

复制代码
数值类型:tinyint,  smallint, mediumint, int, bigint, float, double, decimal
时间类型:date,  time,  year,  datetime,  timestamp
字符类型:char, varchar, tinyblob, tinytext, blob, text, mediumtext, longblob, longtext
其他类型:enum,set

本文将向你介绍 OceanBase MySQL 模式下的 DBLINK 基本用法。

1.1 描述

创建一个访问指定远端数据库的DBLINK。创建时需要指定DBLINK名字并且提供远端数据库的用户名、租户名、数据库名,密码、IP地址、端口号、集群名。

IP地址和端口号可以是指定某个OB Server的IP地址和端口号,或者是OceanBase集群的Proxy的IP地址和端口号。当创建DBLINK的端口号是集群的Proxy的端口号,且Proxy是由configurl部署的时候,需要指定集群名及Cluster名字。

1.2 语法

复制代码
create_dblink_stmt:
CREATE DATABASE LINK [if not exists] dblink_name CONNECT TO user@tenant DATABASE database_name IDENTIFIED BY password HOST 'ip:port' [CLUSTER cluster_name];

1.3 参数说明

  • dblink_name:DBLINK的名字。
  • if not exists:兼容MySQL语法
  • user:远端数据库的用户名。
  • tenant:远端数据库的租户名,如果远端数据库是Oracle,则租户名始终为oracle
  • password:远端数据库的用户名的登录密码,密码里有例如@#!等除数字、字母以外的特殊字符时,需要使用单/双引号把密码括起来避免报语法出错。
  • database_name:远端msyql租户的database,DBLINK读取数据时默认访问该数据库,如果需要访问其他数据库可以在sql中给表指定特定数据库。
  • ip:远端数据库的IP地址。IP地址可以指定为集群的Proxy的IP地址,或者集群中指定OB Server的IP地址;ip为指定OB Server的IP地址时,则要求本地数据库和指定OB Server之间的网络是可以互通的。
  • port:远端数据库的端口号。可以指定为集群的Proxy的端口号,或者集群中指定OB Server的端口号;端口号为指定OB Server的端口号时,则要求本地数据库和指定OB Server之间的网络是可以互通的。
  • cluster_name: 远端OceanBase集群的名字。只有IP和端口号是Proxy的IP和端口号,且Proxy是由configurl部署的时候才需要指定集群名字。集群名字需要使用双引号括起来,因为集群名字是大小写敏感的,这样做可以避免可能的字母升格问题。

1.4 示例

OceanBase-MySQL模式的DBLINK功能访问远端OceanBase集群时可以指定访问某个具体OB Server也可以访问远端集群的OB Proxy。通常情况下,为了保证高可用性,我们推荐使用DBLINK连接到远端OceanBase集群的OB Proxy。

1.4.1 OceanBase-MySQL模式连接远端集群某个OB Server示例

创建连接到远端OceanBase的DBLINK,名字为ob_dblink。远端数据库的租户为mysql(可以指定任意MySQL租户),用户为user1,数据库为test,密码为passwd123,IP地址为100.88.92.176,端口号为35307。以上所用IP和端口号仅为示例所用(已打码处理),用户按照实际环境指定。

复制代码
obclient>create database link if not exists ob_dblink connect to user1@mysql database test identified by 'passwd123' host '100.88.92.176:35307';
Query OK, 1 row affected (0.10 sec)

如下图所示,连接到远端OceanBase的DBLINKob_dblink创建成功。

1.4.2 OceanBase-MySQL模式连接远端集群Proxy示例

创建连接到远端OceanBase的DBLINK,名字为ob_dblink_proxy。远端数据库的租户为mysql(可以指定任意MySQL租户,示例使用了OceanBase的默认MySQL租户),用户为user1,数据库为test,密码为passwd123,集群名字为obcluster,IP地址为Proxy的IP地址100.88.92.176,端口号为Proxy的端口号35303,Proxy由configurl部署。以上所用IP和端口号仅为示例所用(已打码处理),用户按照实际环境指定。注意集群名字需要用双引号括住,防止集群名字的字母被升格为大写字母。

复制代码
obclient>create database link if not exists  ob_dblink_proxy connect to user1@mysql database test identified by 'passwd123' host '100.88.92.176:35307' CLUSTER "obcluster";
Query OK, 1 row affected (0.10 sec)

如下图所示,连接到远端OceanBase的DBLINKob_dblink_proxy创建成功。

2. 使用DBLINK查询远端数据库表数据

2.1 语法

使用dblink做查询的语法和普通的 select 语法一致,唯一区别在于,使用 DBLINK 表时需要在table_reference后加上@dblink_name后缀。

2.2 示例

示例1

使用如下sql可以读取远端集群MySql租户内test库中的 number_t 表。

复制代码
select * from number_t@ob_dblink;

如下图所示,OceanBase成功通过DBLINK访问了位于远端集群的number_t表。

示例2

使用如下sql可以读取远端集群MySql租户内test库中的 number_t 表,并和本地的 number_t 表做 join 操作。

复制代码
select a.c_decimal, b.c_double from number_t a, number_t@ob_dblink b where a.c_int = b.c_int;

如下图所示,OceanBase成功通过DBLINK访问了位于远端集群MySql租户内test库的number_t表并且和本地的number_t表做了join。

示例3

ob_dblink创建时默认访问test库中的对象,如果需要访问其他库下的对象,可以显式指定数据库。例如使用如下sql可以读取远端集群MySql租户内mysql库中的 datetime_t 表。

复制代码
select * from mysql.datetime_t@ob_dblink;

如下图所示,OceanBase成功通过DBLINK访问了位于远端集群的number_t表并且和本地的number_t表做了join。

在不需要使用已创建好的DBLINK时,或者创建时给了错误的连接串(IP、PORT、用户名、密码等),我们可以使用删除语法将DBLINK删除。

3.1 语法

复制代码
drop_dblink_stmt:
DROP DATABASE LINK [if exists] dblink_name;

3.2 参数说明

dblink_name:DBLINK的名字。

3.3 示例

使用如下sql可以删除名为ob_dblink的DBLINK。

复制代码
OceanBase(root@oceanbase)>drop database link if exists ob_dblink;
Query OK, 1 row affected (0.072 sec)

如下图所示,ob_dblink已经被删除。

4.1 语法

4.2版本查询方法:

复制代码
select * from oceanbase.dba_db_links;

结语

本文简要介绍了 OceanBase v4.2 版本 MySQL 模式下 DBLINK的创建、删除和读操作。OceanBase v4.1 的 Oracle 模式下,不仅支持了 DBLink 的创建、删除、读操作,还已经支持了 DBLINK 的 DELETE、INSERT、UPDATE和MERGE INTO操作。在未来版本的 MySQL 模式中,我们也会逐步兼容这些功能,敬请期待!

相关推荐
冰 河3 天前
《Mycat核心技术》第21章:高可用负载均衡集群的实现(HAProxy + Keepalived + Mycat)
分布式·微服务·程序员·分布式数据库·mycat
韩曙亮6 天前
【系统架构设计师】数据库系统 ② ( 分布式数据库 | 分布式数据库 特点 | 分布式数据库 分层模式 | 两阶段提交协议 - 2PC 协议 )
数据库·分布式·系统架构·分布式数据库·软考·dbms·两阶段提交协议
ActionTech8 天前
ChatDBA VS DeepSeek:快速诊断 OceanBase 集群新租户数据同步异常
oceanbase·deepseek·chatdba·爱可生
码农老起9 天前
从Oracle到OceanBase数据库迁移:全方位技术解析
数据库·oracle·oceanbase
OceanBase数据库官方博客9 天前
数据文件误删除,OceanBase中如何重建受影响的节点
oceanbase·分布式数据库·运维管理·实践经验
码农老起12 天前
OceanBase数据库基于脚本的分布式存储层性能深度优化
数据库·分布式·oceanbase
码农老起12 天前
万亿级数据量的OceanBase应用从JVM到协议栈立体化改造实现性能调优
jvm·oceanbase
OceanBase数据库官方博客14 天前
OceanBase 读写分离最佳实践
oceanbase·分布式数据库·读写分离·最佳实践
OceanBase数据库官方博客16 天前
网易云信架构升级实践,故障恢复时间缩至8秒
oceanbase·分布式数据库·架构选型·布道师计划
OceanBase数据库官方博客18 天前
自然语言秒转SQL—— 免费体验 OB Cloud Text2SQL 数据查询
数据库·sql·ai·oceanbase·分布式数据库·向量·text2sql