Maison > Article > base de données > RMAN备份与恢复之控制文件丢失
RMAN备份与恢复控制文件,首先我们要对数据库进行备份,如果没有备份何来的恢复。备份数据库的过程是这样的:RMAN发出备份全库命
一 写在前面
常言道,“知其然,更要知其所以然”。但是没有知其然,何谈知其所以然。本系列文章呈现给你的更多是怎么做,为什么这样做也会有所涉及。但是由于水平有限,所以原理性的东西讲解不够深刻,还望读者海涵。
最近看了很多资料,也在思考我们我在追逐的技术究竟能给这个社会带来什么价值。走在技术的道路上多少有些枯燥,但这又何妨?
二 RMAN备份和恢复控制文件讲解
我们经常在说“备份重于一切”,如果出现问题可以从备份文件中恢复。此系列文章讲解RMAN的备份与恢复。RMAN(Recovery Manager),可以用来备份和还原数据库文件、归档日志和控制文件,它也可以用来执行完全或不完全的数据库恢复。RMAN备份方式有:完全备份(Full Backup)与增量备份(Incremental Backup)、打开备份(Open Backup)或关闭备份(Closed Backup)、一致备份(Consistent Backup)与不一致备份(Inconsistent Backup)。RMAN恢复有完全恢复和不完全恢复。其中不完全恢复,可以基于时间,基于SCN,基于日志序列号、基于备份控制文件。
控制文件记录了数据库的结构和行为,对于数据库而言,控制文件是相当重要的,如果控制文件有问题,并且参数文件没有问题,数据库只能启动到NOMOUNT状态。Oracle 11g控制文件默认两个,一个存放在数据目录,另一个存放在闪回目录。真实环境中控制文件也是多个,一般3个为宜。
RMAN备份与恢复控制文件,首先我们要对数据库进行备份,如果没有备份何来的恢复。备份数据库的过程是这样的:RMAN发出备份全库命令后,RMAN生成到目标数据库的bequeath连接,也就是说会检查ORACLA_SID变量中的实例名,并在该在实 例上产生一个服务器进程,然后作为sysdba登陆,然后会产生一个作为备份的通道(其实也是进程,在PGA或者是在SGA分配存储)。随后RMAN调用 SYS.DBMS_RCVMAN请求数据库结构信息,包括控制文件的信息(当前序列号,创建时间……),由于指定了备份全库,所以RMAN会请求数据库中数据文件信息,并判断是否存在offline数据文件(包括所在的位置和工作方式)。RMAN开始备份,为了保持数据一致性RMAN必须构建控制文件快照,接下来RMAN调用DBMS _BACKUP_RESTORE数据包,该调用可以创建备份片。RMAN拥有文件列表,所以它为数据文件读取操作分配内存缓冲区,分配缓冲区后RMAN初始化备份片。一旦初始化了备份片, RMAN会判断是否使用了服务器参数文件,如果使用了则会做为备份的一部分,还要备份控制文件,之后才开始备份数据文件,并将其推至内存。 为了实现这一功能,通道进程在磁盘上执行预读取操作,并且将多个数据文件读入内存中,RMAN会判断数据块头信息是否仍然为零,如果数据块没有被使用过,就不会发生到输出缓冲区的写操作,同时会丢弃这个数据块(这就RMAN为什么会只备份使用过的数据的原因,也是它的优点)。 RMAN还会执行检查数据块有没有corruption操作。当检查通过了就被写入到输出缓冲区。一旦输出缓冲区填满了,就被推至备份文件位置。在备份数据块的时候,RMAN影子进程会得到备份状态信息,并将它传给V$session_longops视图,查询它能得到信息。 当数据文件的所有数据块都被读入输入缓冲区并确定了状态之后RMAN就会通过将这个数据文件写入备份片来结束该文件的备份操作。所有数据文件写入备份片之后,RMAN生成最后一个对SYS DBMS BACKUP RESTORE数据包的调用,该调用在控制文件中写入备份信息(包括备份片名,启动备份操作时的检查点的SCN和完成备份的时间),至此完成备份!
备份数据库完成后,我们需要一致性关闭数据库,因为数据库处于运行状态会向控制文件写内容,如果不关闭,会出现控制文件版本不一致。一致性关闭数据库后,我们需要模拟控制文件丢失,为了避免恢复出错,我们不使用rm命令,真实环境中使用此命令也是很危险的,我们使用mv命令。接着我们启动数据库到NOMOUNT状态,为什么是NOMOUNT,因为数据库启动会经过三个阶段,实例启动,数据库装载,数据库打开,NOMOUNT阶段使用的是参数文件,因为我们的控制文件丢失,所以无法读取,只能启动到NOMOUNT状态。然后RMAN中通过备份的控制文件还原,因为控制文件恢复完成,可以启动数据库到MOUNT状态,所以我们接着使数据库到MOUNT状态,因为数据库的控制文件是通过RMAN恢复的,我们需要恢复数据库,使控制文件生效,并进行控制文件版本的校对和同步。然后我们使用RESETLOGS(重置日志)方式打开数据库,因为日志文件被清空了,以前的备份无效,所以我们应该再次对数据库进行备份。这一点至关重要。
我们还可以使用RUN命令把所有的操作写入一个人脚本,这样可以减少很多操作,前提是这样的脚本经过严格的测试。
控制文件丢失使用run命令
语法:
RUN{
STARTUP MOUNT;
RESTORE CONTROLFILE FROM '/';
ALTER DATABASE MOUNT;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
}
示例:
RUN{
STARTUPNOMOUNT;
RESTORECONTROLFILE FROM '/u01/oracle/fast_recovery_area/JUSTDB/backupset/2013_12_11/o1_mf_ncsnf_TAG20131211T164208_9bj9c8rp_.bkp';
ALTERDATABASE MOUNT;
RECOVERDATABASE;
ALTERDATABASE OPEN RESETLOGS;
}
当然,这只是模拟,真实环境中控制文件基本上不会丢失。
三 控制文件丢失模拟
Step 1,备份数据库
RMAN> BACKUP DATABASE;