KingbaseES DBLink 擴展介紹


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 必須支持連接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM