標籤:cti 時間 where opera sel value oracle 更改 bsp
提交DML操作後,該操作使用的還原段就可以被其它對象使用了,為了保證閃回操作時這些資料仍然被儲存在還原段中,可能需要重新設定undo_retention參數,表示一個事務提交後,該事務的資料必須儲存在還原段中的時間;但是這也並不能完全保證指定的時間的資料一定能夠被恢複,還原資料表空間沒有足夠的時間時,仍會覆蓋要求保留的磁碟空間。
查看undo_retention的當前值:
SQL> show parameter undo_retentionNAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_retention integer 900
預設是900s
設定undo_retention的值為2個小時
SQL> alter system set undo_retention = 7200;系統已更改。
執行個體測試:
目標:將emp_bak表中的員工的工資統一更新為9999,提交後使用閃回技術復原回初始值。
--更新emp_bak
SQL> update emp_bak set sal = 9999;已更新10行。
SQL> commit;提交完成。
--查出更新操作對應的事務號
SQL> select versions_xid,ename,sal from emp_bak 2 versions between scn minvalue and maxvalue 3 where empno = 7900; VERSIONS_XID ENAME SAL---------------- ---------- ---------08001D0018060000 JAMES 9999.00 JAMES 950.00
versions_xid為事務號,minvalue為最小值,maxvalue為最大值。
--從資料字典flashback_transaction_query中查詢出事務號所對應的SCN號
select start_scn from flashback_transaction_query 2 where xid = hextoraw(‘08001D0018060000‘); START_SCN---------- 2206522 2206522 2206522 2206522 2206522 2206522 2206522 2206522已選擇8行。
--啟用行移動功能, 否則不能閃回表
SQL> alter table scott.emp_bak enable row movement;表已更改。
--閃回表
SQL> flashback table scott.emp_bak to scn 2206522;閃回完成。SQL> select sal from scott.emp_bak where empno=7900; SAL---------- 950
閃回已經完成了。
注意閃回是閃回到該SCN之前的一個狀態。
附錄:
除了根據SCN號閃回,還可以根據時間閃回
如果查詢flashback_transaction_query視圖中的列operation全是unknown 而且undo_sql 也為空白,要開啟對DML更改引用的列值和主索引值的日誌記錄
SQL> alter database add supplemental log data (primary key) columns;
再查詢就可以見到了
SQL> select start_scn,operation,undo_sql from flashback_transaction_query 2 where xid = hextoraw(‘05000C00DE060000‘); START_SCN OPERATION UNDO_SQL---------- -------------------------------- -------------------------------------------------------------------------------- 2210297 UPDATE update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAT‘; 2210297 UPDATE update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAS‘; 2210297 UPDATE update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAR‘; 2210297 UPDATE update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAQ‘; 2210297 UPDATE update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAP‘; 2210297 UPDATE update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAO‘; 2210297 UPDATE update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAN‘; 2210297 UPDATE update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAM‘; 2210297 UPDATE update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAL‘; 2210297 UPDATE update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAK‘;
Oracle的閃回技術--閃回錯誤的DML操作