天天看點

表空間的狀态(一) - ONLINE和OFFLINE

前幾天問一個表空間狀态的問題,也暴露了自己基礎知識的薄弱,之是以總結如下兩篇博文,主要還是讓自己靜下心來,補一下相關知識點,并通過實踐強化自己的了解。

主要參考:

《11g Concept》

《11g Administrator's Guide》

表空間的ONLINE和OFFLINE狀态

1. 隻要資料庫處于OPEN狀态,除了SYSTEM表空間外的其他表空間,都可以将其置為online或offline狀态。SYSTEM表空間之是以不能置為offline,是因為其中儲存的資料字典需要一直使用。将表空間置為offline,可能的原因包括維護、備份以及恢複等目的。

3. 如果表空間處于offline狀态,那麼Oracle不會允許任何對該表空間中對象的SQL執行。表空間置為offline時仍處于活動狀态的語句在交易級别并不會受影響。Oracle會儲存這些尚未完成語句相關的復原資料到SYSTEM表空間。當表空間置為online時,如果有必要,那麼Oracle會應用這些復原資料。

3. 除了Oracle外,沒有任何應用能夠讀取或編輯offline的表空間。是以,offline的表空間更不能導到其他資料庫。

4. Oracle在一些場景下會自動切換表空間狀态從online到offline。例如,當資料庫寫程序DBWn,嘗試幾次仍不能寫入表空間的資料檔案中。使用者通路offline表空間時會收到一個報錯。如果造成這種磁盤IO失敗的問題是媒體錯誤,解決這問題之後需要恢複表空間。

5. 将表空間置為offline可能包含如下原因:

(1) 需要禁止通路一部分資料庫的場景。

(2) 執行一次offline表空間備份(盡管表空間可以在online和使用情況下備份)。

(3) 當更新或維護應用時,需要讓應用和對應的表臨時不能通路。

(4) 重命名或重配置設定表空間中的資料檔案。

當表空間置為offline,資料庫會将關聯的所有資料檔案都置為offline狀态。但是如下表空間不能置為offline:

> SYSTEM

> UNDO表空間

> 臨時表空間

6. 将表空間置為offline之前,若有使用者設定該表空間為其預設表空間,需要考慮是否需要改變其預設表空間。之是以這樣做,是因為這些使用者将不能通路offline表空間中的對象。

7. 使用ALTER TABLESPACE ... OFFLINE語句可以添加如下參數:

NORMAL:如果表空間的任何資料檔案沒有出現錯誤,表空間能夠正常地置為offline。如果出現寫錯誤,那麼表空間中的資料檔案不會被置為offline。當明确使用OFFLINE NORMAL,資料庫會對所有資料檔案進行一次checkpoint檢查點事件,NORMAL是預設設定。

TEMPORARY:表空間能夠臨時置為offline狀态,即使一個或多個檔案出現錯誤。當使用OFFLINE TEMPORARY,資料庫會将還沒有置為offline的資料檔案進行置位操作,并執行檢查點事件。

如果沒有檔案是offline,但使用了temporary語句,那麼當将表空間置為online時不需要媒體恢複。然而,如果表空間的一個或多個檔案由于寫入錯誤是以導緻offline狀态,能夠臨時将表空間置為offline狀态,恢複online之前需要對表空間進行恢複操作。

IMMEDIATE:表空間能夠立即設定為offline狀态,資料庫不會進行任何資料檔案的檢查點事件。當使用OFFLINE IMMEDIATE,那表空間置為online之前需要對表空間進行媒體恢複操作。但是如果資料庫處于NOARCHIVELOG模式,表空間就不能立即置為offline狀态。

8. 如果必須設定表空間為offline狀态,建議首先使用預設的NORMAL語句。他會確定當表空間置為online前不需要執行恢複操作,盡管在不完全恢複之後,使用LATER DATABASE OPEN RESTLOGS語句重置了redo日志sequence。

僅僅當不能使用NORMAL方式将表空間置為offline時,可以使用TEMPORARY。使用TEMPORARY後,在表空間置為online前,僅需要恢複那些出錯的offline檔案。

如果NORMAL和TEMPORARY都失敗時,才可以選擇使用IMMEDIATE選項。

9. 如果表空間沒有“幹淨地”置為offline(也就是沒有使用NORMAL語句執行的offline操作),那麼置為online前需要首先對該表空間執行媒體恢複操作。否則資料庫會報錯,表空間仍處于offline狀态。

實驗:

1. 設定表空間DCSOPEN_TBS為offline:

SQL> alter tablespace dcsopen_tbs offline;

Tablespace altered.

2. 查詢資料檔案狀态:

select file#, name, status from v$datafile;

file  #name 

status

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

11   /oracle/oradata_petest/petest/dcsopen_tbs02.dbf OFFLINE

DCSOPEN_TBS使用的資料檔案狀态已經置為OFFLINE。

3. 嘗試查詢已OFFLINE表空間:

SQL> select * from test;

select * from test

              *

ERROR at line 1:

ORA-00376: file 7 cannot be read at this time

ORA-01110: data file 7: '/oracle/oradata_petest/petest/dcsopen_tbs01.dbf'

報錯,提示此時資料檔案不能讀。

4. 将表空間置為online:

SQL> alter tablespace dcsopen_tbs online;

11   /oracle/oradata_petest/petest/dcsopen_tbs02.dbf ONLINE

未完待續。。。

To be continued ...