Oracle UNDO表空間
一、還原資料與還原表空間
還原資料是:
• 原始的、修改之前的資料副本
• 針對更改資料的每個事務處理而捕獲
• 至少保留到事務處理結束
• 用於支援:
– 回退操作
– 讀取一致性查詢
– Oracle 閃回查詢、Oracle 閃回事務處理和 Oracle 閃回表
– 從失敗的事務處理中進行恢復
還原資訊儲存在還原段中,還原段又儲存在還原表空間中。
還原表空間:
• 僅用於還原段
• 有特殊的恢復注意事項
• 只能與單個例項相關聯(叢集情況還原表空間是分開的)
• 在任意給定時間,一個給定的例項只能有一個表空間是當前可寫還原表空間
二、事務處理與還原資料
• 每個事務處理僅分配一個還原段。
• 一個還原段可以同時服務多個事務處理。
三、還原資料與重做資料
還原 |
重做 |
|
記錄 |
如何還原更改 |
如何重現更改 |
用於 |
回退、讀取一致性、閃回 |
前滾資料庫更改 |
儲存於 |
還原段 |
重做日誌檔案 |
避免 |
在多使用者系統中出現讀取不一致 |
資料丟失 |
四、相關引數說明
以上為預設值。
啟用自動還原管理:UNDO_MANAGEMENT='AUTO'
設定還原保留時間:UNDO_RETENTION=10800--這個引數一般設定3小時,設定大點200G左右
設定還原表空間:UNDO_TABLESPACE='UNDOTBS1'
五、設定還原保留時間
指令碼修改立即生效無需重啟:
alter system set undo_retention=10800
UNDO_RETENTION 指定已提交的還原資訊要保留多長時間(秒),預設為900秒。
僅在以下情況下才必須設定此引數:
• 還原表空間啟用了 AUTOEXTEND 選項
• 需要設定 LOB 的還原保留時間
• 需要保證保留時間
還原保留時間是建議值,當UNDO表空間滿了且沒到900秒也會覆蓋,如果需要確保必須保留900秒,則需要設定保證還原保留時間
六、設定保證還原保留時間
SQL> ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;
SQL> ALTER TABLESPACE undotbs1 RETENTION NOGUARANTEE;--不保證還原保留時間
在有guarantee的保證下,ORACLE將會保證undo資訊能夠儲存到undo_retention設定的值之後才被覆蓋,如果這個時候同時執行了很多事物,將undo表空間耗完了,那麼那個事物會失敗,會報ORA-30036 錯誤,所以使用guarantee一定要慎用,如果非要使用guarantee,那麼儘量將undo 表空間設大一點。
七、還原資料的使用
1、閃回查詢
說明:查詢指定時間點的所有資料
select empno, ename, job, mgr, sal
from scott.emp
as of timestamp to_timestamp('2016-01-21 15:10:00', 'yyyy-mm-dd hh24:mi:ss')
where mgr = 7566;
2、閃回版本查詢
說明:
(1)檢視兩個時間點之間行的所有版本。
(2)檢視更改了行的事務處理。
注意:
(1)不能使用 VERSIONS 子句查詢外部表、臨時表、固定表、檢視。
(2)VERSIONS 子句不能跨 DDL 命令使用。
(3)段收縮操作已過濾掉。
SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;--獲取SCN
update…commit;inset…commit;delete…commit;
SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;--獲取SCN
select VERSIONS_STARTSCN,versions_starttime,VERSIONS_ENDSCN,versions_endtime,versions_xid,versions_operation
from employees versions between scn 2797818 and 2797868
order by VERSIONS_STARTTIME;
select VERSIONS_STARTSCN,versions_starttime,VERSIONS_ENDSCN,versions_endtime,versions_xid,versions_operation
from employees versions between timestamp minvalue and maxvalue
order by VERSIONS_STARTTIME;
閃回版本查詢偽列解析
VERSIONS_STARTSCN VERSIONS_STARTTIME |
該條記錄操作時的SCN或時間,如果為空,表示該行記錄是在查詢範圍外建立的 |
VERSIONS_ENDSCN VERSIONS_ENDTIME |
該條記錄失效時的SCN或時間,如果為空,說明記錄當前時間在 當前表內不存在,或者已經被刪除了,可以配合著 VERSIONS_OPERATION列來看,如果 VERSIONS_OPERATION列值為D,說明該列已被刪除,如果該 列為空,則說明記錄在這段時間無操作 |
VERSIONS_XID |
該操作的事務ID |
VERSIONS_OPERATION |
對該行執行的操作:I表示INSERT,D表示DELETE,U表示UPDATE 提示:對於索引鍵的update操作,版本查詢可能會將其識別成兩 個操作:DELETE和INSERT |
3、閃回表
說明:
(1)需要具有對特定表的 FLASHBACK ANY TABLE 或 FLASHBACK 物件許可權和具有 SELECT、INSERT、DELETE 和ALTER 許可權。
(2)FLASHBACK TABLE 命令作為單個事務處理執行,要求獲取 DML 排它鎖。
(3)不閃回統計資訊,保留當前索引和從屬物件。
(4)操作不能對系統表執行,不能跨DDL操作,會生成還原資料和重做資料。
ALTER TABLE temp_liutao ENABLE ROW MOVEMENT;
FLASHBACK TABLE temp_liutao TO TIMESTAMP TO_TIMESTAMP('2016-01-20 16:10:00','YYYY-MM-DD HH24:MI:SS');
flashback table temp_liutao to timestamp(systimestamp - interval '3'minute);
flashback table t_topcommsc_request to scn 13884734132482;
ALTER TABLE temp_liutao DISABLE ROW MOVEMENT;