檔案異常資料還原(11gAW2 Cheaper6,7):
一、Temp file
error
二、REDO Log file error:
三、Index error
四、File error
五、Password
file error
六、Control file error
七、Block Error
Oracle Version:10g/11g
Temp file error:
分可以重啟及不可以重啟兩種狀況:
可重啟:把file 刪除掉,重新啟動oracle即可
不可重啟:建立tempfile,刪除舊有的tempfile,以下分兩種建立方式:
一、
SQL> select file_name from
dba_temp_files where tablespace_name='TEMP';
--找出temp
tablespace所使用的tempfiles
SQL> select tablespace_name from
dba_tablespaces where contents='TEMPORARY';
--找出所有可用的temporary
tablespace
--建議建立一個新temporary tablespace取代已經毀損的temporary tablespace
SQL> create temporary tablespace temp2
tempfile '/u02/oradata/orcl/temp2.dbf' size 100M AUTOEXTEND
ON NEXT 8K maxsize unlimited;;
--變更資料庫的預設temporary tablespace為temp2
SQL> alter database default temporary
tablespace temp2;
查詢User的temp tablespace
SQL> select temporary_tablespace from
dba_users where username='HR';
刪除壞掉的temp
SQL> drop tablespace temp INCLUDING
CONTENTS AND DATAFILES;;
<====在原本的user session 沒斷前可能會卡住,須等session斷掉,或手動kill session才會成功drop
二、
SQL> alter tablespace temp add tempfile
'/home/oracle/temp01.dbf' size 100M ; --add new tempfile到temp tablespace
SQL> alter tablespace temp drop tempfile
'/u02/oradata/orcl/temp01.dbf'; --drop
corrupted tempfile
SQL> select file_name from
dba_temp_files where tablespace_name='TEMP';
--找出temp
tablespace所使用的tempfiles
*********************************************************************
REDO Log file error:
如果是inactive,現在不影響運作狀況,等待轉換的時候,才會受影響
--一個database至少要有兩個logfile groups
--logfile group的特色,只要logfile group裡尚有一個以上的logfile member存在,則此logfile group還是維持正常的操作
--每個logfile group裡至少需要一個member,最多只能有5個members.建議各個member應該放在不同disk controller所管理的不同disk
Redo log擺放路徑
SQL> select group#,member from v$logfile order by group#;
redo log的狀態
SQL> select group#,sequence#,members,to_char(first_time,'YYYY-MM-DD:HH24:MI:SS'),status,archived from v$log;
current->lgwr正在使用的logfile group(如果需要將log buffer的redo entry寫到logfile group時,lgwr會把redo entry寫到此logfile group的所有logfile member之中)
inactive->如果現在發生instance crash.當instance重新啟動並進行rollforward時,不需要使用此logfile group的內容來復原dirty buffers
active->如果現在發生instance crash.當instance重新啟動並進行rollforward時,將需要使用此logfile group的內容,將dirty buffers復原
SQL> alter system checkpoint; --要求將目前所有的dirty buffers全數寫回datafiles(Buffer cache寫入資料檔中).因此目前所有為ACTIVE的logfile group,在此指令完成後,都將變成INACTIVE
SQL> alter system switch logfile; --lgwr更換current logfile group
--並呼叫ckpt對舊的current logfile group進行checkpoint(dbwr將此log sequence#區間的dirty buffers變成clean buffer)
--如果是archivelog mode,則也會呼叫archiver對舊的current logfile group進行archive
--針對尚未被archived的logfile group(若檔案遺失,會自動建立此file,db必需要經過alter system switch logfile才知道檔案移失,才會自動建立檔案)
SQL> alter database clear unarchived logfile group 2;
SQL> select group#,sequence#,members,to_char(first_time,'YYYY-MM-DD:HH24:MI:SS') first_time,status,archived from v$log;
GROUP# SEQUENCE# MEMBERS FIRST_TIME STATUS ARC
---------- ---------- ---------- ------------------- ---------------- ---
1 31 1 2010-10-12:04:47:06 INACTIVE YES
2 0 1 2010-10-12:04:48:37 UNUSED YES
3 33 1 2010-10-12:04:49:51 CURRENT NO
查看archivelog sequence
SQL> select sequence#,name from v$archived_log;
**此時應該立刻進行一次whole backup.這樣就不需要使用到log seq# 32,因為現在的current logfile sequence#為33
**不然如果現在有任何datafile發生media failure,當recovery它時,將需要log seq# 32
RMAN> backup database;
備註:
SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;
設置此參數之后,在數據庫Open過程中,Oracle會跳過某些一致性檢查,從而使數據庫可能跳過不一致狀態。
注意_allow_resetlogs_corruption是Oracle中的一個隱含參數如果系統實在不能resetlogs方式打開的後只能出此下策
http://www.sadtojoy.com/aspx/Detail.aspx?id=3996
--一個database至少要有兩個logfile groups
--logfile group的特色,只要logfile group裡尚有一個以上的logfile member存在,則此logfile group還是維持正常的操作
--每個logfile group裡至少需要一個member,最多只能有5個members.建議各個member應該放在不同disk controller所管理的不同disk
Redo log擺放路徑
SQL> select group#,member from v$logfile order by group#;
redo log的狀態
SQL> select group#,sequence#,members,to_char(first_time,'YYYY-MM-DD:HH24:MI:SS'),status,archived from v$log;
current->lgwr正在使用的logfile group(如果需要將log buffer的redo entry寫到logfile group時,lgwr會把redo entry寫到此logfile group的所有logfile member之中)
inactive->如果現在發生instance crash.當instance重新啟動並進行rollforward時,不需要使用此logfile group的內容來復原dirty buffers
active->如果現在發生instance crash.當instance重新啟動並進行rollforward時,將需要使用此logfile group的內容,將dirty buffers復原
SQL> alter system checkpoint; --要求將目前所有的dirty buffers全數寫回datafiles(Buffer cache寫入資料檔中).因此目前所有為ACTIVE的logfile group,在此指令完成後,都將變成INACTIVE
SQL> alter system switch logfile; --lgwr更換current logfile group
--並呼叫ckpt對舊的current logfile group進行checkpoint(dbwr將此log sequence#區間的dirty buffers變成clean buffer)
--如果是archivelog mode,則也會呼叫archiver對舊的current logfile group進行archive
--針對尚未被archived的logfile group(若檔案遺失,會自動建立此file,db必需要經過alter system switch logfile才知道檔案移失,才會自動建立檔案)
SQL> alter database clear unarchived logfile group 2;
SQL> select group#,sequence#,members,to_char(first_time,'YYYY-MM-DD:HH24:MI:SS') first_time,status,archived from v$log;
GROUP# SEQUENCE# MEMBERS FIRST_TIME STATUS ARC
---------- ---------- ---------- ------------------- ---------------- ---
1 31 1 2010-10-12:04:47:06 INACTIVE YES
2 0 1 2010-10-12:04:48:37 UNUSED YES
3 33 1 2010-10-12:04:49:51 CURRENT NO
查看archivelog sequence
SQL> select sequence#,name from v$archived_log;
**此時應該立刻進行一次whole backup.這樣就不需要使用到log seq# 32,因為現在的current logfile sequence#為33
**不然如果現在有任何datafile發生media failure,當recovery它時,將需要log seq# 32
RMAN> backup database;
備註:
SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;
設置此參數之后,在數據庫Open過程中,Oracle會跳過某些一致性檢查,從而使數據庫可能跳過不一致狀態。
注意_allow_resetlogs_corruption是Oracle中的一個隱含參數如果系統實在不能resetlogs方式打開的後只能出此下策
http://www.sadtojoy.com/aspx/Detail.aspx?id=3996
*********************************************************************
Index Error
純index
tablespace發生media
failure,可以採用以下的做法
1.當作一般的datafile,進行offline->restore->recover->online的復原操作
2.drop index tablespace,create new index
tablespace,create index --因為index內容與table內容相依.所以只要table存在,便可以重建index
查詢User底下的tablespace的型態是否全部都為index
SQL> select segment_type,count(*) from
dba_segments where tablespace_name='USERS' group by segment_type;
資料重建:
SQL> alter database datafile
'/oradata1/testdb/index_ts01.dbf' offline drop;
SQL> drop tablespace index_ts including
contents and datafiles;
SQL> create tablespace index_ts datafile
'/oradata1/testdb/index_ts01.dbf' size 10M ;
SQL> create index scott.t5_idx1 on
scott.t5(object_id) tablespace index_ts;
透過rman回覆:
RMAN> run {
2> sql 'alter database datafile 4
offline';
3> restore datafile 4;
4> recover datafile 4;
5> sql 'alter database datafile 4
online';}
*********************************************************************
File Error
透過Rman的方式還原+Archive log還原,若是一般的User,不一定要停機,
[oracle@oracleDB ~]$ rman target /
RMAN>
run {
2> sql 'alter database datafile 6
offline';
3>
restore datafile 6;
4>
recover datafile 6;
5>
sql 'alter database datafile 6 online';}
*********************************************************************
Password file error
當user process要求以as sysdba或as sysoper身分建立session時,Oracle server使用下列2種方式驗證其身分
1.os驗證(user必須先登入os(Oracle Server所在的os),同時user所使用的os username必須屬於某個特殊的os group,即所謂的dba group(在安裝oracle software時指定的os group)
2.當os驗證失敗或使用remote登入時,則使用password file進行驗證
**重建密碼檔
[oracle@oracleDB ~]$ orapwd
file=$ORACLE_HOME/dbs/orapworcl password=oracle entries=10 ignorecase=y --file為password file的名字,有特定的格式.orapw開頭,緊接著instance
name,記得不需要副檔名
--password為sys的密碼(11g 預設有區分大小寫)
--ignorecase=y取消大小寫區分,可以向前相容.
SQL> select * from v$pwfile_users; --顯示現在password file內的資訊
*********************************************************************
Control error(Control file的任一檔案壞掉,db就會有異常)
查看Control file
存放位置
SQL> select value from
v$system_parameter where name='control_files';
1.如果只有部分的controlfile發生media failure,只需要將尚存好的controlfile複製給壞的controlfile即可,接著重新啟動即可(instance
recovery自動發生)
使用OS指命COPY即可
[oracle@oracleDB ~]$ cp
/u2/oradata/orcl/control01.ctl /u01/app/oracle/flash_recovery_area/orcl/control02.ctl
SQL>
alter database mount;
SQL>
alter database open; --將會進行instance recovery.因此無資料遺失.
2.controlfile全數毀損,則必須在nomount階段,restore之前所做的controlfile備份,
SQL>startup nomount;
--使用rman復原controlfile,目前instance已經在nomount階段
[oracle@oracleDB ~]$ rman target /
RMAN> restore controlfile from
autobackup; --由Oracle Server自行找尋最新的autobackup所產生的controlfile backup
------restore controlfile from
'/home/oracle/orcl_control_20101020.ctl';
--DBA明確選擇使用某一個controlfile
backup
------restore controlfile; --由RC的內容將controlfile復原--$ rman target / catalog rmanuser/oracle@192.168.56.1:1521/orcl
在mount下執行:
SQL>alter database mount;
SQL> recover database until cancel using
backup controlfile;(應該會出錯...因還原出來的Control與System.dbf這個檔不一致)
因control遺失,所以要做restore database,從backup到現在的time,資料一併不見
RMAN> restore database;
RMAN> recover database;
SQL> alter database open resetlogs;
查看現在的INSTANCE狀態
SQL> select status from v$instance;
--使用sql command備份controlfile為binary format
SQL> alter database backup controlfile
to '/home/oracle/orcl_control_20101020.ctl';
*********************************************************************
Block Error
**主動使用rman指令驗證整個datafile,看看是否還有其他尚未發現的錯誤blocks
--backup validate nochecksum datafile 4; --nochecksum將關閉自動physical corruption檢查
RMAN> backup validate datafile 4; --只檢查physical corruption.預設自動檢查checksum(physical corruption)
--backup check logical validate datafile 4; --同時檢查physical/logical
corruption(check logical啟動logical corruption檢查)
查詢錯誤的block
SQL> select * from v$database_block_corruption; --內容來自於v$backup_corruption與v$copy_corruption
--而v$backup_corruption的內容來自於執行rman的backup或backup validate所發現的corrupted blocks
--而v$copy_corruption的內容來自於執行rman的backup as copy或backup as copy validate所發現的corrupted blocks
**可以直接藉由跳過毀損block不讀取的方式,取得其他完好block的內容
SQL> execute
dbms_repair.skip_corrupt_blocks('HR','T1',flags=>1); --可以不寫flags=>1,因為此選項為預設值
--blockrecover為10g 的語法
--10g >
blockrecover datafile 4 block 679;
RMAN> recover datafile 4 block 679; --不需要offline datafile或tablespace(availability較高).僅需restore/recovery
corrupted blocks(復原速度較快)
做完之後,再查詢一下是否有錯誤的block