Inceptor/ArgoDB 中 DBLink 的 DDL/DML 操作示例

  使用配置
内容纲要

概要描述

本文主要描述Inceptor/ArgoDB 中 DBLink 的 DDL/DML 操作示例。

详细说明

各类操作对 Inceptor/ArgoDB 的版本可能存在兼容性要求,请参考此处

创建 DBLink

创建方式1:使用 Inceptor/ArgoDB 镜像中的 JDBC 驱动

创建语句如下:

CREATE DATABASE LINK link_name CONNECT TO jdbc_username IDENTIFIED BY 'jdbc_password' USING 'jdbc_URL';

参数解释:

link_name : 创建DBLink的名字,自定
jdbc_username : 要链接的外部数据源对应的username
jdbc_password : 登录外部数据源使用的password
jdbc_URL : 外部数据源对应的JDBC连接串

例如:

--MySQL
CREATE DATABASE LINK mysql_dblink CONNECT TO vt_app IDENTIFIED BY 'transwarp' USING 'jdbc:mysql://172.18.20.28:17307/app001';

--Oracle
CREATE DATABASE LINK oracle19c_link CONNECT TO lyra IDENTIFIED BY '123456' USING 'jdbc:oracle:thin:@tw-node1:1521/LYRAPDB';

--Teradata
CREATE DATABASE LINK td CONNECT TO dbc IDENTIFIED BY 'dbc' USING 'jdbc:teradata://172.18.20.21/dbs_port=1025,database=jdbctest';
创建方式2:使用手动指定路径的 JDBC 驱动

创建语句如下:

CREATE DATABASE LINK link_name CONNECT TO jdbc_username IDENTIFIED BY 'jdbc_password' USING 'jdbc_URL' with 'jdbc_driver';

参数解释:

link_name : 创建DBLink的名字,自定
jdbc_username : 要链接的外部数据源对应的username
jdbc_password : 登录外部数据源使用的password
jdbc_URL : 外部数据源对应的JDBC连接串
jdbc_driver : 外部数据源所需JDBC driver在pod中对应的绝对路径

jdbc driver 一般设置为映射目录,如 /var/log/service_name/ 或者 /etc/service_name/conf/ ,后面必须加上斜杠!!
注: 。

例如:

--MySQL
CREATE DATABASE LINK mysql_dblink CONNECT TO vt_app IDENTIFIED BY 'transwarp' USING 'jdbc:mysql://172.18.20.28:17307/app001' WITH '/var/log/argodbcomputing1/';

--Oracle
CREATE DATABASE LINK oracle19c_link CONNECT TO lyra IDENTIFIED BY '123456' USING 'jdbc:oracle:thin:@tw-node1:1521/LYRAPDB' WITH '/var/log/argodbcomputing1/';

--Teradata
CREATE DATABASE LINK td CONNECT TO dbc IDENTIFIED BY 'dbc' USING 'jdbc:teradata://172.18.20.21/dbs_port=1025,database=jdbctest' WITH '/var/log/inceptor1/';
创建方式3:使用 Kerberos 认证

示例参考:

--Inceptor
CREATE DATABASE LINK cdh_link2 USING 'jdbc:hive2://node23:10000/;principal=hive/node23@HADOOP.COM' DBLINKPROPERTIES('dblink.kerberos.user'='hive/node23@HADOOP.COM','dblink.kerberos.keytab'='/var/log/inceptor2/hive.keytab');

删除/修改 DBLink 及相关表

操作 结果 注意事项
DROP 内表 如果删除DBLink内表,则数据源端的表以及数据也会被删除 DBLink内外表删除需在删除数据源之前进行,否则会遇到DBLink表删不掉的情况
DROP 外表 如果删除DBLink外表,数据源表以及数据不会被删除 DBLink内外表删除需在删除数据源之前进行,否则会遇到DBLink表删不掉的情况
DROP DBLink DROP DATABASE LINK dblink_name; 如果只删除DBLink不删除通过其创建的相关表格,表格还会存在但无法读取数据,如果以相同方式重新创建一模一样的DBLink,之前的表格还可以继续使用
ALTER DBLink 暂不支持

查询 DBLink

使用方式1:使用 @DBLink 的方式

使用示例如下:

SELECT * FROM TABLE@dblink_name;
使用方式2:建内外表的方式
创建内/外表 说明 示例
内表(不建议,支持的数据源以及数据类型有限,对应关系请参考注释部分第4条) 通过联邦计算服务创建内表,结果会在对应外部数据源创建一张表,并在联邦计算服务创建一张DBLink表,与数据源创建的表建立映射关系。如果删除DBLink内表,则数据源端的表以及数据也会被删除 CREATE TABLE transfer_log (log_id INTEGER, log_ts TIMESTAMP, from_user VARCHAR(50) ) stored as dblink with dblink mysql8_link tblproperties("dblink.table.name"="lyra_test.transfer_log"); –tplproperties对于部分数据库可选,TD为强制要写
外表(推荐方式) 创建外表前提是数据源端已有表格,用户需要查询已有数据或者同步插入新数据,只在联邦计算服务上创建一张DBLink外表,与数据源的表建立映射关系即可。如果删除DBLink外表,数据源表以及数据不会被删除 create external table ex_transfer_log ( col_id DECIMAL(4) ) stored as dblink with dblink mysql8_link tblproperties("dblink.table.name"="lyra_test.transfer_log");

注意:

1)针对大部分数据源创建DBLink外表不需要字段与数据源表格一一对应,如示例中随意指定一列即可

元信息管理系统会自动从联邦数据源中同步Schema元信息(即列信息),所以创建DBLink外表时的列信息可以写成简化Schema,如本例中的"(col_id decimal(4))"

2)tblproperties里面lyra_test为创建DBLink时JDBC指定的数据库或者其对应的Schema

例如:创建MySQL DBLink时,JDBC串中指定数据库lyra_test,那么dblink.table.name中也输入该数据库即可

创建Oracle DBLink时,JDBC连接串中指定了Instance/Service name,但是dblink.table.name中需要输入当前Instance/Service name下对应的Schema信息才可,且Schema需要全大写

3)TD创建内表方式与MySQL / Oracle略有不同,需指定tblproperties,示例SQL:create table inner_table2(id int) stored as dblink with dblink td_link tblproperties("dblink.table.name"="pd_mart_ddl.inner_table2"); 内表需与TD端表格名称相同

MySQL / Oracle等支持创建内表的数据库也可以写成这种形式

4)创建DBLink内表时,不同数据源字段类型并不是所有都支持。

DML 操作

DML相关操作只支持Insert into select,其余均不支持。

使用 @DBLink 的方式

示例:

insert into d1@mysql8_link select 1 from system.dual;
使用内外表的方式

示例:

insert into external_table / internal_table select *** from system.dual;

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。