表空間的狀態(二) - read/write

bitifi發表於2015-10-23

表空間狀態-READ ONLY、READ WRITE


1. 只讀表空間的主要用途就是為了消除對資料庫大部分靜態資料的備份和恢復的需要。Oracle不會更新只讀表空間愛你的檔案,因此這部分檔案可以儲存於只讀介質中,例如CD-ROM或WORM drives。
2. 只讀表空間並不是為了滿足歸檔的要求。只讀表空間不能修改。如果需要修改只讀表空間中的記錄,則需要先將表空間置為read/write。更新表空間後,可以重置為只讀。
3. 由於只讀表空間不能修改,所以只要沒有置為read/write,就不需要重複地進行備份。而且,如果需要恢復資料庫時,也不需要恢復只讀表空間,原因就是他們未曾修改過。
4. 能從只讀表空間中刪除物件,例如表或索引,但不能建立或修改物件。可以執行修改資料字典中檔案描述的語句,例如ALTER TABLE ... ADD或ALTER TABLE ... MODIFY,但不能新增任何新的描述資訊,除非表空間置為read/write。
5. 只讀表空間可以匯出匯入到其他資料庫。既然只讀表空間不能修改,他們就能儲存於CD-ROM或WORM(一次寫-多次讀)這些設施中。
6. 所有表空間初始建立都是read/write。使用READ ONLY子句可以設定表空間為只讀。前提是必須具有ALTER TABLESPACE或MANAGE TABLESPACE的系統許可權。
使用ALTER TABLESPACE ... READ ONLY前,需要滿足以下條件:
> 表空間處於online狀態。這是為了確保不會有UNDO資訊需要應用到表空間。注:如果處於offline,則會將UNDO資訊儲存於SYSTEM表空間,待恢復online時應用這些UNDO資訊。
> 不能修改活動的UNDO表空間或SYSTEM表空間。
> 表空間不能處於當前正在進行的online備份中,因為備份結束時會更新表空間所有資料檔案的頭部資訊。
> 為了讓從只讀表空間讀取資料得到更好的效能,可以在置為read-only之前執行一次訪問表空間的表中所有資料塊的查詢。一個像SELECT COUNT(*)這樣簡單的查詢,就可以確保在表空間的資料塊在接下來的訪問中獲得最佳的效率。因為這種做法就不需要資料庫檢查最近經常修改資料塊的交易狀態。
7. 可以在資料庫正處理交易的時候執行ALTER TABLESPACE ... READ ONLY語句。執行語句後,表空間就處於交易只讀狀態。不會允許任何交易(DML操作)應用於表空間。如果嘗試進行交易操作,那麼此操作會被終止和回滾。然而,那些已經做了變更並不再進行進一步修改的交易,就允許執行commit或roll back操作。
如果ALTER TABLESPACE ... READ ONLY語句執行前,一個交易已經執行了,但是回滾到一個儲存點,回滾了他對錶空間的變更,那麼ALTER TABLESPACE ... READ ONLY語句不會等待這個活動的交易。
8. 交易級只讀狀態僅僅當初始化引數COMPATIBLE是8.1.0或以上值時才能使用。如果引數值小於8.1.0,並且存在活動的交易,ALTER TABLESPACE ... READ ONLY語句會失敗。
9. 如果ATLER TABLESPACE語句執行時間太長了,那麼就需要找到阻止只讀狀態生效的那些交易。如下語句可以找出執行ALTER TABLESPACE ... RAED ONLY語句的交易入口和session地址(saddr):
SELECT SQL_TEXT, SADDR
FROM V$SQLAREA,V$SESSION
WHERE V$SQLAREA.ADDRESS = V$SESSION.SQL_ADDRESS AND SQL_TEXT LIKE 'alter tablespace%';
SQL_TEXT                                  SADDR
---------------------------------------- --------
alter tablespace tbs1 read only           80034AF0
每個活動交易的開始SCN會儲存於V$TRANSACTION檢視中。起始SCN越小,說明這步操作就越早。潛在地這條語句越可能阻止接下來只讀狀態的變更。
SELECT SES_ADDR, START_SCNB
FROM V$TRANSACTION
ORDER BY START_SCNB;
SES_ADDR START_SCNB
-------- ----------
800352A0 3621 --> waiting on this txn
80035A50 3623 --> waiting on this txn
80034AF0 3628 --> this is the ALTER TABLESPACE statement
80037910 3629 --> don't care about this txn
可以用如下語句找到阻塞交易的使用者:
SELECT T.SES_ADDR, S.USERNAME, S.MACHINE
FROM V$SESSION S, V$TRANSACTION T
WHERE T.SES_ADDR = S.SADDR
ORDER BY T.SES_ADDR
SES_ADDR USERNAME              MACHINE
-------- -------------------- --------------------
800352A0 DAVIDB                DAVIDBLAP --> Contact this user
80035A50 MIKEL                 LAB61 --> Contact this user
80034AF0 DBA01                 STEVEFLAP
80037910 NICKD                 NICKDLAP
將表空間置為read-only後,建議立即備份。只要表空間一直處於只讀狀態,那就不需要再次地備份,因為不會有對錶空間的更新。
10. 使用LATER TABLESPACE ... READ WRITE語句可以恢復只讀表空間,前提是具有ALTER TABLESPACE或MANAGE TABLESPACE許可權。
表空間置為read/write的前提條件還需要表空間中的所有資料檔案以及表空間自身都處於online狀態。可以使用ALTER DATABASE ... DATAFILE ... ONLINE語句將資料檔案置為online狀態。V$DATAFILE檢視顯示了資料檔案當前的狀態。
將表空間置為可寫模式,需要更新控制檔案,目的就是為了可以使用資料檔案的只讀版本作為恢復的起始點。
11. 在WORM裝置中建立一個只讀表空間。
(1) 建立一個可寫表空間。建立物件、插入資料。
(2) 將表空間置為read-only只讀模式。
(3) 使用作業系統命令將表空間的資料檔案複製到WORM裝置。
(4) 將表空間置為offline狀態。
(5) 重新命名資料檔案以符合複製到WORM裝置中的資料檔案命名規範。使用ALTER TABLESPACE ... RENAME DATAFILE語句,重新命名資料檔案的操作會修改控制檔案。
(6) 將表空間恢復為online狀態。

實驗:
1. 設定表空間為read only狀態
SQL> alter tablespace dcsopen_tbs read only;
Tablespace altered.

2. 檢視資料檔案狀態
SQL> select file#, name, status from v$datafile where file#=11;
FILE#  NAME                                                                    STATUS
----- ------------------------------------------------------- ------------------------
11      /oracle/oradata_petest/petest/dcsopen_tbs02.dbf   ONLINE

3. 登入到只讀表空間
SQL> select * from test1;
      T1ID T1V
---------- ----------
         1 t1
         2 t2
         3 t3
可以讀其中的表。
SQL> insert into test1 values(12, 't12');
insert into test1 values(12, 't12')
            *
ERROR at line 1:
ORA-00372: file 7 cannot be modified at this time
ORA-01110: data file 7: '/oracle/oradata_petest/petest/dcsopen_tbs01.dbf'
執行交易操作時提示7號資料檔案此時不能修改。

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

相關文章