ora-02085的解決:Database Link與GLOBAL_NAMES引數

studywell發表於2014-10-10
轉自:http://www.cnblogs.com/rootq/archive/2009/08/12/1544683.html


    當GLOBAL_NAMES引數設定為TRUE時,使用DATABASE LINK時,DATABASE LINK的名稱必須與被連線庫的GLOBAL_NAME一致。下面做一個測試,在測試中,建立資料庫連結的庫為XJ(WINDOWS 2003 ORACLE 10g 10.2.0.1),被連結的庫為DMDB(LINUX AS5 ORACLE 10g 10.2.0.1 RAC)

首先檢視DMDB的相關配置:

SQL> show parameter global_names

NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------
global_names                         boolean     FALSE
SQL> select * from global_name;;

GLOBAL_NAME
----------------------------------------------------------
DMDB

可以看到這個被連結的庫其global_names引數為FALSE。

要建立資料庫連結的庫的配置:

SQL> show parameter global_names

NAME                                 TYPE        VALUE
------------------------------------ ----------- -------
global_names                         boolean     FALSE
SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------
XJ

然後做下面的操作:

SQL> create database link test_link connect to test identified by test using 'DMDB';

資料庫連結已建立。

SQL> select * from dual@test_link;

D
-
X

可以看到資料庫連結工作正常。

在DMDB庫上將global_names設為TRUE:

SQL> alter system set global_names=true;

系統已更改。

在XJ庫上再次查詢,並新建一個DATABASE LINK再進行查詢:

SQL> select * from dual@test_link;

D
-
X

SQL> create database link test_link2 connect to test identified by test using 'D
MDB';

資料庫連結已建立。

SQL> select * from dual@test_link2;

D
-
X

此時可以看資料庫連結工作正常。我們再將XJ庫的global_names引數設定為TRUE:

SQL> alter system set global_names=true;

系統已更改。

SQL> select * from dual@test_link2;
select * from dual@test_link2
                   *
第 1 行出現錯誤:
ORA-02085: 資料庫連結 TEST_LINK2 連線到 DMDB

SQL> select * from dual@test_link
select * from dual@test_link
                   *
第 1 行出現錯誤:
ORA-02085: 資料庫連結 TEST_LINK 連線到 DMDB

而再次將XJ庫的global_names設為FALSE,則資料庫連結又可用了。
SQL> alter system set global_names=false;

系統已更改。

SQL> select * from dual@test_link;

D
-
X

SQL> select * from dual@test_link2;

D
-
X

再將DMDB庫的global_names設為FALSE,資料庫連結仍然可用:

在DMDB庫上:

SQL> alter system set global_names=false;

系統已更改。

在XJ庫上:

SQL> select * from dual@test_link;

D
-
X

可以看到,連結仍然可以用。
如果在DMDB庫上建立連結到XJ庫上,可以觀察到同樣的結果。
可 以得出一個結論:global_names引數設定為FALSE,影響的是建立資料庫連結的那個庫對資料庫連結的使用。也就是說,如果一個庫(例項)的 global_names引數設值為TRUE,則該庫連線其他庫的資料庫連結,其名稱必須要與被連線的庫的global_name相同:

在XJ庫上:

SQL> alter system set global_names=true;

系統已更改。

SQL> create database link dmdb connect to test identified by test using 'dmdb';

資料庫連結已建立。

SQL> select * from dual@dmdb;

D
-
X
SQL> select * from dual@test_link;
select * from dual@test_link
*
第 1 行出現錯誤:
ORA-02085: 資料庫連結 TEST_LINK 連線到 DMDB


SQL> select * from dual@test_link2;
select * from dual@test_link2
                   *
第 1 行出現錯誤:
ORA-02085: 資料庫連結 TEST_LINK2 連線到 DMDB

如果在GLOBAL_NAMES設定為TRUE的情況下,如果要建多個資料庫連結到同一個庫,怎麼辦呢?因為資料庫連結的名稱必須與目標庫的GLOBAL_NAME相同。可以按如下的方法:

SQL> create database linkdmdb@link1connect to test identified by test using 'dmdb';

資料庫連結已建立。

SQL> create database linkdmdb@link2connect to test identified by test using 'dmdb';

資料庫連結已建立。

SQL> select * fromdual@dmdb;

D
-
X

SQL> select * fromdual@dmdb@link1;

D
-
X

SQL> select * fromdual@dmdb@link2;

D
-
X

也就是在GLOBAL_NAME後面加上@再加上一個標識。這樣就能夠建立多個資料庫連結到同一目標庫上了。

另外在建立資料庫連結時,不能給其他SCHEMA建立連結,這是因為資料庫連結(database link)其名稱可以含有'.'即點號。比如A使用者想給B使用者建立一個DBLINK名叫LINKB,CREATE DATABASE LINK B.LINKB ......, 這個語句將會實際建立一個A使用者下的名為B.LINKB的資料庫連結。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29519108/viewspace-1294297/,如需轉載,請註明出處,否則將追究法律責任。

相關文章