1. 程式人生 > >Oracle閃回技術

Oracle閃回技術

oracle閃回技術

Oracle閃回技術


1.Flashback Database

2.Flashback Drop

3.Flashback Table

4.Flashback Query




1.Flashback Database(利用閃回日誌恢復)


描述:Oracle Flashback Database特性允許通過SQL語句Flashback Database語句,讓數據庫前滾到當前的前一個時間點或者SCN。閃回數據庫可以迅速將數據庫回到誤操作或人為錯誤的前一個時間點,如ctrl+Z操作,可以不利用備份就快速的實現基於時間點的恢復。Oracle通過創建新的Flashback Logs(閃回日誌),記錄數據庫的閃回操作。如果希望能閃回數據庫,需要設置如下參數:DB_RECOVER_FILE_DEST日誌的存放位置,DB_RECOVER_FILE_DEST_SIZE恢復區的大小。


註:在創建數據庫的時候,Oracle將自動創建恢復區,但默認是關閉的,需要執行alter database flashback on命令。



1. Flashback Database 不能解決Media Failure, 這種錯誤RMAN恢復仍是唯一選擇

2. 如果刪除了數據文件或者利用Shrink技術縮小數據文件大小,這時不能用Flashback Database技術回退到改變之前的狀態,這時候就必須先利用RMAN把刪除之前或者縮小之前的文件備份restore 出來, 然後利用Flashback Database 執行剩下的Flashback Datbase。

3. 如果控制文件是從備份中恢復出來的,或者是重建的控制文件,也不能使用Flashback Database。

4. 使用Flashback Database鎖能恢復到的最早的SCN, 取決與Flashback Log中記錄的最早SCN。



Flashback Database 包括一個進程Recover Writer(RVWR)後臺進程,Flashback Database Log日誌 和Flash Recovery Area。一旦數據庫啟用了Flashback Database, 則RVWR進程會啟動,該進程會向Flash Recovery Area中寫入Flashback Database Log, 這些日誌包括的是數據塊的" 前鏡像", 這也是Flashback Database 技術不完全恢復塊的原因。


配置Flash Recovery Area

要想使用Flashback Database, 必須使用Flash Recovery Area,因為Flashback Database Log只能保存在這裏。 要配置的2個參數如下,一個是大小,一個是位置。如果數據庫是RAC,flash recovery area 必須位於共享存儲中。數據庫必須處於archivelog 模式.


啟用Flash Recovery Area:

SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=4G SCOPE=BOTH;

SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST=‘/home/oracle/fast’ SCOPE=BOTH;


禁用Flash Recovery Area:

SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST=‘‘ ;

對於Flash Recovery Area,Oracle 是這樣建議的,flash recovery area 設置的越大,flashback database 的恢復能力就越強,因此建議flash recovery area 能夠放的下所有的數據文件,增量備份,以及所有尚未備份的歸檔文件,當然還有它自己產生的flashback logs。


在數據庫運行過程中,oracle 自動向該區域寫入文件,當剩余空間不足15%的時候,它就會在alert 中增加警告,提示你空間不足。但此時不會影響數據庫的正常運轉,直到所有空間統統被用掉之後,oracle 首先嘗試刪除尋些過期的文件,冗余文件或備份過的文件。


步驟:


配置參數信息;

關閉數據庫

啟動到mount狀態


檢查Flashback 功能, 缺省時功能是關閉的。

select name,current_scn,flashback_on from v$database;


NAME CURRENT_SCN FLASHBACK_ON

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

PROD1 1064824 YES



off為不打開,改為off可以在open狀態下改,改完後flash_recovery_area下的flashback log文件會被Oracle自動刪掉.

這時候會在開始設定的目錄/u01/app/oracle/flash_recovery_area 下生成一個ORCL/FLASHBACK目錄(ORCL根據數據庫名稱變化),下面放的是flashback log文件.


設置參數:DB_FLASHBACK_RETENTION_TARGET

alter system set db_flashback_retention_target=1440 scope=both;

該參數用來控制flashback log 數據保留的時間,或者說,你希望flashback database 能夠恢復的最早的時間點。默認值是1440,單位是minute,即24 小時,需要註意的是該參數雖然未直接指定flash recovery area大小,但卻受其制約,舉個例子假如數據庫每天有10%左右的數據變動的話,如果該初始化參數值設置為1440,則flash recovery area 的大小至少要是當前數據庫實際容量的10%,如果該初始化參數設置為2880,則flash recovery area 的大小就至少是數據庫所占容量的20%。



例:


SQL> create table test1

2 (id number,

3 name varchar2(20));


Table created.


SQL> create table test2

2 (id number,

3 name varchar2(20));


Table created.


SQL> insert into test1 values(dbms_flashback.get_system_change_number,‘A‘);


1 row created.


SQL> insert into test2 values(dbms_flashback.get_system_change_number,‘A‘);


1 row created.


SQL> commit;


Commit complete.


SQL> select * from test1;


ID NAME

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

1065468 A


SQL> select * from test2;


ID NAME

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

1065470 A




查詢當前的scn

SQL> SELECT CURRENT_SCN FROM V$DATABASE;


CURRENT_SCN

-----------

1065501


查詢當前的時間

SQL> select to_char(sysdate,‘yy-mm-dd hh24:mi:ss‘) time from dual;



刪除表1數據並提交


delete from test1;

commit;

select * from test1;

no rows selected



增加表2數據並提交


insert into test2 values(dbms_flashback.get_system_change_number,‘B‘);

commit;

select * from test2;


ID NAME

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

1065470 A

1065529 B



恢復步驟

shutdown immediate

startup mount


SCN或時間點恢復

Flashback database to scn 1065501;


Flashback database to timestamp to_timestamp(‘16-10-15 09:36:05‘,‘yy-mm-dd hh24:mi:ss‘);


打開數據庫:

在執行完flashback database 命令之後,oracle 提供了兩種方式讓你修復數據庫:

1). 先執行alter database open read only 命令以read-only 模式打開數據庫,然後立刻通過邏輯導出的方式將誤操作涉及表的數據導出,再執行recover database 命令以重新應用數據庫產生的redo,將數據庫修復到flashback database 操作前的狀態,然後再通過邏輯導入的方式,將之前誤操作的表重新導入,這樣的話對現有數據的影響最小,不會有數據丟失。

2). 直接alter database open resetlogs 打開數據庫,當然指定scn 或者timestamp 時間點之後產生的數據統統丟失。


SQL> alter database open read only;

Database altered.

SQL> select * from test1;

ID NAME

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

3759479 A

對於test1表,這裏我們發現恢復點之前的數據已經閃回.這時候應該將閃回的test1表的數據導出,對數據庫做完整的恢復,然後將數據導入.

SQL> select * from test2;

ID NAME

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

3759479 A

對於test2表,這裏我們發現恢復點之前的數據也存在,但是恢復點之後的數據(3761885 B)丟失了.

SQL> shutdown immediate

SQL> startup mount


exp sys/[email protected] file=/home/oracle/test1.dmp tables=test1


SQL> recover database;

Media recovery complete.

SQL> alter database open;

Database altered.

再來驗證數據:

SQL> select * from test1;

no rows selected

SQL> select * from test2;

ID VAL

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

3759479 A

3761885 B


imp sys/[email protected] IGNORE=Y TABLES=test1 FULL=N file=/home/oracle/test1.dmp


是完整恢復後的正確數據,把開始test1表的導出數據導入test1表,數據找回完成.

和Flashback Database 相關的2個視圖:

1. V$database

這個視圖可以查看是否啟用了Flashback database功能

SQL> select flashback_on from v$database;

2. V$flashback_database_log

Flashback Database 所能回退到的最早時間,取決與保留的Flashback Database Log 的多少, 該視圖就可以查看許多有用的信息。

Oldest_flashback_scn / Oldest_flashback_time : 這兩列用來記錄可以恢復到最早的時點

Flashback_size: 記錄了當前使用的Flash Recovery Area 空間的大小

Retention_target: 系統定義的策略

Estimated_flashback_size: 根據策略對需要的空間大小的估計值

3. V$flashback_database_stat

這個視圖用來對Flashback log 空間情況進行更細粒度的記錄和估計。 這個視圖以小時為單位記錄單位時間內數據庫的活動量,Flashback_Data 代表Flashback log產生數量,DB_Date 代表數據改變數量,Redo_Date代表日誌數量,通過這3個數量可以反映出數據的活動特點,更準確的預計Flash Recovery Area的空間需求




3、Flashback Drop(利用回收站功能恢復)


Oracle的Flashback Drop閃回刪除功能給出我們一種誤刪除表的便捷恢復方式,實現這種功能的原理是Oracle的“回收站”(RecycleBin)功能。註意,如果被刪除的表原先是存放在SYSTEM系統表空間上,則不支持此功能。


恢復被錯誤drop掉的表。當一張表被刪除後,依然可以查看被drop表的內容,是通過查看回收站中的內容實現的。


被刪除的表將被存在一個叫recyclebin回收站的地方,當drop掉表後,實際上就是將改表改了個名字。


回收站有關的視圖

DBA_RECYCLEBIN

USER_RECYCLEBIN

RECYCLEBIN


被drop掉的表簡短信息

show recyclebin


表空間不足

用戶的空間配額不足

purge命令

使用flashback命令恢復表後,與之對應的回收站中的那條記錄內容被清除



FLASHBACK TABLE TEST3 TO BEFORE DROP;

FLASHBACK TABLE "BIN$Z6gzDCWg7hfgQAB/AQAROQ==$0" TO BEFORE DROP;


FLASHBACK TABLE TEST3 TO BEFORE DROP RENAME TO TEST3_VERSION_1;



SQL> create table test3

2 (id number,

3 name varchar2(30))

4 tablespace users;


Table created.


SQL> insert into test3 values(1,‘A‘

2 );


1 row created.


SQL> insert into test3 values(2,‘B‘);


1 row created.


SQL> commit;


Commit complete.


SQL> select * from test3;


ID NAME

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

1 A

2 B


SQL> drop table test3;


Table dropped.


SQL> show recyclebin;

ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME

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

TEST3 BIN$PujbM654As3gUKjAZhJL+A==$0 TABLE 2016-10-15:10:06:59



SQL> select * from test3;

select * from test3

*

ERROR at line 1:

ORA-00942: table or view does not exist



SQL> FLASHBACK TABLE TEST3 TO BEFORE DROP;

Flashback complete.


SQL> select * from test3;


ID NAME

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

1 A

2 B


SQL>



清除當前用戶的回收站

SQL> purge recyclebin;

SQL> purge user_recyclebin;


清除指定表空間tbs_sec_d的回收站

SQL> purge tablespace tbs_sec_d;


清除指定表空間tbs_sec_d,同時指定用戶sec的回收站

SQL> purge tablespace tbs_sec_d user sec;


清除回收站中所有的內容(sys用戶)

SQL> purge dba_recyclebin


不產生回收站數據的同時drop表方法

這種方法是徹底刪除表的方法,使用前要考慮清楚。

SQL> drop table ft_1 purge;



3、Flashback Table(利用UNDO保留信息恢復)


Oracle Flashback Table特性允許利用Flashback Table語句,確保閃回到表的前一個時間點。利用回滾段信息來恢復一個或一些表到以前的一個時間點(一個快照)。要註意的是,Flashback Table不等於Flashback Query,Flashback Query僅僅是查詢以前的一個快照點而已,並不改變當前表的狀態,而Flashback Table將改變當前表及附屬對象一起回到以前的時間點。


undo_management,參數需要是“AUTO”

undo_retention,單位是秒,調整可回滾的時間範圍


在線操作

恢復到指定的時間點(或者SCN)的任何數據

自動恢復相關屬性

滿足分布式的一致性

數據的一致性,所有相關對象將自動一致。


SQL> flashback table test4 to timestamp to_timestamp(‘2012-12-29 16:44:17‘, ‘yyyy-mm-dd hh24:mi:ss‘);

SQL> flashback table test4 to scn 662421;

SQL> flashback table test4 to timestamp to_timestamp(‘2012-12-29 16:44:17‘, ‘yyyy-mm-dd hh24:mi:ss‘) enable triggers;


普通用戶中需要有Flashback any table的系統權限;

有該表的select、insert、delete、alter權限;

必須保證該表有row movement(行移動)。


例:

create table test4 tablespace users as select * from hr.employees;


select count(*) from test4;


select * from test4;


為test4表創建索引

create index ind_test4 on test4(employee_id);


create or replace trigger tr_test

after update on test4

for each row

begin

null;

end

tr_test;

/


(sys)

select to_char(sysdate, ‘yyyy-mm-dd hh24:mi:ss‘) time, to_char(dbms_flashback.get_system_change_number) scn from dual;


delete from test4;


commit;


drop index ind_test4;


create or replace trigger tr_test

after insert on test4

for each row

begin

null;

end

tr_test;

/


確保該表中的行遷移(row movement)功能

alter table test4 enable row movement;



flashback table test4 to timestamp to_timestamp(‘2016-10-15 10:49:09‘, ‘yyyy-mm-dd hh24:mi:ss‘) enable triggers;



select index_name from user_indexes where table_name = ‘test4‘;


select object_name, status from user_objects where object_name in(‘TR_TEST‘, ‘IND_TEST‘);


select text from user_source t where t.name = ‘TR_TEST‘;


1. Flashback table在真正的高可用環境中,使用意義不大,受限比較多,要必須確保行遷移功能

2. Flashback table過程中,阻止寫操作

3. 使用flashback table可以將delete方式刪除的表閃回到之前某個時間點,而表中索引卻不能正常恢復,因為drop索引的過程是不記錄undo的。

4. 恢復的觸發器本身還是修改後的,並不隨表flashback到修改以前的時間點。說明關鍵字enable triggers只能保證觸發器的狀態正常,而不是內容回滾.

5. 由於原理利用其undo信息,來恢復其對象,因此也是不能恢復truncate數據

6. 恢復數據用flashback query實現比較好





4.Flashback Query


Flashback Query 是利用多版本讀一致性的特性從UNDO 表空間讀取操作前的記錄數據!

什麽是多版本讀一致性

Oracle 采用了一種非常優秀的設計,通過undo 數據來確保寫不堵塞讀,簡單的講,不同的事務在寫數據時,會將數據的前映像寫入undo 表空間,這樣如果同時有其它事務查詢該表數據,則可以通過undo 表空間中數據的前映像來構造所需的完整記錄集,而不需要等待寫入的事務提交或回滾。


flashback query 有多種方式構建查詢記錄集,記錄集的選擇範圍可以基於時間或基於scn,甚至可以同時查詢出記錄在undo 表空間中不同事務時的前映象。用法與標準查詢非常類似,要通過flashback query 查詢undo 中的撤銷數據,最簡單的方式只需要在標準查詢語句的表名後面跟上as of timestamp(基於時間)或as of scn(基於scn)即可。這個功能和flashback on/off 以及recyclebin on/off沒有關系.


例:


hr用戶

create table test5

(id number,

name varchar2(20));


Table created.


SQL> insert into hr.test5 values(dbms_flashback.get_system_change_number,‘A‘); (sys)



select * from test5;


ID NAME

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

1061963 A



select to_char(sysdate,‘yy-mm-dd hh24:mi:ss‘) time from dual;


TIME

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

16-10-15 11:27:15



alter table test5 enable row movement;

delete from test5;

commit;


select * from hr.test5 as of timestamp (SYSTIMESTAMP - INTERVAL ‘2‘ MINUTE);

或者

select * from test5 as of timestamp to_timestamp(‘16-10-15 11:27:15‘,‘YY-MM-DD hh24:mi:ss‘);


insert into test5 select * from test5 as of timestamp to_timestamp(‘16-10-15 11:27:15‘,‘YY-MM-DD hh24:mi:ss‘);



As of scn 示例

SELECT dbms_flashback.get_system_change_number FROM dual;


SELECT CURRENT_SCN FROM V$DATABASE;


delete from hr.test5;


commit;


insert into hr.test5 select * from hr.test5 as of scn 1063434;

commit;


select * from hr.test5;


事實上,Oracle 在內部都是使用scn,即使你指定的是as of timestamp,oracle 也會將其轉換成scn,系統時間標記與scn 之間存在一張表,即SYS 下的SMON_SCN_TIME

每隔5 分鐘,系統產生一次系統時間標記與scn 的匹配並存入sys.smon_scn_time 表,該表中記錄了最近1440個系統時間標記與scn 的匹配記錄,由於該表只維護了最近的1440 條記錄,因此如果使用as of timestamp 的方式則只能flashback 最近5 天內的數據(假設系統是在持續不斷運行並無中斷或關機重啟之類操作的話)。

註意理解系統時間標記與scn 的每5 分鐘匹配一次這句話,舉個例子,比如scn:3764577,3765348 分別匹配12-01-12 13:52:00 和12-01-12 13:57:00,則當你通過as of timestamp 查詢12-01-12 13:52:00或12-01-12 13:57:00 這段時間點內的時間時,oracle 都會將其匹配為scn:3764577到undo 表空間中查找,也就說在這個時間內,不管你指定的時間點是什麽,查詢返回的都將是12-01-12 13:52:00 這個時刻的數據。

查看SCN 和timestamp 之間的對應關系:

select scn,to_char(time_dp,‘yyyy-mm-dd hh24:mi:ss‘)from sys.smon_scn_time;


本文出自 “11862116” 博客,請務必保留此出處http://11872116.blog.51cto.com/11862116/1959074

Oracle閃回技術