kdb_database_link 是 KingbaseES 為了兼容oracle 語法而開發的跨數據庫訪問擴展,可用於訪問KingbaseES, Postgresql , Oracle 。以下分別介紹跨數據庫訪問KingbaseES 與Oracle 的配置過程。
注意:database link 支持DML 操作 是從V8R6C4B0021 版本開始的,對於兩端都是KingbaseES 數據庫的,只需要源端是V8R6C4B0021 版本,目標端版本無要求(但必須保證ODBC 版本能夠連接)。
一、配置ODBC
1、安裝
[root@dbhost02 etc]# yum install unixODBC.x86_64 [kb86@dbhost02 data86]$ isql --version unixODBC 2.3.1 [kb86@dbhost02 data86]$ odbcinst -j unixODBC 2.3.1 DRIVERS............: /usr/local/etc/odbcinst.ini SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources USER DATA SOURCES..: /home/kingbase/.odbc.ini SQLULEN Size.......: 8 SQLLEN Size........: 8 SQLSETPOSIROW Size.: 8
如果設置了LD_LIBRARY_PATH環境變量,則實際生效的是/usr/local/etc/odbcinst.ini ,否則可能是 /etc/odbcinst.ini。
注意:由於不同版本之間存在差異,為了保證能讀取正確的配置,強烈建議統一使用用戶主目錄下 .odbc.ini 文件。
2、配置
根據odbcinst -j 顯示的路徑,配置 odbcinst.ini 和 odbc.ini 文件。
odbcinst.ini 文件內容如下:
[root@dbhost03 etc]# cat /usr/local/etc/odbcinst.ini
# Example driver definitions
# Driver from the postgresql-odbc package
# Setup from the unixODBC package
[PostgreSQL]
Description = ODBC for PostgreSQL
Driver = /usr/lib/psqlodbcw.so
Setup = /usr/lib/libodbcpsqlS.so
Driver64 = /usr/lib64/psqlodbcw.so
Setup64 = /usr/lib64/libodbcpsqlS.so
FileUsage = 1
# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/libmyodbc5.so
Setup = /usr/lib/libodbcmyS.so
Driver64 = /usr/lib64/libmyodbc5.so
Setup64 = /usr/lib64/libodbcmyS.so
FileUsage = 1
[KingbaseES V8R6 ODBC Driver]
Description = ODBC for KingbaseES
Driver = /opt/kb86/ES/V8/Interface/odbc/kdbodbcw.so
Debug = 1
CommLog = 1
odbc.ini 文件內容如下(可選配置,主要用於isql 驗證):
[v8r6] Description=KingbaseES Driver=KingbaseES V8R6 ODBC Driver Servername=localhost Database=test02 Username=user02 Password=user02 Port=54321
3、isql 驗證 (可選)
必須配置了 odbc.ini ,才能進行此步驟
[kb86@dbhost02 data86]$ isql v8r6 +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL>
4、驗證驅動
驗證kingbase自帶的驅動 kdbodbcw.so,確保沒有"not found"
ldd /opt/kb86/ES/V8/Interface/odbc/kdbodbcw.so
二、連接kingbase
1、修改 shared_preload_libraries 參數
需將kdb_database_link 加入 shared_preload_libraries 中,注意 kdb_database_link 必須放在最后,因為,與其他項間有依賴關系。
2、創建擴展
kdb_database_link 實際是在kingbase_fdw上層進行了包裝,需要kingbase_fdw擴展。以system用戶連接,創建組件:
create extension kdb_database_link create extension kingbase_fdw
kdb_database_link 擴展創建后,會生成 $KINGBASE_DATA/sys_database_link.conf文件,類似於oracle 的tnsnames.ora 文件,用於配置服務名,在創建database link時使用。模板內容如下:
#[oradb] #dbtype=Oracle #dbname=orcl #DriverName="Oracle12C ODBC Driver" #host=127.0.0.1 #port=1521 [svr42] dbtype=Kingbase dbname=test02 DriverName="KingbaseES V8R6 ODBC Driver" host=192.168.237.42 port=54321 #[PostgreSQL] #dbtype=Postgres #dbname=postgres #DriverName="PostgreSQL ODBC Driver" #host=127.0.0.1 #port=5432
3、創建數據鏈
create public database link to_svr42 connect to 'user_remote' identified by 'user_remote' using ( DriverName = 'KingbaseES V8R6 ODBC Driver' , Host = '192.168.237.42' , Port = 54321 , Dbname = 'test' , Dbtype = 'kingbase') create public database link to_svr42 connect to 'user02' identified by 'user02' using 'svr42' --或者修改sys_database_link.conf,配置正確的連接串。
數據鏈創建完后,會在pg_foreign_server 和 pg_user_mappings 增加相關條目
test=# select * from pg_user_mappings; umid | srvid | srvname | umuser | usename | umoptions -------+-------+-----------------------------+--------+------------+----------------------------------------- 16535 | 16534 | dblink_server_to_svr42_2200 | 0 | public | {user=user_remote,password=user_remote} (2 rows) test=# select * from pg_foreign_server; oid | srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions -------+-----------------------------+----------+--------+---------+------------+---------------------------------------+---------------------------------------------- 16534 | dblink_server_to_svr42_2200 | 10 | 16495 | | | | {dbname=test,host=192.168.237.42,port=54321}
4、驗證數據鏈
test=# select * from user02.t1@to_svr42; id ---- (0 rows) test=# insert into user02.t1@to_svr42 values(1); INSERT 0 1 test=# update user02.t1@to_svr42 set id=2; UPDATE 1 test=# select * from user02.t1@to_svr42; id ---- 2 (1 row) test=# delete from user02.t1@to_svr42; DELETE 1
5、刪除數據鏈
drop database link public.to_svr42;
三、連接oracle
1、創建擴展
如果要通過database link 連接訪問oracle數據庫,除了kdb_database_link外,還需要 oracle_fdw 插件。
create extension oracle_fdw; create extension kdb_database_link;
2、配置sys_database_link.conf
[oradb] dbtype=Oracle dbname=SOGG DriverName="Oracle ODBC Driver" host=192.168.237.41 port=1521
3、配置odbc
修改 /usr/local/etc/odbcinst.ini , 增加:
[Oracle ODBC Driver] Description = ODBC for Oracle Driver = /opt/kb86/ES/V8/Server/lib/libsqora.so.19.1
Note:具體配置ODBC 連接oracle 過程見:https://www.cnblogs.com/kingbase/p/14921071.html
4、創建database link
create public database link to_ora42 connect to 'USER02' identified by 'user02' using 'oradb' create public database link to_ora42 connect to 'USER02' identified by 'user02' using ( DriverName = 'Oracle ODBC Driver' , Host = '192.168.237.41' , Port = 1521 , Dbname = 'SOGG' , Dbtype = 'oracle')
數據鏈創建后,可以在 字典表sys_database_link 與 pg_foreign_server 看到相關信息。
5、驗證數據訪問