oracle自带有nid用以修改dbname。查看其命令语法如下表所示:

DBNEWID: Release 10.2.0.4.0 - Production on Wed Jun 24 20:06:08 2009
Copyright (c) 1982, 2007,
Oracle.    All
rights reserved.
Keyword
Description                                        (Default)
----------------------------------------------------
TARGET            Username/Password                            (NONE)
DBNAME            New
database name                            (NONE)
LOGFILE
Output Log
(NONE)
REVERT            Revert
failed
change
NO
SETNAME
Set a new database name
only
NO
APPEND            Append
to output log
NO
HELP                Displays
these
messages                NO 其动作描述用“=”表示。

假设某oracle数据库sys密码为123456,欲更名dbname为aaa,则其修改dbname的命令应如下行所示:

nid target=sys/123456 dbname=aaa

网上关于修改dbname的博客文章和论坛问答,基本都是在windows平台上的操作。其提示要点,在于运行nid系统命令之前,必须将数据库置于mount状态下。以此类推,在linux下的操作步骤,应该如下:
sql sql > shutdown immediate; sql > startup mount; sql > host nid target=sys/123456 dbname=aaa
但我按此步骤进行之后,却提示如下字段:
NID-00135: There are 1 active threads
Change of database name failed during validation - database is
intact.
DBNEWID - Completed with validation errors.
经过多机试验,发现这个错误并非偶然出现一两次而已,至于windows平台下,为何无人提起,就有待日后研究了。
关于这个错误,关键是检查两个地方。
第一是表空间与数据文件的状态:
SQL> select
file#,status,name from
v$datafile;
FILE#
STATUS    NAME
———- ——-
——————————————————————————–
1
SYSTEM    /u01/app/oracle/oradata/db1/system01.dbf
2
ONLINE    /u01/app/oracle/oradata/db1/undotbs01.dbf
3
ONLINE    /u01/app/oracle/oradata/db1/sysaux01.dbf
4
ONLINE    /u01/app/oracle/oradata/db1/usertbs.dbf
5
ONLINE    /u01/app/oracle/oradata/db1/raocl.dbf
正常情况下,其状态应该是online或者offline。但如果因为历史操作的原因,导致某数据文件的状态变成了recovery,那么就会出问题了。
解决方法也简单,drop掉出错的数据文件就行了。
第二是归档文件的设置:
SQL> archive log
list
Database log
mode                            Archive
Mode
Automatic
archival
Enabled
Archive
destination                        /u01/app/oracle/product/10.2.0/db1/dbs/arch
Oldest online log
sequence
31
Next log sequence to
archive
33
Current log
sequence
33
SQL> host ls $ORACLE_HOME/dbs
alert_db1.log
arch1_29_689269707.dbf    control01.ctl
initdw.ora    spfiledb1.ora.bak
arch1_25_689269707.dbf    arch1_30_689269707.dbf    control02.ctl
init.ora
arch1_26_689269707.dbf    arch1_31_689269707.dbf    db1_ora_4704.trc    lkAAA
arch1_27_689269707.dbf    arch1_32_689269707.dbf    hc_db1.dat                lkDB1
arch1_28_689269707.dbf    cntrldb1.dbf                        initdb1.ora
orapwdb1
如果没有设置归档文件路径或者没有归档文件存在,nid也会出错。
设置归档文件模式、路径并手工归档的命令分别如下:
SQL> alter database archivelog;
SQL> alter system
set log_archive_dest_1=’location=/u01/app/oracle/oradata/db1/arch’;
SQL> alter system
archive log current;
注意:归档文件模式也要在mount下设置。
确认完成这两步以后,在重新运行nid系统命令,出现如下字段,即可成功更改dbname了。
Control Files in database:
/u01/app/oracle/product/10.2.0/db1/dbs/control01.ctl
/u01/app/oracle/product/10.2.0/db1/dbs/control02.ctl
Change database ID and database
name DB1 to AAA? (Y/[N]) => Y
Proceeding with operation
Changing database ID from 1283133323 to
1845742016
Changing database name from DB1
to AAA
Control
File
/u01/app/oracle/product/10.2.0/db1/dbs/control01.ctl -
modified
Control
File
/u01/app/oracle/product/10.2.0/db1/dbs/control02.ctl -
modified
Datafile
/u01/app/oracle/oradata/db1/system01.dbf - dbid changed, wrote new
name
Datafile
/u01/app/oracle/oradata/db1/undotbs01.dbf - dbid changed, wrote new
name
Datafile
/u01/app/oracle/oradata/db1/sysaux01.dbf - dbid changed, wrote new
name
Datafile
/u01/app/oracle/oradata/db1/usertbs.dbf - dbid changed, wrote new
name
Datafile
/u01/app/oracle/oradata/db1/raocl.dbf - dbid changed, wrote new
name
Datafile
/u01/app/oracle/oradata/db1/temp01.dbf - dbid changed, wrote new
name
Control
File
/u01/app/oracle/product/10.2.0/db1/dbs/control01.ctl - dbid
changed, wrote new name
Control
File
/u01/app/oracle/product/10.2.0/db1/dbs/control02.ctl - dbid
changed, wrote new name
Instance
shut down
Database name changed to
AAA.
Modify parameter file and generate a new password file before restarting.
Database ID for database AAA
changed to 1845742016.
All previous backups and archived redo logs for this database are
unusable.
Database has been shutdown, open
database with RESETLOGS option.
Succesfully changed database
name and
ID.
DBNEWID - Completed succesfully.
至于引起这个错误的深层次原因,从之前有过的其他操作猜测,会不会是scn不一致的原因??如果是这个原因,那或许只要很简单的CKPT就可以了。找时间试验一下。