我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

PUBLIC数据库链无法删除的问题(二)

上一篇 / 下一篇  2007-02-02 00:00:00 / 个人分类:ORACLE

今天在一个二线数据库中发现了一个奇怪的问题。有几个已经存在的PUBLIC数据库链无法正常删除。

这篇文章给出解决的具体方法。

PUBLIC数据库链无法删除的问题(一):http://yangtingkun.itpub.net/post/468/259496

ITPUB个人空间&_TX7dq9f(c$F-J

操作之前再次说明,处理这个问题的最好的方法是不去处理,如果一定要删除的话,最好先做好备份。

问题的描述和产生原因在上面一篇文章中。这里直接描述解决步骤。

第一种方法比较简单:就是利用SYS用户产生LINK$表中的记录。

SQL> COL NAME FORMAT A30ITPUB个人空间0l9nyP6gYhH
SQL> SELECT * FROM DBA_DB_LINKS;

OWNER DB_LINK USERNAME HOST CREATED
9u"T"sK/Y t!t7590422-------- ---------------------- ------------- ----------- ---------------------
O9ZOg[M#n&t7590422PUBLIC DATA NDMAIN DATADB 2004-5
-14 18:44:07
5X+fFZKr-^#H7590422PUBLIC DATA.EMEDCHINA.NET SELE DATADB 2007-2
-01 16:40:23
9Q.s+X0wb%M!YOK0q7590422PUBLIC DATADB DNMAIN DATADB 2004-5
-14 18:41:35
_AwB9Kr7590422PUBLIC MAINDB LOG MAINDB 2004-2
-19 18:27:30
-N2RWY&HDw7590422PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6
-04 14:03:37ITPUB个人空间1S l&T3k8_UZDq
LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2
-28 14:46:29ITPUB个人空间 l&rf \:FI?A fM(r
LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1
-19 09:52:01
-_]nu"z7590422LAS_NEW SSISS.EMEDCHINA.NET USERTSP ssiss 2007-1
-22 10:03:29

已选择8行。

SQL> DROP PUBLIC DATABASE LINK DATADB;ITPUB个人空间Y-?2q-u5H C H
DROP PUBLIC DATABASE LINK DATADBITPUB个人空间b-\U8e(}S P!b
*ITPUB个人空间Y$YK@'zZ U?
ERROR
位于第 1 :
9fq5}4c4J3G7590422ORA-02024:
未找到数据库链接

ITPUB个人空间4y WI)Z_?o5sN A
SQL> SELECT OWNER#, NAME FROM LINK$;

OWNER# NAMEITPUB个人空间|{N X+ivu,_A
---------- ------------------------------ITPUB个人空间3x&~5s0M1@u"N
1 DATAITPUB个人空间p$z8n~'zGg
1 MAINDB
$f4Zw8u'B]Rh%C7590422 1 DATADBITPUB个人空间e0sqWSt
67 SSISS.EMEDCHINA.NET
"?]u6M#N{z7590422 61 REPDB02.EMEDCHINA.NETITPUB个人空间J$h _"j)o7B
1 MAINDB.EMEDCHINA.NET
'o6BH`+o4i6D7590422 67 GPODB.EMEDCHINA.NET
xy2AV*XP%G Q|C7590422 1 DATA.EMEDCHINA.NET

已选择8行。

SQL> DELETE LINK$ WHERE OWNER# = 1 AND NAME = 'DATADB';

已删除 1 行。

SQL> COMMIT;

提交完成。

SQL> SELECT * FROM DBA_DB_LINKS;

OWNER DB_LINK USERNAME HOST CREATED
UA,gd;FG7590422-------- ---------------------- ------------- ----------- ---------------------
(rWkizBYAT7590422PUBLIC DATA NDMAIN DATADB 2004-5
-14 18:44:07ITPUB个人空间&|\P&oM)e#HH
PUBLIC DATA.EMEDCHINA.NET SELE DATADB 2007-2
-01 16:40:23ITPUB个人空间"C6B]*m3Ts3hABa6k
PUBLIC MAINDB LOG MAINDB 2004-2
-19 18:27:30
"~AM+UA(k5Ef7590422PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6
-04 14:03:37
cxW/T t-O p7590422LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2
-28 14:46:29
+j Zw2Y/Q4`6f7590422LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1
-19 09:52:01ITPUB个人空间 n DQzl@.Fa
LAS_NEW SSISS.EMEDCHINA.NET USERTSP ssiss 2007-1
-22 10:03:29

已选择7行。

通过测试发现,第二种方式似乎对Oracle920版本无效:

SQL> SELECT * FROM DBA_DB_LINKS;

OWNER DB_LINK USERNAME HOST CREATEDITPUB个人空间q$d'D!e0c$]"XX v
-------- ---------------------- ------------- ----------- ---------------------
!^9bg0y%T^(W2a7590422PUBLIC DATA NDMAIN DATADB 2004-5
-14 18:44:07
$YV'Z[lE7590422PUBLIC DATA.EMEDCHINA.NET SELE DATADB 2007-2
-01 16:40:23ITPUB个人空间.gU!@-j!ex#e
PUBLIC MAINDB LOG MAINDB 2004-2
-19 18:27:30ITPUB个人空间|qb:GU l
PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6
-04 14:03:37
s7| bM"LcV7590422LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2
-28 14:46:29
;s.\/h/^ O3GX"Re}7590422LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1
-19 09:52:01
d#_k,pJ'a%N&h;l Z7590422LAS_NEW SSISS.EMEDCHINA.NET USERTSP ssiss 2007-1
-22 10:03:29

已选择7行。

SQL> DROP PUBLIC DATABASE LINK DATA;

数据库链接已丢弃。

SQL> SELECT * FROM DBA_DB_LINKS;

OWNER DB_LINK USERNAME HOST CREATEDITPUB个人空间L0b;VfH I O1Q(i
-------- ---------------------- ------------- ----------- ---------------------
:P;lh lh7590422PUBLIC DATA NDMAIN DATADB 2004-5
-14 18:44:07ITPUB个人空间WaAp'V9{L _
PUBLIC MAINDB LOG MAINDB 2004-2
-19 18:27:30
*X K)Z H,L0NLa7590422PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6
-04 14:03:37
|P vL8N9K7590422LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2
-28 14:46:29
p/pfX PHE]7590422LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1
-19 09:52:01ITPUB个人空间P"|'Gv|"g4FT@
LAS_NEW SSISS.EMEDCHINA.NET USERTSP ssiss 2007-1
-22 10:03:29

已选择6行。

SQL> DROP PUBLIC DATABASE LINK DATA;
%p(S)Bn)jP7590422DROP PUBLIC DATABASE LINK DATA
wv7WR.cp2W%P7590422 *ITPUB个人空间2~} A'`l|9SM(E[
ERROR
位于第 1 :ITPUB个人空间e\vn1O2x M*e]:Ye
ORA-02024:
未找到数据库链接

由于GLOBAL_NAME的原因,删掉的并非是希望删掉的DBLINK,而希望删掉的却无法删除。

SQL> SELECT * FROM GLOBAL_NAME;

GLOBAL_NAME
#H?I f,Mw}D7590422------------------------------------------------------------------------------ITPUB个人空间2NK{]P,X
ORCL.EMEDCHINA.NET

SQL> SHOW USER
"L*Z)zY%}'Y:DF @8Y7590422USER
"SYS"
:Q4qSmV7?5qf,j3f7590422SQL> UPDATE PROPS$ SET VALUE$ = 'ORCL' WHERE NAME = 'GLOBAL_DB_NAME';

已更新 1 行。

SQL> SELECT * FROM GLOBAL_NAME;

GLOBAL_NAMEITPUB个人空间Y1Uf:eS&P-C"hve
-----------------------------------------------------------------------------ITPUB个人空间t7PQF3]+w
ORCL

SQL> COMMIT;

提交完成。

SQL> DROP PUBLIC DATABASE LINK DATA;
x U g/m ~7590422DROP PUBLIC DATABASE LINK DATA
K3d|(?%N~ q7590422 *ITPUB个人空间u0sA3||;y&]5~F
ERROR
位于第 1 :
^B)hJ aI\%C}7590422ORA-02024:
未找到数据库链接

ITPUB个人空间6WRfj5Y RG
SQL> SELECT * FROM DBA_DB_LINKS;

OWNER DB_LINK USERNAME HOST CREATED
Y.E wsF7590422-------- ---------------------- ------------- ----------- ---------------------
j7n+ya:T-wL$n7590422PUBLIC DATA NDMAIN DATADB 2004-5
-14 18:44:07ITPUB个人空间+\"s/_}lhm6d:f
PUBLIC MAINDB LOG MAINDB 2004-2
-19 18:27:30ITPUB个人空间Cm x"KE^?
PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6
-04 14:03:37ITPUB个人空间:a:},c@ @'q*R }
LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2
-28 14:46:29ITPUB个人空间(xFn ?"dk\+w
LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1
-19 09:52:01
YNKt.^#_{_s6@7590422LAS_NEW SSISS.EMEDCHINA.NET USERTSP ssiss 2007-1
-22 10:03:29

已选择6行。

SQL> DROP PUBLIC DATABASE LINK DATA;
6l4X|(km%c Cy7590422DROP PUBLIC DATABASE LINK DATAITPUB个人空间9WX X$k7~`5q
*ITPUB个人空间Y2j D A5E r
ERROR
位于第 1 :
5_Ypw7~7590422ORA-02024:
未找到数据库链接

ITPUB个人空间 @8@*}+~4X(ufW
SQL> SELECT * FROM GLOBAL_NAME;

GLOBAL_NAMEITPUB个人空间/]Py7f][@C(^Q
------------------------------------------------------------------------------ITPUB个人空间QH)w"s P%G.{
ORCL

SQL> ITPUB个人空间Te3d#~&i^n
SQL> SHOW PARAMETER DOMAIN

NAME TYPE VALUEITPUB个人空间C^B3l z*O
------------------------------------ ----------- ------------------------------
xL I ~ C7590422db_domain string
u kLy M7590422SQL> CREATE DATABASE LINK TEST;

数据库链接已创建。

SQL> SELECT * FROM DBA_DB_LINKS;

OWNER DB_LINK USERNAME HOST CREATEDITPUB个人空间Rd|.MVX ~}QT
-------- ---------------------- ------------- ----------- ---------------------
b WG9K|7p7590422SYS TEST.EMEDCHINA.NET 2007-2
-02 18:37:18
/bQw } C S,@7590422PUBLIC DATA NDMAIN DATADB 2004-5
-14 18:44:07
$rm7[y/ta|P+^&t7590422PUBLIC MAINDB LOG MAINDB 2004-2
-19 18:27:30
3fLI.j&or t+h`7590422PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6
-04 14:03:37
,`S@.|R V@7590422LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2
-28 14:46:29
f2jL-Q({2} ea7590422LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1
-19 09:52:01ITPUB个人空间H:{/Xctw
LAS_NEW SSISS.EMEDCHINA.NET USERTSP ssiss 2007-1
-22 10:03:29

已选择7行。

SQL> DROP DATABASE LINK TEST;

数据库链接已丢弃。

可以看到,Oracle给出的解决方法对于920环境并不试用。

看来只能通过上面的第一种方法来解决这个问题了。

SQL> ALTER DATABASE RENAME GLOBAL_NAME TO ORCL.EMEDCHINA.NET;

数据库已更改。

SQL> SELECT * FROM GLOBAL_NAME;

GLOBAL_NAMEITPUB个人空间 g mRS.Vu'{;[
-----------------------------------------------------------------------------
2D4G4}0z~'K2L8q:c7590422ORCL.EMEDCHINA.NET

SQL> DROP PUBLIC DATABASE LINK DATA;
)l6~0k"H*vR/gy:k2q-x7590422DROP PUBLIC DATABASE LINK DATAITPUB个人空间8dgouSc8C
*
^h;z:Jcyu b*nk7590422ERROR
位于第 1 :ITPUB个人空间t&z:B lPu V5v
ORA-02024:
未找到数据库链接

ITPUB个人空间2uA*y T'I
SQL> DELETE LINK$ WHERE OWNER# = 1 AND NAME IN ('DATA', 'MAINDB');

已删除2行。

SQL> SELECT * FROM DBA_DB_LINKS;

OWNER DB_LINK USERNAME HOST CREATEDITPUB个人空间~_o(}Gl$[9\
-------- ---------------------- ------------- ----------- ---------------------ITPUB个人空间9H0kHx+G |K+G
PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6
-04 14:03:37ITPUB个人空间Gd N1n+]D
LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2
-28 14:46:29
0Q}PS`1Kh F e1Vk6|7590422LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1
-19 09:52:01
l^ha"E%]3xq7590422LAS_NEW SSISS.EMEDCHINA.NET USERTSP ssiss 2007-1
-22 10:03:29

SQL> COMMIT;

提交完成。

SQL> SET VER OFF
UMe*g|)kP Y7590422SQL> ACCEPT SELE_PASSWORD PROMPT SELE_PASSWORD HIDE
}mVQd3L:i]7590422SELE_PASSWORDITPUB个人空间R9o%g3Ne)b
SQL> CREATE PUBLIC DATABASE LINK DATA CONNECT TO SELE IDENTIFIED BY &SELE_PASSWORD USING 'DATADB';

数据库链接已创建。

SQL> SELECT * FROM DBA_DB_LINKS;

OWNER DB_LINK USERNAME HOST CREATED
R"Z.X(P6t7590422-------- ---------------------- ------------- ----------- ---------------------
^!y6CP,p#Y7590422PUBLIC DATA.EMEDCHINA.NET SELE DATADB 2007-2
-02 18:50:16
+h$Lk*{lY+TNGP7590422PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6
-04 14:03:37
,I snQ+`-N T7590422LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2
-28 14:46:29
Ye`]#zo%u Z7H7590422LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1
-19 09:52:01ITPUB个人空间"q cCQ3_v ^"U
LAS_NEW SSISS.EMEDCHINA.NET USERTSP ssiss 2007-1
-22 10:03:29

根据文档的描述,将GLOBAL_NAME重新命名之后,还应该重建所有的DBLINK。不过测试发现,所有的DBLINK都是正常的,这一步可以根据具体的情况是否执行。

在建立数据库的时候最好直接指定DB_DOMAIN,否则就尽量不要修改GLOBAL_NAME。不然就很容易造成这个问题。

其实全局数据库重命名以前建立的数据库链一般对现有的数据库链没有什么影响,因此即使出现这个问题也没有必要进行删除。如果一定要删除时,先进行备份,然后检查当前的数据库版本是否和给出方法的文章中的版本一致。8i9i中的方法是有区别的。


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar