关闭现有数据库,设定好一个新的 SID 后,通过复制参数文件为 spfile<New SID>.ora 作为新实例的参数文件,将控制文件、数据文件和重做日志复制一份到相应的目录,此时新的数据库就有一个雏形了;将数据库启动 nomout 阶段修改spfile中的新数据库的 controlfile 的位置就可以将数据库启动到 mount 阶段,在 mount 阶段将数据文件和重做日志的文件修改到新路径后就可以打开数据库了。
整个过程都很顺利,但是此时再试图打开原来的数据库就会报错了:
1
|
ORA-01102: cannot mount database in EXCLUSIVE mode
|
而 alert 文件中出现如下信息:
1
2
3
4
5
6
7
8
9
10
11
|
Sat Oct 9 11:14:18 2010
ALTER DATABASE MOUNT
Sat Oct 9 11:14:18 2010
sculkget: failed to lock /u01/app/oracle/dbs/lkORA8I exclusive
sculkget: lock held by PID: 11621
Sat Oct 9 11:14:18 2010
ORA-09968: Message 9968 not found; No message file for product=RDBMS, facility=ORA
Linux-x86_64 Error: 11: Resource temporarily unavailable
Additional information: 11621
Sat Oct 9 11:14:18 2010
ORA-1102 signalled during: ALTER DATABASE MOUNT...
|
旧的数据库的 SID 和 DB_NAME 均是 ORA8I,failed to lock /u01/app/oracle/dbs/lkORA8I exclusive应该就是问题所在了,在参数文件中的db_name好改,但是db_name还存在于控制文件和数据文件中,这些文件怎么改呢? 这个就要借助nid程序了。
首先将新数据库启动到 mount 阶段,假设新的数据库的实例是oratmp,数据库名也是oratmp。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
[oracle@l004020 ~]$
export
$ORACLE_SID=oratmp
[oracle@l004020 ~]$ nid target=sys
/sys_password
dbname=oratmp
DBNEWID: Release 10.2.0.2.0 - Production on Sat Oct 9 11:37:47 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to database ORA8I (DBID=152116074)
Connected to server version 10.2.0
Control Files
in
database:
/u02/oradata/oratmp/control01
.ctl
/u02/oradata/oratmp/control02
.ctl
/u02/oradata/oratmp/control03
.ctl
Change database ID and database name ORA8I to ORATMP? (Y/[N]) => y
Proceeding with operation
Changing database ID from 152116074 to 3320092043
Changing database name from ORA8I to ORATMP
Control File
/u02/oradata/oratmp/control01
.ctl - modified
Control File
/u02/oradata/oratmp/control02
.ctl - modified
Control File
/u02/oradata/oratmp/control03
.ctl - modified
Datafile
/u02/oradata/oratmp/system01
.dbf - dbid changed, wrote new name
Datafile
/u02/oradata/oratmp/undotbs01
.dbf - dbid changed, wrote new name
Datafile
/u02/oradata/oratmp/sysaux01
.dbf - dbid changed, wrote new name
Datafile
/u02/oradata/oratmp/users01
.dbf - dbid changed, wrote new name
Datafile
/u02/oradata/ora8i/temp01
.dbf - dbid changed, wrote new name
Control File
/u02/oradata/oratmp/control01
.ctl - dbid changed, wrote new name
Control File
/u02/oradata/oratmp/control02
.ctl - dbid changed, wrote new name
Control File
/u02/oradata/oratmp/control03
.ctl - dbid changed, wrote new name
Instance shut down
Database name changed to ORATMP.
Modify parameter
file
and generate a new password
file
before restarting.
Database ID
for
database ORATMP changed to 3320092043.
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.
[oracle@l004020 ~]$ sqlplus / as sysdba
SQL>
shutdown
immediate;
ORA-01507: database not mounted
ORACLE instance shut down.
SQL> startup
mount
;
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 2069648 bytes
Variable Size 104860528 bytes
Database Buffers 50331648 bytes
Redo Buffers 10510336 bytes
ORA-01103: database name
'ORATMP'
in
control
file
is not
'ORA8I'
SQL> alter system
set
db_name=
'oratmp'
scope=spfile;
System altered.
SQL>
shutdown
immediate;
ORA-01507: database not mounted
ORACLE instance shut down.
SQL> startup
mount
;
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 2069648 bytes
Variable Size 104860528 bytes
Database Buffers 50331648 bytes
Redo Buffers 10510336 bytes
Database mounted.
SQL> alter database
open
;
alter database
open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option
for
database
open
SQL> alter database
open
resetlogs ;
Database altered.
#再看看hc<db_name>文件。
[oracle@l004020 dbs]$
ls
-lth hc*
-rw-rw---- 1 oracle dba 1.6K 10-09 11:49 hc_oratmp.dat
-rw-rw---- 1 oracle dba 1.6K 10-09 11:34 hc_ora8i.dat
|
简单来说就是如下几步:
1。startup mount ;
2。nid target=sys/sys_password dbname=oratmp
3。alter system set db_name=<new dbname> ;
4。shutdown
5。startup mount ;
6。alter database open resetlogs。