某些时候为了快速创建一个新的数据库(DBCA太慢,而且DBCA创建的库没有数据),或者其它原因,你可以希望直接复制现有数据库,但是又不希望新库与原库重名,这时候就就可以通过重建控制文件的方式修改数据库名。
大致步骤如下:
- 原库生成控制文件创建脚本并shutdown
- 复制数据文件、控制文件、归档文件、Online Redologs以及spfile到新服务器适当路径下。
- 新库中根据spfile生成pfile,并做适当修改后,再根据pfile生成spfile
- 打开原库生成的trace文件,获取控制文件创建脚本并做适当修改
- 新库启动至nomount
- 执行修改后的trace
下面演示通过JSSSTR数据库复制出一个JSSBAK,操作如下:
1、 生成控制文件创建脚本:
JSSSTR> alter database backup controlfile to trace;
Database altered.执行下列语句,获取当前生成的trace文件路径:
JSSSTR> select c.value || '/' || d.instance_name || '_ora_' ||
2 to_char(a.spid,'fm99999') || '.trc'
3 from v$process a, v$session b, v$parameter c, v$instance d
4 where a.addr = b.paddr
5 and b.audsid = userenv('sessionid')
6 and c.name = 'user_dump_dest';
C.VALUE||'/'||D.INSTANCE_NAME||'_ORA_'||TO_CHAR(A.SPID,'FM99999')||'.TRC'
--------------------------------------------------------------------------------
/data/oracle/admin/jssstr/udump/jssstr_ora_5612.trc2、 关闭数据库
JSSSTR> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.3、 复制文件
过程略,注意文件要复制完整,包括数据文件,归档文件,Online Redo以及tnsnames.ora,listener.ora等等。
注,控制文件不需要复制。
4、 新库中通过原spfile生在pfile
[oracle@yans3 dbs]$ export ORACLE_SID=jssbak
[oracle@yans3 dbs]$ sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.3.0 - Production on Wed Mar 25 15:45:05 2009
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Connected to an idle instance.
SQL> set sqlprompt "JSSBAK> "
JSSBAK> create pfile ='/data/oracle/product/10.2/dbs/pfilejssbak.ora' from spfile ='/data/oracle/product/10.2/dbs/spfilejssstr.ora';
File created.5、 文本编辑器修改pfilejssbak.ora
主要修改路径参数和db_name等。过程略
6、 创建spfile并启动到nomount
JSSBAK> create spfile from pfile='/data/oracle/product/10.2/dbs/pfilejssbak.ora';
File created.
JSSBAK> startup nomount
ORACLE instance started.
Total System Global Area 524288000 bytes
Fixed Size 2073984 bytes
Variable Size 150997632 bytes
Database Buffers 364904448 bytes
Redo Buffers 6311936 bytes7、 源库打开生成的trace文件并修改
找到Set #2. RESETLOGS case,复制其后的语句并做适当修改。
主要将:
CREATE CONTROLFILE REUSE DATABASE "JSS STR " RESETLOGS ARCHIVELOG
改为:
CREATE CONTROLFILE SET DATABASE "JSSBAK" RESETLOGS ARCHIVELOG
其它文件路径按照实际情况修改,另外由于前面文件是冷复制,因此移除RECOVER DATABASE USING BACKUP CONTROLFILE那一句。
8、 执行修改后的脚本
JSSBAK> CREATE CONTROLFILE SET DATABASE "JSSBAK" RESETLOGS ARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 292
7 LOGFILE
8 GROUP 1 '/data/oracle/oradata/jssbak/redo01.log' SIZE 50M,
9 GROUP 2 '/data/oracle/oradata/jssbak/redo02.log' SIZE 50M,
10 GROUP 3 '/data/oracle/oradata/jssbak/redo03.log' SIZE 50M
11 DATAFILE
12 '/data/oracle/oradata/jssbak/system01.dbf',
13 '/data/oracle/oradata/jssbak/undotbs01.dbf',
14 '/data/oracle/oradata/jssbak/sysaux01.dbf',
15 '/data/oracle/oradata/jssbak/users01.dbf',
16 '/data/oracle/oradata/jssbak/strmtbs01.ora',
17 '/data/oracle/oradata/jssbak/webdata01.dbf'
18 CHARACTER SET ZHS16GBK
19 ;
Control file created.
JSSBAK> ALTER DATABASE OPEN RESETLOGS;
Database altered.
JSSBAK> ALTER TABLESPACE TEMP ADD TEMPFILE '/data/oracle/oradata/jssbak/temp01.dbf' REUSE;
Tablespace altered.如果没有报错,则数据库复制并改名成功。
---------------------------------------------
1、改数据db_name
SQL> startup mount
SQL> host nid target=sys/admin@tccz dbname=tccz1;
\\停库再重启
SQL> shutdown immediate
SQL> conn sys/admin@tccz as sysdba
SQL> startup mount
SQL> alter system set db_name=zstest scope=spfile;
SQL> shutdown immediate;
\\以resetlogs的方式重新开启数据库
SQL> startup mount
SQL> alter database open resetlogs;
\\查看
SQL> select dbid,name from v$database;
2、更改数据库sid
1)windows下停止所有数据库服务
2)删除旧实例创建新实例
C:\Documents and Settings\Administrator>oradim -delete -sid tccz
C:\Documents and Settings\Administrator>oradim -new -sid tccz1
C:\Documents and Settings\Administrator>set oracle_sid=tccz1
3)将原密码文件pwdzs.ora改为pwdtccz1.ora
4)修改spfile里实例信息(包含路径里的tccz改为tccz1,OS目录tccz改为tccz1)
//如果此处不修改路径中的tccz到tccz1则后面应无需重建控制文件
C:\Documents and Settings\Administrator>sqlplus sys/admin as sysdba
//先从spfile创建pfile
SQL> create pfile='D:\oracle\product\10.2.0\admin\zs\pfile\init080703.ora' from spfile='D:\oracle\product\10.2.0\db_1\database\SPFILEtccz.ORA';
//调整pfile里的参数后再创建spfile
SQL> create spfile='D:\oracle\product\10.2.0\db_1\database\SPFILEtccz1.ORA' from pfile='D:\oracle\product\10.2.0\admin\zstest\pfile\init080703.ora';
5)更改listener.ora和tnsnames.ora并重启listener
直接编辑这两个文件将里面的sid_name、dbname和service_name都改为tccz1
6)因为更改了OS数据库目录路径(tccz改为tccz1)所以需要重建controlfiles
//创建控制文件的脚本可以再旧数据库的时候使用如下语句获得:
alter database backup controlfile to trace as 'd:\controlfile.txt';
再做修改即可使用。
SQL> alter database open resetlogs;
//重建完控制文件重新启用temp表空间
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\tccz1\TEMP01.DBF' SIZE 20m MAXSIZE 32767M;
3、重建em
用emca -deconfig dbcontrol db -repos drop删除em,然后用dbca来重建em.
-------------------------------
dbid是oracle数据库文件构件归属的唯一表示,它就是oracle各种数据文件的身份证件。是oracle在创建数据库是随机指定的10位数字字符串,类似于“1977880105“。
它可以通过oracle提供的应用程序nid.exe去修改:nid.exe target=usr/pwd@address
注意修改dbid必须使用resetlogs打开数据库
dbname就是数据库创建时指定的名称,也就是初始化参数文件里db_name参数指定的值,并且和控制文件里的指定的数据库名称一致。
它也可以通过nid.exe完成修改:nid.exe target=usr/pwd@address dbname=dbnewname setname=yes
注意修改dbname,如果使用pfile初始化参数文件,需要手工修改db_name参数,已经pwd文件
也可以同时修改dbid和dbname:nid.exe target=usr/pwd@address dbname=dbnewname
注意:
nid.exe提供了dbid修改失败回退功能,但不能和dbname修改一起使用!如:nid.exe target=usr/pwd@address revert=yes
nid.exe还可以记录操作日志!如: nid.exe target=usr/pwd@address logfile=file [append=[yes|no]]
注意:如果使用日志模式,则操作不会有任何的确认提示了!
nid.exe要求
1.sysdba身份连接tartget
2.数据库必须在事务一致关闭的情况下mount
3.所以的数据库文件必须可读写
nid.exe不能修改数据库的global_name,这个参数是first建立数据库时生成的,需要手工修改。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10804699/viewspace-607285/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10804699/viewspace-607285/