【轉載】去掉DB_DOMAIN的方法

renjixinchina發表於2013-06-07

【轉載地址】http://yangtingkun.itpub.net/post/468/279105

Oracle的GLOBAL_NAME由兩個部分組成:DB_NAME和DB_DOMAIN。如果在建立資料庫的時候不指定DB_DOMAIN的值,則GLOBAL_NAME和DB_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/15747463/viewspace-763458/,如需轉載,請註明出處,否則將追究法律責任。

相關文章