本文简要介绍了如何使用rman的duplicate命令实现Oracle9i RAC向单实例的迁移
本文可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
author:husthxd
msn:husthxd@hotmail.com
1. 简介
本文简要介绍了如何使用rman的duplicate命令实现Oracle9i RAC向单实例的迁移,迁移的目的是创建目标数据库的一个拷贝用于测试。
Rman的duplicate命令会restore主数据库文件的备份和拷贝并在测试机器上创建新的数据库。
环境:
主数据库:
Oracle 9.2.0.6 RAC
HP-UX 11.11
复制数据库:
Oracle 9.2.0.6
HP-UX 11.11
2. 步骤
1) 在测试机器上安装Oracle 9201,并打补丁到9206。
2) 在测试机器上准备初始化参数文件。
可以从其他机器上拷贝一份init.ora文件到测试机上,并修改必要的参数,如db_block_size、instance_name、db_name、control_files、*_dump_dest等。
下面是本例中使用的init.ora文件。
###########################################
# Optimizer
###########################################
hash_join_enabled=TRUE
query_rewrite_enabled=FALSE
star_transformation_enabled=FALSE
###########################################
# Job Queues
###########################################
job_queue_processes=10
###########################################
# Instance Identification
###########################################
instance_name=test
###########################################
# Miscellaneous
###########################################
aq_tm_processes=1
compatible=9.2.0.0.0
###########################################
# Security and Auditing
###########################################
remote_login_passwordfile=EXCLUSIVE
###########################################
# Sort, Hash Joins, Bitmap Indexes
###########################################
pga_aggregate_target=500m
sort_area_size=524288
###########################################
# Database Identification
###########################################
db_domain=""
db_name=test
###########################################
# File Configuration
###########################################
control_files=("/u01/app/oracle/oradata/CONTROL01.CTL", "/u01/app/oracle/oradata/CONTROL02.CTL", "/u01/app/oracle/oradata/CONTROL03.CTL")
###########################################
# Pools
###########################################
java_pool_size=10485760
large_pool_size=20971520
shared_pool_size=150m
###########################################
# Cursors and Library Cache
###########################################
open_cursors=300
###########################################
# System Managed Undo and Rollback Segments
###########################################
undo_management=AUTO
undo_retention=10800
undo_tablespace=UNDOTBS1
###########################################
# Diagnostics and Statistics
###########################################
background_dump_dest=/u01/app/oracle/admin/test/bdump
core_dump_dest=/u01/app/oracle/admin/test/cdump
timed_statistics=TRUE
user_dump_dest=/u01/app/oracle/admin/test/udump
###########################################
# Processes and Sessions
###########################################
processes=200
###########################################
# Redo Log and Recovery
###########################################
fast_start_mttr_target=300
###########################################
# Cache and I/O
###########################################
db_block_size=16384
db_cache_size=400m
db_file_multiblock_read_count=16
sga_max_size=700m
3) 在测试机上创建密码文件并启动数据库到nomount状态
$orapwd file=/$ORACLE_HOME/dbs/orapw password=sys entries=5
$sqlplus "/ as sysdba"
SQL>startup nomount
4) 拷贝主数据库中最近一次的rman全备份文件到测试机上对应的目录下。
本例中把主数据库中存储在/backup下的备份集文件拷贝到测试机器/backup目录下。
本例中耗时打开1.5小时
5) 在拷贝备份集文件到测试机的同时,在主服务器上执行1级累积增量备份;在增量备份完毕后备份归档日志,并把B节点的归档日志备份集文件拷贝到A机上;
最后把新生成的1级累积增量备份和当天的归档日志备份集文件拷贝到测试机的相应目录下。
在A机上获取已归档的日志编号(在测试机上执行不完全恢复的时候需要):
SQL>archivelog log list;
本例中,这些操作耗时1个小时。
6) 启动rman,连接到目标数据库和辅助数据库。本例是在测试机上执行rman,命令行如下:
rman target nocatalog AUXILIARY /
7) 构造run脚本。
由于数据文件较多,如果手工写set newname脚本会不切实际,有两种方法获取set newname脚本:
A. 从数据字典视图中获得
set heading off
set linesize 200
set pagesize 0
spool newname.log
SELECT 'set new name for datafile '||FILE#||' to '||'"'||trim(name)||'"' FROM v$datafile;
Spool off
修改newname.log即可。
B. 用duplicate命令自动生成的脚本
rman> duplicate target database to "test"
logfile '/u01/app/oracle/oradata/test/redo01.log' size 100m,
'/u01/app/oracle/oradata/test/redo02.log' size 100m,
'/u01/app/oracle/oradata/test/redo03.log' size 100m
nofilenamecheck;
该命令会出错,无需理会,需要的是其中的脚本:
正在打印存储的脚本: Memory Script
{
…
}
修改其中的脚本即可。
本例中run脚本如下:
run
{
set until sequece 2608 thread 1;
set newname for datafile 1 to
"/u01/app/oracle/oradata/system01";
set newname for datafile 2 to
"/u01/app/oracle/oradata/undotbs1_01";
……
duplicate target database to "test"
logfile '/u01/app/oracle/oradata/test/redo01.log' size 100m,
'/u01/app/oracle/oradata/test/redo02.log' size 100m,
'/u01/app/oracle/oradata/test/redo03.log' size 100m
nofilenamecheck;
}
8) 执行该脚本,rman会自动把数据文件restore到测试机上,并执行不完全恢复,最后以RESETLOGS方式打开数据库。
如果执行期间出现诸如:
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 12/18/2004 18:59:31
ORA-19505: failed to identify file "/archivelog/backup/"
ORA-27037: unable to obtain file status
HP-UX Error: 2: No such file or directory
Additional information: 3
的错误,把文件从主服务器上拷贝到测试机上执行以下脚本:
run
{
ALLOCATE AUXILIARY CHANNEL aux_1 device type disk;
ALLOCATE AUXILIARY CHANNEL aux_2 device type disk;
ALLOCATE AUXILIARY CHANNEL aux_3 device type disk;
set until sequence 2608 thread 1;
recover clone database;
RELEASE CHANNEL aux_1;
RELEASE CHANNEL aux_2;
RELEASE CHANNEL aux_3;
}
如果执行成功会显示:
allocated channel: aux_1
channel aux_1: sid=17 devtype=DISK
allocated channel: aux_2
channel aux_2: sid=18 devtype=DISK
allocated channel: aux_3
channel aux_3: sid=19 devtype=DISK
executing command: SET until clause
Starting recover at 18-DEC-04
starting media recovery
media recovery complete
Finished recover at 18-DEC-04
released channel: aux_1
released channel: aux_2
released channel: aux_3
RMAN>
最后需要执行:
RMAN>Alter clone database open resetlogs;
至此复制数据库已经完成了95%。
9) 配置复制数据库
A.RMAN不会备份临时数据文件当然也不会还原临时数据文件了,不过rman会在测试机上创建与主数据库名称一致的临时表空间。
需要手工创建临时表空间文件:
ALTER TABLESPACE TEMP_SBJ ADD TEMPFILE '/u01/app/oracle/oradata/temp_sbj'
SIZE 10000M REUSE AUTOEXTEND OFF;
B.默认的,测试机数据库为归档模式,需要的话变为非归档模式
C.如果实例名称与主数据库不一致,修改初始化参数SERVICE_NAMES,把主数据库服务名加入到测试机SERVICE_NAMES中。
如:
alter system set service_names='test,' scope=both
/
alter system register
/
10) 确认客户端sqlplus和应用程序均可以正常连接到测试数据库
3. 经验与教训
1) 由于主数据库的归档日志备份集文件的存储位置为/archivelog/backup下,而规划测试机的时候没有考虑到归档日志备份集文件的存储,
最后在测试机上勉强加了一个大小为8g的/archivelog。
这样做的直接后果是为避免测试机上的/archivelog/backup的空间不足只能每次在复制数据库前先执行累积增量备份来减少需要应用的归档日志的数目。
2) 由于主数据库比较大,数据文件总大小为250G+,而且第一次restore的时候没有配置好large_pool_size参数,致使restore异常缓慢(1.5个小时)。
在restore后创建控制文件时出现找不到密码文件的错误,当时我真是ft。当时如果使用skip tablespace子句把非系统、
undo表空间剔除在外首先进行一次测试就可以节省不少时间了。
3) 在测试机上restore后创建控制文件时出现找不到密码文件的错误时,差点出现一次重大错误。当时想直接在RMAN中执行以下语句:
RMAN>startup force nomout
RMAN>sql "create controlfile ………"
殊不知startup force nomout操作的是主数据库,直到前台业务人员报告不能连接主数据库时我才意识到操作错误,幸好这条命令出错,不然又要搞半天了。
4) 在测试机碰到一个奇怪的问题,sqlnet.ora中设置SQLNET.AUTHENTICATION_SERVICES= (NTS),本地conn / as sysdba时出现权限不足的错误,
在删除SQLNET.AUTHENTICATION_SERVICES= (NTS)后才可以。而且在远程均不能以sysdba登陆到测试机数据库上,出错信息是权限不足。
5) 使用catalog模式的时候,在recover clone database;时出现ora-600错误,不知道是不是9206的bug,最后使用nocatalog模式解决该问题。
4. 小结
在实施前估算时间是4-5个小时,最后总共花了10个小时才完成,走了不少弯路,对风险估计不足,也没想到测试机的性能这么差,
restore需要差不多2个小时才完成。最后,不管怎样,保持冷静的头脑是关键。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6906/viewspace-21676/,如需转载,请注明出处,否则将追究法律责任。