OceanBase v4.2 MySQL模式DBLINK读功能特性解读

2024年 5月 7日 48.5k 0

0. 概述

OceanBase 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. 创建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创建成功。

OceanBase v4.2 MySQL模式DBLINK读功能特性解读-1

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创建成功。

OceanBase v4.2 MySQL模式DBLINK读功能特性解读-2

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表。

OceanBase v4.2 MySQL模式DBLINK读功能特性解读-3

示例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。

OceanBase v4.2 MySQL模式DBLINK读功能特性解读-4

示例3

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

select * from mysql.datetime_t@ob_dblink;

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

OceanBase v4.2 MySQL模式DBLINK读功能特性解读-5

3. 删除DBLINK

在不需要使用已创建好的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已经被删除。

OceanBase v4.2 MySQL模式DBLINK读功能特性解读-6

4. 查看已创建的DBLINK

4.1 语法

4.2版本查询方法:

select * from oceanbase.dba_db_links;

OceanBase v4.2 MySQL模式DBLINK读功能特性解读-7

结语

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

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论