Oracle資料庫備份與恢復之三:OS備份/使用者管理的備份與恢復

wangkxxe發表於2009-03-20
Oracle資料庫備份與恢復之三:OS備份/使用者管理的備份與恢復
 
  使用者管理的備份與恢復也稱 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(,)達式*/ 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  離線冷備與恢復

    冷備份發生在資料庫已經正常關閉的情況下,當正常關閉時會提供給我們一個完整的資料庫。冷備份是將關鍵性檔案複製到另外位置的一種說法。對於備份    資訊而言,冷備份是最快和最安全的方法。

    冷備份的優點:

    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資料庫是否啟動

    raisrun=`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)  重啟 資料庫

    $ 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 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;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12801008/viewspace-573239/,如需轉載,請註明出處,否則將追究法律責任。

相關文章