[原创]RMAN备用数据库(逻辑dataguard)
RMAN备用数据库
1、介绍几个新RMAN命令
INCLUDE CURRENT CONTROLFILE FOR STANDBY:在备份命令中包含一个备用控制文件,RMAN为了创建备用数据库必须在其备份中有一个备用控制文件。
DUPLICATE TARGET DATABASE FOR STANDBY:创建一个副本数据库作为目标的备用数据库。
DORECOVER:从目标数据库用归档日志备份恢复备用数据库。一旦备用数据库的创建完成,RMAN将对备用数据库应用主数据库中的所有归档日志,一直到RMAN中注册的最新的归档日志。
2、在RMAN为备用操作复制数据库期间,RMAN将自动执行任务的所有要求。当连接到目标辅助和可选的目录数据库时,RMAN将进行以下任务:
1)决定需要还原哪个基本备份。
2)根据辅助数据库参数或者RMAN设置命令和选项,确定将数据文件放置在辅助实例的什么位置。
3)为辅助数据库还原备用控制文件。
4)加载备用数据库控制文件。
5)从第1)步决定的备份片或者映像拷贝来还原数据文件。
6)如果指定了DORECOVER选项,将根据恢复停止点对还原的数据文件应用
所有的增量备份
7)如果指定了DORECOVER选项,将根据恢复点停止点从磁盘或备份对还原的数据文件应用所有归档日志文件。
3、当RMAN创建备用数据库时,就注意以下事项:
1)如果在备用数据库还原期间不希望使用目录,则应在RMAN命令行中指定NOCATALOG.
2)在备份备用控制文件时的重做日志必须被归档。
3)必须有包含备用控制文件的备份,否则,当试图创建备用数据库时会得到一个“RMAN-06024:no backup or copy of the controlfile found to restore”错误。
4)不能在备用创建期间执行完全恢复。如果当前的联机重做日志对数据库不可用,则常常会发生这种情况。应用DORECOVER选项后,RMAN将应用已知的归档日志文件。
5)如果备用数据库驻留在其它的服务器上并拥有与主服务器相同的目录结构,则在备用创建期间不必重命名任何一个文件。默认情况下,DUPLICATE命令将不能继续执行,而RMAN将会通知还原的辅助文件的位置与被备份的目标数据库文件的原始位置是一致的。这样做可以防止DBA偶然覆盖已存在的数据文件。NOFILENAMECHECK选项将会忽略这个检查。
6)备用数据库的数据库名称必须和主数据库的名称相同。如果主数据库和备用数据库在同一机器上,则对备用数据库使用LOCK_NAME_SPACE初始化参数。这将允许两个具有相同名称的数据库驻留在同一机器上,而不相互干扰。
7)RMAN将只创建备用数据库并在创建点上初步恢复该数据库。不能进行备用数据库的后续的维护和恢复(传送、应用归档重做日志文件)
4、创建步骤:
1)目录:创建所有的管理目录($ORACLE_BASE/admin/STBY)和数据目录(/oradata/STBY)。
2)参数文件:拷贝目标数据库的参数文件并命名为initSTBY.ora,这样就创建了一个参数文件。将所有目标数据库名(MYDB)修改为”STBY”,除了数据库名(DB_NAME)必须保留,使备用数据库与原始数据库的名称相同,为了在备用数据库创建期间转换文件名,增加两个转换参数。同时,增加LOCK_NAME_SPACE参数以便可以在同一台机器上同时打开两个同名的数据库:
DB_FILE_NAME_CONVERT = (“MYDB”,”STBY”)
LOG_FILE_NAME_CONVERT = (“MYDB”,”STBY”)
LOCK_NAME_SPACE = “STBY”
STANDBY_ARCHIVE_DEST = /oradata/stby/arvhice
3)口令文件:为备用数据库创建一个口令文件,以便RMAN可以用SYSDBA身分连接到SYSDBA。
4)Windows服务:在windows环境中,使用oradim工具为STBY数据库创建一个新的名为OracleServiceSTBY的数据库服务。
5)配置Net8
6)备份目标数据库(MYDB):创建备用数据库需要一个备用控制文件的备份。备用控制文件备份以后还需要一个日志切换,在命令行中增加一个日志文件参数,以便该脚本输出可以输入到一个文件中:
LINUX>rman trace = b_standby.log
RMAN> connect target sys/oracle
已联机到目标数据库: MYDB (DBID=2567199153)
RMAN> connect catalog rman/rman@standby
已联机至复原目录数据库
RMAN>@b_standby.rcv
b_standby.rcv内容如下:
run{
ALLOCATE channel d1 TYPE DISK;
BACKUP incremental LEVEL 0 DATABASE
format 'd:\oraclebak\db%d_%s_%p_%t'
tag = 'stby_inc0'
include CURRENT CONTROLFILE FOR STANDBY;
SQL 'alter system archive log current ';
BACKUP ARCHIVELOG FROM TIME 'sysdate - 1/24'
format 'd:\oraclebak\arc%d_%s_%p_%t';}
脚本说明:
Control file for standby:当备份整个数据库时,控制文件将自动包含在系统表空间中。为了备用数据库的生成必须创建一个特殊的控制文件。RMAN可以在一个数据文件备份片中存储这个特殊文件。如果需要,这个备份文件也可以用于还原目标数据库的控制文件。
Archive log current:当备用数据控制文件创建时,备用数据库的恢复从这个当前日志开始。
屏幕输出如下:
RMAN> run{
2> ALLOCATE channel d1 TYPE DISK;
3> BACKUP incremental LEVEL 0 DATABASE
4> format 'd:\oraclebak\db%d_%s_%p_%t'
5> tag = 'stby_inc0'
6> include CURRENT CONTROLFILE FOR STANDBY;
7> SQL 'alter system archive log current ';
8> BACKUP ARCHIVELOG FROM TIME 'sysdate - 1/24'
9> format 'd:\oraclebak\arc%d_%s_%p_%t';}
已配置信道: d1
通道d1: sid=16 devtype=DISK
开始backup, 于2008/05/07 22:49:02
通道d1: 正在启动incremental level 0 数据文件备份集
通道d1: 正在设定备份集中的数据文件
在备份集中包括目前的SPFILE
在备份集中包括待命控制档
输入数据文件fno=00001 name=C:\ORACLE\ORADATA\MYDB\SYSTEM01.DBF
输入数据文件fno=00002 name=C:\ORACLE\ORADATA\MYDB\UNDOTBS01.DBF
输入数据文件fno=00005 name=C:\ORACLE\ORADATA\MYDB\EXAMPLE01.DBF
输入数据文件fno=00010 name=C:\ORACLE\ORADATA\MYDB\XDB01.DBF
输入数据文件fno=00006 name=C:\ORACLE\ORADATA\MYDB\INDX1.DBF
输入数据文件fno=00009 name=C:\ORACLE\ORADATA\MYDB\USERS01.DBF
输入数据文件fno=00003 name=C:\ORACLE\ORADATA\MYDB\CWMLITE01.DBF
输入数据文件fno=00004 name=C:\ORACLE\ORADATA\MYDB\DRSYS01.DBF
输入数据文件fno=00007 name=C:\ORACLE\ORADATA\MYDB\ODM01.DBF
输入数据文件fno=00011 name=C:\ORACLE\ORADATA\MYDB\MYTS01.DBF
输入数据文件fno=00008 name=C:\ORACLE\ORADATA\MYDB\TOOLS01.DBF
通道d1: 启动部份1, 在2008/05/07 22:49:09
通道d1: 已完成部份1, 在2008/05/07 22:59:39
处理片=D:\ORACLEBAK\DBMYDB_12_1_654130144 批注=NONE
通道d1: 备份集完成, 经历时间: 00:10:35
完成backup, 于2008/05/07 22:59:39
sql 叙述句: alter system archive log current
开始backup, 于2008/05/07 23:00:13
已存盘目前的日志
通道d1: 启动存盘日志备份集
通道d1: 指定备份集中的存盘日志
输入存盘日志系线=1 顺序=4 recid=22 戳记=654130812
输入存盘日志系线=1 顺序=5 recid=23 戳记=654130813
通道d1: 启动部份1, 在2008/05/07 23:00:15
通道d1: 已完成部份1, 在2008/05/07 23:00:54
处理片=D:\ORACLEBAK\ARCMYDB_13_1_654130814 批注=NONE
通道d1: 备份集完成, 经历时间: 00:00:40
完成backup, 于2008/05/07 23:00:54
已释放通道: d1
RMAN>
请记录目标数据库当前的日志序号,自动恢复将从这个日志序号开始:
SQL>SELECT SEQUENCE# FROM V$LOG WHERE STATUS = ‘CURRENT’;
如何知道一个备份集中是否包含一个备用控制文件?可以在目录中查询名RC_BACKUP_CONTROLFILE的视图中的该注册数据库,控制文件类型“S”(Standby)。正常的控制文件备份将是一个控制文件类型“B”(Backup)
SQL> SELECT SET_COUNT,
CHECKPOINT_CHANGE#,
CHECKPOINT_TIME,
STATUS,
COMPLETION_TIME,
CONTROLFILE_TYPE
FROM RMAN.RC_BACKUP_CONTROLFILE
WHERE DB_NAME = 'MYDB'
AND CONTROLFILE_TYPE = 'S';
同时下面的查询语句可以在备份集和备份片中查找包含的备用控制文件。
SQL> SELECT BS.BS_KEY,
BS.SET_COUNT,
BS.BACKUP_TYPE,
BS.INCREMENTAL_LEVEL,
BS.COMPLETION_TIME,
BS.ELAPSED_SECONDS,
BP.HANDLE,
BP.STATUS
FROM RMAN.RC_BACKUP_SET BS, RMAN.RC_BACKUP_PIECE BP
WHERE BS.CONTROLFILE_INCLUDED = 'STANDBY'
AND BS.DB_ID = BP.DB_ID
AND BS.BS_KEY = BP.BS_KEY
AND BS.DB_ID IN (SELECT DBID FROM RMAN.RC_DATABASE WHERE NAME = 'MYDB');
7)创建备用数据库:简单地启动RMAN并连接到目标、目录和辅助数据库上。设置NLS语言环境变量,如果目标数据库与默认的环境的语言属性相同,则该变量没有必要设置,如果NLS_LANG环境变量与目标数据库的不同则有可能使备用数据库创建失败。
RMAN执行的备用数据库创建工作只需要几个命令。用前述任务中创建的备份生成备用数据库:
LINUX>rman trace=/opt/oracle/standby.log
RMAN>connect target sys/oracle@mydb
RMAN>connect catalog rman/rman@standby
RMAN>connect auxiliary sys/stby
RMAN> run{
SET command ID TO 'Standby Creation';
ALLOCATE auxiliary channel d1 TYPE DISK;
duplicate target DATABASE FOR STANDBY dorecover;}
这向行命令用数据库的备份创建了MYDB数据库的副本,尽管这个脚本中的命令很少,但实际上RMAN完成了大量的工作:
Set command id :这个设置选项使RMAN填充了v$session视图的client_inof列。因此,在STBY数据库被创建时,可以将client_info的值设置为“Standby Creation”来查询v$session表,并观察会话的进行。
Duplicate target database for standby :这个命令创建备用数据库需要完成大量的工作,首先,备用数据库的控制文件需要被复制到辅助数据库init.ora文件中的control_files参数值指定的位置,然后,目标数据库备份中数据文件将被还原到辅助数据库的还原位置上。
Dorecover :当目标数据库复制之后,备份数据库将用增量RMAN备份和归档重做日志恢复。一直恢复到停止点的位置。
屏幕输出如下:
C:>rman trace=c:\oracle\standby.log
Recovery Manager: 版本9.2.0.1.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
Windows 2000 Version 5.1 Service Pack 2, CPU type 586
Starting with debugging turned off
RMAN> connect target sys/oracle@mydb
已联机到目标数据库: MYDB (DBID=2567199153)
RMAN> connect catalog rman/rman@standby
已联机至复原目录数据库
RMAN> connect auxiliary sys/stby@stby
联机至辅助数据库: mydb (未挂载)
RMAN> 2> 3> 4>
执行命令: SET COMMAND ID
已配置信道: d1
通道d1: sid=13 devtype=DISK
开始Duplicate Db, 于 08-5月-08
打印储存的命令档: Memory Script
{
restore clone standby controlfile to clone_cf;
replicate clone controlfile from clone_cf;
sql clone 'alter database mount standby database';
}
执行命令档: Memory Script
开始restore, 于 08-5月-08
通道d1: 启动数据文件备份集的回复
通道d1: 回复控制档案
输出文件名称=C:\ORACLE\ORADATA\STBY\CONTROL01.CTL
通道d1: 回复备份片1
处理片=D:\ORACLEBAK\DBMYDB_12_1_654130144 标志=STBY_INC0 参数=NULL
通道d1: 回复完成
完成restore, 于 08-5月-08
复制控制档案
输入文件名称=C:\ORACLE\ORADATA\STBY\CONTROL01.CTL
输出文件名称=C:\ORACLE\ORADATA\STBY\CONTROL02.CTL
输出文件名称=C:\ORACLE\ORADATA\STBY\CONTROL03.CTL
sql 叙述句: alter database mount standby database
打印储存的命令档: Memory Script
{
set until scn 1170983;
set newname for datafile 1 to
"C:\ORACLE\ORADATA\STBY\SYSTEM01.DBF";
set newname for datafile 2 to
"C:\ORACLE\ORADATA\STBY\UNDOTBS01.DBF";
set newname for datafile 3 to
"C:\ORACLE\ORADATA\STBY\CWMLITE01.DBF";
set newname for datafile 4 to
"C:\ORACLE\ORADATA\STBY\DRSYS01.DBF";
set newname for datafile 5 to
"C:\ORACLE\ORADATA\STBY\EXAMPLE01.DBF";
set newname for datafile 6 to
"C:\ORACLE\ORADATA\STBY\INDX1.DBF";
set newname for datafile 7 to
"C:\ORACLE\ORADATA\STBY\ODM01.DBF";
set newname for datafile 8 to
"C:\ORACLE\ORADATA\STBY\TOOLS01.DBF";
set newname for datafile 9 to
"C:\ORACLE\ORADATA\STBY\USERS01.DBF";
set newname for datafile 10 to
"C:\ORACLE\ORADATA\STBY\XDB01.DBF";
set newname for datafile 11 to
"C:\ORACLE\ORADATA\STBY\MYTS01.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
执行命令: SET NEWNAME
开始restore, 于 08-5月-08
通道d1: 启动数据文件备份集的回复
通道d1: 正在设定要从备份集回复的数据文件
正在将资料文件 00001 回复为C:\ORACLE\ORADATA\STBY\SYSTEM01.DBF
正在将资料文件 00002 回复为C:\ORACLE\ORADATA\STBY\UNDOTBS01.DBF
正在将资料文件 00003 回复为C:\ORACLE\ORADATA\STBY\CWMLITE01.DBF
正在将资料文件 00004 回复为C:\ORACLE\ORADATA\STBY\DRSYS01.DBF
正在将资料文件 00005 回复为C:\ORACLE\ORADATA\STBY\EXAMPLE01.DBF
正在将资料文件 00006 回复为C:\ORACLE\ORADATA\STBY\INDX1.DBF
正在将资料文件 00007 回复为C:\ORACLE\ORADATA\STBY\ODM01.DBF
正在将资料文件 00008 回复为C:\ORACLE\ORADATA\STBY\TOOLS01.DBF
正在将资料文件 00009 回复为C:\ORACLE\ORADATA\STBY\USERS01.DBF
正在将资料文件 00010 回复为C:\ORACLE\ORADATA\STBY\XDB01.DBF
正在将资料文件 00011 回复为C:\ORACLE\ORADATA\STBY\MYTS01.DBF
通道d1: 回复备份片1
处理片=D:\ORACLEBAK\DBMYDB_12_1_654130144 标志=STBY_INC0 参数=NULL
通道d1: 回复完成
完成restore, 于 08-5月-08
打印储存的命令档: Memory Script
{
switch clone datafile all;
}
执行命令档: Memory Script
数据文件2 已切换至数据文件复制本
输入数据文件复本recid=158 戳记=654135499 文件名称=C:\ORACLE\ORADATA\STBY\UNDOTBS01.DBF
数据文件3 已切换至数据文件复制本
输入数据文件复本recid=159 戳记=654135499 文件名称=C:\ORACLE\ORADATA\STBY\CWMLITE01.DBF
数据文件4 已切换至数据文件复制本
输入数据文件复本recid=160 戳记=654135499 文件名称=C:\ORACLE\ORADATA\STBY\DRSYS01.DBF
数据文件5 已切换至数据文件复制本
输入数据文件复本recid=161 戳记=654135499 文件名称=C:\ORACLE\ORADATA\STBY\EXAMPLE01.DBF
数据文件6 已切换至数据文件复制本
输入数据文件复本recid=162 戳记=654135499 文件名称=C:\ORACLE\ORADATA\STBY\INDX1.DBF
数据文件7 已切换至数据文件复制本
输入数据文件复本recid=163 戳记=654135499 文件名称=C:\ORACLE\ORADATA\STBY\ODM01.DBF
数据文件 8 已切换至数据文件复制本
输入数据文件复本recid=164 戳记=654135499 文件名称=C:\ORACLE\ORADATA\STBY\TOOLS01.DBF
数据文件9 已切换至数据文件复制本
输入数据文件复本recid=165 戳记=654135499 文件名称=C:\ORACLE\ORADATA\STBY\USERS01.DBF
数据文件10 已切换至数据文件复制本
输入数据文件复本recid=166 戳记=654135499 文件名称=C:\ORACLE\ORADATA\STBY\XDB01.DBF
数据文件11 已切换至数据文件复制本
输入数据文件复本recid=167 戳记=654135499 文件名称=C:\ORACLE\ORADATA\STBY\MYTS01.DBF
打印储存的命令档: Memory Script
{
set until scn 1170983;
recover
standby
clone database
delete archivelog
;
}
执行命令档: Memory Script
执行命令: SET until clause
开始recover, 于 08-5月-08
启动媒体恢复
通道d1: 启动存盘日志回复到预设目的
通道d1: 回复存盘日志
存盘日志系线=1 顺序=4
通道d1: 回复存盘日志
存盘日志系线=1 顺序=5
通道d1: 回复备份片1
处理片=D:\ORACLEBAK\ARCMYDB_13_1_654130814 标志=TAG20080507T230014 参数=NULL
通道d1: 回复完成
存盘日志文件名称=C:\ORACLE\ORADATA\STBY\ARCHIVE1_4.DBF 系线=1 顺序=4
通道clone_default: 删除存盘日志
存盘日志文件名称=C:\ORACLE\ORADATA\STBY\ARCHIVE1_4.DBF recid=2 戳记=654135509
存盘日志文件名称=C:\ORACLE\ORADATA\STBY\ARCHIVE1_5.DBF 系线=1 顺序=5
通道clone_default: 删除存盘日志
存盘日志文件名称=C:\ORACLE\ORADATA\STBY\ARCHIVE1_5.DBF recid=1 戳记=654135507
媒体恢复完成
完成recover, 于 08-5月-08
完成Duplicate Db, 于 08-5月-08
已释放通道: d1
RMAN>
8)启动管理恢复
修改目标数据库的参数文件,然后重启实例,如下:
SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_2 = "MANDATORY SERVICE=STBY REOPEN=30";
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE2 = ENABLE;
命令备用数据库开始管理恢复:
SQL>RECOVER MANAGED STANDBY DATABASE;
当提交这个命令之后,可能会认为这个命令的执行被堵塞了,得不到任何反馈信息,SQL提示符也不出现,这是正常的。此时STBY数据库已经启动了RFS后台进程接收任何从MYDB数据库传送来的归档日志,存放在由standby_archive_dest参数指定的位置上,生成归档日志并应用它们的工作持续进行,直到管理恢复被取消。
SQL>RECOVER MANAGED STANDBY DATABASE CANCEL;
上面这个取消命令必须在STBY数据库上的另一个SQL*PLUS会话中提交。
9)以只读方式打开备用数据库
取消STBY数据库上的恢复,打开STBY数据库查验数据变化情况:
SQL>ALTER DATABASE OPEN READ ONLY;
10)将备用数据库返回到恢复模式
为了使STBY数据库从只读打开模式返回到恢复模式,首先必须关闭数据库:
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP NOMOUNT;
SQL>ALTER DATABASE MOUNT STANDBY DATABASE;
SQL>RECOVER MANAGED STANDBY DATABASE;
11)激活备用数据库
SQL>ALTER DATABASE ACTIVATE STANDBY DATABASE;
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP;
一旦创建了备用数据库,就可以用RMAN来备份这个备用数据库了,备份备用数据库实际上就是对目标数据库的备份。这样就减少了主服务器的资源开销。不能用RMAN对备用控制文件进行备份,必须从目标数据库进行控制文件的备份。