创建DBLink

最近更新时间: 2026-03-13 09:03:00

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