您好,登錄后才能下訂單哦!
Oracle的閃回
1 flashback 的功能:
1)利用undo data回溯或撤銷提交的數據,
2)flashback log 使database 可以恢復到過去某個時間點,可以作為不完恢復的補充。
2 flashback分類
1)flashback drop 2)flashback query (新添flashback database archive) 3)flashback table 4)flashback version query 5)flashback transaction 6)flashback database
|
2.1 閃回drop 又名閃回刪除
1)理解回收站(recyclebin)
從管理的角度為每個用戶"分配"一個回收站,但這個回收站并不實際開辟空間(只是個邏輯容器),當drop table時(非purge),原來的表所使用的段中的數據并沒有真正的刪除。實際上是把table的段名以回收站方式重命名。該段所在表空間不足需要擴展時,回收站中的信息會被自動清除(考點)。
做個例子理解一下
SQL> show parameter recyclebin //當初始化參數recyclebin為on時,每個用戶都有了自己的回收站 //如果參數設為off 就取消了用戶的回收站,那么當你drop table就相當于purge了。
SQL> create tablespace test1 datafile '/u01/app/oracle/oradata/hyyk/test01.dbf' size 1m; SQL> create table scott.t1(id int) tablespace test1; SQL> insert into scott.t1 values(1); SQL> insert into scott.t1 values(1); SQL> commit; SQL> select segment_name from dba_segments where tablespace_name='TEST1'; //看test表空間下有了一個段
SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST1'; //看這個段有多少空閑空間
繼續插入數據,將表空間撐滿 SQL> insert into scott.t1 values(1); SQL> insert into scott.t1 select * from scott.t1; / /
查看數據有多少行 SQL> select count(*) from scott.t1;
SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST1'; //顯示沒有空閑空間
刪除表t1 SQL> drop table scott.t1;
查看表空間為TEST1的段名被修改了 SQL> select segment_name from dba_segments where tablespace_name='TEST1';
SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST1'; 請看,TEST表空間中的空閑空間又回來了,這說明如果test表空間不夠時,這部分空閑空間是可以被重新利用的,實際上即使你設置了表空間autoextend特性,Oracle 會先使用recyclebin,若空間還不夠,再考慮autoextend.
SQL> create table scott.emp2 tablespace test1 as select * from scott.emp; //擠占test表空間 SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST1'; SQL> select segment_name from dba_segments where tablespace_name='TEST1'; //t1表的數據已經被沖掉了,使用閃回刪除無法找回了(考點)。
|
2)關于回收站中的對象的閃回和清除
閃回和清除的順序不同
閃回使用LIFO (后進先出)
清除使用FIFO (先進先出)
假設回收站里有兩個t1表,看以下兩條語句:
SQL> flashback table t1 to before drop; //閃回的是最新的那個t1表(考點)。
SQL> purge table t1; //清除的是最舊的那個t1表(考點)。
如果想避免混淆,可以直接點出回收站里的表名
SQL> flashback table " BIN$qrJLbL74ZgvgQKjA8Agb/A==$0" to befroe drop;
SQL> purge table "BIN$qrJLbL74ZgvgQKjA8Agb/A==$0";
SQL> purge recyclebin; //清空回收站
3)如何恢復同一個schema下準備閃回的表已有同名的對象存在,閃回drop需要重命名.
SQL> drop table emp1;
SQL> create table emp1 as select * from emp;
SQL> select * from tab;
SQL> show recycle;
SQL> flashback table emp1 to before drop rename to test_old;
//閃回drop語句中使用了重命名
4)system 表空間的對象沒有回收站,所以在sys下缺省使用system表空間時,drop table會直接刪除對象(考點)
5)如果一個表上面有索引和約束,drop后再閃回表,索引和約束還在嗎?
create table t (id int,name char(10));
alter table t add constraint pk_t primary key(id);
insert into t values (1,'sohu');
insert into t values (2,'sina');
commit;
SQL> select * from t;
-----看一眼約束和索引
SCOTT@hyyk> col segment_name for a20
SCOTT@hyyk> select segment_name,segment_type from user_segments;
SCOTT@hyyk> select constraint_name from user_constraints;
SQL> drop table t;
----表被drop到回收站,再看一眼約束和索引
SQL> select segment_name,segment_type from user_segments;
SQL> select constraint_name from user_constraints; //約束有,但亂碼(除外鍵約束外)
SQL> flashback table t to before drop;
-----再看約束和索引
SQL> select segment_name,segment_type from user_segments;
//索引回來了,有效(考點),但亂碼
SQL> select constraint_name from user_constraints; //約束也在,有效(考點),但亂碼
-----分別重命名索引和約束
SQL> alter index "BIN$YIkba0zjgoDgUAEKCAFgVQ==$0" rename to pk_t;
SQL> alter table t rename constraint "BIN$YIkba0zigoDgUAEKCAFgVQ==$0" to pk_t;
-----再看約束和索引
2.2 閃回查詢 flashback query:(用于DML 誤操作)
1)要點:
利用在undo tablespace 里已經被提交的undo block(未被覆蓋),可以通過查詢的方式將表里面的記錄回到過去某個時間點。通過設置undo_retention參數設置前鏡像的保留時間。
查詢的語法:
select … as of scn | timestamp
2)實驗
sys用戶: create table scott.student (sno int,sname char(10),sage int); insert into scott.student values(1,'Tom',21); insert into scott.student values(2,'Kite',22); insert into scott.student values(3,'Bob',23); insert into scott.student values(4,'Mike',24); commit; /
查看數據 SQL> select * from scott.student;
取時間1和取scn1,用于后面閃回查詢使用 select to_char(sysdate, 'yyyy-mm-dd hh34:mi:ss') from dual; //時間1 TO_CHAR(SYSDATE,'YY ------------------- 2017-12-17 20:28:49
select current_scn from v$database; //取scn1 CURRENT_SCN ----------- 1431343
刪除表中1行數據,并提交 delete scott.student where sno=1; commit;
驗證是否刪除成功 select * from scott.student;
這里我們在取時間2和scn2 select to_char(sysdate, 'yyyy-mm-dd hh34:mi:ss') from dual; //取時間2 TO_CHAR(SYSDATE,'YY -------------------------- 2017-12-17 20:30:41
select current_scn from v$database; //取scn 2 CURRENT_SCN ----------- 1431479
我們在更新一下表中的數據 update scott.student set sage=50; commit; select * from scott.student;
我們使用scott用戶進行閃回查詢: 閃回查詢時間1時刻student表的數據,雖然數據庫在時間1之后進行了刪除和更新,但是可以可以沒有覆蓋的undo中讀取到時間1時刻的狀態 select * from student as of timestamp to_date('2017-12-17 20:30:41','yyyy-mm-dd hh34:mi:ss');
閃回查詢scn2的狀態 select * from student as of scn 1431343;
如果在scn2之后,由于操作事物導致一些數據丟失,就可以使用下面的方法恢復數據 1.通過閃回查詢的數據建立一個student2表 create table student2 as select * from scott.student as of scn 1431343;
2.刪除舊的的student drop table student;
3.將student2表重命名成student rename student2 to student; select * from student;
*考點:可以查詢以前某個時間點的數據庫,但是永遠不能對過去時間點得數據庫做DML操作。 |
2.3 閃回表
1)要點
閃回表通常是把表的狀態回退到以前的某個時刻或者SCN上。(其實向前向后都能閃)。自動恢復相關的屬性,包括索引、觸發器等。
前提是對表啟用行移動。
為什么使用行移動:這里的flashback table 指的是從undo中閃回,試想這張表原來的存儲位置被別的objects占用的話,他回不到原來的位置,所以要使用enable row movement
語法:
flashback table to timestamp | scn
2)實驗
delete student; commit; alter table student enable row movement; flashback table student to scn XXXXX |
考點:
1)sys的表不能閃回。
2)必須使能行移動。
3)缺省下,閃回表的過程中有關的trigger都關閉。
4)閃回表有index是被維護的
5 ) 物化視圖下不許閃回表操作
2.4 閃回數據歸檔 (FLASHBACK ARCHIVE) 11g新特性(TOTAL RECALL)
1. 概念
無限期的存儲表行數據,通過后臺進程FBDA,捕捉必要的數據并將其保存在歸檔上,然后可以使用常規閃回查詢命令(as of)查詢需要的數據,但閃回可以回朔到多年以前。閃回歸檔可以看成是閃回查詢時間的延伸。
2. 有幾個要點
3) 可以根據需要建立多個閃回歸檔名(方案),這取決于你需要多少種不同的保留時間。可以調整保留時間,一旦超過了保留期限,后臺進程FDBA將自動刪除該表歷史記錄,也可以在保留期內手動進行刪除操作。
4) 關于兩個權限:
flashback archive administer //授予用戶創建,修改或刪除閃回歸檔名(方案)
flashback archive //授予用戶對表進行歸檔。
5) 啟用表的閃回歸檔需要使用alter table 表名 flashback archive 歸檔名
6) 閃回歸檔enable也有個前提條件,表空間要ASSM管理和以及undo_management=on, 否則修改表時報ORA_55614錯誤
7) 關于閃回歸檔的視圖:
DBA_FLASHBACK_ARCHIVE //描述配置的歸檔
DBA_FLASHBACK_ARCHIVE_TS //列出使用的表空間
DBA_FLASHBACK_ARCHIVE_TABLES //查看歸檔的表
3. 實驗
例1:DBA建一個表空間用于閃回歸檔,然后將閃回歸檔作為一個對象創建并授權。
sys: create tablespace fda datafile '/u01/app/oracle/oradata/hyyk/fda01.dbf' size 5m; create flashback archive fla1 tablespace fda quota 2m retention 1 year; grant flashback archive on fla1 to scott;
用戶將自己的表定義為閃回歸檔 scott: alter table emp1 flashback archive fla1;
可以做些DML操作在使用閃回查詢(as of)驗證。 11gR1上嘗試做一些DDL操作會報錯(11gR2上已改進了,PPT-II-291): scott: alter table emp1 drop column comm; truncate table emp1; ORA-55610: 針對歷史記錄跟蹤表的 DDL 語句無效。(修改列刪除列,清空記錄可以 但是不能刪除)
drop table emp1;(11gR2上也不行)
下面演示取消歸檔保護 sys: 查看有哪些歸檔名 SQL> select owner_name,flashback_archive_name from dba_flashback_archive;
SQL> select * from dba_flashback_archive_ts; //查看歸檔使用表空間的信息
SQL> select * from dba_flashback_archive_tables; //查看表emp1和歸檔名的關系。
sys: SQL> alter table scott.emp1 no flashback archive; //將表scott.emp1從閃回歸檔中取消, |
例2:通過一道考題我們來實驗一下,什么是default歸檔:
題目:
Note the output of the following query;
SQL> SELECT flashback_archive_name, status FROM dba_flashback_archive;
FLASHBACK_ARCHIEVE_NAME STATUS
FLA1 (無default 需要指定)
You executed the following command to enable Flashback Data Archive on the
EXCHANGB_PATE table:
ALTER TABLE exchange_rate FLASHBACK ARCHIEVE; on。。。。。
What is the outcome of this command?
A.The table uses the default Flashback Data Archive.
B.The Flashback Data Archive Is created In the SYSAUX tablespace.
C.The Flashback Data Archive is created in the same tablespace where the tables are stored.
D.The command generates an error because no flashback Data Archive name is specified and there is no default Flashback Data Achieve.
答案:d
SQL> conn / as sysdba。
SQL> alter flashback archive fla1 set default;
SQL> select FLASHBACK_ARCHIVE_NAME,STATUS from dba_flashback_archive;
SQL> alter table scott.emp1 flashback archive; //不用指定歸檔名,emp1綁定了FLA1(DEFAULT)。
SQL> select * from dba_flashback_archive_tables;
刪除閃回歸檔(方案)
SQL> drop flashback archive fla1;
考點:設置閃回數據歸檔有兩個先決條件:
1)使能automatic undo managent
2)tablespace要ASSM的。
2.5 閃回版本查詢(PPT-II-260)
1)要點
閃回查詢僅僅能夠得到過去某個時間點上的數據,但是無法反映出一段時間內數據表中數據變化的細節,10g的閃回版本查詢可以對時間段內數據表的每行變化(不同版本)進行查詢。
語法:select … from … versions between
其中,select后面可以選擇偽列,來獲得事務的開始、結束時間、SCN號、ID號等。
2)舉例:
scott:
create table t3 (id int, name char(10));
insert into t3 values(1,'tim');
insert into t3 values(2,'mike');
insert into t3 values(3,'brain');
insert into t3 values(4,'cade');
commit;
update t3 set name='nelson' where id=4;
commit;
delete t3 where id=2;
commit;
update t3 set id=id+100;
commit;
看看t3表經歷的時間變化
SQL> select versions_startscn, versions_endscn, versions_xid, versions_operation,id,name from scott.t3 versions between scn minvalue and maxvalue;
SQL>select versions_xid, versions_operation,id, name from t3 versions between scn minvalue and maxvalue;
考點:
2)閃回版本中的內容不包括未提交的DML語句。
2.6 閃回事務查詢(PPT-II-270)
1)要點:
閃回事務查詢可以提供撤銷查詢語句。從flashback_transaction_query 這個視圖里查詢引起數據變化的事務,和撤銷事務的SQL語句也就是查詢operation 和 undo_sql列。可以和閃回版本查詢結合起來使用。
sys:
SQL>desc flashback_transaction_query;
SQL>select undo_sql from flashback_transaction_query where xid=hextoraw('事務號');
接上例:
SQL> select undo_sql from flashback_transaction_query where xid=hextoraw('02000E0024040000');
//執行上面語句,原操作(update t3 set id=id+100;)就撤銷了
SQL> update "SYS"."T3" set "ID" = '4' where ROWID = 'AAANByAABAAAO/yAAD';
SQL> update "SYS"."T3" set "ID" = '3' where ROWID = 'AAANByAABAAAO/yAAC';
SQL> update "SYS"."T3" set "ID" = '1' where ROWID = 'AAANByAABAAAO/yAAA';
SQL> commit;
grant execute on dbms_flashback to scott;
閃回事務查詢考點
3) 查詢flashback_transaction_query視圖需要SELECT ANY TRANSACTION權限。
2.7 閃回數據庫(先閃回日志)
1)概念:
閃回數據庫相當于不完全恢復,它通過閃回日志將數據庫整體回退到某個時間點。
閃回數據庫針對的是邏輯錯誤,如果數據庫發生了物理損壞或介質丟失,閃回數據庫將無能為力,閃回數據庫不能完全代替傳統不完全恢復(考點)
使用閃回數據庫,需要開啟閃回日志,閃回日志存放在閃回恢復區里。
一旦啟用了閃回數據庫,某些塊的映像會從db buffer 復制到 SGA的一個新的存儲區域中,即閃回緩沖區,然后再由后臺進程(Recover Write RVWR)將此閃回恢復區的內容刷新到磁盤和閃回日志。這一切并沒有改變LGWR的常規作用。與重做日志不同的是 RVWR不是記錄數據庫變化的日志,而是記錄完整塊影像的記錄。(PPT-311)
*考點:不同于重做日志,閃回日志不能被多路復用和歸檔。它們是自動創建和管理的。
2)閃回日志放在閃回恢復區里
閃回恢復區(flash recovery area)是一個非常重要的概念, 它不僅存放閃回日志,還有許多與恢復有關的文件,比如,可以存放與RMAN相關的三種自動管理的文件,1.歸檔日志、2.控制文件自動備份 3.RMAN備份片。當flash recovery area空間不夠用,Oracle還可以自動清除一些廢棄(obsolete)文件。(PPT-II-49-55)
SQL> show parameter recovery_file
SQL> show parameter flash
*考點:1.設置db_recovery_file_dest之前必須先設置db_recovery_file_dest_size 。2.閃回日志存放的保留期,缺省值1440,單位是分鐘。(先設置大小,再設置路徑)
3)配置閃回數據庫的基本步驟:
3.1) 數據庫閃回要在mount狀態下
SQL> STARTUP MOUNT EXCLUSIVE;
alter database archivelog;必須先開啟歸檔,因為flashback依賴media recovery
alter database flashback on;
3.2) 配置成歸檔方式
SQL> ALTER DATABASE ARCHIVELOG;
閃回數據庫必須配備成歸檔方式,是因為閃回日志里只記錄了快照,這些快照可以使數據庫回退到某個SCN點,而回退快照的SCN僅比你指定的SCN提前一點,然后會運用歸檔日志或當前日志前滾一小段,當到達指定的san時停住。然后在此SCN前resetlogs打開數據庫。
3.3) 指定閃回恢復區
設置參數db_recovery_file_dest='u01/flash_recovery_area'
3.4) 配置閃回保留時間
設置參數db_flashback_retention_target=1440
注意單位是分鐘,缺省1440 相當于24小時
3.5) 使能閃回數據庫
SQL> alter database flashback on;
//其結果在/u01/app/oracle/flash_recovery_area/HYYK/flashback目錄下創建了一個.flb的閃回日志文件。
SQL> select flashback_on from v$database; //查看閃回數據庫啟用或關閉
只是檢查RVWR進程和閃回日志是否有了,如果alter database flashback off;閃回日志自動清除(考點)。
3.6)打開數據庫
alter database open;
4) 例: 恢復被刪除的用戶。
首先進入mount下,配置相關參數,開啟閃回數據庫日志,然后打開數據庫,接下來:
4.1)取當前SCN
SQL> select current_scn from v$database;
(方法二,SQL> create restore point abc [gurantee flashback database];
//"gurantee flashback database"選項可保證abc點(SCN)以來的閃回日志一直存在,不受retention影響)
CURRENT_SCN
-----------
1472195
4.2)刪除scott用戶
SQL> drop user scott cascade;
4.3)準備到mount下做閃回數據庫
SQL> shutdown immediate;
SQL> startup mount exclusive //mount要附加exclusive(獨占),意思是其他sysdba不能打開數據庫,這是一個考點。
SQL> flashback database to scn 1472195;
(方法二,SQL> flashback database to restore point abc;)
4.4)只讀方式打開,確認scott已經被閃回
SQL> alter database open read only;
SQL> select * from scott.emp;
4.5)確認無誤后,重新以resetlogs 方式打開數據庫(屬于不完全恢復)
startup force;
alter database open resetlogs;
//一旦resetlogs打開,若想再一次做閃回,只能閃回比當前更早的scn(見PPT-315page)。
提醒:要在mount下閃回數據庫
flashback database to timestamp to_date('2012-03-02 19:11:11','yyyy-mm-dd hh34:mi:ss');
flashback database to scn 1264788;
閃回后,打開數據庫,第一次最好用只讀方式, 看看是否恢復到你希望的那個時間點上去了,如果不是你希望的,還可以重新閃回(前閃/后閃都可以,因為只讀方式scn是不會增長的)。
5)那些操作適合或不適合閃回數據庫
適合:
drop table xxx purge
drop user xxx cascade
在某個用戶操作影響到整個數據庫時錯誤的truncate表
不適合:
控制文件,數據文件,修改數據不能用閃回數據庫
使用了備份的控制文件或trace文件
drop表空間的操作
段重組后的表,收縮后的數據文件。
6) 使用保存點閃回數據庫
SQL> create restore point gold; //保存點gold相當一個標記,記錄了當前的SCN
...
SQL> startup mount
SQL> flashback database to restore point gold;
7)限制生成閃回數據量
默認情況下,如果啟用了閃回數據庫,那么會記錄所有表空間的閃回數據,使用下面命令可以關閉個別表空間的屬性,自然就不會生成該表空間的閃回數據。
SQL> alter tablespace flashback off; //可以在open下設置
SQL> alter tablespace flashback on; //可以在mount下設置
SQL> select * from v$tablespace //有個字段FLA可顯示狀態
flashback off的表空間在閃回數據庫之前要offline(不參與閃回),所有數據文件scn不一致前不能打開數據庫。
聯機前要對offline的數據文件做部分還原和不完全恢復。
8)關于閃回數據庫有兩個視圖:
v$flashback_database_log顯示所能回退到的最早時間,取決與保留的Flashback Database Log 的多少。
v$flashback_database_stat以一個時間段為一行(大約1小時), 記錄單位時間內數據庫的活動量。
SQL> select * from v$flashback_database_log;
考點:OLDEST_FLASHBACK_SCN表示能夠讓你閃回到最早的那個scn點。
SQL>select * from v$flashback_database_stat;
相比來看,v$flashback_database_log信息對于flash database更有幫助。
*考點:閃回數據庫要求歸檔日志模式,并使用alter database open resetlogs來創建數據庫日志的一個新的化身。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。