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;

Starting backup at 11-DEC-13
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/u01/oracle/oradata/justdb/system01.dbf
input datafile file number=00002 name=/u01/oracle/oradata/justdb/sysaux01.dbf
input datafile file number=00003 name=/u01/oracle/oradata/justdb/undotbs01.dbf
input datafile file number=00004 name=/u01/oracle/oradata/justdb/users01.dbf
channel ORA_DISK_1: starting piece 1 at 11-DEC-13
channel ORA_DISK_1: finished piece 1 at 11-DEC-13
piece handle=/u01/oracle/fast_recovery_area/JUSTDB/backupset/2013_12_11/o1_mf_nnndf_TAG20131211T162913_9bj8lscl_.bkp tag=TAG20131211T162913 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
including current control file in backup set
including current SPFILE in backup set
channel ORA_DISK_1: starting piece 1 at 11-DEC-13
channel ORA_DISK_1: finished piece 1 at 11-DEC-13
piece handle=/u01/oracle/fast_recovery_area/JUSTDB/backupset/2013_12_11/o1_mf_ncsnf_TAG20131211T162913_9bj8m1gt_.bkp tag=TAG20131211T162913 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 11-DEC-13

 

Step 2,一致性关闭数据库

RMAN> SHUTDOWN IMMEDIATE;

database closed
database dismounted
Oracle instance shut down

 

Step 3,模拟控制文件丢失

[oracle@orcl dbs]$ \mv /u01/oracle/oradata/justdb/control01.ctl /opt/learn/ -v
`/u01/oracle/oradata/justdb/control01.ctl' -> `/opt/learn/control01.ctl'
removed `/u01/oracle/oradata/justdb/control01.ctl'
[oracle@orcl dbs]$ \mv /u01/oracle/fast_recovery_area/justdb/control02.ctl /opt/learn/ -v
`/u01/oracle/fast_recovery_area/justdb/control02.ctl' -> `/opt/learn/control02.ctl'
removed `/u01/oracle/fast_recovery_area/justdb/control02.ctl'

 

Step 4,启动数据库到NOMOUNT状态

RMAN> STARTUP NOMOUNT;

connected to target database (not started)
Oracle instance started

Total System Global Area    1269366784 bytes

Fixed Size                    2227984 bytes
Variable Size                754974960 bytes
Database Buffers            503316480 bytes
Redo Buffers                  8847360 bytes

 

Step 5,还原控制文件

RMAN> RESTORE CONTROLFILE FROM '/u01/oracle/fast_recovery_area/JUSTDB/backupset/2013_12_11/o1_mf_ncsnf_TAG20131211T162913_9bj8m1gt_.bkp';

Starting restore at 11-DEC-13
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=19 device type=DISK

channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/u01/oracle/oradata/justdb/control01.ctl
output file name=/u01/oracle/fast_recovery_area/justdb/control02.ctl
Finished restore at 11-DEC-13

 

Step 6,切换数据库到MOUNT状态

RMAN> ALTER DATABASE MOUNT;

database mounted
released channel: ORA_DISK_1

 

Step 7,恢复数据库

RMAN> RECOVER DATABASE;

Starting recover at 11-DEC-13
Starting implicit crosscheck backup at 11-DEC-13
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=1 device type=DISK
Crosschecked 6 objects
Finished implicit crosscheck backup at 11-DEC-13

Starting implicit crosscheck copy at 11-DEC-13
using channel ORA_DISK_1
Finished implicit crosscheck copy at 11-DEC-13

searching for all files in the recovery area
cataloging files...
cataloging done

List of Cataloged Files
=======================
File Name: /u01/oracle/fast_recovery_area/JUSTDB/backupset/2013_12_11/o1_mf_ncsnf_TAG20131211T162913_9bj8m1gt_.bkp

using channel ORA_DISK_1

starting media recovery

archived log for thread 1 with sequence 1 is already on disk as file /u01/oracle/oradata/justdb/redo01.log
archived log file name=/u01/oracle/oradata/justdb/redo01.log thread=1 sequence=1
media recovery complete, elapsed time: 00:00:00
Finished recover at 11-DEC-13

 

Step 8,以RESETLOGS方式打开数据库

RMAN> ALTER DATABASE OPEN RESETLOGS;
ALTER DATABASE OPEN RESETLOGS;

database opened

 

Step 9,查看数据库状态

[oracle@orcl ~]$ sqlplus
[uniread] Loaded history (97 lines)

SQL*Plus: Release 11.2.0.3.0 Production on Wed Dec 11 16:32:16 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining,
Oracle Database Vault and Real Application Testing options
SQL> SELECT open_mode FROM v$database;

OPEN_MODE
--------------------
READ WRITE

 

Step 10,备份数据库

RMAN> BACKUP DATABASE;

推荐阅读:

RMAN 配置归档日志删除策略

Oracle基础教程之通过RMAN复制数据库

RMAN备份策略制定参考内容

RMAN备份学习笔记

Oracle数据库备份加密 RMAN加密

相关内容