第三章 备份恢复

DBA处理数据库故障的信息和耗费的时间完全取决于所做的预防策略,计划考虑的越周详、方案越完整,在恢复过程中选择的余地就越大。对于故障的应对方法可以从硬件、软件两个层面来考虑、

归档模式的优缺点:
归档日志文件中保留了数据库的改动信息,在这种模式下可以获得如下好处:
1 可以进行完全、不完全恢复
2 可以进行联机热备:所谓联机热备,就是在数据库运行状态下,对数据库进行备份。备份时用户对数据库的使用不受任何影响。
3 可以实施data guard:可以部署1个或多个备用数据库,从而最大限度地提供灾难保护手段
4 可以实施stream
5 表空间可以脱机
6 能够增量备份
7 更多的优化选项

归档模式的缺点:
1 需要更多的磁盘空间保存归档日志
2 DBA会有更多的管理工作,包括维护归档空间、备份归档日志




非归档模式的缺点:
只能进行脱机备份,也就是所谓的”冷备份“,和联机备份的”热备份“相对应,数据库必须完全关闭后备份,在备份过程中数据库不可用。
必须备份整个数据库,不能只备份部分数据库
不能增量备份,对于TB级数据库,这是一个非常大的缺点。
只能部分恢复,如果数据文件丢失需要恢复,DBA只能恢复最后一次的完全备份,而之后的所有数据库改变全部丢失。


非归档模式的优点包括:
DBA的管理工作减少,因为非归档模式不产生归档日志,因此DBA不用考虑对归档的管理;
性能会有所提升。



非归档模式改成归档模式
1 关闭数据库
shutdown immediate
2 启动数据库到mount状态
startup mount;
3 修改数据库归档模式
alter database archivelog;
4 启动数据库
alter database open;
5 定义归档位置,也就是归档日志保存路径
alter system set log_archive_dest_1="location=..." scope=both;
6 确认配置生效
archive log list;


oracle的备份分成物理备份和逻辑备份
物理备份就是把实际物理文件从移除拷贝到另一处(可以是1:1的原样拷贝,也可能是n:1的压缩拷贝),操作系统备份、使用rman的备份、冷备份、热备份都是物理备份的例子
逻辑备份是利用sql从数据库中提取数据,并将其保存到文件中,这些数据可以在以后需要时重新导入到原有数据库,或者导入其他数据库。exp imp expdp impdp


联机热备根据使用的工具不同,可以分为用户管理备份(user-Managed backup)和恢复管理器备份(rman,recover Manager)
前者是借助操作系统的文件拷贝命令(比如cp)来完成,而后者是利用oracle提供的工具rman进行备份。


如果数据库处于非归档模式,只能使用冷备份一种备份方式。
冷备份步骤:
1 关闭数据库
2 备份所需的oracle文件
3 以正常方式启动数据库





热备份
用户管理备份:步骤:1 alter tablespace ...begin backup命令把表空间置为备份模式  2 使用操作系统文件拷贝命令进行文件拷贝  3 拷贝结束后,使用alter tablespace...end backup 结束备份
步骤1会有两个效果, 触发表空间上的检查点操作,强迫数据文件在备份开始时处于一致性状态;然后数据文件头的SCN就会被冻结,在结束备份前这个SCN都不会改变。
通过冻结SCN,oracle在恢复时就可以知道备份文件在这个SCN对应的时点,数据是一致的。恢复工作只需从这个SCN开始就可以了。

如果数据库提示:数据文件需要恢复
如果DBA无法确定数据文件是不是从备份文件中恢复过来的,那么首先进行一个判断:是否因为文件处于备份模式才导致了这个提示,这个可以从视图中查看
select file#,status,change#,time from v$backup;

从另一个视图也可以看到数据文件头SCN被冻结的信息
SQL> select name,status,fuzzy from v$datafile_header;

NAME                                               STATUS  FUZ
-------------------------------------------------- ------- ---
/u01/app/oracle/oradata/ORA11GR2/system01.dbf      ONLINE  YES
/u01/app/oracle/oradata/ORA11GR2/sysaux01.dbf      ONLINE  YES
/u01/app/oracle/oradata/ORA11GR2/undotbs01.dbf     ONLINE  YES
/u01/app/oracle/oradata/ORA11GR2/users01.dbf       ONLINE  YES
/u01/app/oracle/oradata/ORA11GR2/example01.dbf     ONLINE  YES

如果是处于备份模式的数据文件,fuzzy列是yes,否则是控制
一旦确定是因为备份模式导致的这个错误,可以使用结束备份命令来接触这个冻结
alter database datafile 2 end backup;
或者alter database end backup;

使用用户管理备份会比使用rman备份生成更多的redo日志




rman备份优点:
1 使用简单
2 结合目录数据库,可以实现企业内多个数据库的几种备份和恢复过程
3 支持增量备份
4 备份中能够识别损坏的数据块
5 备份、恢复过程可以生成详细的操作日志
6 可以核对并确保备份文件的有效性
7 可以保存配置选项和编译脚本,不需要反复重新编译脚本
8 rman脚本可以跨操作系统,不受平台限制。






rman除了能够备份到磁盘,也能备份到磁带,如果要采用这种备份介质,就需要借助于厂商提供的介质管理器(Media Management Library,MML)来完成。

rman对目标数据库至少会建立两个服务器回话或通道。
其中一个通道用于对目标数据库的远程调用



备份前的环境配置

rman环境中可以连接的数据库可以分成3中角色,目标数据库  目录数据库 辅助数据库
如果使用rman搭建data guard环境,standby database就被成为辅助数据库。
rman的某些高级功能,比如表空间的迁移,也会创建一个临时的数据库,这个数据库也叫做辅助数据库。


连接到目标数据库的命令:
rman target user/password@yourdbname

每个oracle数据库都会有唯一的ID,从数据库视图中可以查询到这个ID
select dbid from v$database;


RMAN> show all;

RMAN configuration parameters for database with db_unique_name ORA11GR2 are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default   备份保留策略
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default  default device type是缺省的备份介质,这里的设置是磁盘disk
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default  用来设置对控制文件的自动备份,on代表启动,表示rman会在每次数据库备份之后自动对控制文件进行备份。
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default 自动备份的控制文件的格式,也就是备份文件的存放路径和文件名的命名规范。
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default 这个配置是定义磁盘备份的并行度。
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
这两个配置以拷贝方式做备份时的拷贝份数,如果大于1,则一次可以同时生成多个拷贝;
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
定义backup set文件的最大尺寸
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
这两项用于加密备份集
CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
定义归档日志的删除策略
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/snapcf_ORA11GR2.f'; # default
定义控制文件的snapshot备份格式


这些配置也可以从SQL> select name,value from v$rman_configuration;查看

配置控制文件自动备份
启动控制文件自动备份的同时,用户还可以指定自动备份的存放位置,如果不指定,缺省放在$ORACLE_HOME/dbs目录下
除了自动备份控制文件外,rman还可以配置控制文件快照的存放位置
启用控制文件自动备份:
configure controlfile autobackup on;

配置自动备份的存放位置,在rac环境下,要保证每个节点都要有这个目录
configure controlfile autobackup format for device type disk to '/backup/wxxrdb_rac_backup/autobackup/autobackup_controle_%F';

配置控制文件的快照存放位置:
configure snapshot controlfile name to '/backup/s%U';







修改配置缺省备份是copy格式:
configure device type disk backup type to copy;

配置缺省备份是磁盘备份:
configure default device type to disk;

配置缺省备份是压缩方式:
configure device type disk backup type to compressed backupset;

配置缺省备份位置及名称:
configure channel 1 device type disk format '/backup/wxxrdb_rac_backup/wxxrdb/%U';






配置备份保留策略
两种保留策略,基于恢复窗口和基于冗余策略

基于恢复窗口,这个策略定义的是保留的备份文件必须要能保证恢复到近n天的任意时点。
configure retention policy to recovery window of 7 days;

基于冗余的策略,这个策略定义的是每个文件至少要保留几份备份
configure retention policy to redundancy 2;


与保留策略相关的其他操作
查看备份策略
show retention policy;
查看obsolete备份文件:
report obsolete;
如果没有定义策略,这个命令会报错,提示没有保留策略
清空备份保留策略:
configure retention policy to none;
report obsolete;


可以在命令中临时指定一个备份策略,然后rman根据这个临时策略对享有备份进行评估,通过指定recovery window
report obsolete recovery window of 7 days;
report obsolete redundancy 2;


根据保留策略删除过期文件
delete obsolete;

这个命令和report obsolete一样,定义了备份策略时才能执行。如果没有定义备份策略,会出错提示“没有定义备份策略”,当然可以在命令中临时指定一个临时保留策略
指定redundancy策略的删除
delete obsolete redundancy 2;
指定recovery window策略的删除
delete obsolete recovery window of 4 days;

禁用保留策略
备份保留策略可以取消,禁用备份策略后,所有的备份都不会被评估为过期的
configure retention policy to none;

删除配置configure controfile autobackup format for device type disk clear;
使用configure...clear命令可以清除配置,同时把配置恢复到默认值







检查点
无论是哪一种检查点,区别不过是触发的方式不同而已,而在oracle内部处理机制都一样,也就是检查点队列数据结构。


data buffer中的脏数据块以队列这种数据结构链接起来,这个队列就叫做检查点队列。
一旦脏数据块被放在检查点队列里,它就停留在同一位置,直到将它写出为止。

检查点队列是按照最早热动记录的时间排序的,并且DBWR进程也是按照这个顺序写出脏数据块。
如果同时提交多个检查点请求,多个检查点请求就可以合并处理,只要某个检查点的SCN小于某个被写出的SCN。这个检查点就可以被宣告结束,DBWR继续写出,知道所有检查点都结束。


每当DBWn进程把脏块写到磁盘文件后,会生成一条BWR记录,这个记录代表着在这个时刻数据块是同步的,即磁盘上的内容和buffer cache中的内容一致,BWR记录在恢复阶段会用到。


SCN
scn号是与恢复有关的另一个重要的数据结构,它相当于oracle内部的时钟机制。

每个事务都会被赋予一个SCN值。
事务的SCN号是按照事务的提交时间递增的,但不一定连续。




scn会出现在事务表 数据块头 控制文件 数据文件头以及redo记录中。

日志文件的SCN
select thread#,sequence#,first_change# from v$log_history;
每个日志的first_change#和next_change#就是低SCN和高SCN

数据文件检查点
每个数据文件头也包含检查点结构,当进行文件检查点或者实例检查点、全局检查点时,所有的数据文件文件头的检查点结构也会更新。

每当发生检查点动作时,oracle就把每个数据文件的SCN保存在控制文件中。

select name,checkpoint_change# from v$datafile;


 每个数据文件的文件头会记录会记录启动SCN,而控制文件会记录每个数据文件的终止SCN,这两个SCN用来确认数据文件是否需要恢复。
 查看启动SCN:
 select checkpoint_change# from v$datafile_header;
 查看终止SCN:
select name,last_change# from v$datafile;



数据库运行过程中,检查每个数据文件,所有数据文件的终止SCN都是NULL
select checkpoint_change#,last_change# from v$datafile;
正常关闭数据库后,每个数据文件的终止SCN会被设置成启动SCN.可以通过把数据库启动到mount状态来观察这个值。
shutdown immediate;
startup mount
select checkpoint_change#,last_change# from v$datafile;
异常关闭数据库时,终止SCN来不及被修改,再把数据库启动到mount状态,oracle就知道这些数据文件需要恢复
shutdown abort
startup mount;
select checkpoint_change#,last_change# from v$datafile;



数据库恢复
oracle的数据库恢复有多种分类方式,可以分成实例恢复、介质恢复。后者又可以分成完全恢复和不完全恢复。

确认恢复的开始时间,一般是控制文件中记录的最后一次检查点SCN,这个SCN意味着一个数据库一致的状态。

oracle运行过程中,内存的内容总是比磁盘数据新。

控制文件中记录了最后一次检查点完成时同步到的redo log file中的日志条目位置,于是恢复就可以从这个点开始


恢复过程
1 首先从备份中还原,其结果是使备份文件成为当前文件,这一步叫做还原restore;
2 在还原出来的数据文件上应用日志文件,包括归档日志和控制文件,这一步叫做恢复recovery
3 恢复结束后,数据库就可以打开,向外提供服务,但实际上这是数据库同时有已提交和未提交的事务存在;
4 oracle对于未提交事务进行回滚,回滚结束后,数据库处于一致性状态



数据文件需要做介质恢复,可以通过3种方式进行:可以进行数据库恢复;可以选择表空间恢复,这是通过把受影响的表空间先脱机,然后打开数据库,再恢复属于表空间的数据文件;第三种是数据文件恢复,这是指恢复特定的数据文件。


备份恢复例子演示:
模拟磁盘故障,所有数据文件、控制文件 日志文件全部丢失,只有备份的情况下,如何恢复数据库
1 数据库做全备
$ORACLE_HOME/bin/rman target / << !
run {
crosscheck archivelog all;
configure controlfile autobackup on;
configure controfile autobackup format for device type disk to '/wxxr_data/backup/05_05_25_full/control_%F';
backup full database format '/wxxr_data/backup/05_05_full/data_%d_%U'
plus
archivelog format '/wxxr_data/backup05_05_25_full/arch_%d_%U' delete all input;
}
!

2 删除所有数据文件 控制文件,模拟灾难场景
3 准备数据库的密码文件
orapwd file=orapwwxxrDB password=H2oiswater entries=5
4 准备spfile
sqlplus / as sysdba
create spfile from pfile='/wxxr_data/init.ora';
5 启动该数据库到nomount状态
startup nomount
6 rman target /
7 set DBID=xxxxxxx;
8 restore controlfile from '';
9 RMAN>sql 'alter database mount';
10 还原数据文件
restore database;
11 recover database
12 RMAN>sql 'alter database open resetlogs';
13 数据库恢复完毕后,立即对数据库做一次全备