GLOBAL_NAMES參數(shù)研究
?
??? 最近在配置Stream時(shí),發(fā)現(xiàn)必須要把GLOBAL_NAMES參數(shù)的指設(shè)置為TRUE,具體原因?yàn)楹尾恢5前l(fā)現(xiàn)在設(shè)置了該參數(shù)之后,數(shù)據(jù)庫每天的物化視圖刷新出現(xiàn)了問題。之后查明原因,是DBLINK出現(xiàn)了問題。隨后研究了一下GLOBAL_NAMES這個(gè)參數(shù),發(fā)現(xiàn)其實(shí)很有意思的事情是:GLOBAL_NAMES參數(shù)并不是用來控制GLOBAL_NAME的,而是用來限制DBLINK的使用。下面簡單了解一下這個(gè)參數(shù):
?
??? GLOBAL_NAMES參數(shù)的作用,簡單得說來就是:當(dāng)GLOBAL_NAMES參數(shù)設(shè)置為TRUE時(shí),使用DBLINK的名稱必須與被連接庫的GLOBAL_NAME一致。本來是想做幾個(gè)簡單的測試,但是發(fā)現(xiàn)網(wǎng)上已經(jīng)有人寫過了,想想要再配置數(shù)據(jù)庫也比較麻煩,就直接拷過來了:
?
************************************************************************************
當(dāng)GLOBAL_NAMES參數(shù)設(shè)置為TRUE時(shí),使用DATABASE LINK時(shí),DATABASE LINK的名稱必須與被連接庫的GLOBAL_NAME一致。下面做一個(gè)測試,在測試中,創(chuàng)建數(shù)據(jù)庫鏈接的庫為XJ(WINDOWS 2003 ORACLE 10g 10.2.0.1),被鏈接的庫為DMDB(LINUX AS5 ORACLE 10g 10.2.0.1 RAC)
?
首先查看DMDB的相關(guān)配置:
?
SQL> show parameter global_names
?
NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- ---------
global_names???????????????????????? boolean???? FALSE
------------------------------------ ----------- ---------
global_names???????????????????????? boolean???? FALSE
SQL> select * from global_name;;
?
GLOBAL_NAME
----------------------------------------------------------
DMDB
----------------------------------------------------------
DMDB
?
可以看到這個(gè)被鏈接的庫其global_names參數(shù)為FALSE。
?
要?jiǎng)?chuàng)建數(shù)據(jù)庫鏈接的庫的配置:
?
SQL> show parameter global_names
?
NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- -------
global_names???????????????????????? boolean???? FALSE
------------------------------------ ----------- -------
global_names???????????????????????? boolean???? FALSE
SQL> select * from global_name;
?
GLOBAL_NAME
--------------------------------------------------------
XJ
--------------------------------------------------------
XJ
?
然后做下面的操作:
?
SQL> create database link test_link connect to test identified by test using 'DMDB';
?
數(shù)據(jù)庫鏈接已創(chuàng)建。
?
SQL> select * from
dual@test_link
;
?
D
-
X
-
X
?
可以看到數(shù)據(jù)庫鏈接工作正常。
?
在DMDB庫上將global_names設(shè)為TRUE:
?
SQL> alter system set global_names=true;
?
系統(tǒng)已更改。
?
在XJ庫上再次查詢,并新建一個(gè)DATABASE LINK再進(jìn)行查詢:
?
SQL> select * from
dual@test_link
;
?
D
-
X
-
X
?
SQL> create database link test_link2 connect to test identified by test using 'DMDB';
?
數(shù)據(jù)庫鏈接已創(chuàng)建。
?
SQL> select * from
dual@test_link2
;
?
D
-
X
-
X
?
此時(shí)可以看數(shù)據(jù)庫鏈接工作正常。我們再將XJ庫的global_names參數(shù)設(shè)置為TRUE:
?
SQL> alter system set global_names=true;
?
系統(tǒng)已更改。
?
SQL> select * from
dual@test_link2
;
select * from dual@test_link2
?????????????????? *
第 1 行出現(xiàn)錯(cuò)誤:
ORA-02085: 數(shù)據(jù)庫鏈接 TEST_LINK2 連接到 DMDB
select * from dual@test_link2
?????????????????? *
第 1 行出現(xiàn)錯(cuò)誤:
ORA-02085: 數(shù)據(jù)庫鏈接 TEST_LINK2 連接到 DMDB
?
SQL> select * from
dual@test_link
select * from dual@test_link
?????????????????? *
第 1 行出現(xiàn)錯(cuò)誤:
ORA-02085: 數(shù)據(jù)庫鏈接 TEST_LINK 連接到 DMDB
select * from dual@test_link
?????????????????? *
第 1 行出現(xiàn)錯(cuò)誤:
ORA-02085: 數(shù)據(jù)庫鏈接 TEST_LINK 連接到 DMDB
?
而再次將XJ庫的global_names設(shè)為FALSE,則數(shù)據(jù)庫鏈接又可用了。
SQL> alter system set global_names=false;
SQL> alter system set global_names=false;
?
系統(tǒng)已更改。
?
SQL> select * from
dual@test_link
;
?
D
-
X
-
X
?
SQL> select * from
dual@test_link2
;
?
D
-
X
-
X
?
再將DMDB庫的global_names設(shè)為FALSE,數(shù)據(jù)庫鏈接仍然可用:
?
在DMDB庫上:
?
SQL> alter system set global_names=false;
?
系統(tǒng)已更改。
?
在XJ庫上:
?
SQL> select * from
dual@test_link
;
?
D
-
X
-
X
?
可以看到,鏈接仍然可以用。
如果在DMDB庫上創(chuàng)建鏈接到XJ庫上,可以觀察到同樣的結(jié)果。
可以得出一個(gè)結(jié)論:global_names參數(shù)設(shè)置為FALSE,影響的是創(chuàng)建數(shù)據(jù)庫鏈接的那個(gè)庫對數(shù)據(jù)庫鏈接的使用。也就是說,如果一個(gè)庫(實(shí)例)的global_names參數(shù)設(shè)值為TRUE,則該庫連接其他庫的數(shù)據(jù)庫鏈接,其名稱必須要與被連接的庫的global_name相同:
如果在DMDB庫上創(chuàng)建鏈接到XJ庫上,可以觀察到同樣的結(jié)果。
可以得出一個(gè)結(jié)論:global_names參數(shù)設(shè)置為FALSE,影響的是創(chuàng)建數(shù)據(jù)庫鏈接的那個(gè)庫對數(shù)據(jù)庫鏈接的使用。也就是說,如果一個(gè)庫(實(shí)例)的global_names參數(shù)設(shè)值為TRUE,則該庫連接其他庫的數(shù)據(jù)庫鏈接,其名稱必須要與被連接的庫的global_name相同:
?
在XJ庫上:
?
SQL> alter system set global_names=true;
?
系統(tǒng)已更改。
?
SQL> create database link dmdb connect to test identified by test using 'dmdb';
?
數(shù)據(jù)庫鏈接已創(chuàng)建。
?
SQL> select * from
dual@dmdb
;
?
D
-
X
SQL> select * from dual@test_link ;
select * from dual@test_link
*
第 1 行出現(xiàn)錯(cuò)誤:
ORA-02085: 數(shù)據(jù)庫鏈接 TEST_LINK 連接到 DMDB
-
X
SQL> select * from dual@test_link ;
select * from dual@test_link
*
第 1 行出現(xiàn)錯(cuò)誤:
ORA-02085: 數(shù)據(jù)庫鏈接 TEST_LINK 連接到 DMDB
?
SQL> select * from dual@test_link2 ;
select * from dual@test_link2
?????????????????? *
第 1 行出現(xiàn)錯(cuò)誤:
ORA-02085: 數(shù)據(jù)庫鏈接 TEST_LINK2 連接到 DMDB
?
如果在GLOBAL_NAMES設(shè)置為TRUE的情況下,如果要建多個(gè)數(shù)據(jù)庫鏈接到同一個(gè)庫,怎么辦呢?因?yàn)閿?shù)據(jù)庫鏈接的名稱必須與目標(biāo)庫的GLOBAL_NAME相同。可以按如下的方法:
?
SQL> create database
linkdmdb@link1connect
to test identified by test using 'dmdb';
?
數(shù)據(jù)庫鏈接已創(chuàng)建。
?
SQL> create database
linkdmdb@link2connect
to test identified by test using 'dmdb';
?
數(shù)據(jù)庫鏈接已創(chuàng)建。
?
SQL> select *
fromdual@dmdb
;
?
D
-
X
-
X
?
SQL> select *
fromdual@dmdb@link1
;
?
D
-
X
-
X
?
SQL> select *
fromdual@dmdb@link2
;
?
D
-
X
-
X
?
也就是在GLOBAL_NAME后面加上@再加上一個(gè)標(biāo)識(shí)。這樣就能夠創(chuàng)建多個(gè)數(shù)據(jù)庫鏈接到同一目標(biāo)庫上了。
?
另外在創(chuàng)建數(shù)據(jù)庫鏈接時(shí),不能給其他SCHEMA創(chuàng)建鏈接,這是因?yàn)閿?shù)據(jù)庫鏈接(database link)其名稱可以含有'.'即點(diǎn)號(hào)。比如A用戶想給B用戶創(chuàng)建一個(gè)DBLINK名叫LINKB,CREATE DATABASE LINK B.LINKB ......, 這個(gè)語句將會(huì)實(shí)際創(chuàng)建一個(gè)A用戶下的名為B.LINKB的數(shù)據(jù)庫鏈接。
******************************************************************************************************
?
?
?
?