4.7 高级主题
4.7.1 使用RMAN备份集恢复DB到其他机器 (1常规方法)
用途:利用生产 DB的备份集建立测试环境或备用数据库( 设置成相同的 DBID,不需要连接原始 DB,只需要利用 Catalog)
步骤:
1.准备工作,配置目标DB环境
在目标 DB上设置 ORACLE相关的环境变量:记下生产 DB的 ORACLE_SID,DBID $set ORACLE_SID=ming? 在目标 DB创建与生产 DB相同的目录,将生产 DB的 pfile 文件 FTP到目标DB,或者,在第二步中可以从备份集中进行恢复得到 PFILE.? 在目标 DB 上创建生产 DB 的 RMAN 备份集存放的目录,没有使用 catalog情况时这点必然保持一样? 移植备份集(确定包含控制文件,数据文件,归档文件)到目标 DB? 配置网络连接
2.目标DB在nomount状态下恢复pfile 和controlfile
连接恢复目录和目标数据库:$ RMAN target / catalog rman/rman@rcdb RMAN > set DBID= 3324789823 RMAN > startup nomount RMAN> restore spfile to pfile ‘/home/oracle/pfile’ [from ‘backupset name’]; RMAN> restore controlfile [to 'xx '] from '/xx/ ORADB_ctl_20070111_c-xx';(控制文件的恢复可以参考 4.4.4.6 中其他方法)
3.启动目标DB 到 mount,在目标DB上Restore 和Recover
RMAN> alter database mount; ——可能会提示找不到密码文件,不用理会 如果备份集的位置改变了,需要先进行交叉校验:RMAN> catalog start with '/newdir'; RMAN> crosscheck backup; RMAN> report schema;然后 restore / recover :RMAN> run { allocate channel ch_disk_db_1 device type disk;restore database;recover database until sequence=2412 thread=1;——最后一个 arachivelog的 sequence release channel ch_disk_db_1;
}
4.Resetlogs 打开目标 DB
联机日志文件并没有恢复,所以需要 resetlogs SQL> alter database open resetlogs;
5.重建临时表空间,重建密码文件,立即备份数据库
重建临时表空间:因为备份时不备份临时文件,v$tempfile 中查询为空,所以可以增加一个文件即可:SQL> alter tablespace temp add tempfile '/u05/oracle/oradata/crm/temp01.dbf' size 10M;重建密码文件可以通过 orapwd命令重建密码文件
备注:恢复时有时遇到的一个问题RMAN-03002 ORA-27064 错误解决办法: 把数据文件 resize 到 oracle 的 block size 的整数倍SQL> alter database datafile 'xxx' resize n MB;
4.7.2 使用RMAN备份集恢复DB到其他机器 (2复制方法)
使用 RMAN DUPLICATE 命令可 以在保 留目 标数 据库 的基础上 依靠目标 数据库(Target Database)的备份创建一个副本数据库(Duplicate Database) .该副本即可与目标数 据库完全相同,也可仅包含目标数据库表空间的一部子集。目标站点(Target Site)以及副 本站点(Duplicate Site)甚至可以在同一台机器上。
( 生成新的唯一的 DBID,如果控制文件中仍保存有备份信息,可以不连接 Catalog )
步骤:
1.准备工作,配置副本DB环境
1. 备份主数据库(包括数据文件、控制文件以及所有归档),并把该备份集拷贝到副本 数据库机器同样的目录下。
2. 拷贝主数据库的初始化参数文件 pfile 到副本数据库机器上,并根据需要作相应修改,创建密码文件。
3. 配置主数据库到副本数据库的连接。
2.启动副本数据库到 nomount下,目录数据库必须MOUNT (或OPEN)
$ sqlplus /nolog SQL> conn / as sysdba SQL> startup nomount
3.运行RMAN,分别连接主数据库与副本数据库实例
控制文件中保存有备份信息,可以不连接 Catalog
在副本数据库上:$ rman target sys/change_on_install@MING auxiliary /
4.运行复制命令
如果没有配置自动分配通道的话,需要手工指定至少 1 条辅助通道。
DUPLICATE命令将自动完成:将还原所有数据文件,重新创建控制文件,并利 用新的参数文件启动恢复数据库到一致状态,最后用 resetlog 方式打开数据库,并 重建 redolog
RMAN> RUN { ALLOCATE AUXILIARY CHANNEL aux1 DEVICE TYPE DISK;duplicate target database tocrmnofilenamecheck; RELEASE CHANNEL aux1;}
5.重建临时表空间,立即备份数据库
SQL> alter tablespace temp add tempfile '/u05/oracle/oradata/crm/temp01.dbf' size 10M;
附:Duplicate 复制命令的一些高级用法:
1.NOFILENAMECHECK异机恢复需要指定 NOFILENAMECHECK,可以跳过文件名检测,避免 oracle 错 误的领会你的操作意图。
2.指定PFILE如果辅助实例不是用 SPFILE启动,需要指定 PFILE 参数,PFILE文件必须放在运行 RMAN 的客户端上。
3.跳过不需要复制的表空间要跳过只读表空间,在执行 duplicate 命令时指定 SKIP READONLY 子句即可。
要跳过离线表空间,在执行 duplicate 命令之前将其置为 OFFLINE NORMAL 状态即可,RMAN 复制时会跳过只读或离线表空间的数据文件。
要跳过正常的表空间,指定 SKIP TABLESPACE ts_name, …
4.恢复到以前的时间点要恢复到以前的时间点,在 duplicate 命令中指定 UNTIL TIME 'SYSDATE-1' 5.创建过程中重命名控制文件可以使用 restore controlfile from …;或者 dbms_backup_restore 包恢复出控件文件,然后在初始化参数文件 PFILE 中进行正确的设置。
6.创建过程中重命名在线日志文件1.执行 duplicate 命名时指定 LOGFILE子句,手工设置 redo logs 文件名。 例:LOGFILE GROUP 1 ('?/oradata/newdb/redo01_1.log',
'?/oradata/newdb/redo01_2. log') SIZE 200K,)
2.副本数据库初始化参数文件 PFILE中设置 LOG_FILE_NAME_CONVERT LOG_FILE_NAME_CONVERT = 'string1' , 'string2' , 'string3' , 'string4' , ……;将 strin1 替换为 string2,string3 替换为 string4 7.创建过程中重命名数据文件,或改变数据库文件的新的路径1.在初始化参数中重命名:DB_FILE_NAME_CONVERT=‘xxxx’,‘yyyy’2.在 Duplicate Duplicate Duplicate 命令中重命名数据文件: duplicate target database to newdb DB_FILE_NAME_CONVERT=('xxxx', 'yyyyy ');3.使用 SET NEWNAME 命令重命名数据文件SET NEWNAME FOR DATAFILE 1 TO '/xxx/xxx.dbf';4.使用 CONFIGURE AUXNAME 命令重命名数据文件CONFIGURE AUXNAME FOR DATAFILE 1 TO '/xxxx/xxx.dbf';5.重命名临时文件路径SET NEWNAME FOR TEMPFILE '/xxx/xxx.dbf' TO '/yyy/xxx.dbf';
例:一个比较复杂的复制命令如下:
RMAN> RUN {
allocate auxiliary channel newdb1 device type sbt;
duplicate target database to newdb
DB_FILE_NAME_CONVERT=('/h1/oracle/dbs/trgt/','/h2/oracle/oradata/newdb/')
UNTIL TIME 'SYSDATE-1' # specifies incomplete recovery
SKIP TABLESPACE cmwlite, drsys, example # skip desired tablespaces
PFILE = ?/dbs/initNEWDB.ora
LOGFILE
GROUP 1 ('?/oradata/newdb/redo01_1.log',
'?/oradata/newdb/redo01_2. log') SIZE 200K,
GROUP 2 ('?/oradata/newdb/redo02_1. log'',
'?/oradata/newdb/redo02_2. log'') SIZE 200K
GROUP 3 ('?/oradata/newdb/redo03_1. log'',
'?/oradata/newdb/redo03_2. log'') SIZE 200K REUSE;
}
4.7.3 表空间时间点恢复(TSPITR)
用户可能错误的删除了几个表,而且还截断了几个表,如果进行整库恢复可能代价比较
高,这时,我们可以执行表空间时间点恢复(tablespace point-in-time recovery, TSPITR)。
为了掌握如何执行 TSPITR,应该理解下面这些术语:辅助实例(auxiliary instance): 这是我们创建的临时实例,RMAN 使用这个实例执行TSPITR.完成 TSPITR 后,这个实例可以删除。
辅助集(auxiliary set): 辅助实例上的文件集。包括控制文件、回滚段或者重做段的表空间、系统表空间、联机日志文件等,还可以选择辅助实例的临时表空间。
恢复集(recovery set): 要执行 TSPITR 的表空间/数据文件集目标数据库: 实际执行 TSPITR 的数据库
TSPITR 的本质是,RMAN 将要进行时间点恢复的表空间按照设定的条件恢复到辅助实例上,然后再从辅助实例将表空间传到目标数据库,从而避免整个数据库的恢复,减少恢 复时间,而且这期间其他表空间仍然可用。( 用户管理的备份与恢复也可以使用 TSPITR)
检查TSPITR之后丢失的对象,被丢失对象信息的获取:SQL> Select owner, name From TS_PITR_OBJECTS_TO_BE_DROPPED Where tablespace_name = 'USER01' And creation_time > to_date( '2004-09-27 11:25:21', 'yyyy-mm-dd hh24:mi:ss' );进行TSPITR 的基本步骤是(与有些书上的步骤略有不同):(0) 检查需要恢复的表空间的数据文件备份和控制文件备份是否存在(1) 验证表空间的可传输性(2) 准备辅助实例(3) 执行实际的 TSPITR(4) 在目标数据库上执行 TSPITR 后的操作。
1.验证表空间的可传输性
RMAN 使用 Oracle 可传送的表空间特性来执行 TSPITR,因此表空间本身必须是可传送的。许多因素都导致表空间不可传送。
TSPITR 限制不能还原包含 SYS 用户对象不能执行 TSPITR 恢复具有复制主表的表空间 不支持使用快照日志的表空间 不能还原含有回滚段的表空间不能还原含有分区对象(该对象的分区跨越多个表空间)的表空间表空间中不能含有 VARRAY、嵌套表、外部表对象TSPITR 不能用于恢复删除的表空间。
可以通过 TS_PITR_CHECK 视图来判断表空间是否可传送。如果表空间不可传送,那 么执行 TSPITR 时就会失败。下面是查询 USERS 表空间是否可传送的语句:SQL> SELECT OBJ1_NAME "Object Owner",obj1_name "Object Name", obj1_type "Object Type",ts1_name "Tablespace Name",reason FROM TS_PITR_CHECK WHERE ts1_name='USERS';如果未选定行,说明 USERS 表空间可传输。
2.准备TSPITR 的辅助实例 (AUXILIARY INSTANCE)
启动 TSPITR 之前,需要准备辅助实例。这是一个不需要 RMAN 参与的手工过程。执行下面的步骤来创建辅助实例:u 创建口令文件u 创建辅助实例的参数文件: 编辑辅助实例参数文件的一个简单方法是把目标数据库的参数文件改一下即可。如果目标数据库用的是 SPFILE,那么在 SQLPLUS 中执行 CREATE PFILE FROM SPFILE 就可以生成参数文件。
注意:control_files 设置为辅助实例上的文件名db_name = 目标实例lock_name_space 如果辅助实例与目标数据库同一主机,必须设置 instance_name service_names 取一新名,如 AUX db_file_name_convert 数据文件名的转换log_file_name_convert 日志文件名的转换注释掉 log_archive_start 参数u 如果在 Windows NT 上运行 Oracle,需要使用 oradim 来添加数据库服务u 启动辅助实例,如有必要,配置 tnsnames.ora,测试是否连通。
3.执行实际的TSPITR
例子: 恢复用户误删除的某个重要的表。将实例 MING 的 USERS 表空间恢复到 SCN是 3818161 的时候。
启动辅助实例:C:\>SET ORACLE_SID=AUX1 C:\>SQLPLUS /NOLOG SQL> CONNECT / AS SYSDBA SQL> STARTUP NOMOUNT;请注意,SET ORACLE_SID=AUX1 很重要,这样就可以不用配置 TNSNAMES.ORA执行实际的TSPITR 首先要连到目标数据库和辅助实例。可以联到恢复目录,也可以不连到恢复目录: C:\> SET ORACLE_SID=AUX1 C:\> RMAN TARGET /@MING CATALOG RMAN/RMAN@RECO AUXILIARY / RMAN> RECOVER TAB LESPACE USERS UNTIL SCN 233646;…
等待完成表空间的恢复。当然也可以用 UNTIL TIME 或者 UNTIL SEQUENCE 子句,例:RMAN> run { allocate auxiliary channel c1 device type disk;recover tablespace user02 until logseq 9;}
( 这里有些版本有一个 ORACLE的 BUG,执行到最后可能会报错,需要打补丁 ?? )
可以改变辅助集/恢复集数据文件的位置和名称:set newname for datafile 5 to 'c:\demo\user01.dbf';configure auxname for datafile 1 to '/backup/xxx.dbf‘;在初始化参数文件中用 DB_FILE_NAME_CONVERT 进行转换
10g 中增加了auxiliary destination ,更方便RMAN> recover tablespace user01 until logseq 19 auxiliary destination 'd:\auxiliary';
4.执行TSPITR 后的操作首先应该重新连接 RMAN与目标数据库,并且备份刚恢复的表空间。完成备份后,需要将表空间联机(RMAN 在 TSPITR 后使表空间脱机)。最后,我们还要关闭或删除辅 助数据库。
4.7.4 块媒体恢复 Block Media Recovery (BMR)
产生块损坏的原因一般是间断或随机的 I/O 错误或者是内存的块错误。要恢复的坏块 信息可以从报警与跟踪文件,表与索引的分析,DBV 工具或第三方媒体管理工具以及具体 的查询语句中获得。
1. DBV 工具 dbv file=EYGLE.DBF blocksize=8192 2. RMAN> backup validatedatafile 4; —— 或者 BACKUP VALIDATE DATABASE备份的 坏 块 信息 保存在 V$BACKUP_CORRUPTION 、 V$COPY_CORRUPTION 和V$DATABASE_BLOCK_CORRUPTION 视图中。
V$BACKUP_CORRUPTION 显示历史讹误的视图 V$DATABASE_BLOCK_CORRUPTION 显示当前数据块讹误的视图。 一旦修正了数据库的块讹误,就需要重新运行 BACKUP VALIDATE DATABASE 命令,然后确认 V$DATABASE_BLOCK_CORRUPTION 中没有其他讹误。
RMAN 可以备份包含损坏数据块的数据文件,通过设置 set maxcorrupt 可以跳过指定个数的坏块来避免备份失败。
RMAN> set maxcorrupt for datafile 1 to 0;在 Oracle9i中可以用 RMAN来执行块级的恢复,而且恢复期间数据文件可以是联机状 态。RMAN通过 Block Media Recovery(简称 BMR)来执行块级恢复操作。假设我们在查询一个 Oracle 表的时候接收到下面的错误:ERROR 位于第 1 行:ORA-01578: ORACLE 数据块损坏(文件号 5,块号 97)
ORA-01110: 数据文件 5: 'E:\xxxx.dbf'那么我们就可以在 RMAN中用 BLOCKRECOVER 命令来修复:RMAN> BLOCKRECOVER DATAFILE 5 BLOCK97; 启动 blockrecover 于 03-9月 -06 正在启动全部恢复目录的 resync完成全部 resync使用通道 ORA_DISK_1通道 ORA_DISK_1: 正在从数据文件副本 E:\xxxx.bak 恢复块
正在开始介质的恢复完成介质的恢复完成 blockrecover 于 03-9月 -06
恢复V$DATABASE_BLOCK_CORRUPTION 视图中列出的坏块:RMAN> blockrecover corruption list [ restore until time 'sysdate - 10' ];恢复指定坏块:RMAN> blockrecover datafile 2 block 12,13 datafile 9 block 19;RMAN> blockrecover tablespace system dba 44404,44405 from tag "weekly_backup"; RMAN> blockrecover tablespace system dba 44404,44405 restore until time 'sysdate-2';
4.7.5 使用恢复目录恢复前一个对应物
在不完全恢复完成之后,通常需要使用 resetlogs 选项来打开数据库。resetlogs 表示 一个数据库逻辑生存期的结束和另一个数据库逻辑生存期的开始。数据库的逻辑生存期 也被称为一个对应物(incarnation)。每次使用 resetlogs 选项来打开数据库后都会创建一个 新的数据库对应物。
使用 RMAN可以进行穿越 resetlogs 的恢复,即可以恢复到前一个对应物。10g 版本 增强了这方面的功能。
(1) 使用恢复目录的情况使用恢复目录的情况下,恢复前一个对应物是非常简单的。首先,用list incarnation;来显示有哪些对应物:RMAN> list incarnation;
数据库&nbs
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/16486600/viewspace-522838/ ,如需转载,请注明出处,否则将追究法律责任。