天天看點

Oracle備份與恢複總結之三:OS備份/使用者管理的備份與恢複

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   INTO <表> NOLOGGING  SELECT 語句

INSERT 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 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

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

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;

from:http://tech.ddvip.com/2008-08/121991429658497.html