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


您有 2 条公共消息
  • 来自: 公共消息 标题: 3-5月ITPUB数据库 ... 内容: ITPUB与3月和5月分别安排了Oracle 11g DBA和Oracle性能优化培训,以及 ...
  • 来自: 公共消息 标题: ITPUB邮箱已经恢复 内容: ITPUB邮箱用户请注意,邮箱现在已经恢复 web访问地址 http://emai ...

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


    精华贴数 32
    个人空间 0
    技术积分 53656 (12)
    社区积分 6636 (294)
    注册日期 2001-12-18
    论坛徽章:36
    现任管理团队成员2007年度最佳版主2009架构师大会纪念徽章ITPUB北京2009年会纪念徽章2010新春纪念徽章2010新春纪念徽章
    祖国60周年纪念徽章生肖徽章2007版:鼠生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章2007版:蛇 

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

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

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

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

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

    我们来看以下的步骤。


    __________________
    我的Blog: www.dbanotes.net   


    点击即可用 Google Reader 订阅   

    支付宝官方Blog

    4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
    不想做厨师的裁缝不是好司机






    《Oracle性能诊断艺术》出版了
    只看该作者    顶部
    离线 Fenng
    版主


    精华贴数 32
    个人空间 0
    技术积分 53656 (12)
    社区积分 6636 (294)
    注册日期 2001-12-18
    论坛徽章:36
    现任管理团队成员2007年度最佳版主2009架构师大会纪念徽章ITPUB北京2009年会纪念徽章2010新春纪念徽章2010新春纪念徽章
    祖国60周年纪念徽章生肖徽章2007版:鼠生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章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 订阅   

    支付宝官方Blog

    4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
    不想做厨师的裁缝不是好司机






    《Oracle性能诊断艺术》出版了
    只看该作者    顶部
    离线 Fenng
    版主


    精华贴数 32
    个人空间 0
    技术积分 53656 (12)
    社区积分 6636 (294)
    注册日期 2001-12-18
    论坛徽章:36
    现任管理团队成员2007年度最佳版主2009架构师大会纪念徽章ITPUB北京2009年会纪念徽章2010新春纪念徽章2010新春纪念徽章
    祖国60周年纪念徽章生肖徽章2007版:鼠生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章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 订阅   

    支付宝官方Blog

    4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
    不想做厨师的裁缝不是好司机






    《Oracle性能诊断艺术》出版了
    只看该作者    顶部
    离线 Fenng
    版主


    精华贴数 32
    个人空间 0
    技术积分 53656 (12)
    社区积分 6636 (294)
    注册日期 2001-12-18
    论坛徽章:36
    现任管理团队成员2007年度最佳版主2009架构师大会纪念徽章ITPUB北京2009年会纪念徽章2010新春纪念徽章2010新春纪念徽章
    祖国60周年纪念徽章生肖徽章2007版:鼠生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章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 订阅   

    支付宝官方Blog

    4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
    不想做厨师的裁缝不是好司机






    《Oracle性能诊断艺术》出版了
    只看该作者    顶部
    离线 Fenng
    版主


    精华贴数 32
    个人空间 0
    技术积分 53656 (12)
    社区积分 6636 (294)
    注册日期 2001-12-18
    论坛徽章:36
    现任管理团队成员2007年度最佳版主2009架构师大会纪念徽章ITPUB北京2009年会纪念徽章2010新春纪念徽章2010新春纪念徽章
    祖国60周年纪念徽章生肖徽章2007版:鼠生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章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 订阅   

    支付宝官方Blog

    4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
    不想做厨师的裁缝不是好司机






    《Oracle性能诊断艺术》出版了
    只看该作者    顶部
    离线 Fenng
    版主


    精华贴数 32
    个人空间 0
    技术积分 53656 (12)
    社区积分 6636 (294)
    注册日期 2001-12-18
    论坛徽章:36
    现任管理团队成员2007年度最佳版主2009架构师大会纪念徽章ITPUB北京2009年会纪念徽章2010新春纪念徽章2010新春纪念徽章
    祖国60周年纪念徽章生肖徽章2007版:鼠生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章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 订阅   

    支付宝官方Blog

    4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
    不想做厨师的裁缝不是好司机






    《Oracle性能诊断艺术》出版了
    只看该作者    顶部
    离线 Fenng
    版主


    精华贴数 32
    个人空间 0
    技术积分 53656 (12)
    社区积分 6636 (294)
    注册日期 2001-12-18
    论坛徽章:36
    现任管理团队成员2007年度最佳版主2009架构师大会纪念徽章ITPUB北京2009年会纪念徽章2010新春纪念徽章2010新春纪念徽章
    祖国60周年纪念徽章生肖徽章2007版:鼠生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章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 订阅   

    支付宝官方Blog

    4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
    不想做厨师的裁缝不是好司机






    《Oracle性能诊断艺术》出版了
    只看该作者    顶部
    离线 Fenng
    版主


    精华贴数 32
    个人空间 0
    技术积分 53656 (12)
    社区积分 6636 (294)
    注册日期 2001-12-18
    论坛徽章:36
    现任管理团队成员2007年度最佳版主2009架构师大会纪念徽章ITPUB北京2009年会纪念徽章2010新春纪念徽章2010新春纪念徽章
    祖国60周年纪念徽章生肖徽章2007版:鼠生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章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 订阅   

    支付宝官方Blog

    4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
    不想做厨师的裁缝不是好司机






    《Oracle性能诊断艺术》出版了
    只看该作者    顶部
    离线 ZALBB


    精华贴数 8
    个人空间 0
    技术积分 40757 (23)
    社区积分 18469 (110)
    注册日期 2001-10-15
    论坛徽章:130
    现任管理团队成员     
          

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


    __________________
    对内,共匪什么都要,就是不要脸;对外,共匪什么都不要,就是要脸。
    只看该作者    顶部
    离线 Fenng
    版主


    精华贴数 32
    个人空间 0
    技术积分 53656 (12)
    社区积分 6636 (294)
    注册日期 2001-12-18
    论坛徽章:36
    现任管理团队成员2007年度最佳版主2009架构师大会纪念徽章ITPUB北京2009年会纪念徽章2010新春纪念徽章2010新春纪念徽章
    祖国60周年纪念徽章生肖徽章2007版:鼠生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章2007版:蛇 

    发表于 2004-7-18 23:05 


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


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

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

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


    __________________
    我的Blog: www.dbanotes.net   


    点击即可用 Google Reader 订阅   

    支付宝官方Blog

    4nyth1n9 th4t can 90 wr0n9 wi11 9o wr0ng  
    不想做厨师的裁缝不是好司机






    《Oracle性能诊断艺术》出版了
    只看该作者    顶部
    相关内容


    CopyRight 1999-2006 itpub.net All Right Reserved.
    北京皓辰网域网络信息技术有限公司. 版权所有
    E-mail:Webmaster@itpub.net
    网站律师 隐私政策 知识产权声明
    京ICP证:060528号 联系我们