TDSQL PG 数据库的 DBLink 功能实现了跨数据源访问的能力,您可以在本地数据库上访问远端数据库。
当前,对于 TDSQL PG 数据库的 Oracle 模式,支持创建:
1、TDSQL PG 数据库到 TDSQL PG 数据库下的 DBLink。
2、TDSQL PG 数据库到 Oracle 数据库的 DBlink。
说明:
仅支持oracle模式的库下支持创建dblink,且源端数据库和目标端数据库都是Oracle模式。
前提条件
创建 DBLink 的用户需要具备 CREATE DATABASE LINK 权限。
创建 TDSQL PG 数据库到 TDSQL PG 数据库的 DBLink
创建oracle模式的数据库db_ora。
create database db_ora sql mode oracle;
如果要访问远端的 TDSQL PG 数据库,可以在 TDSQL PG Oracle模式下的数据库创建对应的 DBLink。
创建 DBLink 需要指定 DBLink 名称并且提供远端数据库的用户名、密码、IP 地址、端口号及访问类型等信息。
DBLink 的 SQL 语法如下:
db_ora=# CREATE DATABASE LINK <dblink_name> CONNECT TO <username> IDENTIFIED BY '<password>' USING
'(DESCRIPTION = (HOST = <ip>)(PORT = <port>)(SERVICE_NAME = <database_name>)(SCHEMA_NAME=<schema_name>))';
相关参数说明如下:
<dblink_name>:DBLink 的名称,长度不超过 63 个字符。<username>:远端 TDSQL PG 数据库的用户名。<password>:远端 TDSQL PG 数据库用户名的登录密码。<ip>:指定远端TDSQL PG 数据库的 IP 地址。<port>:指定远端 TDSQL PG 数据库的端口号。<database_name>:远端 TDSQL PG 数据库名称。<schema_name>: 远端TDSQL PG 数据库下的模式。
示例如下:- 创建TDSQL PG 数据库连接到远端TDSQL PG 数据库的dblink
db_ora=# set dblink_types to 'postgresql';
SET
db_ora=# create extension "postgres_fdw" ;
CREATE EXTENSION
db_ora=# CREATE DATABASE LINK tbase_dblink_ora CONNECT TO <username> IDENTIFIED BY '<password>' USING
'(DESCRIPTION = (HOST = <ip>)(PORT = <port>)(SERVICE_NAME = <database_name>)(SCHEMA_NAME=<schema_name>))';
CREATE DATABASE LINK
查看已经创建的dblink
db_ora=# select * from PG_DBLINK ;
表格字段说明如下:
DBLINKNAME: dblink名称DBLINKOWNER: dblink的所有者USERNAME: dblink用于连接远端库的用户HOST: dblink连接远端库的host信息PORT: dblink连接远端库的端口号DBLINK_FOREIGN_SERVER: dblink对应的foreign server名称
通过dblink访问、修改远端数据库的数据
向远端数据库的test_dblink_table插入一条数据(1,'tbase dblink test'),并查询。
说明:
需要先在远端库对应的模式下创建
test_dblink_table表
db_ora=# insert into test_dblink_table@tbase_dblink_ora values (1,'tbase dblink test');
INSERT 0 1
db_ora=# select * from test_dblink_table@tbase_dblink_ora ;
I | CONTENT
---+-------------------
1 | tbase dblink test
(1 row)
删除创建的dblink
删除dblink tbase_dblink_ora。
db_ora=# drop database link tbase_dblink_ora;
NOTICE: (00000) drop cascades to 2 other objects
drop cascades to foreign table ORA_172_17_0_2_1521_U1.TEST_DBLINK_TABLE
DROP DATABASE LINK
创建 TDSQL PG 数据库到Oracle数据库的dblink
如果要访问远端的Oracle数据库,可以在 TDSQL PG Oracle模式下创建对应的 DBLink。
创建 DBLink 需要指定 DBLink 名称并且提供远端Oracle数据库的服务名、用户名、密码、IP 地址、端口号等信息。
DBLink 的 SQL 语法如下:
db_ora=# CREATE DATABASE LINK <dblink_name> CONNECT TO <username> IDENTIFIED BY '<password>' USING
'(DESCRIPTION = (HOST = <ip>)(PORT = <port>)(SERVICE_NAME = <oracle_service_name>))';
相关参数说明如下:
<dblink_name>:DBLink 的名称,长度不超过 63 个字符。<username>:远端Oracle数据库的用户名。<password>:远端Oracle数据库用户名的登录密码。<ip>:指定远端Oracle数据库的 IP 地址。<port>:指定远端Oracle 数据库的端口号。<oracle_service_name>:远端Oracle数据库的服务名称。
示例如下:
创建到Oracle数据库的Database Link
db_ora=# set dblink_types to 'oracle_x86';
SET
db_ora=# create extension "oracle_fdw" ;
CREATE EXTENSION
db_ora=# CREATE DATABASE LINK tbase_dblink_oracle CONNECT TO <username> IDENTIFIED BY '<password>' USING
'(DESCRIPTION = (HOST = <ip>)(PORT = <port>)(SERVICE_NAME = <oracle_service_name>))';
CREATE DATABASE LINK
通过dblink访问远端Oracle数据库的对象
目前TDSQL PG远端为Oracle数据库的DBLINK支持访问远端Oracle数据库的表/视图/同义词,访问对象为远端同义词时,远端同义词的对象也只能是指代的表或视图
db_ora=# SELECT * from oracle_table@tbase_dblink_oracle; --access TABLE in oracle side
db_ora=# SELECT * from oracle_view@tbase_dblink_oracle; --access VIEW in oracle side
db_ora=# SELECT * from oracle_synonym@tbase_dblink_oracle; --access SYNONYM in oracle side
删除创建的dblink(远端为Oracle数据库)
删除DBLINK的语法同远端为TDSQL PG数据库的DBLINK
db_ora=# drop database link tbase_dblink_oracle;
在PG模式下访问远端数据库
在PG模式下,不支持DBLINK语法,如果要访问远端的 TDSQL PG 数据库或postgresql数据库(不支持远端为Oracle数据库),您可以直接使用postgres_fdw插件完成dblink类似的功能。
1.安装插件postgres_fdw
2.创建foreign data server,语法如下:
CREATE SERVER server_name FOREIGN DATA WRAPPER wrapper_name OPTIONS(opt_list);
相关参数说明如下:
server_name: 要创建的外部服务器(foreign server)名称wrapper_name: data wrapper名称,如:postgres_fdw- opt_list: 可选项
- host 'hostip' 指定foreign server连接的远端库ip
- port 'portnumber' 指定foreign server连接的远端库端口号
- dbname 'dbname' 指定foreign server连接的远端库名
示例如下:
--安装postgres_fdw插件
db1=# create extension postgres_fdw;
CREATE EXTENSION
db1=# create server sv1 foreign data wrapper postgres_fdw options(host 'hostip',port'portnumber',dbname'dbname'); --创建foreign server
CREATE SERVER
3.创建foreign table对应远端数据库的table,语法如下:
CREATE FOREIGN TABLE table_name(column_list) SERVER server_name(opt_list)
相关参数说明:
- table_name: 表名,本地操作库的表名,之后用此表和远端库表建立关联。
- column_list: 列信息,必须和远端库的表的列信息对应。
- server_name: 要使用的已存在的外部服务器(foreign server)名
- opt_list: 可选项
- schema_name 'schema' 对应远端库的模式名,必须一致。
- table_name 'table' 对应远端库的表名,必须一致。
4.创建user mapping用于访问远端数据库的用户名和密码,语法如下:
CREATE USER MAPPING FOR user_name SERVER server_name options(opt_list)
相关参数说明:
- user_name: 本地操作库的用户名
- server_name: 要使用的已存在的外部服务器(foreign server)名
- opt_list:可选项
- user 'user_name': 对应远端库的用户名
- password 'passwd': 对应远端库的用户登录密码
- 示例:
db1=# create foreign table test_fdw_tbase(i int, value text) server sv1 options(schema_name'public', table_name'test_fdw_tbase')--创建foreign table,将本地的表test_fdw_tbase和远端库的表public.test_fdw_tbase建立关联;
CREATE FOREIGN TABLE
db1=# create user MAPPING FOR tbase server sv1 options (user'user_name',password'passwd')--创建user mapping;
CREATE USER MAPPING
使用foreign table对远端数据库的表进行修改或查询
db1=# select * from test_fdw_tbase;
i | value
---+-------
(0 rows)
db1=# insert into test_fdw_tbase values (1,'tbase fdw test');
INSERT 0 1
db1=# select * from test_fdw_tbase;
i | value
---+----------------
1 | tbase fdw test
(1 row)
删除对应的foreign table
db1=# drop foreign table test_fdw_tbase;
DROP FOREIGN TABLE
删除对应的foreign server和user mapping
db1=# drop server sv1 cascade;
NOTICE: (00000) drop cascades to user mapping for tbase on server sv1
DROP SERVER