#dblink配置管理
对于从YashanDB到Oracle数据库的链接,系统存在如下前置要求:
YashanDB服务端已安装DBLink插件(可通过查看$YASDB_HOME/third路径下是否存在dblink文件夹确认)。
YashanDB服务端已下载和安装Oracle Instant Client。
未安装Oracle Instant Client的环境中,通过DBLink向Oracle数据库发起远程链接,将会由于缺少必要的组件而抛出错误。
YashanDB服务端已安装libaio库。
YashanDB服务端缺少libaio库时,如通过DBLink向Oracle数据库发起首次远程链接,yex_server沙箱进程可能在加载驱动时发生core dump(yasdb进程无影响)。本错误只在首次链接时影响yex_server进程,再次链接时系统可自动恢复正常。
鉴于上述要求,对于可能使用YashanDB -> Oracle数据库远程链接的数据库,管理员应按下述指导进行必要的操作。
# Oracle Instant Client下载和安装
以YashanDB安装用户(例如yashan)登录到数据库服务器。
根据YashanDB服务器环境,从Oracle官网 (opens new window)下载对应的Oracle Instant Client安装包。
OCI版本要求如下:
x86:21系列
ARM:19系列
将安装包解压到本地路径,例如
/home/oracle-instant-client/。设置动态库依赖路径。
$ vi ~/.bashrc # 在文件中添加如下信息并保存 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/oracle-instant-client/lib生效环境变量。
$ source ~/.bashrc # 在回显信息中检查是否已存在上述路径 $ echo $LD_LIBRARY_PATH
# libaio库安装
以YashanDB安装用户(例如yashan)登录到数据库服务器。
以Centos为例,通过以下命令安装libaio库:
yum install libaio
# 创建DBLink并进行操作
以测试用户sales通过数据库客户端工具yasql连接数据库,数据库默认连接端口为1688。
yasql sales/********@192.168.1.2:1688 YashanDB SQL Enterprise Edition Release {version_number} x86_64 Connected to: YashanDB Server Enterprise Edition Release {version_number} x86_64 - Linux SQL>创建DBLink。
以下为示例,也可以参考CREATE DATABASE LINK了解详细的DBLINK链接配置。
-- YashanDB与YashanDB的数据库链接 CREATE DATABASE LINK dblink_yashan CONNECT TO sales IDENTIFIED BY sales USING '192.168.1.2:1688'; -- YashanDB与Oracle的数据库链接,且对所有用户可见 CREATE PUBLIC DATABASE LINK dblink_oracle CONNECT TO REGRESS IDENTIFIED BY REGRESS USING 'oracle:192.168.1.2:1521/orcl';以DBLink链接到远端Oracle为例,进行数据操作。
-- 以下为远端的Oracle上department表的表定义 desc department; Name Null? Type ----------------------------------------- -------- ---------------------- DEPARTMENT_ID NUMBER FIRST_NAME VARCHAR2(20) -- 在YashanDB上查询department表; SELECT * FROM department@dblink_oracle; DEPARTMENT_ID DEPARTMENT_NAME ----------------------- ------------------------------ 00001 develop --在YashanDB上对远端department表插入数据; INSERT INTO department@dblink_oracle VALUES(00002,test); SELECT * FROM department@dblink_oracle; DEPARTMENT_ID DEPARTMENT_NAME ----------------------- ------------------------------ 00001 develop 00002 test数据库服务可并发打开的DBLink连接由系统参数DBLINK_CURSOR_COUNT进行控制,参数默认值为32,可根据业务需求调整系统参数值。
DBLink连接会申请系统空闲内存来缓存远端表业务数据,要求系统空闲内存 > DBLINK_CURSOR_COUNT * 513K,否则系统内存不足时再次打开dblink会产生报错YAS-00101。
查看当前数据库服务上已创建的DBLink链接。
SELECT * FROM DBA_DB_LINKS;查看当前会话中已开启的所有DBlink及其事务状态。
SELECT * FROM V$DBLINK;若确认暂时无需再次使用当前会话中开启的某个DBLink,可将其关闭释放相应资源。
-- 先按需提交或回滚对应DBLink中的远端事务后才能关闭DBLink COMMIT; -- 方式1:执行ALTER SESSION语句关闭目标DBLink ALTER SESSION CLOSE DATABASE LINK dblink_oracle; -- 方式2:调用DBMS_SESSION高级包关闭目标DBLink exec DBMS_SESSION.CLOSE_DATABASE_LINK(dblink_oracle);
可通过DBLink语法说明了解更多功能及约束。
# 常见故障处理
# YAS-07315 too many dblink result sets
当执行SQL语句访问DBLink远端表时,如发生YAS-07315 too many dblink result sets错误提示,说明当前允许打开的DBLink远端表数量已超过系统参数DBLINK_CURSOR_COUNT配置值。
解决方案:
方案1:在确认无需再次使用某个DBLink后,可关闭目标DBLink释放相应资源,关闭前需提交/回滚其对应的事务。
-- 1. 查询当前会话中已开启的DBLink以及是否正处于事务中 SELECT DB_LINK,IN_TRANSACTION FROM V$DBLINK; DB_LINK IN_TRANSACTION ---------------------------------------------------------------- -------------- LinkToOra YES …… -- 2. 先按需提交或回滚对应DBLink中的远端事务后才能关闭DBLink COMMIT; -- 3. 确认目标DBLink的事务状态 SELECT DB_LINK,IN_TRANSACTION FROM V$DBLINK WHERE DB_LINK = 'LinkToOra'; DB_LINK IN_TRANSACTION ---------------------------------------------------------------- -------------- LinkToOra NO -- 4. 关闭目标DBLink -- 方式1:执行ALTER SESSION语句关闭目标DBLink ALTER SESSION CLOSE DATABASE LINK dblink_oracle; -- 方式2:调用DBMS_SESSION高级包关闭目标DBLink exec DBMS_SESSION.CLOSE_DATABASE_LINK(dblink_oracle);方案2:在确认数据库服务器内存充足的情况下,可适当调大
DBLINK_CURSOR_COUNT参数值,需重启数据库生效。-- 1.查看系统参数配置
show parameter DBLINK_CURSOR_COUNT
NAME VALUE
DBLINK_CURSOR_COUNT 32
-- 2.当打开的DBLink远端表数量超过系统参数值时将发生错误提示 SELECT * FROM t1@dblink1 a1 CROSS JOIN t1@dblink1 a2 CROSS JOIN t1@dblink1 a3 CROSS JOIN t1@dblink1 a4 CROSS JOIN t1@dblink1 a5 CROSS JOIN t1@dblink1 a6 CROSS JOIN t1@dblink1 a7 CROSS JOIN t1@dblink1 a8 CROSS JOIN t1@dblink1 a9 CROSS JOIN t1@dblink1 a10 CROSS JOIN t1@dblink1 a11 CROSS JOIN t1@dblink1 a12 CROSS JOIN t1@dblink1 a13 CROSS JOIN t1@dblink1 a14 CROSS JOIN t1@dblink1 a15 CROSS JOIN t1@dblink1 a16 CROSS JOIN t1@dblink1 a17 CROSS JOIN t1@dblink1 a18 CROSS JOIN t1@dblink1 a19 CROSS JOIN t1@dblink1 a20 CROSS JOIN t1@dblink1 a21 CROSS JOIN t1@dblink1 a22 CROSS JOIN t1@dblink1 a23 CROSS JOIN t1@dblink1 a24 CROSS JOIN t1@dblink1 a25 CROSS JOIN t1@dblink1 a26 CROSS JOIN t1@dblink1 a27 CROSS JOIN t1@dblink1 a28 CROSS JOIN t1@dblink1 a29 CROSS JOIN t1@dblink1 a30 CROSS JOIN t1@dblink1 a31 CROSS JOIN t1@dblink1 a32 CROSS JOIN t1@dblink1 a33;
YAS-07315 too many dblink result sets
-- 3.修改系统参数 ALTER SYSTEM SET DBLINK_CURSOR_COUNT=64 scope=spfile;
-- 4.重启数据库 -- 5.登录后查看参数值 show parameter DBLINK_CURSOR_COUNT
NAME VALUE
DBLINK_CURSOR_COUNT 64
-- 6.重新执行业务SQL可正常执行 SELECT * FROM t1@dblink1 a1 CROSS JOIN t1@dblink1 a2 CROSS JOIN t1@dblink1 a3 CROSS JOIN t1@dblink1 a4 CROSS JOIN t1@dblink1 a5 CROSS JOIN t1@dblink1 a6 CROSS JOIN t1@dblink1 a7 CROSS JOIN t1@dblink1 a8 CROSS JOIN t1@dblink1 a9 CROSS JOIN t1@dblink1 a10 CROSS JOIN t1@dblink1 a11 CROSS JOIN t1@dblink1 a12 CROSS JOIN t1@dblink1 a13 CROSS JOIN t1@dblink1 a14 CROSS JOIN t1@dblink1 a15 CROSS JOIN t1@dblink1 a16 CROSS JOIN t1@dblink1 a17 CROSS JOIN t1@dblink1 a18 CROSS JOIN t1@dblink1 a19 CROSS JOIN t1@dblink1 a20 CROSS JOIN t1@dblink1 a21 CROSS JOIN t1@dblink1 a22 CROSS JOIN t1@dblink1 a23 CROSS JOIN t1@dblink1 a24 CROSS JOIN t1@dblink1 a25 CROSS JOIN t1@dblink1 a26 CROSS JOIN t1@dblink1 a27 CROSS JOIN t1@dblink1 a28 CROSS JOIN t1@dblink1 a29 CROSS JOIN t1@dblink1 a30 CROSS JOIN t1@dblink1 a31 CROSS JOIN t1@dblink1 a32 CROSS JOIN t1@dblink1 a33;
C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3
如果数据库服务重启过程中进程报错内存不足,可参考[配置文件调整](../../../../数据库管理/存储管理/数据库文件管理/配置参数文件与密码文件管理.html#配置参数文件--configuration-parameter-file)将参数值调小或扩容内存后再尝试启动数据库服务。
### YAS-07314 too many connections for dblink %s
此错误表示当前基于同一个DBLink访问远端表的次数超过系统配置值,该配置由yex_server.ini文件的`MAX_DBLINK_CONNS`参数进行约束,取值范围为[64,16384],请参考[沙箱进程管理](yex_server沙箱进程管理)进行参数调整。可参考[dblink语法说明](dblink语法说明)了解更多的沙箱进程参数配置。
### YAS-07330 ERR\_YEX\_TOO\_MANY\_XACTS
此错误表示当前打开DBLink的会话数超过了系统配置值,该配置由yex_server.ini文件的`AXS_MAX_XACTS`参数进行约束,取值范围为[1024,16384],默认值为1024,请参考[沙箱进程管理](yex_server沙箱进程管理)进行参数调整。可参考[DBLink语法说明](dblink语法说明)了解更多的沙箱进程参数配置。
### YAS-07331 transaction branches in same session can not exceed %d
一个会话能同时打开的不同的DBLink个数为32个,此错误表示当前会话同时打开的DBLink个数已超过32个。
若确认暂时无需使用某个DBLink,可在提交/回滚其对应的事务后关闭(执行[ALTER SESSION](../../SQL语句/ALTER SESSION.html#closedblink)语句或[DBMS_SESSION.CLOSE_DATABASE_LINK](../../../PL参考手册/内置高级包/DBMS_SESSION.html#closedblink)存储过程)目标DBLink释放相应资源。

