删除 Dblink 报错 ORA-02024: database link not found

database link概述 
database link是定义一个数据库到另一个数据库的路径的对象,database link允许你查询远程表及执行远程程序。在任何分布式环境里,database都是必要的。另外要注意的是database link是单向的连接。
在创建database link的时候,Oracle再数据字典中保存相关的database link的信息,在使用database link的时候,Oracle通过Oracle Net用用户预先定义好的连接信息访问相应的远程数据库以完成相应的工作。
建立database link之前需要确认的事项:
确认从local database到remote database的网络连接是正常的,tnsping要能成功。
确认在remote database上面有相应的访问权限。
database link分类

类型 Owner 描述
Private 创建database link的user拥有该database link 在本地数据库的特定的schema下建立的database link。只有建立该database link的schema的session能使用这个database link来访问远程的数据库。同时也只有Owner能删除它自己的private database link。
Public Owner是PUBLIC. Public的database link是数据库级的,本地数据库中所有的拥有数据库访问权限的用户或pl/sql程序都能使用此database link来访问相应的远程数据库。
Global Owner是PUBLIC. Global的database link是网络级的,When an Oracle network uses a directory server, the directory server automatically create and manages global database links (as net service names) for every Oracle Database in the network. Users and PL/SQL subprograms in any database can use a global link to access objects in the corresponding remote database.
Note: In earlier releases of Oracle Database, a global database link referred to a database link that was registered with an Oracle Names server. The use of an Oracle Names server has been deprecated. In this document, global database links refer to the use of net service names from the directory server.

创建dblink所需的权限

Privilege Database Required For
CREATE DATABASE LINK Local Creation of a private database link.
CREATE PUBLIC DATABASE LINK Local Creation of a public database link.
CREATE SESSION Remote Creation of any type of database link.

database link的使用 
基本语法
CREATE [SHARED][PUBLIC] database link link_name

      [CONNECT TO [user][current_user] IDENTIFIED BY password]
      [AUTHENTICATED BY user IDENTIFIED BY password]
      [USING 'connect_string']
说明:
1) 权限:创建数据库链接的帐号必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系统权限,用来登录到远程数据库的帐号必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。一个公用数据库链接对于数据库中的所有用户都是可用的,而一个私有链接仅对创建它的用户可用。由一个用户给另外一个用户授权私 有数据库链接是不可能的,一个数据库链接要么是公用的,要么是私有的。
2)link :  当source端的数据库GLOBAL_NAME=TRUE时,link名必须与远程数据库的全局数据库名global_name)相同;否则,可以任意命名。

3)current_user使用该选项是为了创建global类型的dblink。在分布式体系中存在多个数据库的话。如果想要在每一个数据库中都可以使用同样的名字来访问数据库a,那在每个数据库中都要创建一个到数据库a的db_link,太麻烦了。所以现在有这个选项。你只要创建一次。所有的数据库都可以使用这个db_link来访问了。要使用这个特性,必须有oracle nameserver或者ORACLE目录服务器。并且数据库a的参数global_names=true.具体我也没有创建过,没有这个环境。
4)connectstring:连接字符串,tnsnames.ora中定义远程数据库的连接串,也可以在创建dblink的时候直接指定。
5)username、password:远程数据库的用户名,口令。如果不指定,则使用当前的用户名和口令登录到远程数据库,当创建connected user类型的dblink时,需要如果采用数据字典验证,则需要两边数据库的用户名密码一致。

删除 Dblink 报错 ORA-02024: database link not found 的解决方法  ------导致这种错误共有两种情况具体见metalink文档

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

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

一 .  DBLINK所有者不一致造成

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

 

--创建dblink

SQL> conn system/admin;

已连接。

SQL>  create database link hurp connect to system identified by hurp using '

      (DESCRIPTION =

      (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.125)(PORT = 1521))

       )

      (CONNECT_DATA =

      (SERVICE_NAME = newccs)

       )

       ) ';

 

数据库链接已创建。

SQL> select name from v$database@hurp;

 

NAME

---------

hurp

 

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     HURP       SYSTEM                2013-02-23 09:12:45

 

----用public删除

SQL> drop public database link hurp;

drop public database link hurp

                          

第 1 行出现错误:

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

--用本地用户删

SQL> drop database link hurp;

数据库链接已删除。

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

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

SQL> select * from global_name;

GLOBAL_NAME

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

HURP


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 hurp;

drop database link hurp

                   *

第 1 行出现错误:

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

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

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

       SQL> update props$ set value$ = '' 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/hurp;

已连接。

SQL> drop database link hurp;

数据库链接已删除。

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

alter system flush SHARED_POOL;

alter system flush SHARED_POOL;

alter system flush SHARED_POOL;

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



删除DBLINK

dblink的相应属性对应了Oracle的数据字典link$,任何针对dblink的操作都是操作该数据字典。在9i的时候,如果Oracle的global_name仅包括db_name,也就是说DB_DOMAIN的值为空。那么这个时候建立的数据库链,在数据库修改全局名GLOBAL_NAME之后(修改为db_name.db_domain格式),会无法删除。
如果要产生数据库链,必须将GLOBAL_NAME改回DB_NAME格式,即去掉后面的DOMAIN,但是这个时候,RENAME操作会自动添加域名,使得Oracle全局名无法恢复到初始状态。因此在这情况下,如果需要删除dblink,只能直接操作link$数据字典

delete from link$ where owner#=user_id and name=dblink_name

当然直接操作数据字典是危险的,最好做好备份,然后再进行操作。




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29446986/viewspace-1253281/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29446986/viewspace-1253281/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值