删除 Dblink 报错 ORA-02024: database link not found 的解决方法

昨天在删除DBlink 时报错 ORA-02024,  在orcle 11g R2的帮助文档上查找这个错误信息,居然没有,苦逼公司不能上网,回家baidu一下,oracle 使用前辈们已经总结的很好了,还是记录下这个问题解决方法吧。下面引用自http://blog.csdn.net/tianlesoftware/article/details/6160196
 文章.

在Metalink上搜到了2篇与这个错误有关的文章:

Cannot drop a database link after changing the global_name ORA-02024 [ID 382994.1]

http://blog.csdn.net/tianlesoftware/archive/2011/01/23/6160082.aspx

ORA-02024: Database Link Not Found [ID 1058949.1]

http://blog.csdn.net/tianlesoftware/archive/2011/01/23/6160080.aspx

两篇文章分别讲到了2种情况。

一 .  DBLINK所有者不一致造成

我们来演示一下这种情况。

--创建dblink

SQL> conn system/admin;

已连接。

SQL>  create database link dave connect to system identified by admin using ‘

2   (DESCRIPTION =

3   (ADDRESS_LIST =

4   (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.6.100)(PORT = 1521))

5   )

6   (CONNECT_DATA =

7   (SERVICE_NAME = newccs)

8   )

9   )

10   ‘;

数据库链接已创建。

DBLINK 创建这块可以参考官网说明:

CREATE DATABASE LINK

http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_5005.htm#SQLRF01205

--查看验证dblink

SQL> select name from [email protected];

NAME

---------

NEWCCS

SQL> alter session set nls_date_format=‘yyyy-mm-dd hh24:mi:ss‘;

会话已更改。

SQL> select * from all_db_links;

OWNER      DB_LINK    USERNAME   HOST       CREATED

---------- ---------- ---------- ---------- -------------------

SYSTEM     DAVE       SYSTEM                2011-01-23 21:17:31

--我们用错误的所有者来删除看看

SQL> drop public database link dave;

drop public database link dave

*

第 1 行出现错误:

ORA-02024: 未找到数据库链接

--用正确的用户来删除

SQL> drop database link dave;

数据库链接已删除。

二. Global_name 造成

先看官网的一段说明:

If the value of the GLOBAL_NAMES initialization parameter is TRUE, then the database link must have the same name as the database to which it connects. If the value of GLOBAL_NAMES is FALSE, and if you have changed the global name of the database, then you can specify the global name.

The maximum number of database links that can be open in one session or one instance of an Oracle RAC configuration depends on the value of the OPEN_LINKS and OPEN_LINKS_PER_INSTANCE initialization parameters.

Global_names是一个布尔值,global_names的作用是创建db link时是否强制使用远程数据库的global_name,如果global_names=true,则db link name必须要求是remote database的global_name,否则创建之后db link 不能连同,缺省值是false。当global_name 为False时,如果我们修改了global_name,那么在dblink中也要相应的指定global_name. 并且当我们修改了global_name后,之前存在的我们dblink也无法删除。

Global_name 是由db_name.db_domain构成。

有关这几个参数的说明,参考:

DBID,SID,DB_NAME,DB_DOMAIN,INSTANCE_NAME,DB_UNIQUE_NAME,SERVICE_NAMES 及监听参数的说明

http://blog.csdn.net/tianlesoftware/archive/2010/12/20/6086066.aspx

CREATE DATABASE LINK

http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_5005.htm#SQLRF01205

open_links_per_instance 和 open_links 参数说明

http://blog.csdn.net/tianlesoftware/archive/2010/12/22/6090729.aspx

 

 

下面来看示例:

SQL> show parameter global_names

NAME             TYPE        VALUE

------------------------------------ ----------- -------

global_names        boolean     FALSE

SQL> select * from global_name;

GLOBAL_NAME

------------------------------

NEWCCS

SQL> create database link dave connect to system identified by admin using ‘newccs‘;

数据库链接已创建。

SQL> select * from dba_db_links;

OWNER      DB_LINK    USERNAME   HOST       CREATED

---------- ---------- ---------- ---------- -------------------

SYSTEM     DAVE       SYSTEM     newccs     2011-01-23 21:45:41

SQL>  select name from [email protected];

NAME

---------

NEWCCS

这里要注意一点,我这里创建的dblink 使用的是监听名:newccs. dba_db_links表中的host显示的是这个监听的名字。 在第一个示例中,我创建dblink 是使用命令来写的,那种情况下host 为空。

在上面提到,当global_names为False的情况下,如果我们修改了global_name,之前创建的dblink 在删除的时候也会包ORA-02024的错误。 甚至我们把global_name 改变成原来的值,也无法删除。因为这种改变没有生效。除非我们更新props$ 表。

先来验证global_name 修改后生效问题。

SQL> select * from global_name;

GLOBAL_NAME

----------------------------------------------------------------------------

NEWCCS

SQL> alter database rename global_name to newccs.tianlesoftware.com;

数据库已更改。

SQL> select * from global_name;

GLOBAL_NAME

----------------------------------------------------------------------------

NEWCCS.TIANLESOFTWARE.COM

SQL> alter database rename global_name to newccs;

数据库已更改。

SQL> select * from global_name;

GLOBAL_NAME

----------------------------------------------------------------------------

NEWCCS.TIANLESOFTWARE.COM

--这里并没有生效。

SQL> drop database link dave;

drop database link dave

*

第 1 行出现错误:

ORA-02024: 未找到数据库链接

从上面的操作,验证了如果仅通过alter 命令,是无法让global_name 还原成原来的值的。并且当global_name 发生改变后,已经存在的dblink也无法删除。

解决这个问题的方法,就是用sys用户来修改props$表:

SQL> update props$ set value$ = ‘<globalname without domain>‘ where name =‘GLOBAL_DB_NAME‘;

示例:

SQL> conn / as sysdba;

已连接。

SQL> update props$ set value$ = ‘NEWCCS‘ where name =‘GLOBAL_DB_NAME‘;

已更新 1 行。

SQL> commit;

提交完成。

然后切换到dblink 的用户,删除dblink:

SQL> conn system/admin;

已连接。

SQL> drop database link dave;

数据库链接已删除。

如果还报这种错误,可以刷新三次shared pool,在执行drop命令:

alter system flush SHARED_POOL;

alter system flush SHARED_POOL;

alter system flush SHARED_POOL;

如果刷新shared pool后还无法drop,那么就需要重启DB,在删除了。

时间: 2024-09-30 23:07:28

删除 Dblink 报错 ORA-02024: database link not found 的解决方法的相关文章

很爽的一点。用Mysql5.x以上版本出现报错#1929 Incorrect datetime value: &#39;&#39; for column &#39;createtime&#39; 解决方法

我的mysql安装后,保存删除表数据总是出现#1929 Incorrect datetime value: '' for column 'createtime' 的报错提醒,导致不能删除表里数据: 原因: 5以上的版本如果时期时间是空值应该要写NULL: 官方解释说:得知新版本mysql对空值插入有"bug", 要在安装mysql的时候去除默认勾选的enable strict SQL mode 那么如果我们安装好了mysql怎么办了,解决办法是更改mysql中的配置 my.ini 解决

报错:Could not launch &#39;app name&#39;,解决方法

如果你也出現了“Could not launch 'app name'”,No such file or directory (/Users/apple/Library/Developer/Xcode/DerivedData/mytest-ejkagqxooxgmtdfsdoygtyzflibe/Build/Products/Debug-iphoneos/mytest.app/mytest) 这样的讯息的話,有几个处理方法1.刪除DerivedData資料夾法1.1 完全离开Xcode,然后再做

python中引入包的时候报错AttributeError: module &#39;sys&#39; has no attribute &#39;setdefaultencoding&#39;解决方法?

python中引入包的时候报错:import unittestimport smtplibimport timeimport osimport sysimp.reload(sys)sys.setdefaultencoding('utf-8') AttributeError: module 'sys' has no attribute 'setdefaultencoding'解决方法: 1.python2中解决方法:reload(sys)sys.setdefaultencoding('utf-8'

python 编码报错问题 &#39;ascii&#39; codec can&#39;t encode characters 解决方法

python在安装时,默认的编码是ascii, 当程序中出现非ascii编码时,python的处理常常会报这样的错 'ascii' codec can't encode characters python没办法处理非ascii编码的, 此时需要自己设置将python的默认编码,一般设置为utf8的编码格式. 查看python的默认编码 print sys.getdefaultencoding() 解决方法一(已通过验证,顺带也解决了我之前字符前一直加u的问题) 在python安装目录下,进入\P

Centos6 下启动httpd报错 Could not reliably determine the server&#39;s解决方法

在启动httpd的时候报错: 修改/etc/httpd/conf/httpd.conf 配置,去掉ServerName 前的#(或者手动添加ServerName localhost:80)然后重启httpd服务: Centos6 下启动httpd报错 Could not reliably determine the server's解决方法

keil 通过JTAG下载程序 报错:error: flash download failed - &quot;cortex-m3&quot;的解决方法

硬件环境: nxp lpc1788fbd208核心板 软件环境: keil uvision4 segger j-flash arm v4.50 其他: 芯片选择正确 jtag模式 现象:之前用JFlashARM.exe下载了程序,在没有擦除程序的情况下,JTAG模式下用keil下载程序 报错 error: flash download failed - "cortex-m3" 原因:用jFlashARM.exe下载程序后,没有擦除程序 解决:擦除lpc1788 上的程序,然后在keil

在WSL中安装swool报错 error: unrecognized command line option &#39;-V&#39; 的解决方法

Windows Subsystem for Linux Ubuntu中使用pecl安装swool时遇到错误"error: C compiler cannot create executables"."error: unrecognized command line option '-V'" 解决方法 先看解决方法, 将gcc版本降低到4.8即可,因为高版本gcc取消了-V参数: sudo apt install gcc-4.8 -y sudo update-alte

maven, install 时候报错“编码 gbk 的不可映射字符”的解决方法

myeclipse maven, install 时候报错"编码 gbk 的不可映射字符" 报错的原因是compiler采用了GBK编码,而源代码设置的是utf8编码导致编译的时候无法正确解析源码,解决方法很简单,在pom的compiler插件配置处加入<encoding>utf8</encoding> 即可,如下: <build>        <plugins>            <plugin>           

支付宝 报错 rsa_private read error : private key is NULL解决方法

原因:  真机调试IOS支付宝功能GDB出现 rsa_private read error : private key is NULL提示 调试iOS 支付宝SDK的时候,运行demo,把Partner(合作商户 ID)Seller(账户 ID)RSA public key(支付宝公钥)RSA private key(商户私钥) 都放到plist文件了,运行的时候,报错 rsa_private read error : private key isNULL 我确定的是RSA private ke