首先来看看如何在没有目录数据库的方式下进行数据库备份和恢复。
上文提到,在没有目录数据库的情况下,Oracle的备份信息是存储在控制文件中的,那么此时控制文件的安全就显得十分重要。在数据库本身对控制文件进行了多份镜像之外,Oracle从9i开始提供了控制文件自动备份功能,打开该功能之后,Oracle会在数据库发生重大变化(如增减表空间)时自动进行控制文件及spfile文件的备份,这种及时自动的备份使我们可以保留多份控制文件备份,在控制文件丢失时,可以使用这些备份进行恢复。
可以通过如下方式设置控制文件自动备份:
C:\>rman target /
恢复管理器: Release 10.2.0.1.0 - Production on 星期四 3月 1 10:22:08 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到目标数据库: EYGLE (DBID=1417824532)
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
使用目标数据库控制文件替代恢复目录
新的 RMAN 配置参数:
CONFIGURE CONTROLFILE AUTOBACKUP ON;
已成功存储新的 RMAN 配置参数
这个设置可以在RMAN中查询:
RMAN> show controlfile autobackup;
RMAN 配置参数为:
CONFIGURE CONTROLFILE AUTOBACKUP ON;
也可以在数据库中通过如下方式查询得到:
SQL> select * from v$rman_configuration;
CONF# NAME VALUE
---------- ------------------------------ -----
1 CONTROLFILE AUTOBACKUP ON
复制
此时当数据库发生变化时,比如创建表空间(使用OMF方式,可以简化创建命令)需要修改控制文件:
SQL> create tablespace eygle;
表空间已创建。
复制
此时检查alert
Thu Mar 01 10:32:27 2007
create tablespace eygle
Thu Mar 01 10:32:39 2007
Starting control autobackup
Control autobackup written to DISK device handle
'D:\FLASH_RECOVERY_AREA\EYGLE\AUTOBACKUP\2007_03_01\O1_MF_S_616069959_2YDGT7Z3_.BKP'
Completed: create tablespace eygle
复制
注意一下备份路径,由于在Oracle 10g中,Oracle引入了闪回区的新特性,所以自动备份存储在闪回区中;如果不使用闪回区或者是使用Oracle 9i,则自动备份存在于$ORACLE_HOME/dbs目录下,以下是一个Oracle9i自动备份的日志输出示例:
Sat Jan 17 00:55:57 2004
Starting control autobackup
Control autobackup written to DISK device
handle '/opt/oracle/product/9.2.0/dbs/c-1052178311-20040117-00'
Completed: create tablespace eygle datafile '/data1/oracle/oradata/eygle01.dbf’
复制
这里自动备份的控制文件缺省的命名规则如下:
c-IIIIIIIIII-YYYYMMDD-QQ
复制
其中c是控制文件,IIIIIIIIII是DBID,YYYYMMDD是时间戳,QQ取值于序号00~FF(十六进制表示)。
我们再来看一个全备份的处理:
RMAN> backup database tag=eygle070301;
启动 backup 于 01-3月 -07
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=D:\ORADATA\EYGLE\DATAFILE\O1_MF_SYSTEM_2G8OHFX6_.DBF
输入数据文件 fno=00002 name=D:\ORADATA\EYGLE\DATAFILE\O1_MF_UNDOTBS1_2G8OJ6NB_.DBF
输入数据文件 fno=00003 name=D:\ORADATA\EYGLE\DATAFILE\O1_MF_SYSAUX_2G8OJHP9_.DBF
输入数据文件 fno=00005 name=D:\ORADATA\EYGLE\DATAFILE\O1_MF_EYGLE_2YDGSVH7_.DBF
输入数据文件 fno=00004 name=D:\ORADATA\EYGLE\DATAFILE\O1_MF_USERS_2G8OJYYS_.DBF
通道 ORA_DISK_1: 正在启动段 1 于 01-3月 -07
通道 ORA_DISK_1: 已完成段 1 于 01-3月 -07
段句柄=
D:\FLASH_RECOVERY_AREA\EYGLE\BACKUPSET\2007_03_01\O1_MF_NNNDF_EYGLE070301_2YF53C6S_.BKP 标记=EYGLE070301 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:02:55
完成 backup 于 01-3月 -07
启动 Control File and SPFILE Autobackup 于 01-3月 -07
段handle=
D:\FLASH_RECOVERY_AREA\EYGLE\AUTOBACKUP\2007_03_01\O1_MF_S_616092954_2YF58V2J_.BKP comment=NONE
完成 Control File and SPFILE Autobackup 于 01-3月 -07
复制
由于使用控制文件作为备份信息存储地,Oracle在完成备份后会写控制文件,这个写操作进而会触发控制文件的自动备份,由于自动控制文件的备份发生在数据库备份之后,所以这个控制文件包含了此次的备份信息。
自动备份控制文件的信息同时会记录在警告日志文件中,所以可以通过查询警告日志来获得不同备份的详细日期:
Thu Mar 01 16:55:56 2007 Control autobackup written to DISK device handle 'D:\FLASH_RECOVERY_AREA\EYGLE\AUTOBACKUP\2007_03_01\O1_MF_S_616092954_2YF58V2J_.BKP'
复制
这些备份信息存储在控制文件中,可以将控制文件转储出来看一看控制文件是如何记录这部分,首先在SQL*Plus中执行如下命令:
SQL> alter session set events 'immediate trace name controlf level 8';
会话已更改。
SQL> @gettrcname.sql
TRACE_FILE_NAME
------------------------------------------------
C:\ORACLE\ADMIN\EYGLE\UDUMP\eygle_ora_2572.trc
复制
然后可以在udump目录下找到相应的跟踪文件,其中和备份相关的信息有很多,主要包含备份集及备份片信息两个部分,以下简要截取了部分信息。
备份集信息包含了备份状态、备份时间、备份集内容等信息:
***************************************************************************
BACKUP SET RECORDS
***************************************************************************
(size = 40, compat size = 40, section max = 409, section in-use = 9,
last-recid= 9, old-recno = 1, last-recno = 9)
(extent = 1, blkno = 98, numrecs = 409)
Earliest record:
RECID #1 Recno 1 Record timestamp 03/01/07 10:32:42
Backup set key: stamp=616069959, count=1
Backup status:<available>
Backup contains: <full datafiles> <controlfile> <SPFILE>
Backup set is NOT part of the incremental strategy
Blocksize=16384 Piece-Count=1 Level=0 Time:
Backup does not have keep options.
Latest record:
RECID #9 Recno 9 Record timestamp 03/01/07 16:55:56
Backup set key: stamp=616092954, count=11
Backup status:<available>
Backup contains: <full datafiles> <controlfile> <SPFILE>
Backup set is NOT part of the incremental strategy
Blocksize=16384 Piece-Count=1 Level=0 Time:
Backup does not have keep options.
……………………
复制
备份片信息记录了每个备份集所包含的备份文件的状态、文件名称等信息:
***************************************************************************
BACKUP PIECE RECORDS
***************************************************************************
(size = 736, compat size = 736, section max = 200, section in-use = 9,
last-recid= 9, old-recno = 1, last-recno = 9)
(extent = 1, blkno = 99, numrecs = 200)
Earliest record:
RECID #1 Recno 1 Record timestamp 03/01/07 10:32:39 piece #1 copy #1 pool 0
Backup set key: stamp=616069959, count=1
V$RMAN_STATUS: recid=126991636, stamp=126991632
Flags: <deleted> <concurrent access>
Device: DISK
Handle:
Media-Handle:
Comment:
Tag: TAG20070301T103239
Completion time 03/01/07 10:32:42
Latest record:
RECID #9 Recno 9 Record timestamp 03/01/07 16:55:55 piece #1 copy #1 pool 0
Backup set key: stamp=616092954, count=11
V$RMAN_STATUS: recid=126991636, stamp=126991632
Flags: <concurrent access>
Device: DISK
Handle: D:\FLASH_RECOVERY_AREA\EYGLE\AUTOBACKUP\2007_03_01\O1_MF_S_616092954_2YF58V2J_.BKP
Media-Handle:
Comment:
Tag: TAG20070301T165554
Completion time 03/01/07 16:55:56
……………………
复制
前面提到,控制文件对于恢复来说至关重要,如果没有备份控制文件,也可以采用Oracle自动备份的控制文件作为恢复依据,在上面的RMAN备份过程中,最后Oracle执行了自动备份。
有了自动备份之后,在发生灾难后就可以使用自动备份恢复spfile文件及控制文件,恢复参数文件可以使用如下命令(通常恢复到一个临时目录下,以免覆盖当前文件,确认后再转移到缺省目录)。恢复spfile文件可以参考如下步骤:
RMAN> restore spfile to 'e:\temp\spfile.ora' from autobackup;
启动 restore 于 01-3月 -07
使用通道 ORA_DISK_1
恢复区域目标: d:\oradata\flash_recovery_area
用于搜索的数据库名 (或数据库的唯一名称): EYGLE
通道 ORA_DISK_1: 在恢复区域中找到自动备份
通道 ORA_DISK_1: 已找到的自动备份:
D:\FLASH_RECOVERY_AREA\EYGLE\AUTOBACKUP\2007_03_01\O1_MF_S_616092954_2YF58V2J_.BKP
通道 ORA_DISK_1: 从自动备份复原 SPFILE 已完成
完成 restore 于 01-3月 -07
使用如下步骤恢复控制文件:
RMAN> restore controlfile to 'e:\temp\control01.ctl' from autobackup;
启动 restore 于 01-3月 -07
使用通道 ORA_DISK_1
恢复区域目标: d:\oradata\flash_recovery_area
用于搜索的数据库名 (或数据库的唯一名称): EYGLE
通道 ORA_DISK_1: 在恢复区域中找到自动备份
通道 ORA_DISK_1: 已找到的自动备份:
D:\FLASH_RECOVERY_AREA\EYGLE\AUTOBACKUP\2007_03_01\O1_MF_S_616092954_2YF58V2J_.BKP
通道 ORA_DISK_1: 从自动备份复原控制文件已完成
完成 restore 于 01-3月 -07
复制
有一点还要说明的是,如果数据库无法Mount,就不能使用如上方式恢复自动备份的控制文件或者参数文件。
[oracle@jumper dbs]$ rman target /
Recovery Manager: Release 9.2.0.4.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
connected to target database: conner (not mounted)
RMAN> restore controlfile to '/tmp/control01.ctl' from autobackup;
Starting restore at 08-MAR-06
using target database controlfile instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=11 devtype=DISK
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 03/08/2006 11:38:29
RMAN-06495: must explicitly specify DBID with SET DBID command
复制
此时,Oracle需要我们提供数据库的DBID,才能找到相应的自动备份用以恢复。如果无法得知DBID,那么可以直接指定自动备份集来进行恢复:
RMAN> restore controlfile to '/tmp/control01.ctl' from 'c-3152029224-20051221-00';
Starting restore at 08-MAR-06
using target database controlfile instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=9 devtype=DISK
channel ORA_DISK_1: restoring controlfile
channel ORA_DISK_1: restore complete
Finished restore at 08-MAR-06
复制
进一步地,如果数据库连参数文件都丢失了,甚至数据库实例无法nomount,那么恢复spfile文件时会遇到如下错误:
[oracle@jumper dbs]$ rman target /
Recovery Manager: Release 9.2.0.4.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
connected to target database (not started)
RMAN> restore spfile to '/tmp/spfile.ora' from 'c-3152029224-20060509-00';
Starting restore at 09-MAY-06
RMAN-00571: ========================================================
RMAN-00569: ============== ERROR MESSAGE STACK FOLLOWS ===========
RMAN-00571: ========================================================
RMAN-03002: failure of restore command at 05/09/2006 14:09:43
RMAN-12010: automatic channel allocation initialization failed
RMAN-06403: could not obtain a fully authorized session
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux Error: 2: No such file or directory
复制
此时,可以手工临时编辑一个pfile文件启动实例,即可进行spfile恢复,也可以使用RMAN启动默认实例,进行spfile文件恢复。启动默认实例:
[oracle@jumper dbs]$ rman target /
Recovery Manager: Release 9.2.0.4.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
connected to target database (not started)
RMAN> startup nomount;
startup failed: ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/opt/oracle/product/9.2.0/dbs/initconner.ora'
trying to start the Oracle instance without parameter files ...
Oracle instance started
此时就可以利用这个DUMMY实例,恢复spfile文件:
[oracle@jumper log]$ rman target /
Recovery Manager: Release 9.2.0.4.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
connected to target database: DUMMY (not mounted)
RMAN> restore spfile to '/tmp/spfile.ora' from 'c-3152029224-20060509-00';
Starting restore at 09-MAY-06
using target database controlfile instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=9 devtype=DISK
channel ORA_DISK_1: autobackup found: c-3152029224-20060509-00
channel ORA_DISK_1: SPFILE restore from autobackup complete
Finished restore at 09-MAY-06
复制
最后还要强调的是,缺省地,这个自动备份功能是关闭的,强烈推荐大家用上文提到的方法打开该功能。