全局观:ORACLE问题解决一例-阿里云开发者社区

开发者社区> 数据库> 正文
登录阅读全文

全局观:ORACLE问题解决一例

简介:
     今天协助同事解决了同一个数据库上的几个问题,记录下且总结下吧。
         首先是同事让我帮助他看看他碰到的一个问题:
        
    在某个数据库的用户下,有一个dblink,如果直接执行使用dblink的查询就会报ORA-02019错误,例如:
    select * from tab@dbjs;
    但是以前利用该dblink建立的SYNONYM执行查询却没有没有问题。
        
        看看ORA-02019的错误说明
connection description for remote database not found

Cause: An attempt was made to connect or log in to a remote database using a connection description that could not be found.

Action: Specify an existing database link. Query the data dictionary to see all existing database links. See your operating system-specific Net8 documentation for valid connection descriptors.

        显然dblink已经出现了问题,所有的相关查询都应该有问题,不可能有好有坏。经检查其实问题出现在SYNONYM(同义词)上。为什呢,原来在数据库上有相同名称的同义词,只是用户不同是基于PUBLIC的!所以其实这些所谓没有出问题的SYNONYM其实根本已经有了问题,只是我们默认使用的是PUBLIC下的名称相同的同义词!
        SYNONYM确实给开发和管理提供了非常的便利,但是这个怪异的家伙同时也会有很多的副作用产生。就像这次碰到的问题,一个基于PUBLIC的同名SYNONYM,因为其关联的是另外一个用户,而并非我们需要操作的用户,一旦执行起删除、修改等操作后果不堪设想。
        解决完该问题后,同事准备重新建立新的dblink,但是原来的却无论怎样也无法删除,报ORA-02024。看看ORACLE的错误说明;
       
database link not found

Cause: Database link to be dropped is not found in dictionary

Action: Correct the database link name
  
       很怪异,怎么会呢?名字不会错的。后来突然想起来,这个数据库曾经试图做stream,所以修改过global_name,名字是带后缀的(ORCL.CPLATFORM)。所以现在就无法删除了,除非这个dblink的名字也使用相同的后缀呀!
         只能通过基表进行删除了:
       
SQL> delete from link$ WHERE OWNER#=46 and name='DBJS';

1 row deleted

SQL> commit;

Commit complete

        OWNER#对应的是USER_ID,NAME对应的是dblink的名字。OK!,问题解决。
        
        这里我们不难看出,作为数据库中每一项技术都会有好的地方,同时也都会或多或少的存在些问题(局限性)。作为一个数据库管理人员或设计人员需要有一个较高层次的大局观,否则可能会图一时方便,一时快速解决问题,为今后的数据库或者是应用的运行带来极大的问题甚至是故障!

         想想现在解决眼前,然后请再想想以后保证未来。毕竟各种应用系统都是动态发展的。-:)

本文转自Be the miracle!博客51CTO博客,原文链接http://blog.51cto.com/miracle/118337如需转载请自行联系原作者


Larry.Yue

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: