KingbaseES错误unsupported for database link处理

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。

具体原因:

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

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

  3. 退出或者建立新的连接后,新开的连接进程里面未加载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.

# 完成问题复现
posted @ 2023-02-28 10:06  KINGBASE研究院  阅读(116)  评论(0编辑  收藏  举报