`
destroyed
  • 浏览: 23985 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

Oracle数据库备份与恢复之四:RMAN(备份与恢复管理器) 续

阅读更多
  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;

数据库    Incarnations  列表DB    关键字    Inc                关键字                               DB        名    DB ID CUR          重置 SCN    重置时间
1 2 MING 2600315304 NO 1 20-4  月 -06



1 854 MING 2600315304 NO 3407561 19-8  月 -06
1 4368 MING 2600315304 NO 3794049 29-8  月 -06
1 4437 MING 2600315304 NO 3794728 29-8  月 -06
1 4639 MING 2600315304 YES 3794935 29-8  月 -06


    接下来,决定恢复到哪个对应物比如,决定恢复到上面的 4437,方法:在 NOMOUNT 状态下用下面的命令:RMAN> reset database to incarnation 4437; 下面是具体的恢复步骤的一个演示(输出略去): RMAN> shutdown immediate;RMAN> startup nomount;RMAN> reset database to incarnation 4437; RMAN> restore controlfile;RMAN> alter database mount;RMAN> restore database until scn 3794934;RMAN> recover database until scn 3794934;RMAN> alter database open resetlogs;上面的例子中,我们最大可恢复到的  SCN  就是 3794934,因为 4437  的下一个对应物的重置  SCN  是 3794935.(2)  不使用恢复目录的情况不使用恢复目录的情况下,要恢复前一个对应物就必须要能恢复到前一对应物的控 制文件。不使用恢复目录,我们就无法使用  RESET DATABASE TO incarnation_num  命 令。

    首先看看有哪些对应物:RMAN> list incarnation;

数据库    Incarnations    列表DB    关键字    Inc                                   关键字    DB                           名           DB ID CUR    重置 SCN 重置时间------- ------- -------- ---------------- --- ---------- ----------1         1               MING             2600315304                NO         3501920        20-8  月   -06
2 2 MING 2600315304 NO 3785052 29-8  月 -06
3 3 MING 2600315304 NO 3794049 29-8  月 -06
4 4 MING 2600315304 NO 3794728 29-8  月 -06
5 5 MING 2600315304 NO 3794935 29-8  月 -06


6         6               MING             2600315304                YES       3976301             03-9  月    -06假设我们要恢复到 5,6之间,那么就要看看有没有控制文件的备份的  SCN  在  3794935到 3976301。我们使用下面的命令:RMAN> LIST BACKUP OF CONTROLFILE BY FILE;控制文件备份列表===========================CF Ckp SCN Ckp      时间           BS Key      S  段数  副本数  标记---------- ---------- ------- - -------    ------- ---
3976095 03-9  月 -06 34 A 2 1 TAG20060903T170136
3959239 03-9  月 -06 30 A 1 1  
3959170 03-9  月 -06 29 A 1 1  
3958983 03-9  月 -06 28 A 1 1  
3958937 03-9  月 -06 27 A 1 1  



3816575 30-8  月 -06 11 A 2 1 TAG20060830T064447


可以看出,上面的列表中,控制文件都是可以用的。接下来找到一个具体的含有控制文件的备份:RMAN> LIST BACKUP OF CONTROLFILE;备份集列表===================……段名:E:\TEST\C-2600315304-20060830-07控制文件包括: Ckp SCN: 3818213                            Ckp    时间:30-8  月    -06……假 设 我 们 使 用  E:\TEST\C-2600315304-20060830-07 , 那 么 接 下 来 我 们 需 要 用DBMS_BACKUP_RESTORE  包来从这个文件中恢复控制文件。(在 SQLPLUS  中运行)  SQL>SHUTDOWN IMMEDIATE;SQL>STARTUP NOMOUNT;SQL>DECLAREDEVTYPE VARCHAR2(256);DONE BOOLEAN;BEGINDEVTYPE:=DBMS_BACKUP_RESTORE.deviceallocate(NULL);DBMS_BACKUP_RESTORE.restoresetdatafile;DBMS_BACKUP_RESTORE.restorecontrolfileto('/xxx/CONTROL01.CTL');DBMS_BACKUP_RESTORE.restorebackuppiece('/xxx/C-2600315304-20060830-07',DONE=>done);DBMS_BACKUP_RESTORE.restoresetdatafile;DBMS_BACKUP_RESTORE.restorecontrolfileto('/xxx/CONTROL02.CTL');DBMS_BACKUP_RESTORE.restorebackuppiece('/xxx/C-2600315304-20060830-07',DONE=>done);DBMS_BACKUP_RESTORE.restoresetdatafile;DBMS_BACKUP_RESTORE.restorecontrolfileto('/xxx/CONTROL03.CTL');DBMS_BACKUP_RESTORE.restorebackuppiece('/xxx/C-2600315304-20060830-07',DONE=>done);DBMS_BACKUP_RESTORE.devicedeallocate(NULL);END;/SQL>ALTER DATABASE MOUNT; 重新联到 RMAN  后    再来运行一下 LIST INCARNATION;$ RMAN TARGET /@MING NOCATALOG; RMAN> LIST INCARNATION;数据库     Incarnations  列表DB    关键字     Inc         关键字    DB          名     DB  ID                              CUR     重置    SCN重置时间------- ------- -------- ---------------- --- ---------- ----------
1 1 MING 2600315304 NO 3501920 20-8  月 -06
2 2 MING 2600315304 NO 3785052 29-8  月 -06
3 3 MING 2600315304 NO 3794049 29-8  月 -06
4 4 MING 2600315304 NO 3794728 29-8  月 -06
5 5 MING 2600315304 YES 3794935 29-8  月 -06


可以看出来,我们已经恢复到想要的对应物上了。接下来:RMAN> RESTORE DATABASE; RMAN> RECOVER DATABASE;RMAN> ALTER DATABASE OPEN RESETLOGS;
    4.7.6 RMAN增量备份

    通过增量备份,RMAN  允许用户只备份上次增量备份操作以来被修改过的数据块。

    N  级别增量备份备份从最近的  N  级别或者更小级别以来的所有更改过的数据块内容。0 级备份与全备份的不同就是  0  级备份可以作为其它增量备份的基础备份而全备份是不可 以的。

    增量备份的优点:  节约备份时间节省备份磁带或者磁盘空间    降低网络带宽要求增量备份的缺点:  恢复时间可能要长。

    增量备份分为两种,一种是累积增量备份,一种是非累积增量备份。

    差异增量备份(Differential Incremental Backup)

    差异备份是默认的增量备份类型,备份上一次在同级或者更低级别进行备份以来所有有变化的数据块。

    RMAN>backup incremental level n (incremental) database;累积增量备份(Cumulative Incremental Backup)

    包括上一次低级备份以来所有有变化的数据块。累计增量备份增加了备份的时间, 但是因为恢复的时候,需要从更少的备份集中恢复数据,所以,为了减少恢复的时候, 累计增量备份将比差异增量备份更有效。

    RMAN>backup incremental level n (cumulative) database;

    9i  :  不管怎么样增量备份,还是需要比较数据库中全部的数据块,这个过程其实是一个漫 长的过程,而且由于增量备份形成多个不同的备份集,使得恢复变的更加不可靠而且速度慢, 所以增量备份在版本 9中仍然是鸡肋,除非是很大型的数据仓库系统,没有必要选择增量备 份。

    10g  :  在增量备份上做了很大的改进,可以使增量备份变成真正意义的增量,因为通过特有的增量日志,使得 RMAN  没有必要去比较数据库的每一个数据块,当然,代价就是日志的 IO与磁盘空间付出。另外,10g 通过备份的合并,使增量备份的结果可以合并在一起,而完全的减少了恢复时间。

    1.  基本备份(0  级备份)

    Level  0  是增量备份策略的基础(注意与 Full备份区别)。执行增量备份操作时,首先需 要的是基本备份(incremental base backup),增量备份必须有一个基本备份。基本备份的增量 级别是  0,如果没有  0  级备份,那么其它级别的备份会自动转成基本备份。

    0  级备份举例:

    RMAN> run { 2> allocate channel dev1 type disk;3> backup 4> incremental level 0 5> filesperset 4    #定义每个 backupset  的最大文件数6> format "/oracle/backups/sunday_level0_%t" 7> (database);8> release channel dev1;

    使用 LIST语句查看,数据库备份集的列表显示中, "type"  将显示  "Incremental","LV"列将显示"0"  . 2.  N  级备份

    RMAN> run { 2> allocate channel dev1 type disk;3> backup 4> incremental level 1/2/3/4 5> filesperset 4    #定义每个 backupset  的最大文件数6> format "/oracle/backups/sunday_level0_%t" 7> (database);8> release channel dev1;9> }

    3.  N 级备份的规划根据业务需求、数据量、恢复所需要的时间等方面考虑,制定合理的备份计划。 例:  一个典型的增量备份案例如下:星期天晚上  - level 0 backup performed 星期一晚上  - level 2 backup performed 星期二晚上  - level 2 backup performed 星期三晚上  - level 1 backup performed 星期四晚上  - level 2 backup performed 星期五晚上  - level 1 backup performed 星期六晚上  - level 2 backup performed 星期天晚上  - level 0 backup performed 4.  增量备份的恢复同普通的完全恢复:  restore    recover RMAN自动确定和使用需要的备份集。

    4.7.7 RMAN备份的优化

    可以在 RMAN配置中设置备份的优化,如RMAN> CONFIGURE BACKUP OPTIMIZATION ON;如果优化设置打开,将对备份的数据文件、归档日志或备份集运行一个优化算法。

    RMAN备份操作主要是完成以下三个步骤1、从磁盘上读取数据2、在内存中处理数据块3、写入数据到磁盘或磁带以上的读写操作可以同步或异步的完成,在同步 I/O操作中,一个时间只允许有一个IO 操作,但是在异步 I/O操作中,一个时间允许有多个IO操作。因此,备份与恢复的调优主 要集中在以下几个方面:1、  提高同步或异步 I/O操作能力在支持异步操作的操作系统上, 可以通过设置TAPE_AYSNCH_IO,DISK_ASYNCH_IO 和 BACKUP_TYPE_IO_SLAVES 来支持异步操作,提高写的能力。

    2、  提高磁盘读能力可以在  backup命令后通过设置  DISKRATIO来保证从多个磁盘上读取数据,保证 连续的数据流。

    3、  正确设置缓冲区与参数值设置LARGE_POOL_SIZE , 使备份可以使用连续的缓冲池 , 通过设置DB_FIL_DIRECT_IO_COUNT  可以提高缓冲区的利用。如果使用磁带备份,还可以设置 BACKUP_TYPE_IO_SLAVES 来提高磁带的写能力。

    4、  采用并行备份开辟多个通道,可以实现并行备份与恢复

    4.7.8 DBMS_BACKUP_RESTORE 包

    这个包是  RMAN  备份与恢复的核心,在调试模式下,RMAN  会输出它调用的每一条命令:C:\> rman debug target /@tlgaxz catalog rman/rman@reco trace=debug.txt

    常用命令:restoreSetDataFile               指示还原操作的开始(但是不会执行实际的还原操作)

    restoreSetDataFileTo     定义要还原的数据文件和该文件的还原位置

    restoreControlFileTo 定义控制文件的还原位置

    restoreSpfileTo                     定义要还原的  spfile 的位置

    restorebackuppiece             执行实际的还原操作,这个函数的一个参数是备份文件名

    devicedeallocate                  释放  deviceallocate 函数所分配的设备 deviceallocate          分配用于连续  I/O的设备

     applySetDataFile      指示增量还原操作的开始 applyDataFileTo    定义数据文件的增量还原位置

    applybackuppiece        执行实际的还原操作 resetoreSetArchivelog    指示归档日志还原操作的开始

    restoreArchivelog                 定义要还原的归档的重做日志序列和线程

    例:使用  dbms_backup_restore 包恢复服务器参数文件:在一些不常见的情况下,我们可能需要直接使用  dbms_backup_restore  包来恢复 spfile. 当然这个包也可以用来恢复其它数据,是常规办法都没有用的时候的一个利器。这个包可以 在 数  据 库    NOMOUNT    状 态  下  使  用 .  假  设 我  们  有 一  个 自  动  备  份 文  件C-2600315304-20060829-02,我们需要从这里恢复数据,那么可以通过执行下面的脚本来完成:

SQL>DECLAREDEVTYPE VARCHAR2(256);DONE BOOLEAN;BEGINDEVTYPE:=DBMS_BACKUP_RESTORE.deviceallocate(NULL);DBMS_BACKUP_RESTORE.restoresetdatafile;DBMS_BACKUP_RESTORE.restorespfileto('d:\spfile.ora');DBMS_BACKUP_RESTORE.restorebackuppiece('d:\C-2600315304-20060829-00',DONE=>done);DBMS_BACKUP_RESTORE.devicedeallocate(NULL);END;/
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics