Oracle 备份恢复体系 一
1.数据库故障类型
a】用户进程故障 user process failure :pmon自动处理
b】实例故障 instance failure :smon自动处理
c】user errors 用户错误 :需要dba通过备份恢复解决
d】介质故障 media failure 必须通过备份和日志恢复
2. 备份和恢复计划
a】根据生产环境的恢复周期,制定详细的备份计划,然后严格执行
b】对备份,要在一定的事件内利用测试环境,进行故障恢复的练习
3.备份和恢复的分类
无论是rman还是expdp impdp 都要打开归档
4.还原和恢复
先还原,后恢复,才能达到一致性恢复,这是2步不同的操作
那么,如何确认数据库的一致性呢?
select current_scn,checkpoint_change# from v$database;
select file#,last_chanbge# from v$datafile;
select file#,checkpoint_change# from v$datafile_header;
强制关库
shutdown abort
如果last_change#为空代表非正常关库
再次启动,数据库会自动发起恢复,然后last-change#会自动恢复为非空
rman恢复 有风险,一般小范围恢复用的都是闪回技术
5.归档与非归档
a】归档模式:redo log 写入archive log
b】非归档模式:没有archive log,redo log file 循环覆盖
当处于非归档模式下时,在丢失数据文件后唯一的选择就是执行完整的数据库还原,而不能进行恢复,recover
非归档模式只能进行冷备即一致性备份,只能进行完整还原,还原到最后一次备份。
归档模式可以冷备也可以热备,可以恢复到最后一次commit。
5.Rman配置参数详解
#在linux系统命令下 rman target / #进入rman界面
show all #查看配置的参数
a】CONFIGURE RETENTION POLICY TO REDUNDANCY 1; #default,备份保留策略,。默认是1份。每做一次备份,就会产生一个备份集,
通过report obsolete 可以查看过期的备份
b】CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS; #按照保留策略进行保留,7天前的备份会被标记为过期
c】CONFIGURE RENTENTION POLICY TO REDUNDANCY 3;#按照冗余数进行保留,设置3份,超过3份就会被标记为obsolete 过期
d】CONFIGURE BACKUP OPTIMIZATION OFF;#default 默认关闭备份优化器,可以通过ON 打开
CONFIGURE BACKUP OPTIMIZATION ON
d】CONFIGURE DEFAULT DEVICE TYPE TO DISK;#defautl 备份到磁盘
e】CONFIGURE CONTGROLFILE AUTOBACKUP ON #default 自动备份控制文件
f】CONFIGURE CONTROLFILE ATUOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F';#default 自动备份控制文件的格式指定,备份到本地。
g】CONFIGURE DEVICE TYPE DISK PARALLELISM 2; #备份的并行度,数值越大任务执行越快
h】CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1;#default 备份的副本数
i】CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1;#default 归档日志备份的副本
j】CONFIGURE MAXSETSIZE TO UNLIMITED;#default 备份集的最大限制,默认是无限制
k】CONFIGURE ENCRYPTION FOR DATABASE OFF ;#default 备份加密开关 可以设置为ON,打开加密
l】CONFIGURE ARCHIVELOG DELETION POLICY TO NONE;#default 归档日志的删除策略,当前不设置
脚本里面不注明的地方,默认按照默认设置进行。
自动备份控制文件的路径:如何配置中没有指定绝对路径,那么控制文件就是在自动恢复区,那么如何指定路径呢?
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/路径/名称_%T%F';
那么自动恢复区在哪呢?可以通过查找参数获取
show parameter recovery_
上图是RMAN工作时连接到目标数据库时通过通道连接数据库
run { allocate channel ch_1 device type disk format = '/路径/backup_%u_%c.bak'; backup tablespace system,users channel ch_1; }
RMAN可以进行两种类型的备份,即完全备份FULL BACKUP,增量备份 INCREMENT BACKUP。在进行完全备份时,RMAN会将数据文件中除空白数据块之外的所有数据块都复制到备份集中。需要注意,在RMAN中可以对数据文件进行完全备份或增量备份,但是对控制文件和日志文件只能进行完全备份。
与完全备份相反,在进行增量备份时RMAN也会读取整个数据文件,但是只会备份与上一次备份相比发生了变化的数据块。RMAN可以会单独的数据文件,表空间,或者整个数据库进行增量备份。
当数据库打开时,可以使用RMAN的backup命令备份如下:
a】归档重做日志
b】数据文件
c】数据库
d】表空间
e】控制文件
f】备份集
在使用backup命令备份数据文件时,可以为其设置参数定义备份段的文件名,文件数和每个文件的通道。
rman target / #注意路径一定要有效存在 backup database format '/路径/名称_%Y_%M_%D_%U.bak' maxsetsize 2G;
#在非一致性备份后,一定要做联机在线日志的归档。否则恢复的时候是无法做到同步的
RMAN> sql'alter system archive log current';
#查看备份集
list backup of database;
#备份表空间
run {
allocate channel ch_1 type disk;
backup tablespace users
format '/路径/名称_%d_%p_%t_%c.dbf';
}
list backup of tablespace users;
#备份数据文件
backup datafile 1,2,3,4,5 filesperset 3;
#查看
list backup of datafile 1,2,3,4,5
#备份控制文件
backup current controlfile;
#备份归档重做日志文件
backup archivelog all delete all input; #
backup database plus archivelog
运行backup database plus archivelog,的运行步骤是;
1.alter system archive log current; 归档当前日志
2.backup archivelog all; 备份所有归档日志
3.backup database; 备份数据库
4.alter system archive log current; 归档当前日志
5.backup archivelog recently generated ; 备份刚生成的归档日志
Backup database plus archivelog delete input;
会备份归档日志并且会在备份结束后删除默认目录下的归档日志、datafile copy还有backup set。适用于单个归档dest路径如FRA。
Backup database plus archivelog delete all input;
会备份归档日志并且会在备份结束后删除所有目录下的归档日志、datafile copy还有backup set。适用于复数归档dest路径。
6.RMAN 备份脚本
#!/bin/bash #ScriptName:backup_all.sh #Usage: backup all files in oracle user environment. #ex: nohup /bin/bash backup_all.sh > backup.log & #Author: xxxxx #Creation: 2020-09-11 #Version: 1.0.0 #Define variable <You may need to change the value of basedir.> basedir=/u01/app/orabak date=`date +%Y%m%d` #Create pfile sqlplus / as sysdba <<EOF create pfile='$basedir/pfile$date.ora' from spfile; EOF #RMAN BACKUP rman target / log=$basedir/backup_all_$date.log <<EOF run{ allocate channel c1 device type disk; allocate channel c2 device type disk; backup database filesperset 4 format '$basedir/full_%d_%T_%s_%p'; sql 'alter system archive log current'; sql 'alter system archive log current'; sql 'alter system archive log current'; sql 'alter system archive log current'; backup archivelog all format '$basedir/arch_%d_%T_%s_%p' delete input; backup current controlfile format '$basedir/ctl_%d_%T_%s_%p'; release channel c1; release channel c2; } EOF
7. RMAN 恢复
基于更改的不完全恢复,需要确定SCN号。LogMiner是确认SCN号的常用工具
完全恢复
#丢失数据文件,进行完全恢复
RMAN>startup mount; RMAN>restore database; RMAN>recover database; RMAn>sql 'alter database open';
#丢失重做日志文件,进行不完全恢复 SQL>startup mount; SQL>recover database until cancel; SQL>alter database open resetlogs;
#丢失数据文件、控制文件和重做日志文件,进行不完全恢复 RMAN>startup nomount; RMAN>restore controfile from autobackup; RMAN>alter database mount; RMAN>restore database; SQL>recover database using backup controlfile until cancel; SQL>alter database open resetlogs;
#基于时间点的恢复(常用) RMAN>startup mount; RMAN>restore database; RMAN>sql 'alter session set nls_date_format="yyyymmdd hh24:mi:ss"'; #设置显示时间格式 RMAN>recover database until time '20140312 17:07:00'; #把数据库恢复到2014-03-12 17:07:00这一时间点上 RMAN>sql 'alter database open resetlogs';
#基于SCN的恢复 RMAN>startup mount; RMAN>restore database; RMAN>recover database until scn scn号; RMAN>sql 'alter database open resetlogs'; ①查询当前SCN号: SQL>select dbms_flashback.get_system_change_number from dual; ②根据SCN号查询时间: SQL>select to_char(scn_to_timestamp(963959),'yyyymmdd hh24:mi:si') from dual; ③根据时间查询SCN号: SQL>select timestamp_to_scn(to_date('20140309 17:55:10','yyyymmdd hh24:mi:ss')) from dual; ④查询一段时间内的SCN号: SQL>select * from (select time_dp,scn from smon_scn_time order by time_dp desc) where rownum<20;