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
创建成功。
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。
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已经被删除。
4. 查看已创建的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 模式中,我们也会逐步兼容这些功能,敬请期待!