今天协助同事解决了同一个数据库上的几个问题,记录下且总结下吧。
首先是同事让我帮助他看看他碰到的一个问题:
看看ORA-02019的错误说明
显然dblink已经出现了问题,所有的相关查询都应该有问题,不可能有好有坏。经检查其实问题出现在SYNONYM(同义词)上。为什呢,原来在数据库上有相同名称的同义词,只是用户不同是基于PUBLIC的!所以其实这些所谓没有出问题的SYNONYM其实根本已经有了问题,只是我们默认使用的是PUBLIC下的名称相同的同义词!
SYNONYM确实给开发和管理提供了非常的便利,但是这个怪异的家伙同时也会有很多的副作用产生。就像这次碰到的问题,一个基于PUBLIC的同名SYNONYM,因为其关联的是另外一个用户,而并非我们需要操作的用户,一旦执行起删除、修改等操作后果不堪设想。
解决完该问题后,同事准备重新建立新的dblink,但是原来的却无论怎样也无法删除,报 ORA-02024 。看看ORACLE的错误说明;
很怪异,怎么会呢?名字不会错的。后来突然想起来,这个数据库曾经试图做stream,所以修改过global_name,名字是带后缀的(ORCL.CPLATFORM)。所以现在就无法删除了,除非这个dblink的名字也使用相同的后缀呀!
只能通过基表进行删除了:
OWNER#对应的是USER_ID,NAME对应的是dblink的名字。OK!,问题解决。
这里我们不难看出,作为数据库中每一项技术都会有好的地方,同时也都会或多或少的存在些问题(局限性)。作为一个数据库管理人员或设计人员需要有一个较高层次的大局观,否则可能会图一时方便,一时快速解决问题,为今后的数据库或者是应用的运行带来极大的问题甚至是故障!
首先是同事让我帮助他看看他碰到的一个问题:
在某个数据库的用户下,有一个dblink,如果直接执行使用dblink的查询就会报ORA-02019错误,例如:
select * from tab@dbjs;
但是以前利用该dblink建立的SYNONYM执行查询却没有没有问题。
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.
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
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
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