前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【深度解析】偶遇ORA-02020错误

【深度解析】偶遇ORA-02020错误

作者头像
Yunjie Ge
发布2022-04-24 08:19:14
1.4K0
发布2022-04-24 08:19:14
举报
文章被收录于专栏:数据库与编程
前言

开发人员反映数据库报错:

代码语言:javascript
复制
Error: ORA-04052: 在查找远程对象 IRMS20.T_ORDER_HUIZONG@JIAKELINK 时出错     
代码语言:javascript
复制
       ORA-00604: 递归 SQL 级别 1 出现错误       
代码语言:javascript
复制
       ORA-02020: 过多的数据库链接在使用中
分析

1.参考文档:

ORA-02020 Error when Using Database Links in a Lookup (文档 ID 463403.1)

2.查看错误介绍

代码语言:javascript
复制
[oracle@sddwdb1 ~]$ oerr ora 202002020, 00000, "too many database links in use"// *
代码语言:javascript
复制
Cause:  The current session has exceeded the INIT.ORA open_links maximum.// *
代码语言:javascript
复制
Action: Increase the open_links limit, or free up some open links by//
代码语言:javascript
复制
committing or rolling back the transaction and canceling open//          
代码语言:javascript
复制
cursors that reference remote databases.

从 错误介绍原因是open_links参数超过了最大限制,open_link参数表示一个会话可以打开的dblink的最大连接数,11g中数据库默认是4,从错误原因得知这里出现错误应该就是单个会话使用的dblink太多,而数据库参数设置的太小了出现的问题。

参考文档:Error 'Ora-02020 Too Many Database Links In Use' When Trying To Run Workbooks After Database Upgrade (文档 ID 832046.1)

3.下面来进行模拟测试

(1)配置tnsnames.ora、创建dblink

代码语言:javascript
复制
zynx=(DESCRIPTION=
    (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
        (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
     )
     (CONNECT_DATA =
           (SERVER = DEDICATED)
           (SERVICE_NAME = xxx)
     )
  )
代码语言:javascript
复制
dw =(DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
    (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = xxx)
     )
  )
代码语言:javascript
复制
kf =(DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
    (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = xxx)
     )
  )
代码语言:javascript
复制
sms =(DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
    (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = xxx)
    )
  )
代码语言:javascript
复制
sjfx =(DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
    (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = xxx)
     )
  )
代码语言:javascript
复制
create user zjtest identified by zj_TEST_0107  account unlock default tablespace users;
代码语言:javascript
复制
grant dba to ZJTEST;
代码语言:javascript
复制
create public database link zynxtest connect to zjtest identified by "zj_TEST_0107" using 'zynx';
代码语言:javascript
复制
create public database link dwtest connect to zjtest identified by "zj_TEST_0107" using 'dw';
代码语言:javascript
复制
create public database link kftest connect to zjtest identified by "zj_TEST_0107" using 'kf';
代码语言:javascript
复制
create public database link smstest connect to zjtest identified by "zj_TEST_0107" using 'sms';
代码语言:javascript
复制
create public database link sjfxtest connect to zjtest identified by "zj_TEST_0107" using 'sjfx';

(2)测试连接

代码语言:javascript
复制
select table_name from user_tables@zynxtest
代码语言:javascript
复制
union allselect table_name from user_tables@dwtest
代码语言:javascript
复制
union allselect table_name from user_tables@kftest
代码语言:javascript
复制
union allselect table_name from user_tables@smstest
代码语言:javascript
复制
union allselect table_name from user_tables@sjfxtest

可以看到参数设置是4,而一个会话中使用4个dblink是没有问题的,下面来使用5个dblink:

可以看到出现错误了,这是一个sql中使用5个dblink,下面来测试一个会话中5个sql使用5个dblink:

可以看到单个sql使用一个dblink,只要是在同一个会话中超过5个不同的远端连接就不行。

因为一个会话打开dblink连接之后,只要会话不退出,dblink连接就不关闭,所以只要是一个会话不管几个sql都是不行的。

(3)在所有库删除创建的测试link、测试用户

代码语言:javascript
复制
drop user ZJTEST cascade;
代码语言:javascript
复制
drop public database link zynxtest;
代码语言:javascript
复制
drop public database link sjfxtest;
代码语言:javascript
复制
drop public database link dwtest;
代码语言:javascript
复制
drop public database link kftest;
代码语言:javascript
复制
drop public database link smstest;
解决

增加open_links参数值,这个参数是静态参数,修改之后需要重启数据库。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 山东Oracle用户组 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 分析
  • 解决
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档