第四部分 附章(2)RMAN备份来创建之实践
目标:通过rman备份,在同一台服务器创建standby,primary数据库名为jssweb,要创建的standby,db_unique_name命名为jssrman,因为是在同一台服务器,所以需要对standby的数据文件和日志文件路径做下重定义,这里我们选择通过初始化参数的形式重定义文件路径。
一、做好准备工作
1、创建standby实例
需要首先通过ORADIM命令创建一个新的OracleService,非windows环境可以跳过这一步。
E:\ora10g>oradim -new -sid jssrman
实例已创建。
E:\ora10g>set oracle_sid=jssrman
E:\ora10g>sqlplus "/ as sysdba"
.............
顺手配置一下监听,修改tnsname.ora之类,此处不做演示。
2、创建standby的初始化参数文件
没必要完全重建,首先根据primary的spfile生成一个pfile出来,然后比着改改就是了。例如:
在primary数据库执行,注意是primary数据库:
SQL>create pfile='E:\ora10g\product\10.2.0\db_1\database\INITjssrman.ora' from spfile;
用任意文本编辑器打开INITjssrman.ora,注意修改相关的化参数,此例中主要修改下列属性:
*.audit_file_dest='e:\ora10g\product\10.2.0\admin\jssrman\adump'
*.background_dump_dest='e:\ora10g\product\10.2.0\admin\jssrman\bdump'
*.control_files='E:\ora10g\oradata\jssrman\control01.ctl','E:\ora10g\oradata\jssrman\control02.ctl','E:\ora10g\oradata\jssrman\control03.ctl'
*.core_dump_dest='e:\ora10g\product\10.2.0\admin\jssrman\cdump'
*.DB_FILE_NAME_CONVERT='oradata\jssweb','oradata\jssrman'
*.db_name='jssweb'
*.DB_UNIQUE_NAME='jssrman'
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(jssweb,jsspdg,jssrman)'
*.LOG_ARCHIVE_DEST_1='LOCATION=E:\ora10g\oradata\jssrman\VALID_FOR=(ALL_LOGFILES,ALL_ROLES)DB_UNIQUE_NAME=jssrman'
*.LOG_ARCHIVE_DEST_STATE_1='ENABLE'
*.LOG_FILE_NAME_CONVERT='oradata\jssweb','oradata\jssrman'
*.standby_file_management='AUTO'
*.user_dump_dest='e:\ora10g\product\10.2.0\admin\jssrman\udump'
注意,由于此standby数据库不考虑切换,因为不再配置fal_*,等相关初始化参数。
然后通过该pfile创建standby的spfile,注意是在standby数据库执行:
SQL>create spfile from pfile='E:\ora10g\product\10.2.0\db_1\database\initjssrman.ora';
3、启动standby到nomount状态
SQL>startup nomount
ORACLE例程已经启动。
Total System Global Area 167772160bytes
.....................
4、创建standby的密码文件
注意保持密码与primary数据库相同,非常重要。
E:\ora10g>orapwd file=e:\ora10g\product\10.2.0\db_1\database\PWDjssrman.ora password=verysafe entries=30
二、进行创建工作
1、连接primary和standby
注意连接standby的时候前面指定auxiliary
E:\ora10g>set oracle_sid=jssweb
E:\ora10g>rman target / auxiliarysys/tfad04@jssrman
恢复管理器:Release10.2.0.3.0-Productionon星期三1月3013:53:132008
Copyright(c)1982,2005,Oracle. Allrightsreserved.
已连接到目标数据库:JSSWEB(DBID=3408827880, 未打开)
已连接到辅助数据库:JSSWEB(未装载)
2、创建standby的控制文件。
我们之前都操作过通过sql命令创建standby的控制文件,这次换一换,在rman中创建standby的控制文件。
RMAN>copy current controlfile for standby to 'e:\ora10g\oradata\jssrman\control01.ctl';
启动backup于29-1月-08
使用目标数据库控制文件替代恢复目录
分配的通道:ORA_DISK_1
通道ORA_DISK_1:sid=157devtype=DISK
通道ORA_DISK_1:启动数据文件副本
复制备用控制文件
输出文件名=E:\ORA10G\ORADATA\JSSRMAN\CONTROL01.CTL标记=TAG20080129T150422 recid=6时间戳=645289463
通道ORA_DISK_1:数据文件复制完毕, 经过时间:00:00:03
完成backup于29-1月-08
启动Control File and SPFILE Auto backup于29-1月-08
段handle=D:\BACKUP\C-3408827880-20080129-00comment=NONE
完成Control File and SPFILE Auto backup于29-1月-08
3、生成standby数据库
由于我们此时的备份集是刚刚的,所以在执行duplicate命令时并不需要指定dorecover子句,而且我们采用了通过db_file_name_convert等初始化参数的方式重定义数据文件和日志文件路径,因为执行的命令就非常简单,就这是我们前面说的,不同路径下创建standby中,最简单的方式:
RMAN>duplicate target database for standby;
启动DuplicateDb于30-1月-08
使用目标数据库控制文件替代恢复目录
分配的通道:ORA_AUX_DISK_1
通道ORA_AUX_DISK_1:sid=155devtype=DISK
内存脚本的内容:
{
restore clone standby controlfile;
sql clone 'alter database mount standby database';
}
正在执行内存脚本
启动restore 于30-1月-08
使用通道ORA_AUX_DISK_1
通道ORA_AUX_DISK_1:正在复原控制文件
通道ORA_AUX_DISK_1:已复制控制文件副本
输出文件名=E:\ORA10G\ORADATA\JSSRMAN\CONTROL01.CTL
输出文件名=E:\ORA10G\ORADATA\JSSRMAN\CONTROL01.CTL
输出文件名=E:\ORA10G\ORADATA\JSSRMAN\CONTROL02.CTL
输出文件名=E:\ORA10G\ORADATA\JSSRMAN\CONTROL03.CTL
完成restore 于30-1月-08
sql 语句:alter database mount standby database
释放的通道:ORA_AUX_DISK_1
内存脚本的内容:
{
set newname for tempfile 1 to "E:\ORA10G\ORADATA\JSSRMAN\TEMP01.DBF";
switch clone tempfile all;
set newname for datafile 1 to "E:\ORA10G\ORADATA\JSSRMAN\SYSTEM01.DBF";
set newname for datafile 2 to "E:\ORA10G\ORADATA\JSSRMAN\UNDOTBS01.DBF";
set newname for datafile 3 to "E:\ORA10G\ORADATA\JSSRMAN\SYSAUX01.DBF";
set newname for datafile 4 to "E:\ORA10G\ORADATA\JSSRMAN\USERS01.DBF";
set newname for datafile 5 to "E:\ORA10G\ORADATA\JSSRMAN\TBSWEB01.DBF";
restore
check readonly
clone database
;
}
正在执行内存脚本
正在执行命令:SET NEWNAME
临时文件1在控制文件中已重命名为E:\ORA10G\ORADATA\JSSRMAN\TEMP01.DBF
正在执行命令:SET NEWNAME
正在执行命令:SET NEWNAME
正在执行命令:SET NEWNAME
正在执行命令:SET NEWNAME
正在执行命令:SET NEWNAME
启动restore 于30-1月-08
分配的通道:ORA_AUX_DISK_1
通道ORA_AUX_DISK_1:sid=155devtype=DISK
通道ORA_AUX_DISK_1:正在开始恢复数据文件备份集
通道ORA_AUX_DISK_1:正在指定从备份集恢复的数据文件
正将数据文件00001恢复到E:\ORA10G\ORADATA\JSSRMAN\SYSTEM01.DBF
正将数据文件00002恢复到E:\ORA10G\ORADATA\JSSRMAN\UNDOTBS01.DBF
正将数据文件00003恢复到E:\ORA10G\ORADATA\JSSRMAN\SYSAUX01.DBF
正将数据文件00004恢复到E:\ORA10G\ORADATA\JSSRMAN\USERS01.DBF
正将数据文件00005恢复到E:\ORA10G\ORADATA\JSSRMAN\TBSWEB01.DBF
通道ORA_AUX_DISK_1:正在读取备份段D:\BACKUP\04J6V1SJ_1_1
通道ORA_AUX_DISK_1:已恢复备份段1
段句柄=D:\BACKUP\04J6V1SJ_1_1标记=TAG20080124T111011
通道ORA_AUX_DISK_1:恢复完成, 用时:00:00:57
完成restore 于30-1月-08
内存脚本的内容:
{
switch clone datafile all;
}
正在执行内存脚本
数据文件1已转换成数据文件副本
输 入 数 据 文 件 副 本 recid=11 stamp=645372185 文 件 名=E:\ORA10G\ORADATA\JSSRMAN\SYSTEM01.DBF数据文件2已转换成数据文件副本
输 入 数 据 文 件 副 本 recid=12 stamp=645372185 文 件 名=E:\ORA10G\ORADATA\JSSRMAN\UNDOTBS01.DBF数据文件3已转换成数据文件副本
输 入 数 据 文 件 副 本 recid=13 stamp=645372186 文 件 名=E:\ORA10G\ORADATA\JSSRMAN\SYSAUX01.DBF数据文件4已转换成数据文件副本
输 入 数 据 文 件 副 本 recid=14 stamp=645372186 文 件 名=E:\ORA10G\ORADATA\JSSRMAN\USERS01.DBF数据文件5已转换成数据文件副本
输 入 数 据 文 件 副 本 recid=15 stamp=645372186 文 件 名=E:\ORA10G\ORADATA\JSSRMAN\TBSWEB01.DBF
完成DuplicateDb于30-1月-08
4、重建standby临时表空间数据文件
提示:本步非必须,如果该standby不会切换为primary并且也不会有查询需求,就不必创建!
三、完成善后工作
善后工作通常很不起眼但是很重要,
1、修改primary数据库中的相关参数
SQL>show parameter db_unique
NAME TYPE VALUE
-----------------------------------------------------------------------------
db_unique_name string jssweb
SQL>set sql prompt Jssweb>
Jssweb>alter system set log_archive_config='DG_CONFIG=(jssweb,jsspdg,jssrman)';
系统已更改。
Jssweb> alter system set log_archive_dest_3='SERVICE=jssrman lgwr async valid_for=(online_logfiles,primary_role)db_unique_name=jssrman';
系统已更改。
Jssweb>alter system set log_archive_dest_state_3=enable;
系统已更改。
2、考虑到为保证切换后,dg仍能正常运转,同时修改待切换的standby数据库初始化参数
SQL>show parameter db_unique
NAME TYPE VALUE
-----------------------------------------------------------------------------
db_unique_name string jsspdg
SQL>set sql prompt Jsspdg>
Jsspdg>alter system set log_archive_config='DG_CONFIG=(jssweb,jsspdg,jssrman)';
系统已更改。
Jsspdg> alter system set log_archive_dest_3='SERVICE=jssweb lgwr async valid_for=(online_logfiles,primary_role)db_unique_name=jssweb';
系统已更改。
Jsspdg>alter system set log_archive_dest_state_3=enable;
系统已更改。
3、打开standby的redo应用
SQL>show parameter db_unique
NAME TYPE VALUE
----------------------------------------------------------------------------------------
db_unique_name string jssrman
SQL>set sql prompt Jssrman>
Jssrman>alter database recove rmanaged standby database disconnect from session;
数据库已更改。
4、Primary切换日志,验证同步效果
Jssweb>alter system switch logfile;
系统已更改。
Jssweb>select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
787
Jsspdg>select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
787
Jssrman>selec tmax(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
787
与之前通过primary物理备份相比,通过rman的duplicate命令创建standby,实际执行的步骤是不是更简单一些了呢,基本上你只需要记住duplicate的用法就好了,其它工作rman都自动帮你干。正象开篇中我说过的那样,为什么要选择通过rman来创建standby呢,因为简单:)
