OracleRMAN备份恢复做了那么多次整理一下

备份通用脚本Linux、Windows

run{
allocate channel c1 device type disk;
allocate channel c2 device type disk;
allocate channel c3 device type disk;
allocate channel c4 device type disk;
crosscheck archivelog all;
crosscheck backupset;
delete noprompt expired backup ;
delete noprompt expired archivelog all;
backup as compressed backupset database format 'w:\backup\db_%U_%T.bak' ;
backup current controlfile  format 'w:\backup\ctl_%U_%T.bak';
sql "alter system switch logfile";
backup as compressed backupset archivelog from time 'sysdate -3' format 'w:\backup\arc_%U_%T.bak';
backup spfile  format 'w:\backup\spfile_%U_%T.bak';
delete noprompt force archivelog until time 'sysdate -7';
delete noprompt obsolete;
release channel c1;
release channel c2;
release channel c3;
release channel c4;
}

这个脚本将controlfile、datafile、archivelog和spfile分开备份了,方便恢复的时候选择指定文件恢复,如果不分开备份也可选择从full database backupset里恢复控制文件。

备份集有效性验证

下面的命令可模拟恢复验证备份有效性

restore validate database;
restore validate spfile;
restore validate controlfile;

恢复

前半部分Linux和Windows通用步骤

1.在测试机上搭建与主库相同版本的数据库,保持实例名相同,打上相同补丁,尽量保持环境一直,可以省掉很多不必要麻烦。

2.测试机数据库安装完成后删除原有数据文件目录及数据文件,可选择新建数据文件目录,在这我们以Linux系统为例:
原数据文件目录:/u01/app/oracle/oradata/orcl/ 将oradata目录下orcl文件夹全部删除
新建数据文件目录:/u01/oradata/orcl ##此目录用于存放恢复出来的控制文件、数据文件、redo.log
新建归档目录: /u01/archivelog ##此目录用于存放恢复出来的归档日志
新建catalog目录: /u01/backup ##此目录用于存放从主库拷贝过来的备份文件

注:以上操作均用oracle用户操作,如用root用户操作记得给oracle:oinstall权限,特别是从主库拷贝过来的备份集,一定要给权限,不然无法恢复,尤其是做全库full database backupset备份,未单独备份控制文件的,如果没给权限,恢复控制文件时,所有文件都提示里面不包含控制文件,这会给你带来“是否这些备份文件有问题”的错觉。

3.修改测试机数据库(下文均称作备库)的控制文件存放路径、归档日志存放路径。

sys@ORCL>shutdown abort
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
sys@ORCL>startup nomount
ORACLE 例程已经启动。

Total System Global Area  768294912 bytes
Fixed Size		    2257192 bytes
Variable Size		  473960152 bytes
Database Buffers	  289406976 bytes
Redo Buffers		    2670592 bytes
sys@ORCL>alter system set control_files='/u01/oradata/orcl/control.ctl' scope=spfile;
system altered.
sys@ORCL>alter system set log_archive_dest_1='location=/u01/archivelog/' scope=spfile;
system altered.

修改完这两个参数,重新启动实例到nomount

sys@ORCL>shutdown abort
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
sys@ORCL>startup nomount
ORACLE 例程已经启动。

4.将主库的备份文件拷贝到备库并给oracle:oinstall权限,Windows可以直接用。

(1)恢复控制文件(没截图,用大佬的图代替一下,是Windows的,Linux也一样)。

在这里插入图片描述
恢复完可以去/u01/oradata/orcl/下面看一下,控制文件已经恢复到此路径。

(2)恢复完控制文件就可以将数据库启动到mount了。

在这里插入图片描述

(3)将控制文件中,将无效的备份集合全部删除

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)将/u01/backup/目录注册到控制文件中(图是借用大佬的,目录是/u01/backup)。

在这里插入图片描述

(5)开始还原数据文件

run{
allocate channel ch1 device type disk;
allocate channel ch2 device type disk;
allocate channel ch3 device type disk;
allocate channel ch4 device type disk;
set newname for database to '/u01/oracle/orcl/%b';
restore database;
switch datafile all;
release channel ch1;
release channel ch2;
release channel ch3;
release channel ch4;
}

在这里插入图片描述
如果之前的步骤都没问题你会看到以下输出
在这里插入图片描述
此过程可长可短,视数据库大小而定,此时已经可以在/u01/oradata/orcl/目录下看到恢复出来的数据文件。

(6)开始恢复数据文件后,因为恢复需要一定时间,可以在恢复数据文件的同时,做一下归档日志的恢复。

归档日志的恢复有两种方法:1.从主库拷贝。2.从备份中恢复。
如果备份集中有归档备份可以list看一下有哪些归档,可选择性恢复到指定时间,或者恢复最近几天,或者全部恢复,都行,看需求。
在这里插入图片描述
在这里插入图片描述
这里要做说明:这张图片是rac-single恢复,归档日志有两个thrd,如果要按需恢复,两个线程都要恢复。
如果按天数恢复就不用考虑这些了,直接
在这里插入图片描述
如果需要按seq恢复

单节点到单节点
rman>restore archivelog from logseq 50989
rac到单节点
RMAN > restore archivelog from logseq 9860 until logseq 9971 thread 1;或
RMAN > restore archivelog from logseq 72653 until logseq 72679;
两个节点都要恢复
RMAN> restore archivelog from logseq 9267 until logseq 9396 thread 2;

(7)数据文件恢复结束,做数据库不完全恢复。

如果数据文件恢复没有问题可看到如下输出:
在这里插入图片描述
开始做不完全恢复
单机到单机输出如下图:
在这里插入图片描述
rac到单机输出如下图:
在这里插入图片描述
这些输出报错都是正常的,键入auto之后,数据库自动读取/u01/archivelog中的归档日志文件,进行恢复,此步骤也需要一定时间,具体时间根据需要恢复的归档日志量而定.应用完成日志之后,就可以打开数据库了:
在这里插入图片描述

收尾

至此恢复工作已经完成,可按需,优化部分数据库参数,如果此备库是用作测试库,还需要重建一下tmpfile表空间:

select name from v$tempfile;

查看当前临时表空间目录,还是源库路径,需要drop然后重建

drop tablespace TMP including contents and datafiles;

create temporary tablespace TMP tempfile '/u01/oradata/orcl/tmp001.dbf' size 500M autoextend on next 100M maxsize unlimited;

自己挖的坑自己填

(1)REDO.LOG的坑

如果按上面的步骤做备份恢复,需要主库和备库环境一模一样,环境包括:系统(windows-linux)、文件目录(数据文件目录)、数据库版本、补丁,最后才能resetlogs open成功。

数据文件目录要是不一致就会出现如下问题:
1.单机到单机,logfile的目录还是源库的目录,可重命名redo.log。
在这里插入图片描述

SQL>select member from v$logfile;

在这里插入图片描述

SQL> alter database rename file 'D:\app\Administrator\oradata\orcl\REDO01.LOG' to 'D:\oradata\orcl\REDO01.LOG';

在这里插入图片描述
此时可以尝试重新open resetlogs,有可能会open成功,也有可能会出现如下情况:
在这里插入图片描述
Redo03.log,group3在被清除不允许操作。原因可能是这个日志组是数据库正在使用的current redolog。
尝试alter system switch logfile;和alter system checkpoint;切换目录失败数据库不是open。
SQL>alter database clear logfile group 3;
重新resetlog open,成功。

1.rac到单机,logfile的目录还是源库的目录,此时不能rename,也不能添加新redo后drop旧redo,只能重建控制文件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
日志组的状态是clearing或者clearing_current,操作不了的话就只能重建控制文件了。
注:上面关于redo.log或者还有异构系统数据文件路径不正确的情况可以通过设置下面两个参数来避免
db_file_name_convert string
log_file_name_convert string

(2)主库到备库涉及跨小版本

11.2.0.3-11.2.0.4linux
在执行完recover database using backup controlfile until cancel;之后
执行alter database open resetlogs;后无法打开数据库
在这里插入图片描述
此处需要做一下升级
执行 alter database open upgrade;
然后执行@$ORACLE_HOME/rdbms/admin/catupgrd.sql;
执行完上述脚本数据库就可以用startup来打开了
打开后执行@?/rdbms/admin/utlrp.sql 编译一下无效对象就可以了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值