分类: LINUX
2009-05-11 09:09:44
(1) 使用控制文件快照辅助恢复
在RMAN的配置参数中,还有一个缺省设置:
RMAN> show snapshot controlfile name;
这个文件时oracle数据库的控制文件快照,在linux上的缺省存储位置时$ORACLE_HOME/dbs,通常的缺省文件名称为snapcf_
当RMAN需要同步控制文件中记录的信息或当RMAN需要备份当前的控制文件时,RMAN 会对控制文件进行快照备份,那么这个将会极为有用,当所有的控制文件都丢失或损坏时,可以尝试使用这个控制文件进行数据恢复。
可以基于SCN的不完全恢复:
RMAN> run
{set until scn 18996544590;
Restore database;
Recover database;
}
然后通过resetlogs强制打开数据库:
RMAN> alter database open restlogs;
当然也可以基于时间点的恢复
RMAN> run
{set until time 2009-0101 11:00:30;
Restore database;
Recover database;
}
在进行不完全恢复时,until scn和until time 是两种常用的恢复方式。
(2) 用rman的plus archivelog选项简化数据库备份
由于在nocatalog方式下备份,一个有效的完整备份应该包括所有数据文件的全备份、备份期间的所有归档日志备份、控制文件的备份,所以一个完整的全备份脚本可能如下:
Run{
Allocate channerl c1 type disk;
Backup full tag ‘dbfull’ format ‘/path/full%u_%s_%p’ database
Include current controlfile;
Sql ‘alter system archive log current’;
Backup fileaperset 3 format ‘/path/arch%u_%s_%p’
Archivelog all delete input;
Release channel c1;
}
在数据库全备份完成后,需要执行alter system archive log current命令将当前日志归档,备份归档日志时应该包括最后生成的归档。
从9i开始,oracle引入了plus archivelog,当使用这个选项进行备份时,oracle将执行如下步骤:
n
运行一个alter system archivelog current 命令
n
运行backup archivelog all命令
n
备份backup命令中定义的文件
n
运行 alter system archivelog current命令
n
备份所有的剩下的归档日志
现在一个完整的备份脚本可能如下:
Run{
Backup full tag ‘eygel’ database
Include current controlfile format ‘d:\backup\eyglefull_%d_%T_%s’
Plus archivelog format ‘d:\backup\eyglearch_%d_%T_%s’ delete all
input;
}
在执行过程中,oracle将首先归档当前日志,然后执行归档日志文件的备份,完成日志备份后将启动指定的数据库全备份,在完成全备份后,再次归档当前日志,并备份整个过程中生成的归档日志文件。
(3) 使用RMAN对控制文件进行备份
上文的介绍中,已经提到了以下几种控制文件安全保护机制:
n
首先在数据库配置中,应该在不同磁盘组上存储多份控制文件,以保证在线控制文件的安全
n
应该启用控制文件的自动备份功能,以便数据库可以在必要时字哦的那个备份控制文件。
n
在进行全备份或其他备份时,指定inclue current controlfile子句,在备份时同时备份控制文件。
n
在RMAN进行控制文件同步或备份时,Oracle会自动执行控制文件的快照,这个快照在某些特殊情况下,可以用于辅助恢复。
那么除此之外RMAN还支持以下多种控制文件备份方式。
n
使用backup current controlfile 对控制文件进行备份
如果启用了自动控制文件备份,那么这个命令还会引发自动备份:
RMAN> backup current controlfile format ‘d:\backup\control%s.ctl’;
n
备份控制文件拷贝
从10g开始,RMAN支持用命令对控制文件进行拷贝备份:
RMAN> backup as copy current controlfile format ‘d:\backup\control01.ctl’;
拷贝的控制文件是当前控制文件的一个原样副本,可以直接用于启动数据库,而RMAN的控制文件备份则需要通过RMAN进行恢复。
n
备份数据文件1将包含控制文件
在oracle中,如果对datafile 1 进行备份,则oracle会自动在备份中包含当前控制文件和参数文件,如果启用了自动控制文件的备份,则备份datafile1时不再备份控制文件。
RMAN> backup datafile 1;
(4) RMAN的镜像COPY功能
RMAN处理可以创建备份集进行数据库备份外,还可以进行数据文件的镜像拷贝。镜像拷贝时单个数据文件、归档日志或者控制文件的额外拷贝,不以RMAN的格式存储。
镜像拷贝的文件和执行操作系统拷贝是一样的,以数据文件的固有格式存储,RMAN进行重建或者恢复操作时,可以使用镜像拷贝,当然镜像拷贝也可以通过手工操作执行恢复。
当发出一个RESTORE命令时,缺省的RMAN恢复一个数据文件或者控制文件的镜像拷贝到原来的位置,镜像拷贝优先于备份集被采用,因为使用备份集进行恢复会有额外的开销。并且,如果需要使用镜像拷贝恢复数据文件或控制文件,无需把文件COPY到原来位置,RMAN的SWITCH命令可以通知数据库使用当前位置的文件,这类似于alter database rename file 命令的功能。
Oracle允许我们使用RMAN进行镜像COPY备份。例如:
RMAN> run{
Allocate channel ch1 type disk;
Copy
Datafile 1 to ‘/data5/orabak/system01.dbf’
Current controlfile to ‘/data5/orabak/control01.dbf’;
}
从10g开始,oracle还允许单条命令backup as copy 进行全数据库镜像拷贝备份:
RMAN> run{
Backup as copy tag “032820501copy” database;
}
(5) RMAN基于镜像COPY的表空间恢复
很多时候数据库由于存储问题或者用户的误操作损失了表空间或数据文件,此时就可以通过RMAN的镜像拷贝进行恢复:
通过list copy 命令可以查看数据库的拷贝文件列表:
RMAN>
list copy;
如果是硬件故障导致的数据文件损坏,对于需要恢复的文件,就可以通过SETNAME指定恢复文件到不同的位置:
RMAN> run{
Set newname for datafile 8 to ‘/opt/oracle/eygle/trans01.dbf’;
Restore datafile 8;
Switch datafile all;
Recover datafile 8;
}
这样就恢复了这个表空间的恢复。
(6) 使用RMAN进行完全恢复
如果数据库的控制文件完好、日志文件完好,一旦数据文件损失,那就可以通过RMAN的备份集恢复数据文件,应用归档日志,完成完全恢复:
可以使用list backup summary命令查看控制文件中记录的文件集概要信息,然后通过restore database命令从备份集中恢复备份文件:
RMAN> restore database;
RMAN> recover database;
(7) 使用RMAN的不完全数据恢复
更多情况下,我们需要对数据库进行不完全恢复,以下时restore备份后基于时间恢复的一个示例:
RMAN> recover database until time ‘2009-03-09 16:30:00’
(8) 使用RMAN对ASM文件的备份与恢复
(9) 使用RMAN对RAC环境的备份
(10)
Nocatalog方式的备份方案指定
以下备份策略设置每周进行2次全备份,除全备份日外执行归档日志的备份;备份时间选在业务量最小的凌晨3:30进行;备份保存位置要精心选择,通常要选择和数据库文件不同的硬盘存放,同时需要选择合适的冗余保留策略。
n
定时设置
$ crontab -l
30 3 * * 0-6 /opt/startrman.sh
n
备份调度脚本。本例通过startrman.sh脚本进行调用执行
$cat startrman.sh
. /opt/oracle/.bash_profile
SH_HOME=/opt/oracle/dbmon/rmanbak
Export SH_HOME
DATE=`date +”%Y%m%d”`
Week=`date “%w”`
Ps –ef|grep dbw0_$ORACLE_SID|grep –v grep >>/dev/null
If [ $? –eq 0 ];then
If [ $week = “0”] ||
[$week = “3” ];then
Rman target / @$SH_HOME/fullback.sql
log=/logs/fullback.log
Else
Rman
target / @$SH_HOME/archback.sql log=/logs/archback.log
fi
fi
n
全备份脚本
Run{
Backup full tag ‘order’ database
Include current controlfile
Format ‘/data3/orderfullback_%d_%T_%s’
Plus archivelog
Format ‘/data3/orderarchback_%d_%T_%s’ delete all input;
Delete nopromt obsolete;
}
n
归档备份日志脚本
Run{
Backup archivelog all
Format ‘/data3/orderarchback_%d_%T_%s’ delete all input;’
}
n
RMAN的保留策略
RMAN> show retention policy;
这样一个简单的备份策略就指定好了。
RMAN>list backup summary;
(11)
目录(catalog)数据库
使用catalog数据库,首先要确定一个数据库作为目录数据库。
创建恢复目录可以通过以下步骤完成:
n
创建表空间。
SQL> create tablespace rman
Datafile ‘/opt/oracle/rman01.dbf’ size 50m
Extent management local uniform size 128k;
n
创建用户并授权。
SQL> create user rman identified by rmanbak
Default tablespace rman
Temporary tablespace temp
Quota unlimited on rman
SQL> grant connect ,resource,recovery_catalog_owner to rman;
n
创建恢复目录
RMAN> rman catalog rman/rmanbak
RMAN> create catalog;
恢复目录创建的对象可以通过SQL*PLUS连接到数据库进行查询。在进行数据库备份之前,还需要在catalog数据库中注册目标数据库。注册数据库需要同时连接到目标(Target
数据库和目录(catalog)数据库:
$rman catalog rman/rmanbak target eygle/eygle@eygle
RMAN> register database;
如果要从恢复目录中注销已注册的数据库,可以通过系统不DBMS_RCVCAT 来实现。注销数据数据库需要注意,一旦注销,该目标数据库保存在这个恢复目录中的备份集就不再可用了,注销数据库必须知道目标数据库的标识码(DB_ID)和数据库键值(DB_KEY),这可以通过目录数据库查询获得:
SQL> connect rman/rmanbak
SQL> select * from db;
执行如下命令注销数据库:
SQL> excute
dbms_rcvcat.unregisterdatabase(1,1407566546)
注意在10g中,oracle简化了这个操作,现在通过一条简单的命令unregister database就可以注销:
$rman catalog rman/rman target eygle/eygle@eygle
RMAN> register database;
RMAN> unregister database;
(12)
使用catalog数据库对目标数据库进行备份
使用catalog的另外一个好处是,可以在数据库中存储备份脚本,这样在反复执行备份时就可以通过简化的命令来执行。先看以下脚本的存储:
$rman catalog rman/rman target eygle/eygle@eygle
RMAN> create script fullbk{
Backup full tag ‘eygle’ database
Include current controlfile
Format ‘/opt/oracle/backup/eyglefull_%d_%T_%s’
Plus archivelog
Format ‘/opt/oracle/backup/eyglearch_%d_%T_%s’
Delete all input;
}
调用这个脚本执行备份很简单:
RMAN> run{execute script fullbk;}
如果要删除这个脚本:
RMAN> delete script fullbk;
(13)
完全恢复与resetlogs
很多朋友经常会对完全恢复与resetlogs产生误解,以为使用resetlogs方式打开数据库就是不完全恢复,这种看法是不正确的。
只要拥有当前的日志文件,那么就能够对数据库执行完全恢复,而是否需要使用resetlogs方式打开,则取决于是否使用的时备份的控制文件。如果使用的是备份的控制文件则需要使用resetlogs方式打开数据库;如果拥有当前的控制文件或者通过通过重建控制文件来恢复,就不需要通过resetlogs方式打开数据库。
(14)
使用RMAN进行增量备份
RMAN另外一个强大的功能是支持增量备份。
增量备份分为两类:差异增量备份和累积增量备份:
n
差异增量备份
差异增量备份备份上一次更高级别备份或同级备份以来所有变化的数据块,差异增量是默认的增量备份方式。
n
累积增量备份
累积增量备份备份自上次更高级别备份以来的所有变化的数据块。
接下来通过一个实例来看一下增量备份的备份和恢复操作。首先配置一个备份路径:
RMAN> configure channel 1 device type disk format ‘/opt/bakup_%U’;
执行一个0级备份
RMAN> backup incremental level=0 database archivelog delete
input;
之后就可以修改数据,进行一些数据变更:
再来执行1级备份,现在oracle将备份变化的数据块:
RMAN> backup incremental level=1 database plus archivelog
delete input;
(15)
10g
Block Change Tracking选项
Block Change
Tracking进程记录自上次备份以来发生变化的数据块,并把这些信息记录在跟踪文件中,RMAN使用这个文件判断增量备份中需要备份的变更数据。
7.8特殊情况下的备份恢复
7.8.1_allow_resetlogs_corruption参数
这个参数的含义就是允许在数据库不一致的情况下强制重置日志,设置这个参数可以使得oracle在启动过程中强制跳过一系列的一致性检查,强制打开数据库。但是注意,在使用这个参数之前,一定要记得备份当前的数据库环境,保留现场,以便恢复失败后仍然能够退回到最初的状态。
SQL>alter system set “allow_resetlogs_corruption”=true
scope=spfile;
7.8.2
_corrupted_rollback_segments参数
除了常见的日志文件损坏之后,oracle的undo表空间发生损坏也是常见的问题。在没有备份的情况下,也可以通过oracle的另外一个参数来进行特殊处理,这个参数就是_corrupted_rollback_segments。
7.8.3
oracle 10g跨越resetlogs时间的恢复
在10g以前,在进行了不完全恢复使用resetlog选项打开数据库以后,oracle建议要立即进行全备份。因为日志序号会被复位,以防止后续日志被应用。Resetlogs之前的备份不能用于进行跨越resetlogs时间点的恢复。
在10g中,oracle允许跨越resetlogs时间点进行完全和不完全恢复。
7.8.4使用RMAN进行基于数据块的恢复
从9i开始,RMAN开始支持基于数据块的恢复,当表空间中的某个数据块发生损坏,恢复整个文件显得有点过于昂贵,而数据块的恢复则可以帮助我们快速恢复,减少业务影响。基于数据块的恢复可以在线进行,甚至受损数据块文件也不受影响,只是在恢复完成之前访问损坏BLOCK会收到错误提示:基于block的恢复必须是完全恢复,所以完整的备份必不可少。
RMAN>
blockrecover datafile 2 block 14 from backupset;
7.8.5oracle
10g备份集压缩
从10g开始,oracle允许我们对备份集执行压缩,以减少空间耗用,这个特性通过对BACKUP命令伴增加as compressed backupset 子句实现。压缩备份在恢复时无需解压缩。可以修改一下RMAN的配置参数:
RMAN>
configure device type disk backup type to compressed backupset;
7.8.6使用RMAN恢复备份集到不同主机
当未使用catalog方式进行RMAN备份时,将备份集转移到其他主机时,除非目录结构相同,否则控制文件将无法识别路径不同的备份集,针对这类问题,可以使用dbms_backup_restore包进行文件回复:但是从oracle 10g开始,oracle终于简化了问题的处理,现在通过RMAN就可以很容易地处理不同主机的RMAN备份集恢复。