关于克隆数据库的方法,最近一直在研究,偶尔在cnoug上闲逛,发现了两篇帖子不错,现作为以后工作中的参考:
方法一:
如何使用rman在两机器间克隆数据库
原文摘自:www.cnoug.org
关键字:目标、目录、克隆、日志、
目标数据库和克隆数据库分别在两台机器,其环境都一样:
windows 2000 server sp4、ie6.1, oracle9205
在本文中,使用的是目标数据库上的rman,目录数据库在第3台机器上,
操作步骤:
1、连接目标数据库,对目标数据库做全库备份
d:\oracle\bin>rman
恢复管理器: 版本9.2.0.5.0 – production
copyright (c) 1995, 2002, oracle corporation. all rights reserved.
rman> connect catalog rman/rman@187
连接到恢复目录数据库
rman> connect target /
连接到目标数据库: encore (dbid=3146513770)
rman> run
2> {allocate channel d1 type disk maxpiecesize = 500m;
3> backup full database
4> format e:\rmanbak\db_%d_%s_%p_%t;
5> release channel d1;
6> }
分配的通道: d1
通道 d1: sid=16 devtype=disk
启动 backup 于 2004-06-28 21:03:31
通道 d1: 正在启动 full 数据文件备份集
通道 d1: 正在指定备份集中的数据文件
在备份集中包含当前的 spfile
备份集中包括当前控制文件
输入数据文件 fno=00001 name=d:\oracle\oradata\encore ystem01.dbf
输入数据文件 fno=00002 name=d:\oracle\oradata\encore\undotbs01.dbf
输入数据文件 fno=00005 name=d:\oracle\oradata\encore\example01.dbf
输入数据文件 fno=00008 name=d:\oracle\oradata\encore\tools01.dbf
输入数据文件 fno=00010 name=d:\oracle\oradata\encore\xdb01.dbf
输入数据文件 fno=00006 name=d:\oracle\oradata\encore\indx01.dbf
输入数据文件 fno=00009 name=d:\oracle\oradata\encore\users01.dbf
输入数据文件 fno=00003 name=d:\oracle\oradata\encore\cwmlite01.dbf
输入数据文件 fno=00004 name=d:\oracle\oradata\encore\drsys01.dbf
输入数据文件 fno=00007 name=d:\oracle\oradata\encore\odm01.dbf
通道 d1: 正在启动段 1 于 2004-06-28 21:03:37
通道 d1: 已完成段 1 于 2004-06-28 21:05:02
段 handle=e:\rmanbak\db_encore_1_1_530053412 comment=none
通道 d1: 正在启动段 2 于 2004-06-28 21:05:02
通道 d1: 已完成段 2 于 2004-06-28 21:06:07
段 handle=e:\rmanbak\db_encore_1_2_530053412 comment=none
通道 d1: 备份集已完成, 经过时间:00:02:35
完成 backup 于 2004-06-28 21:06:07
释放的通道: d1
rman>
2、备份目标数据库的参数文件
sql> create pfile from spfile;
文件已创建
sql>
3、–将目标数据库的参数文件(第2步创建)拷贝到克隆机器上,修改相应的参数(主要是实例名和
数据库名,和bdump、udump、cdump 等后台进程的跟踪文件存放的路径,本文中,克隆数据库
的实例名为 clone,数据库名为 clone_db),然后在克隆机器上创建实例
d:\oracle\bin>oradim -new -sid clone -pfile d:\oracle\database\initclone.ora -intpwd sys1
d:\oracle\bin>
4、–修改克隆数据库的监听器,增加对克隆数据库的监听(第3段)
sid_list_listener =
(sid_list =
(sid_desc =
(sid_name = plsextproc)
(oracle_home = d:\oracle)
(program = extproc)
)
(sid_desc =
(global_dbname = oracle)
(oracle_home = d:\oracle)
(sid_name = oracle92)
)
(sid_desc =
(global_dbname = clone_db)
(oracle_home = d:\oracle)
(sid_name = clone)
)
)
5、修改rman机器上的tnsnames.ora文件,增加此连接串,保证rman使用此连接串能够连接到
克隆数据库的实例
clone =
(description =
(address_list =
(address = (protocol = tcp)(host = 192.168.0.194)(port = 1521))
)
(connect_data =
(service_name = clone_db)
)
)
5、将目标数据库的备份集拷贝到克隆数据库机器的同一位置,并启动克隆数据库(nomount 状态)
6、由于第1步骤中没有备份日志,在使用
rman> run
2> {allocate auxiliary channel d1 type disk;
3> set newname for datafile 1 to f:\clone\data ystem01.dbf;
脚本克隆数据库时,出现 no backup copy 之类的错误,
之后补充备份目标数据库的日志,
rman> run
2> {allocate channel d1 type disk maxpiecesize = 500m;
3> backup archivelog all
4> format e:\rmanbak\log_%d_%s_%p_%t;
5> release channel d1;
6> }
分配的通道: d1
通道 d1: sid=11 devtype=disk
启动 backup 于 2004-06-28 21:42:18
当前日志已存档
通道 d1: 正在启动存档日志备份集
通道 d1: 正在指定备份集中的存档日志
输入存档日志线程 =1 序列 =107 记录 id=107 时间戳=528371132
输入存档日志线程 =1 序列 =108 记录 id=108 时间戳=530053839
输入存档日志线程 =1 序列 =109 记录 id=109 时间戳=530054855
输入存档日志线程 =1 序列 =110 记录 id=110 时间戳=530055437
输入存档日志线程 =1 序列 =111 记录 id=111 时间戳=530055540
输入存档日志线程 =1 序列 =112 记录 id=112 时间戳=530055739
通道 d1: 正在启动段 1 于 2004-06-28 21:42:23
通道 d1: 已完成段 1 于 2004-06-28 21:42:26
段 handle=e:\rmanbak\log_encore_2_1_530055742 comment=none
通道 d1: 备份集已完成, 经过时间:00:00:04
完成 backup 于 2004-06-28 21:42:26
释放的通道: d1
7、将日志备份集拷贝到克隆机器的同一目录后,回到rman处,连接辅助(克隆)数据库,
执行脚本,剩下的rman自己会做
rman> connect auxiliary sys/sys1@clone
已连接到备用数据库: clone_db (未安装)
rman> run
2> {allocate auxiliary channel d1 type disk;
3> set newname for datafile 1 to f:\clone\data ystem01.dbf;
4> set newname for datafile 2 to f:\clone\data\undotbs01.dbf;
5> set newname for datafile 3 to f:\clone\data\cwmlite01.dbf;
6> set newname for datafile 4 to f:\clone\data\drsys01.dbf;
7> set newname for datafile 5 to f:\clone\data\example01.dbf;
8> set newname for datafile 6 to f:\clone\data\indx01.dbf;
9> set newname for datafile 7 to f:\clone\data\odm01.dbf;
10> set newname for datafile 8 to f:\clone\data\tools01.dbf;
11> set newname for datafile 9 to f:\clone\data\users01.dbf;
12> set newname for datafile 10 to f:\clone\data\xdb01.dbf;
13> duplicate target database to clone_db
14> logfile
15> group 1 (f:\clone\data\redo01.dbf) size 10m,
16> group 2 (f:\clone\data\redo02.dbf) size 10m,
17> group 3 (f:\clone\data\redo03.dbf) size 10m;
18> }
分配的通道: d1
通道 d1: sid=8 devtype=disk
正在执行命令: set newname
正在执行命令: set newname
正在执行命令: set newname
正在执行命令: set newname
正在执行命令: set newname
正在执行命令: set newname
正在执行命令: set newname
正在执行命令: set newname
正在执行命令: set newname
正在执行命令: set newname
启动 duplicate db 于 2004-06-28 21:43:51
正在打印存储的脚本: memory script
{
set until scn 261688166;
set newname for datafile 1 to
“f:\clone\data ystem01.dbf”;
set newname for datafile 2 to
“f:\clone\data\undotbs01.dbf”;
set newname for datafile 3 to
“f:\clone\data\cwmlite01.dbf”;
set newname for datafile 4 to
“f:\clone\data\drsys01.dbf”;
set newname for datafile 5 to
“f:\clone\data\example01.dbf”;
set newname for datafile 6 to
“f:\clone\data\indx01.dbf”;
set newname for datafile 7 to
“f:\clone\data\odm01.dbf”;
set newname for datafile 8 to
“f:\clone\data\tools01.dbf”;
set newname for datafile 9 to
“f:\clone\data\users01.dbf”;
set newname for datafile 10 to
“f:\clone\data\xdb01.dbf”;
restore
check readonly
clone database
;
}
正在执行脚本: memory script
正在执行命令: set until clause
正在执行命令: set newname
正在执行命令: set newname
正在执行命令: set newname
正在执行命令: set newname
正在执行命令: set newname
正在执行命令: set newname
正在执行命令: set newname
正在执行命令: set newname
正在执行命令: set newname
正在执行命令: set newname
启动 restore 于 2004-06-28 21:43:54
通道 d1: 正在开始恢复数据文件备份集
通道 d1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到f:\clone\data ystem01.dbf
正将数据文件00002恢复到f:\clone\data\undotbs01.dbf
正将数据文件00003恢复到f:\clone\data\cwmlite01.dbf
正将数据文件00004恢复到f:\clone\data\drsys01.dbf
正将数据文件00005恢复到f:\clone\data\example01.dbf
正将数据文件00006恢复到f:\clone\data\indx01.dbf
正将数据文件00007恢复到f:\clone\data\odm01.dbf
正将数据文件00008恢复到f:\clone\data\tools01.dbf
正将数据文件00009恢复到f:\clone\data\users01.dbf
正将数据文件00010恢复到f:\clone\data\xdb01.dbf
通道 d1: 已恢复备份段 1
段 handle=e:\rmanbak\db_encore_1_1_530053412 tag=tag20040628t210331 params=null
通道 d1: 已恢复备份段 2
段 handle=e:\rmanbak\db_encore_1_2_530053412 tag=tag20040628t210331 params=null
通道 d1: 恢复完成
完成 restore 于 2004-06-28 21:46:35
sql 语句: create controlfile reuse set database “clone_db” resetlogs archivelog
maxlogfiles 50
maxlogmembers 5
maxdatafiles 100
maxinstances 1
maxloghistory 226
logfile
group 1 ( f:\clone\data\redo01.dbf ) size 10485760 ,
group 2 ( f:\clone\data\redo02.dbf ) size 10485760 ,
group 3 ( f:\clone\data\redo03.dbf ) size 10485760
datafile
f:\clone\data ystem01.dbf
character set zhs16gbk
正在打印存储的脚本: memory script
{
switch clone datafile all;
}
正在执行脚本: memory script
数据文件 2 已转换成数据文件副本
输入数据文件副本 recid=1 stamp=530056505 文件名=f:\clone\data\undotbs01.dbf
数据文件 3 已转换成数据文件副本
输入数据文件副本 recid=2 stamp=530056505 文件名=f:\clone\data\cwmlite01.dbf
数据文件 4 已转换成数据文件副本
输入数据文件副本 recid=3 stamp=530056505 文件名=f:\clone\data\drsys01.dbf
数据文件 5 已转换成数据文件副本
输入数据文件副本 recid=4 stamp=530056505 文件名=f:\clone\data\example01.dbf
数据文件 6 已转换成数据文件副本
输入数据文件副本 recid=5 stamp=530056505 文件名=f:\clone\data\indx01.dbf
数据文件 7 已转换成数据文件副本
输入数据文件副本 recid=6 stamp=530056505 文件名=f:\clone\data\odm01.dbf
数据文件 8 已转换成数据文件副本
输入数据文件副本 recid=7 stamp=530056505 文件名=f:\clone\data\tools01.dbf
数据文件 9 已转换成数据文件副本
输入数据文件副本 recid=8 stamp=530056505 文件名=f:\clone\data\users01.dbf
数据文件 10 已转换成数据文件副本
输入数据文件副本 recid=9 stamp=530056505 文件名=f:\clone\data\xdb01.dbf
正在打印存储的脚本: memory script
{
set until scn 261688166;
recover
clone database
delete archivelog
;
}
正在执行脚本: memory script
正在执行命令: set until clause
启动 recover 于 2004-06-28 21:46:37
正在开始介质的恢复
通道 d1: 正在启动到默认目标的存档日志恢复
通道 d1: 正在恢复存档日志
存档日志线程 =1 序列=108
通道 d1: 正在恢复存档日志
存档日志线程 =1 序列=109
通道 d1: 正在恢复存档日志
存档日志线程 =1 序列=110
通道 d1: 正在恢复存档日志
存档日志线程 =1 序列=111
通道 d1: 正在恢复存档日志
存档日志线程 =1 序列=112
通道 d1: 已恢复备份段 1
段 handle=e:\rmanbak\log_encore_2_1_530055742 tag=tag20040628t214221 params=null
通道 d1: 恢复完成
存档日志文件名 =f:\clone\log\arc00108.001 线程 =1 序列 =108
通道 clone_default: 正在删除存档日志
存档日志文件名 =f:\clone\log\arc00108.001 记录 id=3 时间戳 =530056510
存档日志文件名 =f:\clone\log\arc00109.001 线程 =1 序列 =109
通道 clone_default: 正在删除存档日志
存档日志文件名 =f:\clone\log\arc00109.001 记录 id=4 时间戳 =530056510
存档日志文件名 =f:\clone\log\arc00110.001 线程 =1 序列 =110
通道 clone_default: 正在删除存档日志
存档日志文件名 =f:\clone\log\arc00110.001 记录 id=5 时间戳 =530056510
存档日志文件名 =f:\clone\log\arc00111.001 线程 =1 序列 =111
通道 clone_default: 正在删除存档日志
存档日志文件名 =f:\clone\log\arc00111.001 记录 id=2 时间戳 =530056510
存档日志文件名 =f:\clone\log\arc00112.001 线程 =1 序列 =112
通道 clone_default: 正在删除存档日志
存档日志文件名 =f:\clone\log\arc00112.001 记录 id=1 时间戳 =530056510
完成介质的恢复
完成 recover 于 2004-06-28 21:46:47
正在打印存储的脚本: memory script
{
shutdown clone;
startup clone nomount ;
}
正在执行脚本: memory script
数据库已卸载
oracle 例程已关闭
已连接到备用数据库 (未启动)
oracle 例程已启动
系统全局区域总计 319889436 字节
fixed size 454684 字节
variable size 109051904 字节
database buffers 209715200 字节
redo buffers 667648 字节
sql 语句: create controlfile reuse set database “clone_db” resetlogs archivelog
maxlogfiles 50
maxlogmembers 5
maxdatafiles 100
maxinstances 1
maxloghistory 226
logfile
group 1 ( f:\clone\data\redo01.dbf ) size 10485760 ,
group 2 ( f:\clone\data\redo02.dbf ) size 10485760 ,
group 3 ( f:\clone\data\redo03.dbf ) size 10485760
datafile
f:\clone\data ystem01.dbf
character set zhs16gbk
正在打印存储的脚本: memory script
{
catalog clone datafilecopy “f:\clone\data\undotbs01.dbf”;
catalog clone datafilecopy “f:\clone\data\cwmlite01.dbf”;
catalog clone datafilecopy “f:\clone\data\drsys01.dbf”;
catalog clone datafilecopy “f:\clone\data\example01.dbf”;
catalog clone datafilecopy “f:\clone\data\indx01.dbf”;
catalog clone datafilecopy “f:\clone\data\odm01.dbf”;
catalog clone datafilecopy “f:\clone\data\tools01.dbf”;
catalog clone datafilecopy “f:\clone\data\users01.dbf”;
catalog clone datafilecopy “f:\clone\data\xdb01.dbf”;
switch clone datafile all;
}
正在执行脚本: memory script
已将数据文件副本列入目录
数据文件副本 filename=f:\clone\data\undotbs01.dbf recid=1 stamp=530056530
已将数据文件副本列入目录
数据文件副本 filename=f:\clone\data\cwmlite01.dbf recid=2 stamp=530056530
已将数据文件副本列入目录
数据文件副本 filename=f:\clone\data\drsys01.dbf recid=3 stamp=530056531
已将数据文件副本列入目录
数据文件副本 filename=f:\clone\data\example01.dbf recid=4 stamp=530056531
已将数据文件副本列入目录
数据文件副本 filename=f:\clone\data\indx01.dbf recid=5 stamp=530056531
已将数据文件副本列入目录
数据文件副本 filename=f:\clone\data\odm01.dbf recid=6 stamp=530056531
已将数据文件副本列入目录
数据文件副本 filename=f:\clone\data\tools01.dbf recid=7 stamp=530056532
已将数据文件副本列入目录
数据文件副本 filename=f:\clone\data\users01.dbf recid=8 stamp=530056532
已将数据文件副本列入目录
数据文件副本 filename=f:\clone\data\xdb01.dbf recid=9 stamp=530056532
数据文件 2 已转换成数据文件副本
输入数据文件副本 recid=1 stamp=530056530 文件名=f:\clone\data\undotbs01.dbf
数据文件 3 已转换成数据文件副本
输入数据文件副本 recid=2 stamp=530056530 文件名=f:\clone\data\cwmlite01.dbf
数据文件 4 已转换成数据文件副本
输入数据文件副本 recid=3 stamp=530056531 文件名=f:\clone\data\drsys01.dbf
数据文件 5 已转换成数据文件副本
输入数据文件副本 recid=4 stamp=530056531 文件名=f:\clone\data\example01.dbf
数据文件 6 已转换成数据文件副本
输入数据文件副本 recid=5 stamp=530056531 文件名=f:\clone\data\indx01.dbf
数据文件 7 已转换成数据文件副本
输入数据文件副本 recid=6 stamp=530056531 文件名=f:\clone\data\odm01.dbf
数据文件 8 已转换成数据文件副本
输入数据文件副本 recid=7 stamp=530056532 文件名=f:\clone\data\tools01.dbf
数据文件 9 已转换成数据文件副本
输入数据文件副本 recid=8 stamp=530056532 文件名=f:\clone\data\users01.dbf
数据文件 10 已转换成数据文件副本
输入数据文件副本 recid=9 stamp=530056532 文件名=f:\clone\data\xdb01.dbf
正在打印存储的脚本: memory script
{
alter clone database open resetlogs;
}
正在执行脚本: memory script
数据库已打开
rman>
–执行此步骤需要注意:避免连接克隆数据库,否则,rman将无法正常关闭克隆数据库
(shutdown clone),剩下的步骤无法继续执行。
8、测试克隆数据库
d:\oracle\bin>sqlplus
sql*plus: release 9.2.0.5.0 – production on mon jun 28 22:01:46 2004
copyright (c) 1982, 2002, oracle corporation. all rights reserved.
enter user-name: sys/sys1@clone as sysdba
connected to:
oracle9i enterprise edition release 9.2.0.5.0 – production
with the partitioning, oracle label security, olap and oracle data mining options
jserver release 9.2.0.5.0 – production
sql> select status from v$instance;
status
————
open
sql> archive log list;
database log mode archive mode
automatic archival enabled
archive destination f:\clone\log
oldest online log sequence 0
next log sequence to archive 1
current log sequence 1
sql>
总结:在两台机器间用rman克隆数据库,个人认为,有两点需要注意:
1、在对目标数据库做全库备份时,要注意同时备份日志,缺少此步骤,rman在克隆时将报no backup copy 之类的错误.
2、要将目标数据库备份的备份集拷贝到克隆机器的同一个目录(同备份目标数据库时备份集存放的目录)下,否则,rman将报:找不到xxxx备份集.
dbca是一款可以配置、管理和建立数据库的工具。在初始数据库安装过程中,如果你选择“建立一个数据库选项(create a database option)”,这一工具就会启动并运行。你可以建立一个基于模板的数据库,也可以从先前的范例中导入一个新的模板。
很多管理人员并不知道,只要在命令行中键入dbca这可以进入到dbca环境。一旦这一工具启动,你可以建立一个新的数据库,配置数据库的init.ora选项,删除一个现有的数据库,或者管理数据库模板。这些数据库模板与安装时生成的模板类似(比如general purpose, data warehouse,以及transaction processing)。
在安装过程中,出现一个警示对话框以询问是否需要保存你的模板。你可以点击no,或者可以在安装时就人工定义你的数据库。dbca工具能够检查数据库设置并生成一个基于当前操作系统的模板,甚至可以有选择性地输出当前数据。这一特性就使得它成为将一个数据库转移到另一机器或者将一个数据库嵌入到其它有价值产品的优秀工具。
dbca工具将模板存储在一个以.dbc扩展名的文件。一个.dbc文件包含init.ora参数、位置数据文件、日志文件、以及数据库中以xml格式的控制文件的列表。如果你选择包含你的数据库数据,这一工具也会生成一个扩展名为.dbj的文件,即一个包含你的数据文件的图像的zip压缩文件。有些用户会想到建立所有这些设置的一个备份,以避免在一个新机器上重新建立一个数据库的必要。
方法二:
使用dbca克隆一个数据库
有很多变量允许dbca为oracle软件将文件安装到合适的路径,比如{oracle_base}以及{db_name}。由于这些只是简单的xml,可以使用一个diff函数快速查看这些模板之间的差别。例如,general purpose 和 data warehouse数据库模板之间的差别是在于oracle 9i 9.2.0.0的data warehouse模板:
temp tablespace小于1m.
init.ora参数包括:
star_transformation_enabled被激活。
pga_aggregate_target比较在。
query_rewrite_enabled被激活。
db_file_multiblock_read_count为双倍。
sort_area_size为双倍。
hash_area_size没有被设置。
db_cache_size比较小。
对于transaction processing模板,差别在于:
oracle olap选项没有被激活。
init.ora参数包括:
db_block_size为一半。
undo_retention比较小。
pga_aggregate_target比较小。
db_file_multiblock_read_count为一半。
hash_join_enabled被关闭。
db_cache_size比较大。
无需建立一个cwmlite tablespace(因为olap选项已经被关闭)。
example 和 system tablespaces比较小。
temp tablespace为双倍大小。
当你使用dbca工具从数据库中输出数据时,dbca将生成一个以.dfj扩展名的文件,即一个包含每一数据文件的源图像的zip压缩文件。这就意味着这些数据在转移过程中保证了安全性。然而,这些文件并没有很好被exp和imp文档化和支持。同样,这些图像绝大多数直接写入到磁盘,而不是类似于imp的通过sql写入。