KingbaseES dblink异常unsupported for database link

2023-02-28,,

KingbaseES使用dblink查询报错:unsupported for database link

适用于:

KingbaseES所有版本。

问题现象:

KingbaseES创建kingbase_fdw、kdb_database_link扩展插件并创建dblink连接后,在当前的连接使用刚创建的dblink连接可以正常查询数据。关闭或退出当前连接后,新的连接使用dblink查询报错ERROR: Unsupported for database link。

kdb_database_link 是 KingbaseES 为了兼容oracle 语法而开发的跨数据库访问扩展,用于访问KingbaseES, Postgresql , Oracle 。

kdb_database_link 实际是在kingbase_fdw上层进行了包装,创建kdb_database_link同时需要kingbase_fdw。

具体原因:

    数据库kingbase.conf配置文件shared_preload_libraries 没有添加kdb_database_link扩展插件。

    创建kdb_database_link扩展插件后,在当前的连接可以使用dblink查询数据。主要是由于创建kdb_database_link扩展插件后扩展调用的kdb_database_link共享库文件在当前连接进程里面有加载。

    退出或者建立新的连接后,新开的连接进程里面未加载kdb_database_link扩展插件,使用dblink查询就会报错。

# 通过pmap pid可以看到kdb_database_link.so共享库文件在当前的连接进程有加载
$ pmap 847
847: kingbase: system test [local] idle
0000000000400000 9216K r-x-- kingbase
0000000000eff000 108K rw--- kingbase
0000000000f1a000 328K rw--- [ anon ]
0000000001816000 1400K rw--- [ anon ]
0000000001974000 1140K rw--- [ anon ]
00007fc83ca61000 100K r-x-- kingbase_fdw.so
00007fc83ca7a000 2048K ----- kingbase_fdw.so
00007fc83cc7a000 4K rw--- kingbase_fdw.so
00007fc83cc7b000 48K r-x-- kdb_database_link.so
00007fc83cc87000 2044K ----- kdb_database_link.so
00007fc83ce86000 4K rw--- kdb_database_link.so # 退出连接后,新连接pmap信息里面无kdb_database_link.so共享库文件
# 由于信息太多这里不展示,感兴趣可以根据复现用例,进行观察。

解决方法:

在数据库kingbase.conf配置文件shared_preload_libraries添加 kdb_database_link扩展。

# 示例
shared_preload_libraries = 'kdb_database_link,...'

问题复现:

1.创建kdb_database_link扩展插件

create extension kingbase_fdw;
create extension kdb_database_link;

2.创建dblink连接

#	DriverName :      连接驱动名称(同kingbase用户家目录下.odbc.ini文件里面名称保持一致)
# Host : 远程数据库网络地址
# Port : 远程数据库服务端口
# Dbname : 远程数据库名称
# DbType : 远程数据库类型
# DbType : 支持Oracle,KingbaseES,Postgres三种数据库类型 # 语法格式 test=# \help create database link
Command: CREATE DATABASE LINK
Description: define a new database link
Syntax:
CREATE [ PUBLIC ] DATABASE LINK dblink CONNECT TO user IDENTIFIED BY
'password' USING { connect_string | config_tag } # 示例 create public database link link30 connect to 'system' identified by 'system' using(DriverName='KingbaseES V8R6 ODBC Driver',Host='192.168.57.30',Port=54321,Dbname='test',Dbtype='kingbase');

3.使用创建的dblink查询数据

# 创建kdb_database_link扩展插件、创建dblink连接后不退出连接,直接使用创建的dblink查询

test=# select * from emp@link30;
id | name
----+------
2 | name
3 | name
(2 行记录)

4.退出当前连接或者新开连接

test=# \q
[kingbase@postgres ~]$ ksql -Usystem -dtest
ksql (V8.0)
输入 "help" 来获取帮助信息. test=# select * from emp@link31;
ERROR: Unsupported for database link. # 完成问题复现

KingbaseES dblink异常unsupported for database link的相关教程结束。

《KingbaseES dblink异常unsupported for database link.doc》

下载本文的Word格式文档,以方便收藏与打印。