oracle 閃回 flashback

j04212發表於2014-02-14


--flashback 功能
flashback database:將整個資料庫倒退到一個特定的時刻。
flashback table:將表返回到過去的一個狀態。
flashback drop:撤銷 drop table 命令並恢復被刪除的表。
flashback query、flashback version query、flashback transaction query:檢索過去某一時刻(或時間間隔)的資料。
flashback transaction backout:撤銷一個事務以及它依賴的所有事務。
flashback data archive:儲存對一個表所做更改的歷史,可用它來構造舊版本資料的查詢和用於審計用途。


--閃回查詢技術

閃回查詢
閃回版本查詢
閃回事務查詢


--閃回錯誤操作技術

閃回表
閃回刪除
閃回資料庫


--使用條件

undo_management 引數必須是auto
閃回功能開啟
啟用回收站


應該為撤銷資料指定 retention guarantee 子句。僅設定較大的 undo_retention 值並不能保證 Oracle 不丟棄未過期的撤銷資料。

alter tablespace undotbs1 retention guarantee;


為保證資料一致性,在使用任何種類的閃回操作前,應該發出一條commit或者rollback語句。


--檢視閃回功能是否開啟

select flashback_on from v$database;

開啟閃回功能(mount狀態下)

alter database flashback on;


--檢視回收站是否啟用

show parameter recyclebin;

開啟回收站功能

alter system set recyclebin=on;


--查詢最大事務時間

select maxquerylen from v$undostat
order by maxquerylen;


--閃回查詢許可權
grant flashback on employees to ikki;
或者
grant flashback any table to ikki;


--閃回查詢

select 列名
from 表名
as of scn|timestamp 表示式
where 條件


sql>set time on;

14:02:58 SQL> select empno,sal
14:03:11   2  from emp
14:03:16   3  as of timestamp sysdate-1/24  (一個小時前的,1天除24)
14:03:53   4  where empno=7844;

14:04:01 SQL> select empno,sal
14:08:43   2  from emp
14:08:47   3  as of timestamp to_timestamp('2012-7-28 14:01:20','yyyy-mm-dd hh24:mi:ss')
14:09:56   4  where empno=7844;

select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss') time_dp
from smon_scn_time

select scn_to_timestamp(2335368) from dual
select timestamp_to_scn(to_date('2012-7-28 14:01:26','yyyy-mm-dd hh24:mi:ss')) from dual

14:35:39 SQL> select current_scn from v$database;

    2335368

14:39:55 SQL> select empno,sal from scott.emp
14:40:53   2  where empno=7844;

      7844       4000


create bak_table as select * from table_name as of timestamp|scn;

insert into bak_table select * from table_name as of timestamp|scn;


--閃回版本查詢

select 列名
from 表名
versions between scn|timestamp
minvalue|表示式 and maxvalue|表示式
where 條件

 

versions_starttime
versions_startscn
versions_endtime
versions_endscn
versions_xid
versions_operation(i,d,u)

update scott.emp set sal=6000 where empno=7844;
update scott.emp set sal=6500 where empno=7844;
update scott.emp set sal=7000 where empno=7844;
commit;
update scott.emp set sal=7500 where empno=7844;
commit;
set linesize 600
col starttime format a30
col endtime format a30
col operation format a10

select versions_xid xid,versions_starttime starttime,versions_endtime endtime,
versions_operation operation,sal 表欄位
from scott.emp
versions between timestamp minvalue and maxvalue
where empno=7844
order by starttime;

select versions_xid xid,versions_startscn startscn,versions_endscn endscn,
versions_operation operation,sal
from scott.emp
versions between scn minvalue and maxvalue
where empno=7844
order by startscn;


閃回版本查詢的一些限制:

1)只能用此特性來查詢實際的表,不能查詢檢視。
2)不能跨DDL操作應用versions子句。
3)查詢將忽略純粹的行物理更改,如段收縮中發生的行物理更改。
4)如果處理外部表或臨時表,則不能使用此特性。


--閃回事務查詢

set pause on;

select versions_xid,sal
from scott.emp
versions between scn minvalue and maxvalue
where empno=7844;

select operation,undo_sql
from flashback_transaction_query
where xid=HEXTORAW('04001e002e010000');


--閃回表(不適合system表空間, 不能跨DDL操作)

flashback table 表名 to
scn|timestamp 表示式
[enable|disable triggers]


使用者具有flashback any table許可權

使用者具有物件許可權
合理設定undo_retention引數值


閃回表前先執行下面的語句:

alter table t enable row movement;
這是因為閃回操作是使用DML操作來完成工作,這些DML操作更改了影響到行的ID,因此你必須保證已經啟用用於閃回表特性的表中的行移動。


閃回表命令:

flashback table t to scn 675371;
或者
flashback table t to timestamp
to_timestamp('20131121 15:35:00','yyyymmdd hh24:mi:ss');


閃回表的一些限制:

1)不能閃回SYS擁有的表,恢復物件或遠端表。
2)不能將表閃回到涉及表結構更改(如修改或刪除列、擷取一個表、新增約束、執行與分割槽有關的操作如新增或刪除一個分割槽)
3)flashback語句涉及單個事務,閃回操作要麼完全成功,要麼完全失敗。如果閃回操作涉及多個表,所有的表都必須閃回或者不閃回。
4)如果在閃回操作中Oracle發現違背了約束,則放棄操作,使表保留原來的狀態。
5)如果收縮一個表或更改一個表的任意非儲存屬性(除了pctfeee、inittrans和maxtrans等屬性),則不能閃回到做出這些更改前的時刻。


--閃回刪除(只適合本地管理,非系統表空間的表)

flashback table 表名 to before drop[rename to 表名1]

show parameter recyclebin
alter system set recyclebin=on

select object_name,original_name,type from user_recyclebin;


--清除回收站

purge [table 表名]|[index 索引名]|
[recyclebin|dba_recyclebin]|
[tablespace 表空間名 [user 使用者名稱]]

purge recyclebin


--閃回資料庫

flashback [standby] database 資料名
to [scn|timestamp 表示式]
   [before scn|timestamp 表示式]


歸檔模式

設定了閃回恢復區
啟用了flashback database特性
 (mount狀態)alter database flashback on;
db_flashback_retention_target 設定閃回日誌保留時間


不適用於:

已還原或重建控制檔案
已刪除了表空間
已收縮了資料檔案


SQL> select oldest_flashback_scn,oldest_flashback_time,retention_target      

  2  from v$flashback_database_log;

OLDEST_FLASHBACK_SCN OLDEST_FLASH RETENTION_TARGET
-------------------- ------------ ----------------
             2327829 28-JUL-12                1440

alter database to scn 2327829;
alter database open resetlogs;

select * from v$flashback_database_logfile

 

閃回表
alter table test.tbs enable row movement;

flashback table test.tbs to timestamp to_timestamp('2012-8-4 09:39:22','yyyy-mm-dd hh24:mi:ss');

select object_name,original_name,type from user_recyclebin;
select object_name,original_name,type from dba_recyclebin;
show recyclebin
select OBJECT_NAME,OBJECT_TYPE from user_objects;

alter index rename "BIN$xmfpWkYzIJPgQKjAJQARMA==$0" to "idx_a"

v$flashback_database_log

 

--閃回資料歸檔

11:30:46 SYS@dbtest> create tablespace fla
11:30:58   2  datafile '/u01/app/oracle/oradata/fla01.dbf' size 10m;

11:31:50 SYS@dbtest> create flashback archive default flaarea
11:32:37   2  tablespace fla quota 8m
11:32:55   3  retention 1 year;

11:33:05 SYS@dbtest> create tablespace fla1
11:35:47   2  datafile '/u01/app/oracle/oradata/fla101.dbf' size 20m;

11:36:17 SYS@dbtest> alter flashback archive flaarea
11:36:37   2  add tablespace fla1
11:36:47   3  quota 10m;

11:36:53 SYS@dbtest> alter flashback archive flaarea
11:38:24   2  modify retention 2 year;

11:38:37 SYS@dbtest> alter flashback archive flaarea
11:39:06   2  modify tablespace fla1
11:39:16   3  quota 12 m;

11:39:24 SYS@dbtest> alter flashback archive flaarea
11:39:39   2  set default;

11:39:44 SYS@dbtest> create tablespace fla2
11:41:44   2  datafile '/u01/app/oracle/oradata/fla201.dbf'
11:42:09   3  size 10m;

11:42:15 SYS@dbtest> create flashback archive flaarea1
11:42:31   2  tablespace fla2
11:42:36   3  quota 5m
11:42:42   4  retention 1 year;


--手動刪除閃迴歸檔區的資料

alter flashback archive flaarea
purge before timestamp to_timestamp('2012-8-4 15:00:00','yyyy-mm-dd hh24:mi:ss')


--授予使用者scott閃回區管理許可權和flaarea區上的閃回許可權

grant flashback archive administer to scott
grant flashback archive on flaarea to scott
grant flashback archive on flaarea1 to scott


--指定表到閃迴歸檔區

create table t1(c1 int) flashback archive
create table t2(c1 int) flashback archive flaarea1
create table t3(c1 int)

select * from t3 as of timestamp to_timestamp()


ORA-01548: active rollback segment '_SYSSMU2_2232571081$' found, terminate
dropping tablespace


--清除特定scn之前的資料

alter flashback archive flaarea purge before scn 728969


--將指定的表不再設定資料歸檔

alter table t1 no flashback archive


--刪除資料歸檔區

drop flashback archive flaarea

dba_flashback_archive
dba_flashback_archive_ts      --表空間
dba_flashback_archive_tables

user_flashback_archive
user_flashback_archive_tables


--rman下的閃回

(mount下)
rman> flashback database to time="to_date('2012-8-4 15:00:00','yyyy-mm-dd hh24:mi:ss')";

rman> flashback database to scn=273533;

rman> flashback database to sequence=3 thread=1;

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

相關文章