
DBLINK的定义
DBLINK全称database link,是一种数据库之间的单向连接,通常用来创建外部数据库的连接并对外部数据进行DML操作。借助这一特性,也可以用来还原数据库,快速且方便,不用在多个服务器之间来回切换传导数据。
dblink 是UXDB 的一个模块,支持从数据库会话中连接到其他数据库。
安装 dblink
alert user uxdb with superuser;\c template1
CREATE EXTENSION dblink;
select * from ux_available_extensions;
xdb *abc为当前表
CREATE EXTENSION dblink;
登录UXDB数据库,在uxdb=#下
CREATE EXTENSION dblink;
本地跨库访问
首先在 uxdb 中建立 userinfo 表,随后在本地新建一个 localdb 数据库,并在其中建立一个 local_test 数据表。
*建表
CREATE TABLE userinfo (id int primary key, name text); *插值INSERT INTO userinfo VALUES (1, 'Eric'), (2, 'Tom');*查询一下SELECT * FROM userinfo;*建localdb库CREATE DATABASE localdb;*连接库\c localdb*建表CREATE TABLE local_test (id serial primary key, ival int default 0, create_time timestamptz not null default now());*插值INSERT INTO local_test(ival) VALUES (1), (2), (3), (4);*查询一下SELECT * FROM local_test;
在 uxdb 数据库中查询 local_test 表,就需要使用到 dblink 来访问了。首先,我们通过 dblink_connect 创建一个连接。
SELECT dblink_connect('local_dblink_test','dbname=localdb hostaddr=127.0.0.1 port=5432 user=uxdb password=mypassword');
再通过 dblink 执行查询。
SELECT * FROM dblink('local_dblink_test', 'SELECT * FROM local_test;') AS lt(id int, ival int, create_time timestamptz);
再把返回结果与本库中的表进行联合查询。
SELECT u.id, name, create_time FROM userinfo u JOIN dblink('local_dblink_test', 'SELECT * FROM local_test;') AS lt(id int, ival int, create_time timestamptz) on u.id = lt.id;
可以为dblink创建一个视图。
CREATE VIEW v_localdb_testAS SELECT * FROM dblink('local_dblink_test', 'SELECT * FROM local_test;')AS lt(id int, ival int, create_time timestamptz);
SELECT * FROM v_localdb_test;SELECT u.id, name, create_time FROM userinfo u JOIN v_localdb_test v ON u.id = v.id;
备注:在 local_test 表中 id 字段类型为 serial,但是在通过 dblink 查询时返回的结果类型不能使用 serial 类型。
远端跨库访问
远端跨库访问本质也是类似的,在配置 dblink_connect 连接参数时指明远端数据库的地址、端口、用户名和密码等信息。如:
SELECT dblink_connect('remote_dblink_test', 'dbname=remotedb hostaddr=192.168.10.24 port=5432 user=uxdb password=mypassword');
操作参考上面的<本地跨库访问>
关闭 dblink
当不需要在使用 dblink 访问外部数据库时,我们需要使用 dblink_disconnect 来关闭连接。首先,我们通过 dblink_get_connections 来查看现有的 dblink 连接,随后将其关闭。
SELECT dblink_get_connections();
SELECT dblink_disconnect('remote_dblink_test');SELECT dblink_disconnect('local_dblink_test');











