概要描述
本文主要描述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;