oracle--rman备份纪要

1、参数设置---rman

  • 设置channel数量,增加备份/恢复传输速度。

  • 设置最大坏块数,set maxcorrupt,避免少数坏块引起备份或恢复失败。(仅备份集使用)

  • 跳过只读数据块,backup指令加上skip readonly参数。(仅备份集使用)

2、备份类型,默认为disk,可改为sbt,rman将顺序执行sbt库中函数。---rman

3、backup as copy备份元数据,异机可iscsi、nfs远程挂载备份和快速恢复。---rman

  • backup as copy increment level 0 tag 'full_bak' database format '/home/***path/%U.dbf';  (全备)
  • backup as copy increment level 1 for recover of copy with tag 'full_bak' database;(增量,产生增量文件)
  • recover of copy database  with tag 'full_bak'; (合并上次增量到全备文件,之后可删除增量文件)
  • restore controlfile **; catalog **; switch database to copy. (快速恢复)

        注:归档日志需备份,还原时需先restore 控制文件,再catalog ,再 recover。。。

4、清理操作---rman(闪回区)

  • 删除归档日志:delete archivelog all completed before 'SYSDATE-7';
  • 校验controlfile中过期归档:crosscheck archivelog all;
  • 删除controlfile中过期归档:delete expired archivelog all;
  • 删除表空间镜像:delete datafilecopy *;
  • 校验controlfile过期镜像:crosscheck copy of database;
  • 删除controlfile过期镜像:delete expired copy of database;

5、备份/恢复进度查询,登入sys,输入如下sql:

select sid,OPNAME,TARGET_DESC,serial#,context,sofar,TOTALWORK,trunc(sofar/totalwork*100,2)||'%' as perwork from v$session_longops where sofar!=totalwork;

6、备份历史查询 ---rman(主要关注copy类)

  • 数据文件:list copy of database tag 'tagname';
  • 控制文件:list copy of controlfile tag 'tagname';
  • 归档日志:list copy of archivelog all tag 'tagname';
  • 参数文件:list backup of spfile tag 'tagname';
  • 增量备份片:list backuppiece tag 'tagname';

7、重做日志与归档日志的区别:归档日志是重做日志的备份集合,重做日志空间大小有限只能存储短期的操作记录,当开启归档模式时重做日志组中某个日志写满时会保存到归档日志中。

8、各类文件存放路查询---sqlplus

  • 参数文件:show parameter spfile;
  • 控制文件:select * from v$controlfile;
  • 数据文件:select file_name from dba_data_files;
  • 重做日志:select * from v$logfile;
  • 归档日志:archive log list; 中的Archive destination字段。默认为闪回区在/data/oracle/flash_recovery_area/大写服务名/archivelog/日期/ (闪回区)

9、归档模式--sqlplus

  • 检查:archive log list;
  • 停机:shutdow immediate;
  • 挂载模式启动:startup mount;
  • 开启归档:alter database archivelog;
  • 开启数据库:alter database open;

10、闪回区---sqlplus(作用:oracle特有,帮助快速恢复。ORA-19815:闪回区使用大小告警,需清理归档日志)

  • 查询是否开启闪回区:select flashback_on from v$database;
  • 启动闪回区:alter database flashback on; (归档模式需开启)
  • 使用率:select * from v$flash_recovery_area_usage;(归档日志:archivelog目录,IMAGE COPY:datafile目录,备份片:autobackup目录------在rman中delete;crosscheck;delete expired等操作清理)
  • 总大小:show parameter db_recovery_file_dest_size;
  • 修改大小:alter system set db_recovery_file_dest_size=3g;

11、rac集群

  • 存在多台服务器,多个实例,访问同一组表空间,表空间存放于共享盘由asm实例进行管理,su - grid用户后执行asmcmd可查看编辑(包含ls cd mkdir等指令)
  • 备份指令与普通单机相同,rman进入后执行backup等操作即可。
  • 恢复到共享盘:进入asmcmd执行cp指令将外部文件系统的备份文件拷贝至+data的对应目录下,再rman进行switch database to copy。
  • 恢复单个节点:直接rman进行switch database to copy即可。

12、增量备份时异常断电保护--rman

  • list copy of controlfile tag 'tagname'; 检查最新的控制文件在存储目录是否存在
  • list backuppiece tag 'tagname';  查询在rman记录中是否有新的增量备份片,检查最新的增量备份片在存储目录是否存在,若增量丢失,需要重新全备。
  • list copy of archivelog all tag 'tagname';  检查最新id的归档日志在存储目录是否存在
  • 亦可使用crosscheck backuppiece tag 'tagname';检查是否有增量备份片过期,若存在过期的记录,则需要重新全备若不执行重新全备,下次做增量时rman执行到recover copy of做合并时会判断没有全备文件,会自动在闪回区完成一次全备,以前使用的全备文件则不再关联。没有备份片过期,则再做一次增量即可。

13、归档日志重复备份问题---rman

因not backed up 1 times在backup as copy archivelog all的as copy模式下没有效果,故每次增量后需将最新的sequence保存到文件中,下次备份归档时加上from sequence参数从指定id开始镜像拷贝,可解决归档日志重复拷贝问题。(经验证,和闪回区的归档md5值比对成功,且异机switch切换后可成功启动)

14、块跟踪block change tracking  ---sqlplus

数据库开启块跟踪可缩短rman增量备份的时间,alter database enable block change tracking;或者指定文件记录alter database enable block change tracking using file '****';

15、查看控制文件内容

sqlplus执行alter database backup controlfile to trace as '/root/control_file.txt';  将内容以可视化方式导出到文件。

16、rman恢复到指定时间点

catalog注册数据文件和日志文件之后执行  run{set until time "to_date('20210916 17:38:00','yyyymmdd hh24:mi:ss')";restore database;recover database;}  

注:每次alter database open resetlogs;   其中的resetlogs参数将强制修改控制文件的scn变更为指定时间点的scn+1,恢复时间点until time不能在最近的resetlogs时间之前,否则将报错RMAN-20207且后续无法打开数据库。若要跨resetlogs恢复,需要先执行list incarnation; 查询对应时间段的incarnation N再执行reset database to incarnation N操作即可正常恢复。(resetlogs可看做时间轴上的断点,incarnation可看做每个resetlogs断点间的段落id)

17、强制将redo日志进行归档(sqlplus下,备份时无需执行此命令,因为再rman backup过程中已经包含了这个步骤)

alter system archive log current;

18、redo日志大小限制查询和修改

查询select * from v$log;  (单位字节)

修改redo大小,没有resize选项,只能先删除再重建,对于status为current的日志需要先switch logfile切换到其他日志组。

  • alter system switch logfile;
  • alter database drop logfile group 1;
  • alter database add logfile group 1 ('/data/oracle/oradata/orcl11g/redo01.log') size 1024M;

*****************************************模拟丢失增量文件*************************************

执行backup as copy increment level 1 for recover of copy with tag 'full_bak' database;后直接将增量文件删除,进行recover copy of合并时将报错no such file。执行交叉校验后将修改该备份片的状态为失效,后续默认会在闪回区再做一次全备。

****************************************rman  image copy***********************************************

备份脚本

#!/bin/sh

function get_sequence_num(){
    num=$(echo $1 | awk -F'_S-' '{printf $2}' | awk -F'_T-' '{print $1}')
    echo $num
}



function BACKUP_INC(){
next_sequence=$(cat next_sequence.txt)
echo "from sequence [${next_sequence}]"
if [[ $next_sequence == "" ]];then
    echo "Invalid next_sequence"
    exit 3
fi

rman target sys/123456 << !
CONFIGURE DEFAULT DEVICE TYPE TO 'disk';
backup as copy spfile format '/root/tmp_dir/%U.ora';
backup as copy current controlfile format '/root/tmp_dir/%U.ctl';
backup incremental level 1 for recover of copy with tag 'test1' database format '/root/tmp_dir/%U.inc';
backup as copy archivelog from sequence $next_sequence format '/root/tmp_dir/archivelog_dir/%U.arc';
recover copy of database with tag 'test1';
exit
!

#获取下一个sequence
last_file=$(ls -rt /root/tmp_dir/archivelog_dir/ | tail -1)
num=$(get_sequence_num $last_file)
echo "~~$num"
let "next_sequence=$num+1"
#保存下一个sequence到文件
echo $next_sequence > next_sequence.txt
}
#backup as copy archivelog all format '/root/tmp_dir/archivelog_dir/%U.arc' not  backed up 1 times;
#recover copy of database with tag 'test1';



function BACKUP_FULL(){
rman target sys/123456 << !
CONFIGURE DEFAULT DEVICE TYPE TO 'disk';
backup as copy spfile format '/root/tmp_dir/%U.ora';
backup as copy current controlfile format '/root/tmp_dir/%U.ctl';
backup incremental level 0 as copy tag 'test1' database format '/root/tmp_dir/%U.dbf';
backup as copy archivelog all format '/root/tmp_dir/archivelog_dir/%U.arc';
exit
!

#获取下一个sequence
last_file=$(ls -rt /root/tmp_dir/archivelog_dir/ | tail -1)
num=$(get_sequence_num $last_file)
echo "~~$num"
let "next_sequence=$num+1"
#保存下一个sequence到文件
echo $next_sequence > next_sequence.txt
}
#backup as copy archivelog all format '/root/tmp_dir/archivelog_dir/%U.arc';


curr_path=$(basename $0)
#清理rman过期记录
cd $curr_path
./crosscheck_clear.sh
if [[ ! $# -eq 1 ]];then
    echo "param error!"
    exit 1
fi

if [[ $1 == "full" ]] ;then
    echo "---------------------------BACKUP_FULL----------------------------"
    BACKUP_FULL
elif [[ $1 = "inc" ]] ;then
    echo "---------------------------BACKUP_INC----------------------------"
    BACKUP_INC
else
    echo "param error!"
    exit 2
fi

清理脚本

#!/bin/sh

rman target sys/123456 << !
crosscheck archivelog all;
delete expired archivelog all;
yes
crosscheck copy of database;
delete expired copy of database;
yes
quit
!

恢复脚本 (创建channel和设置指定时间点需在run内)

#!/bin/sh

spfile_path=/root/test_dir/xfs_dir/ne0gq3ne_1_1.ora
controlfile_path=/root/test_dir/xfs_dir/cf_D-ORCL11G_id-1190235964_ng0gq3nh.ctl

chmod 777 -R /root/test_dir/xfs_dir


sqlplus  sys/123456 as sysdba << !
alter system set control_files='$controlfile_path' scope=spfile;
shutdown immediate;
startup nomount;
exit
!

####################### SPFILE ##############################
rman target sys/123456 << !
startup nomount;
restore spfile to '/data/oracle/product/11.2.0/dbs/spfileorcl_mount_test.ora' from '$spfile_path';
!

sqlplus  sys/123456 as sysdba << !
create pfile from spfile;
exit
!

######################## CONTROLFILE AND DATAFILE ##############################
rman target sys/123456 << !
restore controlfile from '$controlfile_path';
alter database mount;

catalog archivelog '/root/test_dir/xfs_dir/archivelog_dir/arch_D-ORCL11G_id-1190235964_S-195_T-1_A-1083521094_n10gq3h3.arc';
catalog archivelog '/root/test_dir/xfs_dir/archivelog_dir/arch_D-ORCL11G_id-1190235964_S-196_T-1_A-1083521094_n20gq3h4.arc';
catalog archivelog '/root/test_dir/xfs_dir/archivelog_dir/arch_D-ORCL11G_id-1190235964_S-197_T-1_A-1083521094_n30gq3h5.arc';
catalog archivelog '/root/test_dir/xfs_dir/archivelog_dir/arch_D-ORCL11G_id-1190235964_S-198_T-1_A-1083521094_nb0gq3l7.arc';
catalog archivelog '/root/test_dir/xfs_dir/archivelog_dir/arch_D-ORCL11G_id-1190235964_S-199_T-1_A-1083521094_nl0gq3og.arc';

catalog datafilecopy '/root/test_dir/xfs_dir/data_D-ORCL11G_I-1190235964_TS-USERS_FNO-4_ll0gq3ff.dbf';
catalog datafilecopy '/root/test_dir/xfs_dir/data_D-ORCL11G_I-1190235964_TS-UNDOTBS1_FNO-3_lk0gq3f8.dbf';
catalog datafilecopy '/root/test_dir/xfs_dir/data_D-ORCL11G_I-1190235964_TS-SYSTEM_FNO-1_li0gq3dm.dbf';
catalog datafilecopy '/root/test_dir/xfs_dir/data_D-ORCL11G_I-1190235964_TS-SYSAUX_FNO-2_lj0gq3ef.dbf';
switch database to copy;

run{
set until time "to_date('2022-03-10 16:50:00','yyyy-mm-dd hh24:mi:ss')";
recover database;
}

exit
!

sqlplus  sys/123456 as sysdba << !
alter database open resetlogs;
!

echo "restore completely!"

原机恢复单个表空间

rman target sys/123456 << !
run{
sql'alter database datafile 4 offline';
catalog datafilecopy '/data/oracle/oradata/orcl11g/users01.dbf';
switch datafile 4 to copy;
recover datafile 4;
sql'alter database datafile 4 online';
}
exit
!

异机恢复部分表空间比较复杂,必须恢复sys、aux、undo三个表空间和要恢复的表空间一起,过程大致和上面一致,recover database的时候加上'skip tablespace ***'跳过没有数据文件的若干表空间,之后数据库启动会报部分datafile不存在,但不影响其他已恢复的表空间使用。(部分错误需重构控制文件解决)

异机恢复部分表空间(还原参数文件、控制文件,以及注册数据文件、归档日志等步骤此处省略)

rman target sys/123456 << !
run{
set until time "to_date('2022-03-10 16:50:00','yyyy-mm-dd hh24:mi:ss')";
recover database skip forever tablespace users;
}
alter database open resetlogs;
exit
!

查询备份进度

set line 9999
col opname for a35
col start_time for a19
SELECT SID, SERIAL#,opname, to_char(start_time,'yyyy-mm-dd HH24:MI:SS')  start_time, SOFAR, TOTALWORK,
ROUND(SOFAR/TOTALWORK*100,2) "%COMPLETE",ceil(ELAPSED_SECONDS/60) ELAPSED_MI
FROM V$SESSION_LONGOPS
where opname like 'RMAN%' order by start_time asc;

结果如下:(sofar为已完成块数量,totalwork为总备份块数量<单位为8K>。。。其中参数文件、控制文件、数据文件、归档日志的进度各自独立)

root用户下只能登录拥有sysdba权限的用户。(前提先在root用户下设置好ORACLE_HOME和ORACLE_SID环境变量)

查看是否拥有权限:select * from V_$PWFILE_USERS;

授予权限:grant  sysdba,dba,connect,resource,create session  to zhangchen;

撤销权限:revoke sysdba from zhangchen;

全量和增量大小判断(主要是数据文件和归档日志,注:增量大小需开启块跟踪)

开启块跟踪:alter database enable block change tracking using file '/data/oracle/product/11.2.0/bct/changed_block_tracking.log';

数据文件总大小:select sum(bytes) from v$datafile;

查看所有归档日志信息:select SEQUENCE#,NAME,BLOCKS,BLOCK_SIZE from v$archived_log where deleted='NO';

查看全备归档日志总大小(过滤RESETLOGS_ID,FIRST_CHANGE#相同的文件,此类文件MD5完全相同只会备份其中一个):select sum(BLOCKS*BLOCK_SIZE) from (select RECID,BLOCKS,BLOCK_SIZE,row_number() over (partition by RESETLOGS_ID,FIRST_CHANGE# order by RESETLOGS_ID ) rn from v$archived_log where deleted='NO') b where b.rn=1;

查看增量归档日志总大小(从下一个sqn开始):select sum(BLOCKS*BLOCK_SIZE) from (select RECID,BLOCKS,BLOCK_SIZE,row_number() over (partition by RESETLOGS_ID,FIRST_CHANGE# order by RESETLOGS_ID ) rn from v$archived_log where deleted='NO' and SEQUENCE#>=10) b where b.rn=1;

增量数据文件大小:

select 
sum(blocks_changed * block_size)
from v$datafile join
(select fno
file#,
sum(bct) blocks_changed
from (select distinct fno, bno, bct from x$krcbit
where vertime >= (select curr_vertime from x$krcfde
where csno=x$krcbit.csno and fno=x$krcbit.fno))
group by fno order by 1)
using(file#);

注:异机恢复无法使用catalog start with自动识别目录下的备份文件,只能1个1个注册。

RMAN-06053问题处理方法:catalog archivelog注册的归档日志不全,需要注册更多的归档日志,若全部的归档日志非常多全部注册的话恢复起来则非常慢,可以按照最新备份的dbf时间戳进行筛选,将对应时间左右以及之后的全部日志进行catalog。(RMAN-06054错误可以忽略)

备份速度慢的话,rman执行CONFIGURE BACKUP OPTIMIZATION ON;  开启备份优化。通道数开到24(最大值为24)

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值