Oracle数据库的global_name,在Database Link与GLOBAL_NAMES参数一文中提到了,设置global_names初始化参数为true后,本地的数据库链接名称必须与远程数据库的global_name相同,才能正常使用数据库链接。那么怎么查询数据库的global_name呢?
SQL> col global_name for a30
SQL> select * from global_name;GLOBAL_NAME
------------------------------
DMDB
那么怎么样修改global_name?
ALTER DATABASE
RENAME GLOBAL_NAME TO NEW_NAME;
注意不要直接用update global_name set global_name=''将global_name设置为空,否则数据库不能启动,会报ORA-00600[18061] 或 ORA-00600[18062]这样的错误。 只有用备份进行恢复后才能打开。(参见metalink note 743676.1)。
那么global_name到底是个什么对象呢?
SQL> select owner,object_name,object_type from dba_objects where object_name='GLOBAL_NAME';
OWNER OBJECT_NAME OBJECT_TYPE
---------- -------------------- --------------------
SYS GLOBAL_NAME VIEW
PUBLIC GLOBAL_NAME SYNONYMSQL> select text from dba_views where view_name='GLOBAL_NAME';
TEXT
----------------------------------------------------------------
select value$ from sys.props$ where name = 'GLOBAL_DB_NAME'
可以看到global_name实际上是一个视图,来源于sys.props$表,而这个表是非常重要的一个关于数据库属性的表,不要随意更改此表的内容,否则将引起无可预料的、无法挽回的损失。
在用alert database rename global_name时,如果设置了global_name类似于"dmdb.com"这样的名称,则以后更改名称,则没有常规的办法去掉"."分隔符了。
SQL> select * from global_name;
GLOBAL_NAME
------------------------------
DMDBSQL> alter database rename global_name to dmdb.com;
Database altered.
SQL> select * from global_name;
GLOBAL_NAME
------------------------------
DMDB.COMSQL> alter database rename global_name to dmdb.cn;
Database altered.
SQL> select * from global_name;
GLOBAL_NAME
------------------------------
DMDB.CNSQL> alter database rename global_name to dmdb;
Database altered.
SQL> select * from global_name;
GLOBAL_NAME
------------------------------
DMDB.CNSQL> alter database rename global_name to dm;
Database altered.
SQL> select * from global_name;
GLOBAL_NAME
------------------------------
DM.CNSQL> alter database rename global_name to dm.com.cn;
Database altered.
SQL> select * from global_name;
GLOBAL_NAME
------------------------------
DM.COM.CNSQL> alter database rename global_name to dmdb;
Database altered.
SQL> select * from global_name;
GLOBAL_NAME
------------------------------
DMDB.COM.CN
SQL> alter database rename global_name to dmdb.net;Database altered.
SQL> select * from global_name;
GLOBAL_NAME
------------------------------
DMDB.NET
要去掉点分隔符,只有用update:
SQL> update global_name set global_name='DMDB';
1 row updated.
SQL> commit;
Commit complete.
SQL> select * from global_name;
GLOBAL_NAME
------------------------------
DMDB
郑重提示:除非万不得已,不要去更新global_name视图,即时更新,也不要去更新global_name的基表props$,更不要将global_name更新为空。
学习了
[回复]
看到熊哥的文章后,心血来潮。
先通过RMAN对库进行了全备,再到库进修改global_name=”;关闭库。
启动库后报ora-600[18062],果然如熊哥所言。
——–
启动库到mount状态,进入到rman:
restore database;
recover database;
alter database open resetlogs;
库却还是没启来,有点不解中。
[回复]
老熊 回复:
9月 6th, 2010 at 8:59 上午
@OracGPS, 你应该恢复到update global_name之前的时间点。你这样子恢复,将update global_name这一句的事务也恢复了。
[回复]
[…] 在以前的一篇文章中,我提到千万不能将Oracle数据库的global_name更新为空。这不,事儿来了。我的一个同事,提到了一个解决办法,不过那个办法实际上是一种不完全恢复的办法,如果没有备份,就行不通。如果没有备份,可以使用BBED来修改块来解决这个问题,不过使用bbed仍然比较麻烦。 […]