去掉DB_DOMAIN的方法

yangtingkun發表於2007-04-10

今天下午比較鬱悶,折騰了一個下午,就是因為GLOBAL_NAME的問題。


OracleGLOBAL_NAME由兩個部分組成:DB_NAMEDB_DOMAIN。如果在建立資料庫的時候不指定DB_DOMAIN的值,則GLOBAL_NAMEDB_NAME的值一樣。

Oracle有一個從來沒有解決的問題,就是DB_DOMAIN一旦加上,就再也去不掉了。

不管是設定透過DB_DOMAIN的方式,還是透過ALTER DATABASE RENAME GLOBAL_NAME TO的方式。一旦GLOBAL_NAME包含了DB_DOMAIN部分。就再也無法去掉了。

SQL> SELECT * FROM GLOBAL_NAME;

GLOBAL_NAME
-------------------------------------------------------------------------
YTK

SQL> SHOW PARAMETER DB_DOMAIN

NAME TYPE VALUE
------------------------------------ ----------- ------------------------
db_domain string
SQL> ALTER DATABASE RENAME GLOBAL_NAME TO YTK.YANGTINGKUN;

資料庫已更改。

SQL> SELECT * FROM GLOBAL_NAME;

GLOBAL_NAME
-------------------------------------------------------------------------
YTK.YANGTINGKUN

SQL> ALTER DATABASE RENAME GLOBAL_NAME TO YTK;

資料庫已更改。

SQL> SELECT * FROM GLOBAL_NAME;

GLOBAL_NAME
-------------------------------------------------------------------------
YTK.YANGTINGKUN

而且這個問題還可能造成以前建立的資料庫鏈不可用的情況。這還不是最鬱悶的,當配置高階複製等環境時,需要將GLOBAL_NAMES引數設定為TRUE,因此如果主站點本身不帶DB_DOMAIN,則帶DB_DOMAIN的資料庫無法加入到這個複製環境中。

因為,這個時候,新增任何不帶DOMAIN的資料庫鏈,Oracle都會自動將本機的DOMAIN加上。

SQL> CREATE DATABASE LINK TESTDATA;

資料庫連結已建立。

SQL> SELECT DB_LINK FROM USER_DB_LINKS;

DB_LINK
----------------------------------------
TESTDATA.YANGTINGKUN

這就要求複製環境中不要出現不同配置的資料庫。要不然全部環境都不帶DB_DOMAIN,要不然全部環境都帶DB_DOMAIN。否則就很容易出現這個問題。

說了半天,這個DB_DOMAIN到底如何才能去掉呢。沒有常規的方法,唯一的方法是修改資料字典。

下面的方法只是實在沒有辦法的時候才使用,個人並不推薦使用這個方式。

SQL> CONN /@YTK AS SYSDBA已連線。
SQL> UPDATE SYS.PROPS$ SET VALUE$ = 'YTK' WHERE NAME = 'GLOBAL_DB_NAME';

已更新 1 行。

SQL> SELECT * FROM GLOBAL_NAME;

GLOBAL_NAME
----------------------------------------------------------------------------
YTK

SQL> COMMIT;

提交完成。

雖然透過SQL_TRACE可以看到,Oracle實際上就是這些了這個操作,不過仍然不推薦採用直接修改資料字典的方法。

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

相關文章