DBLink 擴展插件功能與 Kingbase_FDW 類似,用於遠程訪問KingbaseES 數據庫。相比於Kingbase_FDW,DBLink 功能更強大,可以執行DML,還可以通過 begin ... end 完成事務操作。以下介紹dblink擴展的使用。
一、測試環境
本地數據庫 | 遠程數據庫 | |
IP | 192.168.237.42 | 192.168.237.43 |
用戶 | user_local | user_remote |
1、本地數據庫創建用戶
test=# create role user_local with login; CREATE ROLE test=# alter role user_local with password 'user_local'; ALTER ROLE test=# create schema user_local authorization user_local; CREATE SCHEMA
2、遠程數據庫創建用戶與測試表
test=# create role user_remote with login; CREATE ROLE test=# alter role user_remote with password 'user_remote'; ALTER ROLE test=# create schema user_remote authorization user_remote; CREATE SCHEMA test=# \c test user_remote You are now connected to database "test" as user "user_remote". test=> create table t1(id integer,name char(9)); CREATE TABLE test=> insert into t1 values(1,'a'); INSERT 0 1 test=> insert into t1 values(2,'b'); INSERT 0 1
二、創建擴展插件
1、創建擴展
test=# create extension dblink; CREATE EXTENSION 創建后,pg_foreign_data_wrapper 會新增一條記錄。 test=# select * from pg_foreign_data_wrapper where fdwname='dblink_fdw'; oid | fdwname | fdwowner | fdwhandler | fdwvalidator | fdwacl | fdwoptions -------+------------+----------+------------+--------------+--------+------------ 16466 | dblink_fdw | 10 | 0 | 16465 | |
2、創建Server
create server dblink_to43 foreign data wrapper dblink_fdw options (hostaddr '192.168.237.43' , dbname 'test'); test=# select * from pg_foreign_server where srvname='dblink_to43'; oid | srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions -------+-------------+----------+--------+---------+------------+--------+--------------------------------------- 24693 | dblink_to43 | 10 | 24692 | | | | {hostaddr=192.168.237.43,dbname=test} (1 row) grant usage on foreign server dblink_to43 to user_local;
3、創建用戶映射
create user mapping for user_local server dblink_to43 options (user 'user_remote' , password 'user_remote'); test=# select * from pg_user_mappings; umid | srvid | srvname | umuser | usename | umoptions -------+-------+-------------+--------+------------+----------------------------------------- 24694 | 24693 | dblink_to43 | 24645 | user_local | {user=user_remote,password=user_remote} (1 row)
三、測試數據庫訪問
1、dblink 連接
test=> \c test user_local You are now connected to database "test" as user "user_local". test=> select dblink_connect('conn01','dblink_to43') ; dblink_connect ---------------- OK (1 row) test=> select * from sys_database_link; oid | lnkname | lnknamespace | lnkuser | lnkowner | lnkserver | dbtype | lnkoptions | lnkcreated -----+---------+--------------+---------+----------+-----------+--------+------------+------------ (0 rows) test=> select * from all_db_links; owner | db_link | username | host | created -------+---------+----------+------+--------- (0 rows)
以dblink_connect 方式連接,采用的是長連接,直到顯示關閉,或者數據庫會話結束。
Note:dblink 信息在 sys_database_link 是看不到的,sys_database_link 是配合 kdb_database_link 插件使用。
2、數據訪問
test=> select * from dblink('conn01','select * from t1'); id | name ----+----------- 1 | a 2 | b (2 rows) test=> select dblink_exec('conn01','insert into t1 values(1,''a'')'); dblink_exec ------------- INSERT 0 1 (1 row) test=> select * from dblink_exec('conn01','insert into t1 values(1,''a'')'); dblink_exec ------------- INSERT 0 1 (1 row)
3、事務操作
test=> SELECT dblink_exec('conn01', 'BEGIN'); dblink_exec ------------- BEGIN (1 row) test=> select dblink_exec('conn01','insert into t1 values(1,''a'')'); dblink_exec ------------- INSERT 0 1 (1 row) test=> SELECT dblink_exec('conn01', 'COMMIT'); dblink_exec ------------- COMMIT (1 row)
4、斷開連接
test=> SELECT dblink_disconnect('conn01'); dblink_disconnect ------------------- OK (1 row)
四、其他注意點
以上例子的是用dblink_connect 創建連接,是長連接。也可以在執行SQL的同時創建連接:
test=> select * from dblink('dbname=test host=192.168.237.43 port=54321 user=user_remote password=user_remote','select * from t1');
還有,dblink 實際是數據庫的連接,前提是目標端的 sys_hba.conf 必須支持連接。