暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

RMAN使用NOCATALOG方式进行数据库备份

原创 eygle 2019-11-20
1643

首先来看看如何在没有目录数据库的方式下进行数据库备份和恢复。
上文提到,在没有目录数据库的情况下,Oracle的备份信息是存储在控制文件中的,那么此时控制文件的安全就显得十分重要。在数据库本身对控制文件进行了多份镜像之外,Oracle从9i开始提供了控制文件自动备份功能,打开该功能之后,Oracle会在数据库发生重大变化(如增减表空间)时自动进行控制文件及spfile文件的备份,这种及时自动的备份使我们可以保留多份控制文件备份,在控制文件丢失时,可以使用这些备份进行恢复。
可以通过如下方式设置控制文件自动备份:

C:\>rman target / 恢复管理器: Release 10.2.0.1.0 - Production on 星期四 31 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.log文件,可以在其中发现这样的备份信息:

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; 启动 backup01-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: 正在启动段 101-3-07 通道 ORA_DISK_1: 已完成段 101-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 完成 backup01-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; 启动 restore01-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 已完成 完成 restore01-3-07 使用如下步骤恢复控制文件: RMAN> restore controlfile to 'e:\temp\control01.ctl' from autobackup; 启动 restore01-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: 从自动备份复原控制文件已完成 完成 restore01-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
复制

最后还要强调的是,缺省地,这个自动备份功能是关闭的,强烈推荐大家用上文提到的方法打开该功能。

最后修改时间:2019-11-20 19:50:47
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论