今天在一个二线数据库中发现了一个奇怪的问题。有几个已经存在的PUBLIC数据库链无法正常删除。
这篇文章给出解决的具体方法。
PUBLIC数据库链无法删除的问题(一):http://yangtingkun.itpub.net/post/468/259496
操作之前再次说明,处理这个问题的最好的方法是不去处理,如果一定要删除的话,最好先做好备份。
问题的描述和产生原因在上面一篇文章中。这里直接描述解决步骤。
第一种方法比较简单:就是利用SYS用户产生LINK$表中的记录。
SQL> COL NAME FORMAT A30
SQL> SELECT * FROM DBA_DB_LINKS;
OWNER DB_LINK USERNAME HOST CREATED
-------- ---------------------- ------------- ----------- ---------------------
PUBLIC DATA NDMAIN DATADB 2004-5月 -14 18:44:07
PUBLIC DATA.EMEDCHINA.NET SELE DATADB 2007-2月 -01 16:40:23
PUBLIC DATADB DNMAIN DATADB 2004-5月 -14 18:41:35
PUBLIC MAINDB LOG MAINDB 2004-2月 -19 18:27:30
PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6月 -04 14:03:37
LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2月 -28 14:46:29
LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1月 -19 09:52:01
LAS_NEW SSISS.EMEDCHINA.NET USERTSP ssiss 2007-1月 -22 10:03:29
已选择8行。
SQL> DROP PUBLIC DATABASE LINK DATADB;
DROP PUBLIC DATABASE LINK DATADB
*
ERROR 位于第 1 行:
ORA-02024: 未找到数据库链接
SQL> SELECT OWNER#, NAME FROM LINK$;
OWNER# NAME
---------- ------------------------------
1 DATA
1 MAINDB
1 DATADB
67 SSISS.EMEDCHINA.NET
61 REPDB02.EMEDCHINA.NET
1 MAINDB.EMEDCHINA.NET
67 GPODB.EMEDCHINA.NET
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
-------- ---------------------- ------------- ----------- ---------------------
PUBLIC DATA NDMAIN DATADB 2004-5月 -14 18:44:07
PUBLIC DATA.EMEDCHINA.NET SELE DATADB 2007-2月 -01 16:40:23
PUBLIC MAINDB LOG MAINDB 2004-2月 -19 18:27:30
PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6月 -04 14:03:37
LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2月 -28 14:46:29
LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1月 -19 09:52:01
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 CREATED
-------- ---------------------- ------------- ----------- ---------------------
PUBLIC DATA NDMAIN DATADB 2004-5月 -14 18:44:07
PUBLIC DATA.EMEDCHINA.NET SELE DATADB 2007-2月 -01 16:40:23
PUBLIC MAINDB LOG MAINDB 2004-2月 -19 18:27:30
PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6月 -04 14:03:37
LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2月 -28 14:46:29
LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1月 -19 09:52:01
LAS_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 CREATED
-------- ---------------------- ------------- ----------- ---------------------
PUBLIC DATA NDMAIN DATADB 2004-5月 -14 18:44:07
PUBLIC MAINDB LOG MAINDB 2004-2月 -19 18:27:30
PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6月 -04 14:03:37
LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2月 -28 14:46:29
LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1月 -19 09:52:01
LAS_NEW SSISS.EMEDCHINA.NET USERTSP ssiss 2007-1月 -22 10:03:29
已选择6行。
SQL> DROP PUBLIC DATABASE LINK DATA;
DROP PUBLIC DATABASE LINK DATA
*
ERROR 位于第 1 行:
ORA-02024: 未找到数据库链接
由于GLOBAL_NAME的原因,删掉的并非是希望删掉的DBLINK,而希望删掉的却无法删除。
SQL> SELECT * FROM GLOBAL_NAME;
GLOBAL_NAME
------------------------------------------------------------------------------
ORCL.EMEDCHINA.NET
SQL> SHOW USER
USER 为"SYS"
SQL> UPDATE PROPS$ SET VALUE$ = 'ORCL' WHERE NAME = 'GLOBAL_DB_NAME';
已更新 1 行。
SQL> SELECT * FROM GLOBAL_NAME;
GLOBAL_NAME
-----------------------------------------------------------------------------
ORCL
SQL> COMMIT;
提交完成。
SQL> DROP PUBLIC DATABASE LINK DATA;
DROP PUBLIC DATABASE LINK DATA
*
ERROR 位于第 1 行:
ORA-02024: 未找到数据库链接
SQL> SELECT * FROM DBA_DB_LINKS;
OWNER DB_LINK USERNAME HOST CREATED
-------- ---------------------- ------------- ----------- ---------------------
PUBLIC DATA NDMAIN DATADB 2004-5月 -14 18:44:07
PUBLIC MAINDB LOG MAINDB 2004-2月 -19 18:27:30
PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6月 -04 14:03:37
LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2月 -28 14:46:29
LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1月 -19 09:52:01
LAS_NEW SSISS.EMEDCHINA.NET USERTSP ssiss 2007-1月 -22 10:03:29
已选择6行。
SQL> DROP PUBLIC DATABASE LINK DATA;
DROP PUBLIC DATABASE LINK DATA
*
ERROR 位于第 1 行:
ORA-02024: 未找到数据库链接
SQL> SELECT * FROM GLOBAL_NAME;
GLOBAL_NAME
------------------------------------------------------------------------------
ORCL
SQL>
SQL> SHOW PARAMETER DOMAIN
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_domain string
SQL> CREATE DATABASE LINK TEST;
数据库链接已创建。
SQL> SELECT * FROM DBA_DB_LINKS;
OWNER DB_LINK USERNAME HOST CREATED
-------- ---------------------- ------------- ----------- ---------------------
SYS TEST.EMEDCHINA.NET 2007-2月 -02 18:37:18
PUBLIC DATA NDMAIN DATADB 2004-5月 -14 18:44:07
PUBLIC MAINDB LOG MAINDB 2004-2月 -19 18:27:30
PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6月 -04 14:03:37
LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2月 -28 14:46:29
LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1月 -19 09:52:01
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_NAME
-----------------------------------------------------------------------------
ORCL.EMEDCHINA.NET
SQL> DROP PUBLIC DATABASE LINK DATA;
DROP PUBLIC DATABASE LINK DATA
*
ERROR 位于第 1 行:
ORA-02024: 未找到数据库链接
SQL> DELETE LINK$ WHERE OWNER# = 1 AND NAME IN ('DATA', 'MAINDB');
已删除2行。
SQL> SELECT * FROM DBA_DB_LINKS;
OWNER DB_LINK USERNAME HOST CREATED
-------- ---------------------- ------------- ----------- ---------------------
PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6月 -04 14:03:37
LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2月 -28 14:46:29
LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1月 -19 09:52:01
LAS_NEW SSISS.EMEDCHINA.NET USERTSP ssiss 2007-1月 -22 10:03:29
SQL> COMMIT;
提交完成。
SQL> SET VER OFF
SQL> ACCEPT SELE_PASSWORD PROMPT SELE_PASSWORD HIDE
SELE_PASSWORD
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
-------- ---------------------- ------------- ----------- ---------------------
PUBLIC DATA.EMEDCHINA.NET SELE DATADB 2007-2月 -02 18:50:16
PUBLIC MAINDB.EMEDCHINA.NET LOG MAINDB 2004-6月 -04 14:03:37
LAS REPDB02.EMEDCHINA.NET REPORT report2_90 2006-2月 -28 14:46:29
LAS_NEW GPODB.EMEDCHINA.NET SELE_LAS_NEW gpodb 2007-1月 -19 09:52:01
LAS_NEW SSISS.EMEDCHINA.NET USERTSP ssiss 2007-1月 -22 10:03:29
根据文档的描述,将GLOBAL_NAME重新命名之后,还应该重建所有的DBLINK。不过测试发现,所有的DBLINK都是正常的,这一步可以根据具体的情况是否执行。
在建立数据库的时候最好直接指定DB_DOMAIN,否则就尽量不要修改GLOBAL_NAME。不然就很容易造成这个问题。
其实全局数据库重命名以前建立的数据库链一般对现有的数据库链没有什么影响,因此即使出现这个问题也没有必要进行删除。如果一定要删除时,先进行备份,然后检查当前的数据库版本是否和给出方法的文章中的版本一致。8i和9i中的方法是有区别的。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-69157/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-69157/