青豆的魔法橱_首页_软件测试专业网站:51Testing软件测试网 - powered by X-Space

日历

« 2008-05-19  
    123
45678910
11121314151617
18192021222324
25262728293031

统计信息

  • 访问量: 250
  • 日志数: 12
  • 建立时间: 2007-11-20
  • 更新时间: 2007-11-20

RSS订阅

相逢即是有缘,相知即是幸运。快乐的生活最重要了,祝我的好朋友们天天开心~

我的最新日志

  • Oracle备份与恢复案例(12)【转帖】

    2007-11-20

    5.3.2数据库关闭,但是数据文件中没有活动事务

    这种情况下最简单的方法就是offline drop掉这个坏了的或者丢失的数据文件,然后以restricted模式打开数据库然后删除并且重建包含损坏文件的回滚段表空间。

     

    具体步骤如下:

    1 确定数据库是正常的关闭的。方法是可以去查看alert文件,到最后看是否有如下信息:

    "alter database dismount

    Completed: alter database dismount"

    如果有的话,就证明数据库是正常关闭的,否则就不能用这个方法去恢复。

    2 修改init参数文件,移去ROLLBACK_SEGMENTS中包含的损坏数据文件的回滚段表空间的回滚段,如果你不能确定哪些回滚段是坏的,简单的方法是你可以注释掉整个ROLLBACK_SEGMENTS

    3 restricted模式去mount数据库。

    STARTUP RESTRICT MOUNT

    4 offline drop掉那个坏的数据文件

    ALTER DATABASE DATAFILE '<full_path_file_name>' OFFLINE DROP;

    5 打开数据库

    ALTER DATABASE OPEN

    如果你看到如下信息"Statement processed",则跳到第7步,如果你看到ORA-604, ORA-376, and ORA-1110的错误信息,继续第6步。

    6、  正常的关闭数据库,然后在init文件中注释掉ROLLBACK_SEGMENTS,并加入隐含参数

    _corrupted_rollback_segments = ( <rollback1>,...., <rollbackN> )

    然后以restricted模式打开数据库

    STARTUP RESTRICT

    7 删除掉那个包含损坏文件的回滚段表空间。

    DROP TABLESPACE <tablespace_name> INCLUDING CONTENTS;

    8 重建回滚段表空间,记得创建后要把回滚段都online

    9 重新使数据库对所有用户可用。

    ALTER SYSTEM DISABLE RESTRICTED SESSION;

    10、然后正常关闭数据库,修改init文件,如果开始只是注释掉了ROLLBACK_SEGMENTS的,就去掉注释即可,如果加了隐含参数的,注释掉它,并在ROLLBACK_SEGMENTS加入所有的回滚段。

    11、正常启动数据库:

    Startup

    注:

    1、这种方法的前提条件是数据库是正常关闭(不是abort)可用;

    2、这种方法是正常方法,不会引起数据错误。

    5.3.3 数据库关闭,数据文件中有活动事务,没有可用备份。

    一般造成这种原因的情况是采用了shutdown abort或其它原因异常关机(如断电)导致的。

     

    1、开启一个事务

    SQL> set transaction use rollback segment rbs0;

    Transaction set.

    SQL> insert into test (a) values (1);

    1 row created.

     

    2、异常关闭

    SQL> shutdown abort;

    Oracle instance shut down.

     

    3、删除rbs的一个数据文件

    C:>del D:\Oracle\oradata\chen\rbs01.

     

    4、修改INIT<sid>.ora :

    rollback_segments=(system)

    添加_corrupted_rollback_segments=(rbs0,rbs1,rbs2……)

     

    5SQL>Startup mount

     

    6SQL>alter database datafile 'd:\Oracle\oradata\t8i\rbs01.dbf' offline drop;

    数据库已更改。

     

    7SQL>recover database

    完成介质恢复。

     

    8SQL>alter database open ;

    数据库已更改。

     

    9SQL>select * from v$rollname;

     

           USN   NAME

    ----   -------

             0     SYSTEM

     

    10SQL>select segment_name,tablespace_name,status
    FROM dba_rollback_segs;


    SEGMENT_NAME    TABLESPACE_NAME       STATUS

    ----------- ------ ------------------------------------

    SYSTEM          SYSTEM                ONLINE

    RBS0         RBS                NEEDS RECOVERY

    RBS1         RBS                NEEDS RECOVERY

    RBS2         RBS                NEEDS RECOVERY

     

    11SQL>drop rollback segment rbs0;

    重算段已丢弃。

        SQL>drop rollback segment rbs1;

    重算段已丢弃。

        SQL>drop rollback segment rbs2;

    重算段已丢弃。

     

    12SQL>select segment_name,tablespace_name,status
    FROM dba_rollback_segs;


    SEGMENT_NAME    TABLESPACE_NAME    STATUS

    -------------------------------------

    SYSTEM          SYSTEM             ONLINE

     

    13SQL>drop tablespace rbs including contents;

    表空间已丢弃。

     

    14、重建新的回滚表空间及回滚段,并联机。

     

    15SQL>shutdown abort

     

    16、再修改INIT<sid>.ora

    rollback_segments=(rbs0,rbs1,rbs2)

    _corrupted_rollback_segments=(rbs0,rbs1,rbs2)去掉。

     

    17SQL>startup

     

    注:

    1、这种办法是万不得以的时候使用的方法,如果有备份,都建议从备份上进行恢复;

    2、这种方法恢复的数据库,可能会引起数据库的数据错误;

    3、恢复成功以后,建议exp/imp数据,并重新分析检查数据库。

    5.3.4 数据库关闭,数据文件中有活动事务,从备份恢复

    1、从一个有效的备份中恢复损坏的数据文件。

    2mount数据库。

    3、执行以下查询:

    SELECT FILE#, NAME, STATUS FROM V$DATAFILE;

    如果发现要恢复的文件是offline状态的话,要先online它:

    ALTER DATABASE DATAFILE '<full_path_file_name>' ONLINE;

    4、执行以下查询

    SELECT V1.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE#

    FROM V$LOG V1, V$LOGFILE V2

    WHERE V1.GROUP# = V2.GROUP# ;

    这个将列出redlog文件所代表的sequencefirst change numbers

     

    5、如果数据库是非归档情况下,执行以下查询:

    SELECT FILE#, CHANGE# FROM V$RECOVER_FILE;

    如果CHANGE#大于最小的redolog文件的FIRST_CHANGE#,则数据文件可以被恢复,记得在应用日志的时候要把所有redolog文件全部应用一遍。


    如果CHANGE#小于最小的redolog文件的FIRST_CHANGE#,则数据文件就不可以被恢复了,这时候你要从一个有效的全备份中去恢复数据库了,如果没有全备份的话,那你就只能把数据库强制打开到一个不一致的状态去exp出数据,然后重新建库导入数据,因为这种方式的恢复Oracle 查看(26) 评论(0)

  • Oracle备份与恢复案例(11)【转帖】

    2007-11-20

    5.2 损坏控制文件的恢复方法

    5.2.1 损坏单个控制文件

    损坏单个控制文件是比较容易恢复的,因为一般的数据库系统,控制文件都不是一个,而且所有的控制文件都互为镜相,只要拷贝一个好的控制文件替换坏的控制文件就可以了。

     

    1 控制文件损坏,最典型的就是启动数据库出错,不能mount数据库

    SQL>startup

    ORA-00205: error in identifying controlfile, check alert log for more info

    查看报警日志文件,有如下信息

    alter database  mount

    Mon May 26 11:59:52 2003

    ORA-00202: controlfile: 'D:\Oracle\oradata\chen\control01.ctl'

    ORA-27041: unable to open file

    OSD-04002: unable to open file

    O/S-Error: (OS 2) 系统找不到指定的文件。

     

    2 停止数据库:

    SQL>shutdown immediate

     

    3 拷贝一个好的控制文件替换坏的控制文件或修改init.ora中的控制文件参数,取消这个坏的控制文件。

     

    4 重新启动数据:

    SQL>startup

     

    注:

    1、损失单个控制文件是比较简单的,因为数据库中所有的控制文件都是镜相的,只需要简单的

    拷贝一个好的就可以了;

    2、建议镜相控制文件在不同的磁盘上;

    3、建议多做控制文件的备份,长期保留一份由alter database backup control file to trace产生的控制文件的文本备份。

    5.2.2 损坏全部控制文件

    损坏多个控制文件,或者人为的删除了所有的控制文件,通过控制文件的复制已经不能解决问题,这个时候需要重新建立控制文件。

     

    同时注意,alter database backup control file to trace可以产生一个控制文件的文本备份。


    以下是详细重新创建控制文件的步骤:

    1 关闭数据库

    SQL>shutdown immediate;

    2 删除所有控制文件,模拟控制文件的丢失

     

    3 启动数据库,出现错误,并不能启动到mount

    SQL>startup

    ORA-00205: error in identifying controlfile, check alert log for more info

    查看报警日志文件,有如下信息

    alter database  mount

    Mon May 26 11:53:15 2003

    ORA-00202: controlfile: 'D:\Oracle\oradata\chen\control01.ctl'

    ORA-27041: unable to open file

    OSD-04002: unable to open file

    O/S-Error: (OS 2) 系统找不到指定的文件。

     

    4 关闭数据库

    SQL>shutdown immediate;

     

    5 internalsys下运行如下创建控制文件的脚本,注意完整列出联机日志或数据文件的路径,或修改由alter database backup control file to trace备份控制文件时产生的脚本,去掉多余的注释即可。


    STARTUP NOMOUNT

    CREATE CONTROLFILE REUSE DATABASE "TEST" NORESETLOGS NOARCHIVELOG

              MAXLOGFILES 32

              MAXLOGMEMBERS 2

              MAXDATAFILES 254

              MAXINSTANCES 1

              MAXLOGHISTORY 226

    LOGFILE

        GROUP 1 'D:\Oracle\ORADATA\TEST\REDO01.LOG'  SIZE 1M,

        GROUP 2 'D:\Oracle\ORADATA\TEST\REDO02.LOG'  SIZE 1M,

        GROUP 3 'D:\Oracle\ORADATA\TEST\REDO03.LOG'  SIZE 1M

    DATAFILE

        'D:\Oracle\ORADATA\TEST\SYSTEM01.DBF',

        'D:\Oracle\ORADATA\TEST\RBS01.DBF',

        'D:\Oracle\ORADATA\TEST\USERS01.DBF',

        'D:\Oracle\ORADATA\TEST\TEMP01.DBF',

        'D:\Oracle\ORADATA\TEST\TOOLS01.DBF',

        'D:\Oracle\ORADATA\TEST\INDX01.DBF'

    CHARACTER SET ZHS16GBK;

     

    -- Recovery is required if any of the datafiles are restored backups,

    -- or if the last shutdown was not normal or immediate.

    RECOVER DATABASE

    --if the last shutdown was not normal or immediate

    --noarchive

    -- RECOVER DATABASE UNTIL CANCELUSING BACKUP CONTROLFILE

    --archive

    -- RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL

    -- Database can now be opened normally.

    ALTER DATABASE OPEN;

    --if recover database until cancel

    --ALTER DATABASE OPEN RESETLOGS;

    6 如果没有错误,数据库将启动到open状态下。

     

    注:

    1、重建控制文件用于恢复全部数据文件的损坏,需要注意其书写的正确性,保证包含了所有的数据文件与联机日志;

    2、经常有这样一种情况,因为一个磁盘损坏,我们不能再恢复(store)数据文件到这个磁盘,因此在store到另外一个盘的时候,我们就必须重新创建控制文件,用于识别这个新的数据文件,这里也可以用这种方法用于恢复。

    5.3 损坏回滚数据文件的恢复方法

    回滚段表空间中的一个数据文件丢失或者损坏导致数据库无法识别它,在启动数据库的时候会出现ORA-1157, ORA-1110的错误,或者操作系统级别的错误,例如ORA-7360。在关闭数据库的时候(normal或者immediate)会出现ORA-1116, ORA-1110的错误,或者操作系统级别的错误,例如ORA-7368

     

    感谢Coolyl的辛勤工作,关于回滚段的大部分内容都是摘自他在itpub的文章。

    5.3.1 损坏数据文件,但数据库处于Open状态

    如果你发现有回滚段的数据文件丢失或者损坏了,而此时的数据库是处于打开的状态下并且在运行,就千万不要关闭数据库了,因为在大多数的情况下打开的时候比关闭的时候好解决问题一些。

     

    一般也是存在有两种情况:

    A、是offline丢失或损坏的数据文件,然后从一个备份中恢复,执行介质恢复以保持一致性。但是这种情况要求数据库是归档方式下才可以采用的。

    B、是offline那个存在丢失或损坏的数据文件所在的整个回滚段表空间,然后删除整个回滚段表空间并重建,但是你必须要杀掉那些在回滚段中已经激活的用户进程才可以offline的。

    通常第一种情况就比较简单实现,但是更多的用户事务将会出错并且回滚。

     

    A的具体步骤:

    1 offline丢失或损坏的数据文件

    ALTER DATABASE DATAFILE '<full_path_file_name>' OFFLINE;

    2 从一个有效的备份中恢复。

    3 执行以下查询:

    SELECT V1.GROUP#, MEMBER, SEQUENCE#

    FROM V$LOG V1, V$LOGFILE V2

    WHERE V1.GROUP# = V2.GROUP# ;

    这个将列出你的所有redolog文件以及它们所代表的sequence numbers

    4 恢复数据文件。

    RECOVER DATAFILE '<full_path_file_name>'

    5 确信你应用了所有的redolog文件,直至出现提示信息"Media recovery complete"

    6