当前位置: 首页 > 图文教程 > 数据库 > Oracle > Oracle数据库备份与恢复(3):OS备份和用户管理

Oracle
Excel VBA连接并操作Oracle
Oracle 外连接实现代码
oracle 存储过程和函数例子
Oracle 数据库操作类
ORACLE 分区表的设计
Oracle 用户权限管理方法
Oracle In和exists not in和not exists的比较分析
利用windows任务计划实现oracle的定期备份
ORACLE11g随RHEL5系统自动启动与关闭的设置方法
在oracle 数据库查询的select 查询字段中关联其他表的方法
plsql和tsql常用函数比对
plsql与tsql的语法不同
ASP.NET调用oracle存储过程实现快速分页
执行drop表操作后数据库无法起动
分析Oracle有时会用索引来查找数据的原因
数据从MySQL迁移到 Oracle的注意事项
快速理解Oracle归档模式的命令及参数
在Oracle里加快SQL执行的三种方法
几条常见的数据库分页 SQL 语句
Oracle9I OCP认证过程

Oracle数据库备份与恢复(3):OS备份和用户管理


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-30   浏览: 179 ::
收藏到网摘: n/a

    用户管理的备份与恢复也称 OS物理备份,是指通过数据库命令设置数据库为备份 状态,然后用操作系统命令,拷贝需要备份或恢复的文件。这种备份与恢复需要用户的 参与手工或自动完成。

    对于使用 OS拷贝备份的数据文件,可以使用 DBVERTIFY  进行检验。DBVERTIFY是一个外部工具,主要用于校验数据文件或备份的数据文件的数据块是否正确。 例:

    dbv /u01/oradata/oracle/users01.dbf BLOCKSIZE=8192

    参数说明:

关键字                    说明                        (默认)

FILE
检验的文件
(NONE)
START
始块
(文件的第一个块)
END
束块
(文件的最后一个块)
BLOCKSIZE
逻辑块大小
(2048)
LOGFILE
出日志
(NONE)
FEEDBACK
显示进程
(0)

    Recover  还可以进行测试,检测恢复的错误,错误信息记载在  alert_SID.log  文件中,通过测试,我们可以知道该恢复操作是否能正常完成。

    SQL> RECOVER TABLESPACE sales TEST;

    SQL> RECOVER DATABASE UNTIL CANCEL TEST;

    3.1  相关设置

    3.1.1  设置ARCHIVELOG与NONARCHIVELOG模式

    重做日志组是以循环方式使用的,重做日志组会被覆盖重做日志信息就会丢失。为了保存历史以来的重做日志,数据库可以运行在日志归档模式下(archivelog mode)。 在日志归档模式下,当日志组撤换到下一个组时后台进程  ARCn  将上一个日志文件复制到另一个地方(oracle 10g  使用快速恢复区会归档到该区)保存。数据库默认为非归档模式(noarchivelog mode)。

    设置ARCHIVELOG模式步骤:

    1.  关闭数据库,备份已有的数据,改变数据库的运行方式是对数据库的重要改动,所以要对数据库做备份,对可能出现的问题作出保护。

    2.  修改初试化参数:  使用 PFILE,修改初始化参数文件 init[SID].ora log_archive_start=true #启动自动归档 log_archive_format=ARC%T%S.arc #归档文件格式 log_archive_dest=/arch12/arch             #归档路径

    3.  启动 Instance 到 Mount状态,即加载数据库但不打开数据库:SQL > startup mount;

    4.  发出修改命令SQL > alter database archivelog; SQL > alter database open;设置 NONARCHIVELOG模式步骤同上,只需修改相应参数值即可。

    3.1.2 LOGGING  与  NOLOGGING

    表空间、表、索引、分区可以设置为  NOLOGGING,用于快速装入数据(Direct Load)。 在插入数据时只写入最小的重做日志和回滚数据。在归档数据库模式下,执行  Direct  Load 操作后应立即进行备份,否则不能使用之前的备份进行恢复。另外,用户可以设置数据库的 强制日志模式,使用所有操作都记入日志。

    LOGGING  与  NOLOGGING  的区别:

LOGGING
NOLOGGING
所有的更改写入 REDO
最小写入 REDO LOG
从最近备份中完全恢复
不能从最近备份中完全恢复
不需要增加备份
需要增加备份

    NOLOGGING  的操作:

    CREATE TABLE … NOLOGGING AS SELECT    语句

    INSERT /*+APPEND*/    INTO <表> NOLOGGING    SELECT  语句

    INSERT /*+ PARALLEL(<表>,<n>)达式*/ INTO <表> NOLOGGING SELECT  语句

    SQL*LOADER的DIRECT 方法

    例:

    SQL>CREATE TABLE emp1 NOLOGGING AS SELECT * FROM emp; SQL>SELECT name,unrecoverable_time FROM V$DATAFILE;

    SQL>INSERT /*+ APPEND */ INTO emp1 NOLOGGING SELECT* * FROM emp; SQL>SELECT name,unrecoverable_time FROM V$DATAFILE;

    SQL>ALTER DATABASE NO FORCE LOGGING;

    3.1.3  归档路径

    在归档模式下进行自动归档时,或者在恢复时设置归档所在的位置,需要设置归档路径初始化参数:

    LOG_ARCHIVE_DEST_n=“LOCATION=path MANDATORY|OPTIONAL REOPEN=n”

    LOG_ARCHIVE_DEST_n=“SERVICE=standby MANDATORY|OPTIONAL REOPEN=n

    3.2 NONARCHIVELOG 模式

    3.2.1  脱机冷备与恢复

    冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。冷备份是将关键性文件拷贝到另外位置的一种说法。对于备份  Oracle  信息而言,冷备份是最快和最安全的方法。

    冷备份的优点:

    1.是非常快速的备份方法(只需拷贝文件)

    2.容易归档(简单拷贝即可)

    3.容易恢复到某个时间点上(只需将文件再拷贝回去)

    4.能与归档方法相结合,作数据库“最新状态”的恢复。

    5.低度维护,高度安全。

    冷备份的不足:

    1.单独使用时,只能提供到“某一时间点上”的恢复。

    2.在实施备份的全过程中,数据库必须要作备份而不能作其它工作。也就是说,在冷备份过程中,数据库必须是关闭状态。

    3.若磁盘空间有限,只能拷贝到磁带等其它外部存储设备上,速度会很慢。

    4.不能按表或按用户恢复。

    如果可能的话(主要看效率),应将信息备份到磁盘上,然后启动数据库(使用户可以 工作)并将所备份的信息拷贝到磁带上(拷贝的同时,数据库也可以工作)。冷备份中必须 拷贝的文件包括:1.所有数据文件2.所有控制文件3.所有联机 REDO LOG 文件4.参数化参数 Init.ora 文件(可选)。

    3.2.2  案例

    1.9i  脱机冷备/恢复的例子:

    (1)  关闭数据库

    $ sqlplus /nolog

    SQL> connect /as sysdba

    SQL> shutdown normal;

    (2)  用拷贝命令备份/恢复全部的时间文件、重做日志文件、控制文件、初始化参数 文件SQL > host cp    xx       xx;

    可以使用以下冷备脚本:

    #!/bin/bash

    ##################################################################

    ##    名称:    coldback_gen.sh

    ##    功能:    本 shell 用于生成冷备份脚本, 进行冷备份同时生成相应的恢复命令

    ##  可以修改后在生成后立即执行

    ## 编者:

    ## 日期: 2006.12.13.

    ##################################################################

    ##设置变量

    ##设置临时文件名

    tempsql=./backup.sql

    ##设置备份文件存放路径

    backdate=`date -u +%Y%m%d`

    backupdir=/u04/oracle/coldback/$backdate

    mkdir $backupdir

    ##设置备份脚本文件名

    backupsh=$backupdir/coldback.sh

    rcvrsh=$backupdir/recovery.sh

    echo "正在生成冷备份脚本[$backupsh]……"

    ##检查 ORACLE数据库是否启动

    oraisrun=`ps -ef|grep -c ora_`

    if [ "$oraisrun" = "0" ] || [ "$oraisrun" = "1" ]

    then

    echo "

    ORACLE 数据库尚未启动,请先启动 ORACLE"

    echo ""

    exit

    fi

    ##准备工作

    echo "set heading off     " > $tempsql

    echo "set feedback off   " >>$tempsql

    echo "set tab off              " >>$tempsql

    echo "set verify off        " >>$tempsql

    echo "set pagesize 0"           >>$tempsql

    echo "set linesize 800    " >>$tempsql

    echo "select '#!/bin/bash' from dual;"          >> $tempsql

    echo "select ''                           from dual;"          >> $tempsql

    echo  "select  '##  备份脚本生成时间:  "  `date  +%Y 年%m月%d日-%H:%M:%S`  "'

    from dual;" >> $tempsql

    echo "select '##  备份目的路径: $backupdir' from dual; "        >> $tempsql

    echo "select '' from dual; " >> $tempsql

    echo "" echo "select 'echo ''开始进行脱机冷备……''' from dual; "               >> $tempsql

    echo "select 'echo ''备份目的路径: $backupdir ''' from dual; "      >> $tempsql

    ##这里不直接关闭数据库,提示用户手工关闭为好。如果需要直接关闭,请修改

    echo "select 'orarun='||'\`'||'ps -ef|grep -c ora_'||'\`' from dual;" >>$tempsql

    echo "select 'if [ "\$orarun" != "0" ] && [ "\$orarun" != "1" ]    ' from dual;" >>$tempsql

    echo "select 'then' from dual; " >>$tempsql

    echo "select 'echo '' '' ' from dual;" >>$tempsql

    echo "select 'echo ''ORACLE 数据库已启动,请先关闭 ORACLE 数据库'' ' from dual;"

     >>$tempsql echo "select '

    echo '' '' ' from dual;" >>$tempsql

    echo "select 'exit' from dual; "      >>$tempsql

    echo "select 'fi'       from dual; "      >>$tempsql

    echo "select 'echo '' '' ' from dual; "    >> $tempsql

    echo "select 'echo ''正在备份控制文件……''' from dual; "    >> $tempsql

    echo "select 'cp ' ||name||' $backupdir' from v\$controlfile; "    >> $tempsql

    echo "select 'echo ''控制文件备份完毕!''' from dual; "    >> $tempsql

    echo "select 'echo '' '' ' from dual; "    >> $tempsql

    echo "select 'echo ''正在备份数据文件……''' from dual; "    >> $tempsql

    echo "select 'cp ' ||name||' $backupdir' from v\$datafile;      "    >> $tempsql

    echo "select 'echo ''数据文件备份完毕!''' from dual; "    >> $tempsql

    echo "select 'echo ''正在备份联机日志……''' from dual; "    >> $tempsql

    echo "select 'echo '' '' ' from dual; "    >> $tempsql

    echo "select 'cp '||member||' $backupdir' from v\$logfile;      "    >> $tempsql

    echo "select 'echo ''联机日志备份完毕!''' from dual;"    >> $tempsql

    echo "select 'echo '' '' ' from dual; " >> $tempsql

    echo "select 'echo ''脱机冷备完毕!''' from dual;"    >> $tempsql

    echo "select 'echo '' '' ' from dual; " >> $tempsql

    ##生成冷备份执行脚本

    sqlplus -s ' / as sysdba' < $tempsql > $backupsh

    rm -f $tempsql

    chmod +x $backupsh

    cp $backupsh .

    echo "正在生成冷备对应的恢复脚本[$rcvrsh]……"

    ##准备工作

    echo "set heading off     " > $tempsql

    echo "set feedback off   " >>$tempsql

    echo "set tab off              " >>$tempsql

    echo "set verify off        " >>$tempsql

    echo "set pagesize 0"           >>$tempsql

    echo "set linesize 800    " >>$tempsql

    echo "select '#!/bin/bash' from dual;"          >> $tempsql

    echo "select ''                           from dual;"          >> $tempsql

    echo  "select  '##  恢复脚本生成时间:  "  `date  +%Y 年%m月%d日-%H:%M:%S`  "'

    from dual;" >> $tempsql

    echo "select '##  恢复文件所在路径: $backupdir' from dual; "        >> $tempsql

    echo "select '' from dual; " >> $tempsql

    echo ""

    echo "select 'echo ''开始进行文件的复制恢复……''' from dual; "                >> $tempsql

    echo "select 'echo ''恢复文件所在的路径: $backupdir ''' from dual; "      >> $tempsql

    ##这里不直接关闭数据库,提示用户手工关闭为好    如果需要直接关闭,请修改

    echo "select 'orarun='||'\`'||'ps -ef|grep -c ora_'||'\`' from dual;" >>$tempsql

    echo "select 'if [ "\$orarun" != "0" ] && [ "\$orarun" != "1" ]    ' from dual;" >>$tempsql

    echo "select 'then' from dual; " >>$tempsql

    echo "select 'echo '' '' ' from dual;" >>$tempsql

    echo "select 'echo ''ORACLE 数据库已启动,请先关闭 ORACLE 数据库'' ' from dual;" >>$tempsql

    echo "select 'echo '' '' ' from dual;" >>$tempsql

    echo "select 'exit' from dual; "      >>$tempsql

    echo "select 'fi'       from dual; "      >>$tempsql

    echo "select 'echo '' '' ' from dual; "    >> $tempsql

    echo "select 'echo ''正在恢复控制文件……''' from dual; "    >> $tempsql

    echo              "select               'cp              '||'$backupdir'||'/'||substr(name,instr(name,'/',-1)+1,

    length(name)-instr(name,'/',-1) )||' '||name from v\$controlfile; "    >> $tempsql

    echo "select 'echo ''控制文件恢复完毕!''' from dual; "    >> $tempsql

    echo "select 'echo '' '' ' from dual; "    >> $tempsql

    echo "select 'echo ''正在恢复数据文件……''' from dual; "    >> $tempsql

    echo              "select               'cp              '||'$backupdir'||'/'||substr(name,instr(name,'/',-1)+1,

    length(name)-instr(name,'/',-1) )||' '||name from v\$datafile;      "    >> $tempsql

    echo "select 'echo ''数据文件恢复完毕!''' from dual; "    >> $tempsql

    echo "select 'echo ''正在恢复联机日志……''' from dual; "    >> $tempsql

    echo "select 'echo '' '' ' from dual; "    >> $tempsql

    echo           "select            'cp           '||'$backupdir'||'/'||substr(member,instr(member,'/',-1)+1,

    length(member)-instr(member,'/',-1) )||' '||member from v\$logfile;        "    >> $tempsql

    echo "select 'echo ''联机日志恢复完毕!''' from dual;"    >> $tempsql

    echo "select 'echo '' '' ' from dual; " >> $tempsql

    echo "select 'echo ''脱机冷备恢复完毕!''' from dual;"    >> $tempsql

    echo "select 'echo '' '' ' from dual; " >> $tempsql

    ##生成冷备恢复的执行脚本

    sqlplus -s ' / as sysdba' < $tempsql > $rcvrsh

    rm -f $tempsql

    chmod +x $rcvrsh

    cp $rcvrsh .

    echo "生成脱机冷备备份与恢复脚本完毕!

    " echo "请检查脚本文件: [$backupsh]"

    echo "                                   [$rcvrsh]"

    echo ""

    #如果需要生成后立即执行备份,可增加关闭数据库的操作,然后将以一几行的注释#去掉即可

    #./$backupsh

    #echo "备份执行完毕,请检查!"

    #echo ""

    (3)  重启 Oracle 数据库

    $ sqlplus /nolog

    SQL> connect /as sysdba

    SQL> startup

    2.如果自从上次脱机冷备后,数据文件错误,联机日志没有被覆盖,可模拟不完全恢复。

    1. SQL> shutdown;

    2. $ cp …… ……;         //  只恢复出错的数据文件

    3. SQL> startup mount;

    4. SQL> recover database;

    5. SQL> alter database open;

   3.3 ARCHIVELOG 模式

    3.3.1  脱机冷备与恢复

    同 NONARCHIVELOG模式

    3.3.2  联机热备

    联机热备是在数据库运行的情况下进行备份的方法。热备份要求数据库在 Archivelog方式下操作,并需要大量的档案空间。

    热备份的优点:

    1.可在表空间或数据文件级备份,备份时间短。

    2.备份时数据库仍可使用,支持 24*7不间断运行。

    3.可达到秒级恢复(恢复到某一时间点上)。

    4.可对几乎所有数据库实体作恢复。

    5.恢复是快速的,在大多数情况下在数据库仍工作时恢复。

    热备份的不足是:

    1.不能出错,否则后果严重。

    2.若热备份不成功,所得结果不可用于时间点的恢复。

    3.因难于维护,所以要特别仔细小心,不允许“以失败而告终”。

    注意:在热备过程中系统会生成更多的重做日志和回滚数据。所以必须在数据库较空闲时才进行备份。

    备份内容:(1)  数据文件:  一个表空间一个表空间地备份 sql> alter tablespace users begin backup; sql> $copy '/xx/xx.dbf ''/yy/yy.dbf' ; sql> alter tablespace users end backup; sql> alter system checkpoint;(只读表空间直接拷贝,不用begin backup)

    (2)  备份归档 log文件

    (1)临时停止归档进程     log_archive_max_processes=0

    (2)log下那些在 archive redo log 目标目录中的文件

    (3)重新启动 archive 进程

    (4)备份归档的 redo log  文件

    (3) 备份联机的控制文件:sql> alter database backup controlfile to '/xx/xx.ctl';

    (4)  备份初始化文件  配置文件  等:sql> $copy    …… …… ;

    热备脚本:hotback.sql

    Rem  热备份脚本 for Linux

    Rem  执行该脚本必须保证数据库处于归档模式

    Rem [email protected] 2007-03-17

    Rem

    Rem  设置 SQL*Plus环境参数

    Rem

    set feedback off

    set pagesize 0

    set heading off

    set verify off

    set linesize 100

    set trimspool on

    Rem  设置备份相关的路径    For Linux

    Rem  设置数据文件备份路径

    define datafile_dir    = '/u05/oracle/hotback/datafile'

    Rem  设置归档日志文件备份路径

    define archlog_dir = '/u05/oracle/hotback/archlog'

    Rem  设置控制文件备份路径

    define controlfile_dir = '/u05/oracle/hotback/controlfile'

    Rem  设置生成的备份脚本名

    define hotback    = '/u05/oracle/hotback/open_hot_backup.sql'

    define spoolfile = '/u05/oracle/hotback/spool.tmp'

    define cpy = 'cp' prompt *** Spooling to &hotback

    Rem  产生备份数据文件、归档日志文件的命令

    set serveroutput on size 1000000

    spool &hotback

    prompt spool &spoolfile

    prompt archive log list;;

    prompt alter system switch logfile;;

    prompt alter system archive log all;;

    DECLARE

    CURSOR cur_tablespace IS

    SELECT tablespace_name

    FROM dba_tablespaces

    ORDER BY tablespace_name;

    CURSOR cur_datafile (tn VARCHAR) IS

    SELECT file_name

    FROM dba_data_files

    WHERE tablespace_name = tn

    ORDER BY file_name;

    CURSOR cur_arch_dest IS

    SELECT value

    FROM v$parameter

    WHERE    name = 'log_archive_dest';

    BEGIN

    FOR ct IN cur_tablespace LOOP

    IF ct.tablespace_name!='TEMP' then

    dbms_output.put_line ('alter tablespace '||ct.tablespace_name||' begin backup;');

    FOR cd IN cur_datafile (ct.tablespace_name) LOOP

    dbms_output.put_line ('host &cp y '||cd.file_name||' &datafile_dir');

    END LOOP;

    dbms_output.put_line ('alter tablespace '||ct.tablespace_name||' end backup;');

    end if;

    END LOOP;

    FOR dest IN cur_arch_dest LOOP

    dbms_output.put_line ('host &cpy '|| dest.value || '/* &archlog_dir ');

    END LOOP;

    END;/ Rem  产生备份控制文件的命令

    prompt alter system archive log current;;

    prompt alter database backup controlfile to trace;;

    prompt alter database backup controlfile to '&controlfile_dir/control.bak' REUSE;;

    prompt archive log list;;

    prompt prompt ***Hot Backup Finish***;

    prompt spool off spool off;

    host rm -f &spoolfile

    Rem  执行生成的脚本文件

    Rem @&hotback

    Rem host del &hotback

   3.3.3  联机热备的恢复

    3.3.3.1完全恢复

    一般步骤:

    1.  通过以下信息,找到故障数据文件

    alert.log

    background trace file v$recover_file        v$recovery_lo通过这两个视图可以了解详细的需要恢复的数据文件与需要使用到的归档日志。

    2.  将故障数据文件对应的表空间  offline SQL> alter tablespace xxx offline;

    3. restore and recover SQL> host cp …… ……;SQL> [alter database] recover database/tablespace/datafile 'xx';

    4.  将表空间 online SQL> alter tablespace xxx online;

    3.3.3.2不完全恢复

    不完全恢复的方法只能恢复到过去某个时间点/SCN的数据库状态。

    一些限制:

    1.    必要条件

    一个有效的  online/offline  备份(包含所有的数据文件)

    自从备份到故障前的所有归档日志,有可能需要控件文件  (所有控件文件丢失,数据库结构已改变) SQL> recover database …… using backup controlfile;

    2.  只能恢复到所有备份数据文件的最大 SCN以后,

    3.  恢复后需要 resetlog,所以需要在恢复后马上备份

    三种不完全恢复的方法:

    1.    基于变化的不完全恢复     Change-based Recovery

    2.    基于用户干涉(取消)的不完全恢复      Cancel-based Recovery

    3.    基于时间的不完全恢复    Time-based Recovery

    获得信息:alert.log可以通过 LogMiner获得精确的时间/SCN,一般在备机上恢复,再 exp/imp到生产机。 查看需要恢复的文件,以及相关的提示信息SQL> select * from v$recover_file; SQL> select * from v$datafile;查看二者的 change#,  确定对应的在 v$log_history 中的范围,从而确定需要那个日志文件序列

    设置归档日志文件的路径:  LOG_ARCHIVE_DEST

    设置  log  在不同的路径:SQL> SET LOGSOURCE 'xx';SQL> alter system archive log start to 'xx';

    恢复步骤:

    1.    关闭数据库,启动到 MOUNT 状态SQL> shutdown; SQL> startup mount;

    2.    恢复数据文件、日志文件、归档日志文件SQL> host cp …… ……; SQL> archive log list;SQL> archived log ==>LOG_ARCHIVE_DEST

    3.    执行恢复命令 基于变化:SQL> recover database until change 9999;基于时间:SQL> revover database until time '2001-12-01 14:02:23' using backup controlfile;基于取消:SQL> recover database until cancel;

    4.    重置日志,恢复后需要马上备份SQL> alter database open resetlogs;

  3.4  分类案例

 

    3.4.1  控件文件的备份与恢复

    一、备份

    1.  镜像控制文件手工备份       //  每当数据库结构发生变化时立即备份1.数据库关闭时,OS命令拷贝。

    2.  联机备份SQL> alter database backup controlfile to 'ctl.bak'; SQL> alter database backup controlfile to trace;

    二、恢复

    1.  损坏一个控制文件:从镜像拷贝或修改 initSID.ora取消损坏的控制文件。

    2.  损坏所有的控制文件:利用备份的控制文件恢复,拷贝或在命令中恢复:SQL> recover database ……using backup controlfile;手工重建控制文件:NOMOUNT状态下执行SQL> CREATE CONYTROLFILE……; //注意联机日志和数据文件的路径和文件名SQL> alter database open resetlogs;

    3.4.2  联机日志文件的备份与恢复

    一、备份

    1.  镜像在不同的磁盘上。  //如果有镜像备份,不用恢复2.  非归档模式下,在数据库关闭时用 OS命令拷贝备份。

    3.  归档模式下,手工或自动归档。

    二、恢复    //  在恢复后一定要重做备份 丢失日志组成员:在有多个镜像时,一般不会报错,如果需要恢复,可以先删除再增加。

    1.  删除:    SQL> alter database drop logfile member 'xx';

    2.  新增:    SQL> alter database add logfile member 'xx' to group 2;( 如果丢失当前日志组成员:     可以先 alter system switch logfile;  再进行操作。) 以下恢复方法都是指丢失所有日志组成员的情况下的恢复。

    一、丢失非当前联机日志

    1.  重启数据库到 Mount状态:

    2.  重建丢失的日志:用命令清空日志组的方法//已归档,重建该日志SQL> alter database clear logfile group 2;//归档模式下如果没有归档SQL> alter database clear unarchived logfile group 2;

    二、丢失当前联机日志

    1.  如果数据库正常关闭:日志中没有未决事务需要实例恢复,同非当前联机日志方法。

    2.  如果是非正常关闭数据库的情况,未决事务需要实例恢复: 如果有备份,可通过备份进行不完全恢复。// until cancel 没有备份,进行强制性恢复      //  最后的办法,可能导致数据库的不一致

    3.  如果数据库当前为 Open状态,有活动的事务:尝试能否 Export 或热备份,如果可以,赶紧备份检查非当前日志是否正常,可先做 clear,然后尝试是否能 switch log,能否正常关闭 DB,如果可以 switch log 正常关闭 DB,方法同 1,否则同 2

    3.4.3  回滚数据文件的恢复

    1.  从可用备份中恢复非归档模式下的恢复会有数据丢失归档模式下,有可用备份,可完全恢复(需要关闭数据库)

    2.  没有可用备份时强行恢复:// offline drop,删除重建。

    //  需要先注释 undo_tablespace,或者重新指定一个系统回滚段表空间,然后再操作

    1.  数据库正常关闭   没有未决的事务

    1. shutdown,修改 init参数文件,注释 undo_tablespace

    2. SQL>startup restrict mount;

    3. SQL>alter database datafile 2 offline drop;

    4. SQL>alter database open;

    5. SQL>drop tablespace xxx including contents;

    6.  重建回滚段表空间

    7.    shutdown,修改 init参数文件,去掉注释设置新的 undo_tablespace

    8.    SQL> alter system disable restricted session;

    2.  非正常关闭    强制恢复  隐含参数:_CORRUPTED_ROLLBACK_SEGMENTS

    1. shutdown,修改 init参数文件,删除 undo_tablespace

    2. SQL>startup restrict mount;

    3. SQL>alter database datafile 2 offline drop;

    4. SQL>alter database open;

    5. SQL>drop tablespace xxx including contents;如果出错:回滚段中有活动事务SQL>drop rollback segment rbs0; rbs1, 2 ……

    在第1步中,加入隐含参数_CORRUPTED_ROLLBACK_SEGMENTS = (_SYSSMU1$,_SYSSMU2$,_SYSSMU3$, ……)

    6.  重建回滚段表空间,online

    7. shutdown,修改 init参数文件,去掉注释设置新的 undo_tablespace去掉隐含参数

    8.    SQL>alter system disable restricted session;

    3.4.5  临时数据文件的恢复

    方法: 先将用户临时表空间置为其他,然后删除重建

    1. SQL> shutdown

    2. SQL> startup restrict mount;

    3. SQL> alter user xxx temporary tablespace TEMP2;

    4. SQL> alter database open;

    5. SQL> drop tablespace temp including contents;

    6.  重建临时表空间

    7.  重新分配给各用户

    8.           SQL> alter system disable restricted session; 如果是默认的临时表空间,需要先将默认临时表空间置为其他 SQL> alter database default temporary tablespace temp_2;