http://book.51cto.com/art/200912/169166.htm 三思涂抹oracle
第7章 备份与恢复基础
7.1 备份概念
所谓备份,其实就是冗余,本质是将当前的数据复制一份(也可能是多份)到其他位置,这样当原始数据由于各种原因导致无法访问或错误时,DBA可以通过冗余将其修复到备份时的状态。
7.2. 备份类型
Oracle中的备份从类型上可以分为两类:物理备份和逻辑备份。
物理备份的核心是复制文件。对于Oracle数据库来讲,就是将数据文件、控制文件、归档文件等Oracle数据库启动时所必须的相关物理文件,复制到其他路径或存储设备中。Oracle中提供了多种方式实现物理备份,比如鼎鼎大名的RMAN(全称是Recovery Manager,通常简称RMAN)
逻辑备份的核心是复制数据。这种复制方式不管数据库中具体是哪些文件存储数据,而是按照Oracle提供的命令,通过逻辑的方式直接将数据保存在其他位置。Oracle中实现逻辑备份的方式包括EXP和EXPDP等应用,当然用户也可以自己写应用实现,比如最简单的DBLINK+CREATE TABLE AS等。
优缺点:物理备份是对物理文件的备份,恢复后并不能压缩(优化)数据库;逻辑备份常规的EXP和EXPDP在处理大数据量时效率不佳,并且也未对增量备份提供直接支持,除小规模数据库外,已经极少被应用于备份,倒是更常被应用于数据迁移的解决方案。
7.3 数据库状态
备份时数据库的状态也可以分为两类:启动状态和关闭状态,即:热备份(Online Backups)和冷备份(Offline Backups)。
数据库启动状态创建的备份就是热备份,也叫联机备份。热备份肯定是不一致备份,利用创建的热备份做恢复时,有可能需要应用归档日志或联机重做日志,才能将数据库修复到一个一致性的状态,因此要创建有效的热备份,要求数据库必须处于归档模式,否则创建的备份可能是无效备份(具体情况要视当前Online Redologs是否被覆盖过而定)。对于7×24小时的应用而言往往必须进行热备份。
数据库关闭状态创建的备份就是冷备份,也叫脱机备份。利用冷备份做恢复时,如果数据库是正常关闭(非SHUTDOWN ABORT或主机故障停电关闭等),则不需要对数据库进行修复操作,否则也需要应用归档日志和Online Redologs,才能将数据库修复到一个一致性的状态。
7.4 备份的状态
备份的状态又可以分为两类:一致性备份(Consistent Backups)和 不一致性备份(Inconsistent Backups)。
备份的数据文件和控制文件拥有相同的SCN(System Change Number),即一致性备份。只有当数据库以SHUTDOWN [NORMAL|IMMEDIATE|TRANSACTIONAL]方式关闭,并且数据库未被置于打开状态(或OPEN READ ONLY)时创建的备份才是一致性备份,这种备份在恢复后不需要再做修复操作就可以直接打开,一致性备份必须是冷备份。
通常数据库OPEN READ WRITE或SHUTDOWN ABORT时都不会是一致性状态,因为备份操作不可能同时完成,而数据文件时刻都在写,SCN时刻都在变。不一致的备份在恢复后必须借助归档日志文件和联机重做日志,将数据库修复到一致性的状态才能打开。因此,创建不一致性的备份除了要备份数据库启动时必须的数据文件和控制文件外,还需要备份归档日志文件。
数据库状态与备份状态的关系:
热备份一定是不一致性备份;
冷备份可能是一致性备份,也可能是不一致性备份;
一致性备份肯定是冷备份;
不一致性备份可能是热备份,也可能是冷备份。
7.5 备份规模
从备份的规模上可以分成:完全备份(Whole Database Backups)、表空间备份(Tablespace Backups)、数据文件备份(Datafile Backups)、控制文件备份(Control File Backups)、归档日志文件备份(Archived Redolog Backups)。
完整备份包括:数据文件、控制文件、归档文件(有则备份)和初始化参数文件。完全备份的数据库既可以是归档模式,也可以是非归档模式,但备份是否有效,取决于备份的状态。归档模式下:数据库正常打开状态下创建的备份是不一致性的有效备份,数据库正常关闭状态下创建的备份都是有效备份(存在一致性备份和不一致性备份两种可能)。非归档模式下:数据库正常打开状态下创建的不一致性备份是无效备份(即:非归档模式下就不能进行热备份,否则备份无效),数据库正常关闭状态下创建的备份都是有效备份(还是一直备份)。
表空间备份指定的是一个或多个表空间,实质是备份指定表空间下的数据文件,只有 当数据库处于归档模式时 或者 表空间为只读或脱机状态 时,创建的表空间级备份才是有效备份。
数据文件备份指定的是一个或多个数据文件,只有当数据库处于归档模式时,且数据文件被置为READ ONLY或OFFLINE,此时创建的备份也可视作有效备份(不一致备份)。
归档日志文件备份 定期复制归档文件到其他路径或服务器下即可,不需要考虑一致性或不一致的问题。如果数据库设置了归档状态且被置于Force Logging(归档本身就是备份),归档文件是数据文件备份的重要辅助部分,不一致备份在做恢复时,通常必须通过归档日志才能恢复到一致性状态。
上述方式均指物理备份。逻辑备份由于直接操作逻辑对象,非常灵活,可以满足任意规模的备份(包含但不限于上述类型)。
7.6 恢复
广义的恢复就是将系统置于可用状态。数据库的恢复指物理恢复(通过特定操作将数据文件、控制文件恢复到某一时间点时的状态)和逻辑恢复。
错误类型包括:用户误操作导致的错误、系统进程导致的错误、实例导致的错误、存储介质导致的错误。实例错误会由Oracle(下次启动时)自动(尝试)进行(实例)修复。介质错误由DBA/SA进行介质恢复(Media Recovery)。
7.7 恢复类型
恢复类型包括:实例恢复(Instance Recovery)和 介质恢复(Media Recovery)。
实例恢复,也可称作崩溃恢复(Crash Recovery),由Oracle自动进行,通过读取当前的数据文件和联机重做日志文件(注意,不是归档文件,实例恢复与是否归档模式无关)来恢复数据库,使数据文件和控制文件恢复到崩溃前的一致性状态。
实例恢复分两个步骤进行:缓存恢复(Cache Recovery)、事务恢复(Transaction Recovery)。
Oracle启动实例并加载数据库,然后通过Online Redologs中的重做日志,重现实例崩溃前对数据库的修改操作。在恢复过程中对于已经提交的事务,但尚未写入数据文件的那部分数据全部写入数据文件,这个过程用一个专业名词来表达,叫Rolling Forward(前滚)。Rolling Forward之后,虽然已经提交的修改操作更改的数据都已经被写入数据文件,但在实例崩溃时,部分未提交的事务操作的数据也被写入到数据文件,这些事务必须被撤销,这个过程也可用一个专业名词来表述--Rolling Back(回滚)。
介质恢复指 需要用到DBA创建的备份进行恢复,或重新应用日志文件的操作;就是当前数据库状态已非正常状态,需要DBA介入通过各种方式将数据库恢复到某种指定状态的操作。
介质恢复首先将数据库恢复到备份时的状态,然后通过应用重做日志的方式将数据库恢复到最近的时间点(应用所有重做日志)或者某个指定的时间点(只应用部分重做日志,不超过重做日志中记录的最后时间点)。通常提到介质恢复都是指数据文件的修复,其实还有另外一种介质恢复的方式,即数据块恢复,只不过这种恢复方式仅RMAN中可用,而且实际应用的机率较低,因此本书中所提到的介质恢复,均是指磁盘上数据文件的恢复操作。
7.8 恢复方式
恢复方式:完全恢复(Complete Recovery)和不完全恢复(Incomplete Recovery)。
完全恢复是将数据库恢复到最近的时间点的恢复方式,通常是当磁盘故障导致数据文件或控制文件无法访问时选择的恢复方式。如果是对整个数据库做恢复,大概需要如下以下步骤:
MOUNT数据库。
确认所有数据文件均为ONLINE状态。
执行恢复操作。
应用所有生成的Redologs文件(包括联机重做日志文件和归档文件)。
如果是表空间或数据文件级的恢复,步骤如下:
OPEN库。
将要恢复的表空间或数据文件置为OFFLINE。
执行恢复操作。
应用所有生成的Redologs文件(包括联机重做日志文件和归档文件)。
不完全恢复是指将数据库恢复到非当前时刻的状态,就是只应用部分归档或联机重做日志,DBA可以通过指定SCN或时间点,将数据库恢复到指定时间时的状态,因此这种恢复也叫时间点恢复(Point-in-time Recovery)。
不完全恢复适用于下列情况:
介质损坏导致部分在线重做日志不可用。
用户误删数据,无法用逻辑方式恢复。
由于丢失部分归档日志,无法进行完全恢复。
控制文件丢失,只能以备份的控制文件打开数据库。
要进行不完全恢复的操作,必须要有适当的备份,并且备份必须是在要恢复的时间点之前创建。首先通过创建的备份,恢复所有的数据文件,然后应用重做日志到指定的时间点(或者是最后一个可用的重做日志文件),最后以OPEN RESETLOGS模式打开数据库。
由于不完全恢复只应用部分日志文件,因此必须给Oracle指定结束标志,有如下4种选项可供选择:
基于时间:指定一个具体的时间点。
基于SCN:指定一个具体的SCN号。在Oracle中SCN可以转换成时间,因此本选项与前一条实质相同,但是SCN更加精确。只不过多数情况下,我们可能并不能准确记录下数据库的SCN,因此基于时间会更常用一些。
基于CANCEL:应用所有能够应用的日志文件,直到用户主动取消为止。
基于日志序号:指定归档文件序号,恢复到指定的日志序号后即中止恢复操作。
提示:
不完全恢复同样也支持表空间级或数据文件级的不完全恢复。表空间的时间点恢复还有一个专业名词叫TSPITR(Tablespace Point-in-time Recovery),不过需要谨记SYSTEM表空间和UNDO表空间(或任何包含回滚段的表空间)不支持TSPITR。
7.9 恢复操作
数据库的恢复是指将数据库恢复到一个一致性的状态,整个恢复操作可以分为两个步骤,数据库修复(RESTORE)和恢复(RECOVER)。
修复是指将要恢复的文件从备份集中读取出来,并保存至指定路径下(如果未指定路径,那么就是保存到默认路径),在RMAN备份恢复中对应RESTORE命令。
恢复是指应用所有重做日志,将数据库恢复到崩溃前的状态,或者应用部分REDO,将数据库恢复到指定的时间点。这里的恢复不是广义的恢复,而是特指恢复的操作命令,在RMAN和用户管理的备份恢复中都是对应RECOVER命令。
7.10 RESETLOGS操作
必须在执行不完全恢复后,标示之前生命周期结束,方法就是以RESETLOGS方式打开数据库。以RESETLOGS方式打开后,Oracle数据库又开始了一个新的生命周期,即重置Incarnation,日志文件序号也被重新初始化到1。
指定RESETLOGS会执行下列操作:
归档当前的在线重做日志文件(如果能访问到的话),然后清空内容并将日志文件序号重置为1(如果在线重做日志文件不存在,则重建)。
重置控制文件中关于在线日志文件的元数据。
更新数据文件和在线重做日志文件中的RESETLOGS SCN和重置时间信息。
建议执行OPEN RESETLOGS操作之后马上进行一次全库备份。
Oracle数据库的Incarnation在有些资料中译作对应物,在我看来可以将其理解成生命周期。Oracle数据库从创建到遇到RESETLOGS操作为一个生命周期,这个生命周期内数据库的逻辑属性,如SCN、日志文件序列号等具有相同的特征。当通过OPEN RESETLOGS方式打开数据库后,原生命周期即宣告结束,原生命周期中生成的重做日志文件也被废弃,日志文件序号自动重置为1。
7.11 常见备份与恢复技术
7.11.1 用户管理的备份和恢复(User-Managed Backups&Recovery)
误删数据文件:指操作系统上的物理删除,如果删除的数据文件从创建到当前状态,所有的归档都还在,可以通过特定操作重建该数据文件,不会丢失任何数据。
临时进行的备份和恢复:比如为架设一个与现有数据库一模一样的测试环境,如果通过RMAN进行,必然会有备份和恢复的操作,如果是通过用户管理方式进行,你可以将备份过程视作"备份+修复"的过程,然后再复制归档和在线日志文件,进行恢复操作即可。
7.11.2 RMAN备份和恢复(Recover Manager Backups&Recovery)
使用RMAN,DBA完全可以不用关心数据文件在哪里存放,RMAN的备份是由Oracle自身的服务进程操作,DBA只需要指定备份方式、备份内容,以及备份存储的路径等信息,其他工作都由RMAN自动完成,相对于用户管理方式一次全库备份需要数十条甚至更多命令,RMAN甚至只需要一条命令即可。 RMAN特有的功能,如:支持增量备份,支持直接向磁带设备读写数据,支持错误块检测和修复,支持备份、恢复过程中自动检查,支持作业方式,内置备份冗余等功能,获得了更多厂商的支持(包括NBU/TSM等第三方备份管理工具都支持调用RMAN实现备份)。
7.11.3 逻辑导入/导出(Export/Import和Data Pump)
逻辑备份主要是备份数据,导出表、过程等对象到一个二进制文件中。对于小数据量的数据库,这种方式有一个优势,因为操作比较灵活,而且只导出逻辑数据,相对也节省磁盘空间。导出可以通过Export(执行命令:EXP)或Data Pump Export(执行命令:EXPDP)进行,后者是10g新推出的导出工具,采用10g新增的泵方式处理数据,理论上效率更高。两者导出的二进制文件并不互相兼容。导入是通过Import(执行命令:IMP)或Data Pump Import(执行命令:IMPDP)进行。
由于逻辑导入和导出是通过逻辑方式进行,因此效率相比物理备份差异明显,特别是当数据库容量达到一定规模后,逻辑导入/导出的效率较低,因此并不适于作为常规备份方式。逻辑导入/导出工具可以用来进行数据库迁移,对于跨平台甚至又跨版本的数据库迁移,如果没有选择第三方产品,并且不愿意通过高级复制或自写程序方式迁移数据的话,使用逻辑导入/导出工具进行数据库迁移就几乎成了唯一的选择。
7.11.4 闪回(Flashback)
闪回查询(Flashback Query):通过查询UNDO段,能够重现操作之前的数据。
闪回表(Flashback Table):该特性与10g中新推出的另外一项新增特性Recycle Bin(回收站)对应,默认情况下表对象及其关联的索引等对象在DROP后并没有物理删除,而是标记为删除(类似在Windows中删除文件时,文件移向"回收站"的概念),如果你想对这类表进行恢复,只需要简单的命令即可,而且该操作只修改数据字典,不管要恢复的对象占用多大空间,恢复效率极高。
闪回数据库(Flashback Database):该功能更是了得,真正实现了不需要备份的恢复(严格地讲还是有备份,只不过这个备份操作不由DBA做,而是Oracle自动进行)。
7.11.5 数据卫士(Data Guard)
严格来讲,Data Guard并不是一个备份恢复的工具,因为默认情况下Standby与Primary保持一致状态,因此对于一些逻辑错误,如误删除数据等均无法提供有效的恢复手段,该特性的主要目的是为了容灾。比如当Primary数据库因为某些原因无法访问时,可以快速将应用切换至Standby数据库,如果调配得当,停机时间非常短暂(注意仅使用Data Guard并不能实现故障切换,完全无停顿)。Data Guard支持多种数据保护模式,能够对数据提供最大限度的保护,确保任何情况下都不丢失数据。普通的备份恢复措施则不能保证这一点,而且一旦出现故障,通过备份恢复的方式重建数据库费时较长,相比较而言,Data Guard更适用于容灾恢复。
第8章 RMAN
8.1进入RMAN
通过RMAN的方式无论是要备份还是要恢复,都必须先启动实例并加载数据库。
1.连接数据库
C:\Documents and Settings\junsansi>SET ORACLE_SID=jssbook
C:\Documents and Settings\junsansi>RMAN TARGET /
Recovery Manager: Release 10.2.0.1.0 - Production on
Tue Mar 17 21:12:17 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: JSSBOOK (DBID=1415261003)
RMAN>
SET ORACLE_SID=jssbook 设置实例名
RMAN TARGET / 连接TARGET 或者 先RMAN 再RMAN> connect target /
注意,Linux/UNIX环境下设置操作系统环境变量应使用export命令,另外ORACLE_SID必须为大写。
[oracle@yans1 ~]$ export ORACLE_SID=test08
[oracle@yans1 ~]$ rman target /
2.连接远程数据库
如果要连接的目标数据库是一个远程数据库,那么必须在建立连接时指定一个有效的网络服务名(Net Service Name),本地的tnsname.ora文件中必须已经建立了该网络服务名的正确配置。
C:\Documents and Settings\junsansi>RMAN TARGET sys/sa@orcl
3.退出rman
添加日志
C:\Documents and Settings\junsansi>RMAN TARGET sys/sa@orcl log C:\temp\rman_log.txt
C:\Documents and Settings\junsansi>RMAN TARGET sys/orcl@orcl log C:\TEMP\rman_log.txt
退出rman
RMAN> exit
8.2启动关闭数据库
在Oracle数据库OPEN状态执行备份(严格地讲是属于OPEN READ WRITE状态),则数据库必须是置于归档模式,否则在执行备份操作时有可能碰到ORA-19602错误。
1.启动、关闭数据库
先连接到目标数据库
C:\Documents and Settings\junsansi>RMAN TARGET /
关闭数据库
RMAN> SHUTDOWN IMMEDIATE 或者SHUTDOWN NORMAL、SHUTDOWN ABORT
启动数据库
RMAN> STARTUP 或者 STARTUP MOUNT,然后再利用ALTER DATABASE OPEN
8.2.2 执行操作系统命令
RMAN支持通过执行HOST命令暂时退出RMAN的命令提示符,进入到操作系统的命令环境,
执行完系统命令后可以再通过执行EXIT命令退出到RMAN命令提示符下。
RMAN> HOST;
C:\Documents and Settings\junsansi>exit;
8.2.3 执行SQL语句
在RMAN的命令提示符后输入SQL命令,然后在一对单引号(双引号亦可)中输入要执行的SQL语句,例如:
RMAN> SQL 'ALTER SYSTEM ARCHIVE LOG ALL'; //ora-00258 noarchivelog模式下的手动归档必须标识日志
注意,RMAN中的SQL命令不能执行SELECT语句,或者说可以执行,但看不到结果。
主机命令/SQLPLUS命令/RMAN命令 结合使用
RMAN> HOST;
Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\junsansi>SQLPLUS /NOLOG //不能加分号
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Mar 17 21:15:44 2009 Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> CONN / AS SYSDBA
Connected.
SQL> ALTER SESSION SET NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> SELECT SYSDATE FROM DUAL;
SYSDATE
-------------------
2009-03-17 21:16:08
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options
C:\Documents and Settings\junsansi>EXIT
host command complete
RMAN>
8.2.4 RMAN备份类型
通过RMAN有两种不同类型的备份方式:创建镜像复制和创建备份集。
镜像复制(Image Copies)。镜像复制实际上就是创建数据文件、控制文件或归档文件的备份文件,与用户通过操作系统命令创建的备份一样(甚至连执行的命令都相同,RMAN镜像复制使用COPY命令,Windows下复制文件也用COPY命令,Linux/UNIX下则是用cp命令),只不过RMAN是利用目标数据库中的服务进程来完成文件复制,而用户则是用操作系统命令。这种方式本质仍是复制数据库中的物理文件,包括数据文件、控制文件等,复制出的文件与原始文件一模一样,所以镜像复制的方式体现不出RMAN的优势。
备份集(Backup Sets)。备份集是RMAN创建的具有特定格式的逻辑备份对象,备份集在逻辑上由一个或多个备份片段(Backup Piece)组成,每个备份片段在物理上对应一个操作系统文件,一个备份片段中可能包含多个数据文件、控制文件或归档文件(之一)。通过RMAN创建备份集的优势在于,备份时只读取数据库中已经使用的数据块,因此不管是从备份效率,或是节省存储空间的角度,创建备份集的方式都更有优势,本章所执行的演示均是基于创建备份集的方式进行的。
8.2.5 RMAN命令执行方式
(1)单个执行。
RMAN>BACKUP DATABASE;
(2)批处理,
RMAN>RUN{
......
}
批处理方式实质是将原来单个执行的命令组合到一起,并放在RUN{}之间,这种方式最大的好处是所有在RUN中的命令被视为一个作业,
如果作业中任何一条命令执行失败,则整个命令停止执行,即失败命令后的其他命令都不会再被执行。
这种方式是最常使用的方式,特别是对于后台脚本化执行。
不过,并不是所有的RMAN命令都能被放到RUN块中执行,一些控制RMAN环境变量,或操作CATALOG的操作都不能在RUN块中执行,
如CONFIGURE、LIST、REPORT等。但是你仍然可以将这些命令放在RUN之前、之后或多个RUN块之间(随你放哪,只要不放到RUN块里就行)。
(3)运行脚本,又能细分为以下几种方式:
用命令行方式调用操作系统中保存的脚本:
F:\oracle\script>RMAN TARGET / @backup_db.rman
或者:
F:\oracle\script>RMAN TARGET / cmdfile=backup_db.rman
在RMAN中执行操作系统中保存的脚本文件:
RMAN> @backup_db.rman
运行存储在CATALOG中的脚本(需要首先为RMAN创建恢复目录):
RMAN> RUN { EXECUTE SCRIPT backup_whole_db };
8.3 RMAN备份初级演练
RMAN中所有的备份操作,都是通过BACKUP命令(指创建备份集方式的备份)进行的。
8.3.1 整库的备份
RMAN> BACKUP DATABASE;
执行上述命令后,将对目标数据库中的所有数据文件进行备份,如果你对RMAN的返回信息看得足够认真,你应该已经发现,该备份集生成了两个备份片段:一个存储数据文件,另一个存储控制文件和SPFILE(服务器端初始化参数文件),都被保存到Oracle软件的安装目录下,这是因为没有为备份集指定存储路径,默认情况下就会存储到Oracle软件的安装目录中。
RMAN> BACKUP DATABASE FORMAT 'f:\oracle\backup\bak_%U'; 指定备份文件存放路径,这个路径必须是操作系统中已经存在的路径。
查看创建的全库备份,可以通过LIST命令来查看:
RMAN> LIST BACKUP OF DATABASE;
8.3.2 表空间的备份
只要实例启动并处于加载状态,无论数据库是否打开,都可以在RMAN中对表空间进行备份。
RMAN> BACKUP TABLESPACE USERS;
同样,我们在使用BACKUP TABLESPACE命令也可以通过显式指定FORMAT参数自定义备份片段名称。
RMAN> LIST BACKUP OF TABLESPACE USERS; --查看表空间的备份
RMAN> DELETE BACKUPSET 10; --删除没有用的备份
执行DELETE命令时,默认情况下会给出是否确认删除的提示信息,以避免误操作。如果希望跳过提示的话(比如用后台脚本方式执行,无处确认),那么可以在执行DELETE命令时附加NOPROMPT子句。
8.3.3 数据文件的备份
有两种方式指定数据文件的名称(即数据文件详细路径)和FILE_ID。这两项信息都可以从数据字典DBA_DATA_FILES中查询,
SQL> SELECT FILE_ID,FILE_NAME FROM DBA_DATA_FILES;
尝试通过BACKUP DATAFILE命令备份USERS表空间的数据文件:
BACKUP DATAFILE 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF';
在使用BACKUP DATAFILE命令时既可以指定DATAFILE名称,也可以指定FILE_ID,比如上述执行的命令完全等价于BACKUP DATAFILE 4。
如果要查看指定数据文件的备份,可以用如下命令:
RMAN> LIST BACKUP OF DATAFILE n;
注:n=指定的数据文件序号,如果需要备份的数据文件有多个,n=多个序号,中间以逗号分隔即可,指定的序号在备份中必须存在对应的数据文件,否则会报错。
8.3.4 控制文件的备份
手动执行备份命令
RMAN> BACKUP CURRENT CONTROLFILE;
执行BACKUP命令时指定INCLUDE CURRENT CONTROLFILE子句
RMAN> BACKUP DATABASE INCLUDE CURRENT CONTROLFILE;
不仅限于DATABASE,执行BACKUP命令备份任何文件时都可以指定INCLUDE CURRENT CONTROLFILE子句,甚至是BACKUP CURRENT CONTROLFILE。执行BACKUP CURRENT CONTROLFILE INCLUDE CURRENT CONTROLFILE命令时,会备份几次控制文件呢?
备份数据库的第一个数据文件(SYSTEM表空间)会触发控制文件的自动备份 RMAN> BACKUP DATAFILE 1;
通过CONFIGURE命令将CONTROLFILE AUTOBACKUP置为ON。RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
当AUTOBACKUP被置为ON时,RMAN做任何备份操作,都会自动对控制文件做备份。
如果要查看备份的控制文件,可以通过以下命令进行:RMAN> LIST BACKUP OF CONTROLFILE;
8.3.5 归档文件的备份
只要拥有相应的归档日志文件,就能确保我们将数据库恢复到备份之后的任意时刻。在RMAN中备份归档日志有以下两种方式:
8.3.5.1 利用BACKUP ARCHIVELOG命令备份
BACKUP ARCHIVELOG ALL 是指备份当前所有可访问到的归档文件
BACKUP ARCHIVELOG UNTIL、SCN、TIME、SEQUENCE等参数灵活指定要备份的归档区间。
8.3.5.2 执行BACKUP命令时指定PLUS ARCHIVELOG子句
RMAN> BACKUP CURRENT CONTROLFILE PLUS ARCHIVELOG; 在备份控制文件之前首先对所有归档文件进行备份。
PLUS ARCHIVELOG的方式与BACKUP ARCHIVELOG的区别,BACKUP...PLUS ARCHIVELOG命令在备份过程中会依次执行下列步骤:
1)运行ALTER SYSTEM ARCHIVE LOG CURRENT语句对当前Redolog进行归档。
2)执行BACKUP ARCHIVELOG ALL命令备份所有已归档日志。
3)执行BACKUP命令对指定项进行备份。
4)再次运行ALTER SYSTEM ARCHIVE LOG CURRENT对当前Redolog归档。
5)对新生成的尚未备份的归档文件进行备份。
在完成归档日志文件备份后,我们需要删除已备份过的归档文件(归档文件记录下了数据库进行的所有操作,如果您的数据库操作频繁而且量大,那归档文件的大小也是相当恐怖,备份后删除释放存储空间是相当有必要的)。RMAN提供了DELETE ALL INPUT参数,加在BACKUP命令后,则会在完成备份后自动删除归档目录中已备份的归档日志。
完成备份之后,可以通过下列命令查看已备份的归档日志片段:RMAN> LIST BACKUP OF ARCHIVELOG ALL;
8.3.6 初始化参数文件的备份
通常在备份控制文件时,RMAN也会自动备份服务器端的初始化参数文件,并置于控制文件相同的备份片段中,因此极少需要单独对SPFILE进行备份,如果确实想单独备份初始化参数文件直接使用BACKUP SPFILE命令即可:RMAN> BACKUP SPFILE;
服务器端的初始化参数文件虽然也是一个二进制文件,但用文本编辑工具都可以打开并浏览主要内容(只是不能修改)。
8.3.7 对备份集进行备份
备份备份集使用BACKUP BACKUPSET命令,该命令并不是通过重新读取数据文件的方式新建一个备份集,而是直接复制当前的备份集,生成一个与原备份一样的新备份集。使用BACKUP BACKUPSET命令时可以选择备份所有的备份集,也可以只备份特定的备份集(注:上述两条均特指在磁盘上的备份集,用BACKUP BACKUPSET命令只能将备份集从磁盘备份到磁盘,或者从磁盘备份到磁带,不能从磁带备份到磁带或磁带备份到磁盘),在不指定输出路径的情况下,默认情况都是从磁盘创建备份到磁盘。
备份所有备份集:RMAN> BACKUP BACKUPSET ALL;
备份指定的备份集:RMAN> BACKUP BACKUPSET n; 提示:n=备份集ID,可以同时指定多个,相互间以逗号分隔即可。
如同备份归档文件一样,BACKUP BACKUPSET命令也支持DELETE INPUT参数,DBA可以视实际的需要,在适当位置添加该参数,以释放空间。
8.3.8 综述
查看备份基本都是用"LIST BACKUP OF备份项名称"命令,
如果想自定义片段的话,可以在备份命令后加上FORMAT参数。
8.4 RMAN命令知多少
8.4.1 显示RMAN默认配置--SHOW命令
RMAN> SHOW ALL;
SHOW命令的使用也相当灵活,其后加上不同类型的配置参数,就可以显示不同类型的配置,
RMAN> SHOW CONTROLFILE AUTOBACKUP;
提示:配置项后面加了# default的表示该项为初始配置,未被修改过。
8.4.2 列出备份信息--LIST命令
LIST命令用来查看通过RMAN生成的备份集、备份镜像、归档文件等,命令用LIST+相应关键字即可。
列出数据库中所有的备份信息:RMAN> LIST BACKUP;
列出所有备份的控制文件信息:RMAN> LIST BACKUP OF CONTROLFILE;列出指定数据文件的备份信息: RMAN> LIST BACKUP OF DATAFILE 'F:\ORACLE\ORADATA\JSSBOOK\SCOTT_TBS01.DBF'; 或 RMAN> LIST BACKUP OF DATAFILE 5;
注:DATAFILE序号可以通过动态性能视图V$DATAFILE或数据字典DBA_DATA_FILES中查询。
列出所有备份的归档文件信息:RMAN> LIST BACKUP OF ARCHIVELOG ALL;
列出指定表空间的备份信息:RMAN> LIST COPY OF TABLESPACE 'SYSTEM';
列出某个设备上的所有信息:RMAN> LIST DEVICE TYPE DISK BACKUP;
列出数据库当前所有归档:RMAN> LIST ARCHIVELOG ALL;
列出所有无效备份:RMAN> LIST EXPIRED BACKUP;
8.4.3 删除备份--DELETE命令
DELETE命令用于删除RMAN备份记录及相应的物理文件。当使用RMAN执行备份操作时,会在RMAN资料库(RMAN Repository)中生成RMAN备份记录,默认情况下RMAN备份记录会被存放在目标数据库的控制文件中,如果配置了恢复目录(Recovery Catalog),那么该备份记录也会被存放到恢复目录中。
RMAN中的DELETE命令就是用来删除记录(某些情况下并非删除记录,而是打上删除标记),以及这些记录关联的物理备份片段。
删除过期备份。当使用RMAN命令执行备份操作时,RMAN会根据备份冗余策略确定备份是否过期。
RMAN> DELETE OBSOLETE; 删除无效备份。首先执行CROSSCHECK命令核对备份集,如果发现备份无效(比如备份对应的数据文件损坏或丢失),RMAN会将该备份集标记为EXPIRED状态。
要删除相应的备份记录,可以执行DELETE EXPIRED BACKUP命令:RMAN> DELETE EXPIRED BACKUP;
删除EXPIRED副本,RMAN> DELETE EXPIRED COPY;
删除特定备份集,RMAN> DELETE BACKUPSET 19;
删除特定备份片,RMAN> DELETE BACKUPPIECE 'd:\backup\DEMO_19.bak';
删除所有备份集,RMAN> DELETE BACKUP;
删除特定映像副本,RMAN> DELETE DATAFILE COPY 'd:\backup\DEMO_19.bak';
删除所有映像副本,RMAN> DELETE COPY;
在备份后删除输入对象,RMAN> BACKUP ARCHIVELOG ALL DELETE INPUT; RMAN> DELETE BACKUPSET 22 FORMAT = "d:\backup\%u.bak" DELETE INPUT;
8.4.4 报表显示--REPORT命令
REPORT命令主要是用于当前备份信息的分析,如哪些备份已经过期,哪些文件该备份,哪些备份不可用,哪些备份可以删除之类的。
REPORT命令特别提供了一个SCHEMA关键字,可以用来查看数据库的模式信息(注意此模式非用户的模式哟),比如某个时间段的数据库结构,不过,使用这些功能的前提就是必须首先拥有足够的备份,不然使用REPORT命令得出的结果恐怕也满足不了你的需求啊。
查看7天前数据库的模式:RMAN> REPORT SCHEMA AT TIME 'SYSDATE-7';
查看模式信息必须连接到catalog数据库。
查看所有需要备份的文件:RMAN> REPORT NEED BACKUP;
查看指定表空间是否需要备份:RMAN> REPORT NEED BACKUP TABLESPACE SYSTEM;
查看过期备份:RMAN> REPORT OBSOLETE;
8.4.5 执行检查--CROSSCHECK命令
CROSSCHECK命令用来检查备份或归档物理文件的状态,如果物理文件存在,并且控制文件(或恢复目录)中有匹配记录,则标记该对象的状态为AVAILABLE(有效),如果文件已经不存在了,则标记该对象状态为EXPIRED(无效)。
CROSSCHECK命令并不会主动删除文件(也确实没有这个功能),它只是修改控制文件中对应记录的状态标志,因此如果想删除那些EXPIRED的记录,还是得手动通过DELETE EXPIRED命令进行。
检查所有归档文件:RMAN> CROSSCHECK ARCHIVELOG ALL;
提 示:当操作系统环境变量NLS_LANG指定为中文SIMPLIFIED CHINESE_CHINA时,执行CROSSCHECK命令检查归档,如果结果显示"对归档日志的验证失败",但你又确定该文件存在,别着急,这其实是Oracle 10g版本中的一个bug,验证归档文件显示的结果是反着的,如果显示验证失败说明验证是成功的,反倒是提示验证成功的话你就要小心了,说明验证失败了。这不是CROSSCHECK命令自身的问题,而是Oracle中英文翻译的问题,设置NLS_LANG为AMERICAN_AMERICA,在英文环境下检查显示一切正常。
检查所有备份集:RMAN> CROSSCHECK BACKUP;
8.4.6 修改状态--CHANGE命令
CHANGE命令可以用来修改备份文件或归档文件的状态,不是指物理文件,而是这些文件在控制文件(或恢复目录)中对应记录的状态,状态有两种:AVAILABLE(可用)和UNAVAILABLE(不可用)。
修改指定备份集状态为UNAVAILABLE:RMAN> CHANGE BACKUPSET n UNAVAILABLE;
提示:n为归档文件序号,可以通过LIST ARCHIVELOG ALL或查询V$ARCHIVED_LOG获取。当然你也可以指定归档文件详细路径。
修改指定表空间的备份集为UNAVAILABLE:RMAN> CHANGE BACKUP OF TABLESPACE USERS UNAVAILABLE;
修改指定归档文件状态为UNAVAILABLE:RMAN> CHANGE ARCHIVELOG LOGSEQ=n UNAVAILABLE;
如果将指定对象状态修改为可用,执行上述命令时将关键字UNAVAILABLE改为AVAILABLE即可。
与CROSSCHECK命令不同,CHANGE命令附带了DELETE子句,配合使用能够在修改记录状态的同时直接删除物理文件,删除某个归档文件: RMAN> CHANGE ARCHIVELOG LOGSEQ=n DELETE;
8.4.7 综述
命令记不住注意看RMAN的提示信息,
比如想查看已经备份的归档,只记得要用LIST命令查看,后面应该加什么参数全忘了,没关系,那就先执行LIST命令好了:
RMAN> LIST;
RMAN> LIST BACKUP OF;
RMAN> LIST BACKUP OF ARCHIVELOG ;
RMAN> LIST BACKUP OF ARCHIVELOG ALL;
如果你连RMAN中有哪些命令都忘记了,没关系,随便输入个字母再按回车键试试:
- RMAN-01009: syntax error: found "identifier":
- expecting one of: "allocate, alter, backup,
- beginline, blockrecover, catalog, change, connect,
- copy, convert, create, crosscheck, configure, duplicate,
- debug, delete, drop, exit, endinline, flashback, host,
- {, library, list, mount, open, print, quit, recover,
- register, release, replace, report, renormalize, reset,
- restore, resync, rman, run, rpctest, set, setlimit, sql,
- switch, spool, startup, shutdown, send, show, test,
- transport, upgrade, unregister, validate"
8.5 RMAN备份演练进阶篇
8.5.1 是否选择增量备份
如果数据库运行于非归档模式下,那么你只能在数据库干净关闭(以NORMAL、IMMEDIATE、TRANSACTIONAL方式关闭)的情况下才能进行一致性的增量备份,如果数据库运行于归档模式下,那既可以在数据库关闭状态进行,也可以在数据库打开状态进行备份。
8.5.1.1 增量备份选项
建立增量备份实质就是在执行BACKUP命令时指定一个参数INCREMENTAL LEVEL=n,增量备份可以创建两个级别,用整型数字0…n表示(n最大不超过4),从0级开始,所有增量备份都必须先创建0级备份。0级备份相当于数据库的完整备份。
需要注意,通过BACKUP DATABASE也是创建数据库的完整备份,但这种的完全备份并不等同于增量备份中的0级备份(虽然都是数据库的完整备份),因为常规的完全备份中不包含增量备份策略,并不支持在其基础上创建增量备份集。
在创建增量备份时,既可以对整库进行备份,也可以仅对表空间甚至数据文件级创建增量备份。
建立增量级别0的全库备份:RMAN> BACKUP INCREMENTAL LEVEL=0 DATABASE;
为数据文件user01.dbf建立增量级别1的备份:RMAN> BACKUP INCREMENTAL LEVEL=1 DATAFILE 'F:\ORAHOME1\ORADATA\JSSWEB\ USERS01.DBF';
为表空间USERS建立增量级别1的备份:RMAN> BACKUP INCREMENTAL LEVEL=1 TABLESPACE USERS;
8.5.1.2 增量备份类型
RMAN提供了两种增量备份类型:DIFFERENTIAL(差异)和CUMULATIVE(累积),这两种增量类型在创建备份集时的算法是不一样的。默认情况下RMAN创建的增量备份是DIFFERENTIAL方式,如果要建立CUMULATIVE方式的增量备份,需要在执行BACKUP命令时显式指定。
以CUMULATIVE增量备份方式创建数据库完整备份:RMAN> BACKUP INCREMENTAL LEVEL=1 CUMULATIVE DATABASE;
8.5.1.3 增量备份注意事项
在9i及之前的版本中,不管是否是增量备份,RMAN在执行备份时都需要先将所有数据块全部读入内存,检查每一个数据块头的SCN信息,并与增量备份的父备份集相比较来确定块是否被修改过。如果发现块被修改过,则该块所在的数据文件都要重新备份(是的,检查是在块一级,但备份是数据文件级)。由此可知,除非你的系统修改非常频繁(修改太过频繁的系统是否还有必要创建增量备份,这也是个问题),或者I/O设备效率惊人(我是说,惊人的慢),不然增量备份只是节省了存储空间,既不能减少备份时间,也不能达到提高备份效率的目的,甚至还有可能导致备份时间更长(因为多了数据块检查的操作)。
在10g中Oracle提供了一个新的特性:块修改跟踪(Block Change Tracking)。启用块修改跟踪后,RMAN不用再去扫描数据文件中的每一个块了,直接通过块修改跟踪文件就可以获取哪些块发生了修改的信息。
可通过下列语句启用块修改跟踪:SQL> ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE'/LOACTION/TRK_FILENAME';
如果使用了OMF特性(Oracle-Managed Files),Oracle会自动创建块修改跟踪文件。
通过下列语句禁用块修改跟踪:SQL> ALTER DATABASE DISABLE BLOCK CHANGE TRACKING;
通过下列语句查询是否启用块修改跟踪:SQL> SELECT STATUS FROM V$BLOCK_CHANGE_TRACKING;
需要提醒一句,务必要认识到,虽然备份时间可能减短,并且备份集大小可能减小,但是进行恢复操作时,所需花费的时间有可能会增加,因为数据库恢复时不得不读取多个备份集才能完成恢复操作。
8.5.2 是否使用RMAN备份集的保留策略
在通过RMAN创建的备份片段中,由于备份文件也是由RMAN创建和维护,所以手工删除并不明智,并且RMAN也提供了备份保留策略,合理制订,由RMAN自动删除过旧的备份文件更加安全也更加方便。
RMAN中提供了两种备份保留策略:基于时间和基于冗余数量的备份保留策略。
8.5.2.1 基于时间的备份保留策略
就是你希望数据库最早能恢复到几天前。比如将恢复时间段设置为7,那么RMAN所保留的备份就是可以保证你将数据库恢复到一周内任何时刻下的那些文件。设置基于时间的备份保留策略可以通过CONFIGURE命令:RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF n DAYS; 注:n=大于0的正整数。
执行该命令后,RMAN将始终保留那些将数据库恢复到n天前的状态时需要用到的备份,比如,恢复时间段被设置为7天,那么各个数据文件的备份必须满足如下条件:SYSDATE - BACKUP CHECKPOINT TIME >= 7 任何不满足上述条件的备份都将被RMAN废弃并可通过DELETE OBSOLETE命令删除。
控制文件中记录保存时间有可能对备份保留策略影响!
对于在NOCATALOG下创建的备份,RMAN的备份集信息都是保存在目标端控制文件中,不过需要注意的是,Oracle数据库的控制文件并不是无限扩展,其中能够保存的记录也是有限的,对于RMAN的备份信息来说,控制文件中保存的这部分信息受制于初始化参数:CONTROL_FILE_RECORD_KEEP_TIME。初始化参数CONTROL_FILE_RECORD_KEEP_TIME用来指定记录在控制文件中的最少保存时间,以天为单位,默认值为7。也就是说默认情况下备份集信息最短会在控制文件中保存7天,超过7天以后,如果控制文件由于空间不足(控制文件中并不仅仅只存储备份集信息)需要重用记录,那么超出7天的记录可能会被自动覆盖,在重用记录时它并不管你在RMAN中设置的备份保留时间是多久(控制文件在Oracle数据库中的地位那是相当高的)。
因此对于基于时间的备份保留策略,一般建议CONTROL_FILE_RECORD_ KEEP_TIME初始化参数值不小于你在RMAN中设置的备份保留时间。
另外,CONTROL_FILE_RECORD_KEEP_TIME初始化参数也有可能对基于冗余数量的备份策略造成影响,只不过冗余数量无法直接与时间作对比,因此在设置值时,DBA只能视实际情况,根据备份时创建的备份集可能占用的空间来估计初始化参数CONTROL_FILE_RECORD_KEEP_TIME的参数值了。
当前控制文件中分配的空间中,可存储记录和已存储记录数,可以通过查询视图V$CONTROLFILE_RECORD_SECTION获取。
8.5.2.2 基于冗余数量的备份保留策略
基于冗余数量实质上是某个数据文件以各种形式(包括备份集和镜像复制)存在的备份的数量。如果某个数据文件的冗余备份数量超出了指定数量,RMAN将废弃最旧的备份。
基于数量的备份保留策略也是通过CONFIGURE命令设置:RMAN> CONFIGURE RETENTION POLICY TO REDUNDANCY n; n=大于0的正整数。
DBA通过下列命令设置成不采用任何备份保留策略:RMAN> CONFIGURE RETENTION POLICY TO NONE;
如果不设置任何备份保留策略,使用REPORT OBSOLETE和DELETE OBSOLETE命令时也不会有任何匹配的记录,不过REPORT OBSOLETE和DELETE OBSOLETE命令也支持REDUNDANCY和RECOVERY WINDOW参数,参数值的对应规则与CONFIGURE命令配置备份保留策略完全相同,因此如果你决定将显示和删除过期的命令写在脚本中定期执行的话,不通过备份保留策略,而是直接通过REPORT和DELETE命令本身实现这一点也是可行的。
8.5.2.3 根据备份策略维护备份集