ITPUB??ì3
ITPUB论坛 » Oracle数据库管理 » DBA工作备忘录之三:rman备份,没用catalog ,但控制文件丢失,怎么解决?

标题: [精华] DBA工作备忘录之三:rman备份,没用catalog ,但控制文件丢失,怎么解决?
在线/呼叫 Fenng
版主


精华贴数 32
个人空间 0
技术积分 52805 (11)
社区积分 6575 (207)
注册日期 2001-12-18
论坛徽章:27
现任管理团队成员2007年度最佳版主    
      

发表于 2004-7-18 21:54 
DBA工作备忘录之三:rman备份,没用catalog ,但控制文件丢失,怎么解决?

DBA工作备忘录之三:rman备份,没用catalog ,但控制文件丢失,怎么解决?

情况描述:客户报告数据库故障,新来的系统管理员误操作。删掉了一些文件。
询问:删掉了那些文件?
答曰:所有重要数据文件,所有控制文件。数据库原来是归档模式,用rman备份数据,rman 使用控制文件。
幸运的是,最后一次rman full 备份是包括了控制文件在内。现在状况是数据库无法启动(废话,当然无法启动了   )

不用说,客户的备份方案不够完善,但是这时候再去说这些话已经是马后炮了。还有,客户有Full备份。这对我们来说是个好消息。

其实这种问题有的时候倒的确会遇到。如何进行解决呢?

我们来看以下的步骤。


__________________
我的Blog: www.dbanotes.net   

点击即可用 Google Reader 订阅   



4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
不想做厨师的裁缝不是好司机
只看该作者    顶部
在线/呼叫 Fenng
版主


精华贴数 32
个人空间 0
技术积分 52805 (11)
社区积分 6575 (207)
注册日期 2001-12-18
论坛徽章:27
现任管理团队成员2007年度最佳版主    
      

发表于 2004-7-18 21:56 
为了重现客户的场景,我们作一次模拟操作:

首先,用控制文件作系统的全备份
PHP code:


C
:WUTemp>rman target sys/tuning



Recovery Manager
Release 9.2.0.1.0 Production



Copyright 
(c19952002Oracle Corporation.  All rights reserved.



connected to target databaseDEMO (DBID=3272375326)



RMANrun {

2allocate channel C1 type disk;

3backup full tag 'FullBackup' format 'd:KDE%d_%u_%s_%p.dbf' database include current controlfile;

4sql ' alter system archive log current';

5release channel C1;

6> }



using target database controlfile instead of recovery catalog

allocated channel
C1

channel C1
sid=15 devtype=DISK



Starting backup at 18
-JUL-04

channel C1
starting full datafile backupset

channel C1
specifying datafile(sin backupset

including current SPFILE in backupset

including current controlfile in backupset 

input datafile fno
=00001 name=D:ORACLEORADATADEMOSYSTEM01.DBF

input datafile fno
=00002 name=D:ORACLEORADATADEMOUNDOTBS01.DBF

input datafile fno
=00004 name=D:ORACLEORADATADEMOEXAMPLE01.DBF

input datafile fno
=00009 name=D:ORACLEORADATADEMOXDB01.DBF

input datafile fno
=00005 name=D:ORACLEORADATADEMOINDX01.DBF

input datafile fno
=00008 name=D:ORACLEORADATADEMOUSERS01.DBF

input datafile fno
=00003 name=D:ORACLEORADATADEMODRSYS01.DBF

input datafile fno
=00006 name=D:ORACLEORADATADEMOODM01.DBF

input datafile fno
=00007 name=D:ORACLEORADATADEMOTOOLS01.DBF 

channel C1
starting piece 1 at 18-JUL-04

channel C1
finished piece 1 at 18-JUL-04

piece handle
=D:KDEDEMO_01FR79OT_1_1.DBF comment=NONE

channel C1
backup set completeelapsed time00:01:17

Finished backup at 18
-JUL-04



sql statement
:  alter system archive log current



released channel
__________________
我的Blog: www.dbanotes.net   

点击即可用 Google Reader 订阅   



4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
不想做厨师的裁缝不是好司机
只看该作者    顶部
在线/呼叫 Fenng
版主


精华贴数 32
个人空间 0
技术积分 52805 (11)
社区积分 6575 (207)
注册日期 2001-12-18
论坛徽章:27
现任管理团队成员2007年度最佳版主    
      

发表于 2004-7-18 22:01 
模拟错误

模拟错误,关掉实例,删掉所有的控制文件和所有的.DBF文件。然后
starup :

SQL> startup
ORACLE instance started.

Total System Global Area  152115804 bytes
Fixed Size                   453212 bytes
Variable Size             100663296 bytes
Database Buffers           50331648 bytes
Redo Buffers                 667648 bytes
ORA-00205: error in identifying controlfile, check alert log for more info

现在情形和客户问题一致了


__________________
我的Blog: www.dbanotes.net   

点击即可用 Google Reader 订阅   



4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
不想做厨师的裁缝不是好司机
只看该作者    顶部
在线/呼叫 Fenng
版主


精华贴数 32
个人空间 0
技术积分 52805 (11)
社区积分 6575 (207)
注册日期 2001-12-18
论坛徽章:27
现任管理团队成员2007年度最佳版主    
      

发表于 2004-7-18 22:04 
背景知识:

在Oracle 816 以后的版本中,Oracle提供了一个包BMS_BACKUP_RESTORE.

DBMS_BACKUP_RESTORE 包是由dbmsbkrs.sql 和 prvtbkrs.plb 这两个脚本创建的.catproc.sql 脚本运行

后会调用这两个包.所以是每个数据库都有的这个包是Oracle服务器和操作系统之间IO操作的接口.由恢复管理器直接调用。

由此可见,我们可以在数据库nomount 情况下调用这些package ,来达到我们的恢复目的。

在dbmsbkrs.sql 和prvtbkrs.plb 这两个脚本中有详细的说明文档,就不一一加以翻译了。

关键的内容有:

FUNCTION deviceAllocate( type    IN  varchar2 default NULL
                          ,name    IN  varchar2 default NULL
                          ,ident   IN  varchar2 default NULL
                          ,noio    IN  boolean  default FALSE
                          ,params  IN  varchar2 default NULL )
    RETURN varchar2;

  -- Describe the device to be used for sequential I/O. For device types where
  -- only one process at a time can use a device, this call allocates a device
  -- for exclusive use by this session. The device remains allocated until
  -- deviceDeallocate is called or session termination. The device can be used
  -- both for creating and restoring backups.
  --
  -- Specifying a device allocates a context that exists until the session
  -- terminates or deviceDeallocate is called. Only one device can be specified
  -- at a time for a particular session. Thus deviceDeallocate must be called
  -- before a different device can be specified. This is not a limitation since
  -- a session can only read or write one backup at a time.
  --
  -- The other major effect of allocating a device is to specify the name space
  -- for the backup handles (file names). The handle for a sequential file does
  -- not necessarily define the type of device used to write the file. Thus it
  -- is necessary to specify the device type in order to interpret the file
  -- handle. The NULL device type is defined for all systems. It is the file
  -- system supplied by the operating system. The sequential file handles are
  -- thus normal file names.
  --
  -- A device can be specified either by name or by type.
  --    If the type is specified but not the name, the system picks an
  --    available device of that type.
  --    If the name is specified but not the type, the type is determined
  --    from the device.
  --    If neither the type or the name is given, the backups are files in
  --    the operating system file system.

  -- Note that some types of devices, optical disks for example, can be shared
  -- by many processes, and thus do not really require allocation of the device
  -- itself. However we do need to allocate the context for accessing the
  -- device, and we do need to know the device type for proper interpretation
  -- of the file handle. Thus it is always necessary to make the device
  -- allocation call before making most other calls in this package.
  --
  -- Input parameters:
  --   type
  --     If specified, this gives the type of device to use for sequential
  --     I/O. The allowed types are port specific. For example a port may
  --     support the type "TAPE" which is implemented via the Oracle tape
  --     API. If no type is specified, it may be implied by specifying a
  --     particular device name to allocate. The type should be allowed to
  --     default to NULL if operating system files are to be used.
  --
  --   name
  --     If specified, this names a particular piece of hardware to use for
  --     accessing sequential files. If not specified, any available
  --     device of the correct type will be allocated. If the device cannot
  --     be shared, it is allocated to this session for exclusive use.
  --     The name should be allowed to default to NULL if operating system
  --     files are to be used.
  --
  --   ident
  --     This is the users identifier that he uses to name this device. It
  --     is only used to report the status of this session via
  --     dbms_application_info.  This value will be placed in the CLIENT_INFO
  --     column of the V$SESSION table, in the row corresponding to the
  --     session in which the device was allocated.  This value can also
  --     be queried with the dbms_application_info.read_client_info procedure.
  --
  --   noio
  --     If TRUE, the device will not be used for doing any I/O. This allows
  --     the specification of a device type for deleting sequential files
  --     without actually allocating a piece of hardware. An allocation for
  --     noio can also be used for issuing device commands. Note that some
  --     commands may actually require a physical device and thus will get
  --     an error if the allocate was done with noio set to TRUE.
  --
  --   params
  --     This string is simply passed to the device allocate OSD. It is
  --     completely port and device specific.
  --
  -- Returns:
  --   It returns a valid device type. This is the type that should be
  --   allocated to access the same sequential files at a later date. Note
  --   that this might not be exactly the same value as the input string.
  --   The allocate OSD may do some translation of the type passed in. The
  --   return value is NULL when using operating system files.


  PROCEDURE restoreControlfileTo(cfname IN varchar2);

  -- This copies the controlfile from the backup set to an operating system
  -- file. If the database is mounted, the name must NOT match any of the
  -- current controlfiles.
  --
  -- Input parameters:
  --   cfname
  --     Name of file to create or overwrite with the controlfile from the
  --     backup set.


  PROCEDURE restoreDataFileTo( dfnumber  IN  binary_integer
                              ,toname    IN  varchar2       default NULL);
  --
  -- restoreDataFileTo creates the output file from a complete backup in the
  -- backup set.


等等。


__________________
我的Blog: www.dbanotes.net   

点击即可用 Google Reader 订阅   



4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
不想做厨师的裁缝不是好司机
只看该作者    顶部
在线/呼叫 Fenng
版主


精华贴数 32
个人空间 0
技术积分 52805 (11)
社区积分 6575 (207)
注册日期 2001-12-18
论坛徽章:27
现任管理团队成员2007年度最佳版主    
      

发表于 2004-7-18 22:11 
我们首先尝试恢复控制文件

SQL>startup force nomount;

SQL> DECLARE
  2  devtype varchar2(256);
  3  done boolean;
  4  BEGIN
  5  devtype:=sys.dbms_backup_restore.deviceAllocate(type=>'',ident=>'T1');
  6  sys.dbms_backup_restore.restoreSetDatafile;
  7  sys.dbms_backup_restore.restoreControlfileTo(cfname=>'d:\oracle\Control01.ctl');
  8  sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'D:\KDE\DEMO_01FR79OT_1_1.DBF', params=>null);
  9  sys.dbms_backup_restore.deviceDeallocate;
10  END;
11  /

PL/SQL procedure successfully completed.

SQL>

对以上内容的解释:

第五行 分配一个device channel  ,因为使用的操作系统文件,所以这里为空,如果是从磁带上恢复要用"sbt_tape"
第六行 开始restore
第七行 指出待恢复文件目标存储位置
第八行 从哪个备份片中恢复
第九行 释放设备通道


__________________
我的Blog: www.dbanotes.net   

点击即可用 Google Reader 订阅   



4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
不想做厨师的裁缝不是好司机
只看该作者    顶部
在线/呼叫 Fenng
版主


精华贴数 32
个人空间 0
技术积分 52805 (11)
社区积分 6575 (207)
注册日期 2001-12-18
论坛徽章:27
现任管理团队成员2007年度最佳版主    
      

发表于 2004-7-18 22:13 
SQL> host dir d:\oracle
Volume in drive D is DATA
Volume Serial Number is DC79-57F8

Directory of d:\oracle

07/18/2004  09:08 PM    <DIR>          .
07/18/2004  09:08 PM    <DIR>          ..
06/08/2004  03:21 PM    <DIR>          admin
07/18/2004  09:08 PM         1,871,872 CONTROL01.CTL  
07/16/2004  11:27 AM    <DIR>          ORA92
07/18/2004  09:02 PM    <DIR>          oradata

已经restore成功 .如果控制文件在Full备份之后单独做的,接下来关掉实例,拷贝控制文件到具体位置,然后rman 执行restore database;即可。

可是,我们这里的不是哦


__________________
我的Blog: www.dbanotes.net   

点击即可用 Google Reader 订阅   



4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
不想做厨师的裁缝不是好司机
只看该作者    顶部
在线/呼叫 Fenng
版主


精华贴数 32
个人空间 0
技术积分 52805 (11)
社区积分 6575 (207)
注册日期 2001-12-18
论坛徽章:27
现任管理团队成员2007年度最佳版主    
      

发表于 2004-7-18 22:17 
PHP code:


SQL
> DECLARE

  
2  devtype varchar2(256);

  
3  done boolean;

  
4  BEGIN

  5  devtype
:=sys.dbms_backup_restore.deviceAllocate (type=>'',ident=>'t1');

  
6  sys.dbms_backup_restore.restoreSetDatafile;

  
7  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>01,toname=>'d:oracleo

radatademoSYSTEM01.DBF'
);

  
8  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>02,toname=>'d:oracleo

radatademoUNDOTBS01.DBF'
);

  
9  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>03,toname=>'d:oracleo

radatademoDRSYS01.DBF'
);

 
10  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>04,toname=>'d:oracleo

radatademoEXAMPLE01.DBF'
);

 
11  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>05,toname=>'d:oracleo

radatademoINDX01.DBF'
);

 
12  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>06,toname=>'d:oracleo

radatademoODM01.DBF'
);

 
13  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>07,toname=>'d:oracleo

radatademoTOOLS01.DBF'
);

 
14  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>08,toname=>'d:oracleo

radatademoUSERS01.DBF'
);

 
15  sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>09,toname=>'d:oracleo

radatademoXDB01.DBF'
);

 
16  sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'D:KDEDEMO_

01FR79OT_1_1.DBF'
params=>null);

 
17  sys.dbms_backup_restore.deviceDeallocate;

 
18  END;

 
19  /



PL/SQL procedure successfully completed.





--
我们的情形是所有的数据文件都丢失了,那就如法炮制 ...........





SQLstartup force mount;

ORACLE instance started.



Total System Global Area  152115804 bytes

Fixed Size                   453212 bytes

Variable Size             100663296 bytes

Database Buffers           50331648 bytes

Redo Buffers                 667648 bytes

Database mounted
.

SQLRecover database using backup controlfile until cancel ;

ORA-00279change 243854 generated at 07/18/2004 20:57:03 needed for thread 1

ORA
-00289suggestion D:KDEARC00002.001

ORA
-00280change 243854 for thread 1 is in sequence #2



Specify log: {<RET>=suggested filename AUTO CANCEL}



D:KDEARC00002.001 

--手工指定

ORA
-00279change 244089 generated at 07/18/2004 20:58:18 needed for thread 1

ORA
-00289suggestion D:KDEARC00003.001

ORA
-00280change 244089 for thread 1 is in sequence #3

ORA-00278log file 'D:KDEARC00002.001' no longer needed for this recovery





Specify log
: {<RET>=suggested filename AUTO CANCEL}

cancel

Media recovery cancelled
.



SQLalter database open resetlogs;

Database altered

最后,不得不resetlogs 

然后检查数据,用户可能不得不忍受

然后,打扫战场,马上进行数据库的全备份。和用户商议制定并完善备份计划。


__________________
我的Blog: www.dbanotes.net   

点击即可用 Google Reader 订阅   



4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
不想做厨师的裁缝不是好司机
只看该作者    顶部
在线/呼叫 Fenng
版主


精华贴数 32
个人空间 0
技术积分 52805 (11)
社区积分 6575 (207)
注册日期 2001-12-18
论坛徽章:27
现任管理团队成员2007年度最佳版主    
      

发表于 2004-7-18 22:27 
总结一下:

1 控制文件在备份中意义重大,建议每次对其单独备份。同时应该增大CONTROL_FILE_RECORD_KEEP_TIME这个初始化参数的值。以便备份信息能更长时间的保留

2 应该制定比较完善的备份计划,否则备份计划一旦出现缺口,将可能带来灾难。‘可能出错的地方一定会出错’

3 熟悉RMAN内部备份机制,对DBMS_BACKUP_RESTORE的用法有一定的掌握在关键时侯很有帮助。


参考资料:

RMAN Recovery Without Recovery Catalog or Controlfiles by Bonnie Bizzaro   

dbmsbkrs.sql 和 prvtbkrs.plb 文件说明注释 $ORACLE_HOME/rdbms/admin/

相关链接:

DBA工作备忘录之二: Exp出错的一个案例
http://www.itpub.net/showthread.php?s=&threadid=238819

DBA工作备忘录之一:用events 跟踪解决不能创建物化试图一例
http://www.itpub.net/showthread.php?s=&threadid=222794


__________________
我的Blog: www.dbanotes.net   

点击即可用 Google Reader 订阅   



4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
不想做厨师的裁缝不是好司机
只看该作者    顶部
离线 ZALBB
正在看黑山老妖


精华贴数 8
个人空间 0
技术积分 27654 (29)
社区积分 13562 (97)
注册日期 2001-10-15
论坛徽章:45
      
      

发表于 2004-7-18 23:00 
FENNG,当恢复了控制文件后,为什么说不可以使用RMAN来恢复数据文件呢?
我认为是可以的,只要RMAN会使用控制文件里的路径来找到最后备份的那个日志
即可。


__________________
三民主义统一中国。
只看该作者    顶部
在线/呼叫 Fenng
版主


精华贴数 32
个人空间 0
技术积分 52805 (11)
社区积分 6575 (207)
注册日期 2001-12-18
论坛徽章:27
现任管理团队成员2007年度最佳版主    
      

发表于 2004-7-18 23:05 


QUOTE:
最初由 ZALBB 发布
FENNG,当恢复了控制文件后,为什么说不可以使用RMAN来恢复数据文件呢?
我认为是可以的,只要RMAN会使用控制文件里的路径来找到最后备份的那个日志
即可。


开始我也这么认为的,不过在实际做的过程中发现是有问题的

和Full备份一起的控制文件并没有备份的信息-因为要等备份完毕之后相关信息才会写到控制文件中.

所以,已经备份的控制文件里面没有相关的信息


__________________
我的Blog: www.dbanotes.net   

点击即可用 Google Reader 订阅   



4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
不想做厨师的裁缝不是好司机
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问