最近在项目中,遇到使用RMAN的操作来恢复数据库中某个时间归档日志,RMAN的原理和理解,网友们百度了解一下。我重点将实操部分了。直接上实验环节,让网友更懂。(特别提醒:我是1:1用VMware克隆数据库进行RMAN还原。涉及到两个数据库的数据文件、日志文件、控制文件、参数文件的路径一致,如果两个数据库安装路径不同,内部配置路径环境不同,将不适用本方法了。)
目录
一、环境部署
二、源数据库数据体量的检查
三、源数据库使用RMAN脚本进行数据备份
四、将源数据库中的配置文件,传送到目标数据中
五、目标数据库进行RMAN还原
六、RMAN恢复总结
七、参考文件
一、环境部署
VMware中部署两台数据库应用
我这里分别是192.168.188.141(源数据库),192.168.188.152(目标数据库)
两个数据库版本是Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production(实验前,我将源数据库克隆到152的数据库后,在用impdp数据导入,将数据量增大。)
二、源数据库数据体量的检查
检查源数据库的DBID,控制文件路径
查找数据文件路径
查找字符集和数据总量
查找日志文件的路径
这里有个坑。(使用RMAN操作,数据库必须开启归档模式,不然热备份不了相关的配置文件)
图一是我没有开启归档模式,使用rman脚本进行备份文件,死活备份不了,图二我开启自动归档模式以后,rman脚本就成功了)
三、源数据库使用RMAN脚本进行数据备份
RMAN的脚本(注意bakdir和autobak的路径,写在home用户下面的路劲)
#************************************************************************
#*** rman_bak_L0.sh ***
#************************************************************************
#!/bin/bash
source /home/oracle/.bash_profile
rq=`date +%Y%m%d`
bakdir=/home/oracle/topsoft/rmanbak/${rq}
autobak=/home/oracle/topsoft/rmanbak/autobackup/
if [ ! -d ${bakdir} ];
then mkdir -p ${bakdir}
fi
if [ ! -d ${autobak} ];
then mkdir -p ${autobak}
fi
cd $ORACLE_HOME/bin
./rman target / log=$bakdir/rmanfull_${rq}.log <<EOF
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '${autobak}/%F';
run {
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
allocate channel c4 type disk;
allocate channel c5 type disk;
allocate channel c6 type disk;
sql 'alter system archive log current';
backup as compressed backupset incremental level 0 database tag 'dbfull' format '${autobak}/backlv0_%d_%T_%t_%s_%p.bak';
sql 'alter system archive log current';
backup as compressed backupset archivelog all tag 'arch' format '${autobak}/arch_%d_%T_%t_%s_%p.bak';
backup current controlfile format '${autobak}/ctl_%d_%T_%t_%s_%p.bak';
release channel c1;
release channel c2;
release channel c3;
release channel c4;
release channel c5;
release channel c6;
}
report obsolete;
crosscheck backup;
crosscheck archivelog all;
delete noprompt obsolete;
delete noprompt expired backup;
list backup summary;
exit;
EOF
echo "备份数据完成."
参数说明:
sysdate-1/12 :2小时之前的归档。
%U_%d_%T_%s
%U:默认是%u_%p_%c的简写形式,利用它可以为每一个备份片段(即磁盘文件)生成一个唯一名称,这是最常用的命名方式,执行不同备份操作时,生成的规则也不同,如下所示:
生成备份片段时,%U=%u_%p_%c;
%u:是一个由备份集编号和建立时间压缩后组成的8字符名称。利用%u可以为每个备份集生成一个唯一的名称。
%p:备份集中备份片段的编号,从1开始。
%c:备份片段的复制数(从1开始编号,最大不超过256)。
%d:Oracle数据库名称。
%T:当前时间的年月日格式(YYYYMMDD)。
%s:备份集号。
先将数据库关闭,然后将数据库启动mount模式,开启归档记录,然后开启数据库实例再用RMAN进行备份(RMAN的备份机制,有时间可以了解一下。这里我挖坑一个早上)
将脚本放进去服务器内,加上chmod +x 执行脚本(这里我又重新备份一次作为展示,备份时间是4月12号)
检查一下RMAN备份完成下来的备份文件,发现日志文件、数据文件、控制文件、归档文件都被RMAN脚本执行备份下来了。
还需要准备源数据库的参数文件,在SQL中执行脚本将参数文件备份出来,
将源数据库的数据库的密码文件orapwfzdb,备份到RMAN的文件夹中
四、将源数据库中的配置文件,传送到目标数据中
传送到目标数据库中,目标数据库创建对面的文件路径存放文件(记得目标数据库关闭防火墙,还需要有对接用户的账号密码)
传送过去目标数据库有6个文件:日志文件,ARCH格式归档文件,C-9开头控制文件,initfz开头数据库参数文件,还有backlv的数据文件,还有源数据库中密码文件orapwfzdb文件
(这里我挖了一个坑,没有传送过去日志文件,导致我后面的recover database;还原归档日志时候报错,缺少日志文件,还原归档时间是根据你传送过去的日志文件序列号时间进行还原)
检查一下目的数据库的文件已经保存源数据库的文件。
(因为我是虚拟机克隆源数据库到目标数据库,数据库的配置文件路径和数据库的名字和ID都是一致的了,如果不是安装路径和配置文件参数一致的源数据库和目标库,一定要修改initfzdb20240425.ora中的配置参数。具体方法,改期研讨)
五、目标数据库进行RMAN还原
进入目标数据库先关闭数据实例,用非挂在模式用源数据库数据库中参数文件启动数据库(因为我两个库都是一样信息,配置文件一样直接启动)
如果数据库的SID不是一样,要设置成源数据库一致的SID。(我是克隆过来数据库,SID完全一直)
[oracle@localhost ~]$ export ORACLE_SID=fzdb
使用源数据库文件生成参数文件。
生成参数完毕后,关闭数据库实例,在启动非挂载模式,进行控制文件的还原
使用rman target /进行控制文件还原(注意:控制文件还原,需要将数据库启动到非归档模式)
这里set DBID和控制文件中的参数29**是一致的了,
数据库中启动归档模式,在进行归档模式下面进行归档文件和数据文件的还原。
在RMAN中使用alter指令切换数据库进入归档模式,在用catalog 指令读取目标库路径中的存在备份文件地方。
这里会显示日志文件已经损坏,不需要担心。
RMAN> restore database; --还原数据文件(因为我的数据文件很大,我就截图前后)
RMAN> recover database; --还原归档日志
提示如下报错:
大概意思:媒体恢复请求未知的归档日志,用于恢复线程1的序列号为101的日志,起始SCN为2605247。(因为数据库的归档日志是有记录每次归档序列号,如果想用RMAN恢复时候是要选择恢复到归档日志的多少序列号)
直接用recover恢复到序列号101的归档日志的数据库(这里叫不完全恢复)
恢复数据文件和归档文件,--恢复完成后,将库启动到read only模式,查询一下数据是否正常
目标数据库的数据库容量
源数据库的数据体量和目标库的体量相同。(按道理来说要检查数据库的数数据文件存放位置、查看临时文件位置、查看日志文件位置等等,我这里图方便,因为虚拟机克隆1:1源数据库就不查这些参数了。)
确定数据总量相同后,将数据库关闭,把源数据库的密码文件放到目标数据库的配置文件下面。
在正常启动数据库,发现目标库的开启日志记录功能。使用alter语句正常开启重置日志记录功能即可(RESETLOGSoption :清除所有在线重做日志并修改所有在线数据文件以表明不需要恢复。重置重做日志后,现有的日志文件或数据文件备份都不能使用。)
数据库正常启动,源数据库的数据
六、RMAN恢复总结
首先源数据库需要开启归档模式进行RMAN的数据备份,记录好备份的配置文件,传送到目标库中,第二,目标库中的数据库的配置文件是否和源数据库中的配置文件一致,像我实验中都是1:1还原,很多步骤可以省略,如果不是1:1的话,需要将目标库中数据文件、控制文件、参数文件等改成和源数据库的路径一致,说白了,还原就是房子的家具怎么摆,到新的房子家具也怎么摆。床的位置、沙发的位置都要重新划分。第三就是恢复控制文件时候使用非归档模式和恢复数据文件、归档文件时候,数据库开启归档模式,一定要区分开。最后确定数据恢复没问题后,还要把数据库的密码文件放回到目标库的配置文件中。
还要感谢福娃老师提供RMAN的笔记。下次研究一下如何在不同数据库配置环境下实现RMAN还原
最后感谢
福娃筱欢-CSDN博客老师。
七、参考文件
《Oracle系列》Oracle归档日志管理(开启归档日志、删除归档日志)_oracle删除归档日志-CSDN博客
Oracle RESETLOGS 和 NORESETLOGS 区别说明-CSDN博客
ORACLE开启归档日志_oracle归档日志-CSDN博客
RMAN异机恢复数据库详解-CSDN博客
oracle rman备份 归档模式,将Oracle数据库改为归档模式并启用RMAN备份-CSDN博客