在Linux中通过本地复制的方式创建多一个Oracle数据库

在 Oracle 的世界里,一个实例只能打开一个数据库,如果我想在本机中同时运行两个数据库,那就要开启两个实例了,而不同的实例的标识就是SID。

      关闭现有数据库,设定好一个新的 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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值