PUBLIC数据库链无法删除的问题(一)
上一篇 / 下一篇 2007-02-01 00:00:00 / 个人分类:ORACLE
今天在一个二线数据库中发现了一个奇怪的问题。有几个已经存在的PUBLIC数据库链无法正常删除。
7BG&Kxr7590422
这个数据库建立很早,且一直不是我在维护,所以数据库一直没有打PATCH,数据库版本仍然是9201。
SQL> SELECT * FROM V$VERSION;
BANNERITPUB个人空间 D5I!z}:L%D
----------------------------------------------------------------ITPUB个人空间*yH _gZ:Mu
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production PL/SQL Release 9.2.0.1.0 - Production
'`Pv5It'hcC7590422CORE 9.2.0.1.0 ProductionITPUB个人空间)~x;|5nw.DLP
TNS for Linux: Version 9.2.0.1.0 - Production
mc
t @:[y.]7590422NLSRTL Version 9.2.0.1.0 - Production
检查数据库链,并尝试删除:
SQL> SELECT * FROM DBA_DB_LINKS;
OWNER DB_LINK USERNAME HOST CREATEDITPUB个人空间N%nwo,`}&m4U]4A~
-------- --------------------- ------------ ------------ ----------------------ITPUB个人空间 T
K4f l)aC*r4Q
PUBLIC DATA NDMAIN DATADB 2004-5月 -14 18:44:07ITPUB个人空间]7lu"V}$q7l@u
PUBLIC DATA.EMEDCHINA.NET SELE datadb 2007-2月 -01 10:39:10ITPUB个人空间[~$nD5h2I;~
PUBLIC DATADB DNMAIN DATADB 2004-5月 -14 18:41:35ITPUB个人空间Emv|-AN*v
PUBLIC MAINDB LOG MAINDB 2004-2月 -19 18:27:30
?+h$W
w5dc7590422PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6月 -04 14:03:37
l-Q%Jj|_|S9g%O,I7590422LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2月 -28 14:46:29ITPUB个人空间Mu0tnz
xin {R
LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1月 -19 09:52:01
X3i~s!V
I3Bg7590422LAS_NEW SSISS.EMEDCHINA.NET USERTSP ssiss 2007-1月 -22 10:03:29
已选择8行。
SQL> DROP PUBLIC DATABASE LINK DATADB;
R5T%u2[ `8aY~0I Y
v7590422DROP PUBLIC DATABASE LINK DATADB
!k`6rG v9X7590422 *ITPUB个人空间8J%tayJs!ME`
ERROR 位于第 1 行:
$Sq5y\1S\a V7590422ORA-02024: 未找到数据库链接
D3H,S)\
]w7n,X7590422SQL> ALTER SYSTEM SET GLOBAL_NAMES = TRUE;
系统已更改。
SQL> DROP PUBLIC DATABASE LINK DATADB;ITPUB个人空间BZ Jl'w b$Tzg9G
DROP PUBLIC DATABASE LINK DATADB
w7SDFe*n ~7590422 *
iP/V#kk!e7590422ERROR 位于第 1 行:ITPUB个人空间lOMM/D-Y9_
ORA-02024: 未找到数据库链接
un$p_7D:?@e2V7590422SQL> ALTER SYSTEM SET GLOBAL_NAMES = FALSE;
系统已更改。
看来常规的办法已经行不通了。由于数据库链已经创建了很长的时间,产生问题的原因可能已经无法找到,不过现在可以做的是至少找到无法产生的原因。
SQL> ALTER SESSION SET SQL_TRACE = TRUE;
会话已更改。
SQL> DROP PUBLIC DATABASE LINK DATADB;ITPUB个人空间O%E%RV l/\6m
DROP PUBLIC DATABASE LINK DATADB
C?o6B.e){]&QB7590422 *ITPUB个人空间m
bXYtA
ERROR 位于第 1 行:ITPUB个人空间8~
NQs/V$c
ORA-02024: 未找到数据库链接
2F;\4z&E0AxgK OP7590422SQL> ALTER SESSION SET SQL_TRACE = FALSE;
会话已更改。
从TRACE文件中没有找到具体的错误原因,于是新建立一个数据库链,并对删除操作进行trace:
SQL> CREATE PUBLIC DATABASE LINK TEST;
数据库链接已创建。
SQL> ALTER SESSION SET SQL_TRACE = TRUE;
会话已更改。
SQL> DROP PUBLIC DATABASE LINK TEST;
数据库链接已丢弃。
SQL> ALTER SESSION SET SQL_TRACE = FALSE;
会话已更改。
进行了简单的对比后,仍然找不到导致删除失败的原因。不过到是找到了一个解决问题的方法。
从DROP PUBLIC DATABASE LINK的trace文件看,Oracle在删除数据库链时,对数据字典进行的修改只有一个,就是从link$表中将对应的记录删除。那么只要将需要删除的数据库链对应的记录从表中清除掉就可以了。当然,即使从TRACE文件上看,只包含了这一个操作,仍然不建议采用这样的方法去操作,毕竟,对数据字典进行操作是危险的。
于是查看了一下Metalink,检查是否存在类似的问题,结果很快就查到了问题的真正原因:
如果Oracle的global_name仅包括db_name,也就是说DB_DOMAIN的值为空。那么这个时候建立的数据库链,在数据库修改全局名GLOBAL_NAME之后(修改为db_name.db_domain格式),会无法删除。
如果要产生数据库链,必须将GLOBAL_NAME改回DB_NAME格式,即去掉后面的DOMAIN,但是这个时候,RENAME操作会自动添加域名,使得Oracle全局名无法恢复到初始状态。
SQL> SELECT * FROM GLOBAL_NAME;
GLOBAL_NAMEITPUB个人空间#]#THv9lE
rM/f
-----------------------------------------
A,wd-xD|7590422ORCL.EMEDCHINA.NET
SQL> ALTER DATABASE RENAME GLOBAL_NAME TO ORCL;
数据库已更改。
SQL> SELECT * FROM GLOBAL_NAME;
GLOBAL_NAME
Y"\@0fCbb7590422-----------------------------------------ITPUB个人空间\!I K#~V2K4`
ORCL.EMEDCHINA.NET
这个错误本来是8i上的,不知道为什么9201又重现了这个问题。
而Oracle给出的解决问题的方法居然是UPDATE PROPS$。通过修改PROPS$将数据库的GLOBAL_NAME修改回原来的值。删除数据库链后将GLOBAL_NAME恢复,并重建目前所有的数据库链。
Oracle在给出这个方法的时候强调了这是一种不支持的方法。说实话,我认为Oracle提供的方法还没有直接从LINK$中删除记录方便呢,反正同样都是修改数据字典,更新PROPS$表还需要重新RENAME并重建索引。
如果没有必要,其实最好的方法是不去处理,如果一定要删除的话,最好先做好备份。
导入论坛 引用链接 收藏 分享给好友 推荐到圈子 管理 举报
TAG:
