足夠的空間存儲。若是undo空間已滿且又有新事務執行則會覆蓋原來的undo數據而無論undo數據是否過時。不過,若是undo空間足夠,html
儘管undo數據已經 過了指定的時間,只要不被覆蓋,該undo數據仍是存在,所以也仍是可以被執行flashback閃回(可是必須在增刪改sql
表記錄以前先執行alter table table_name enable row movement即容許該表進行行移動,不然過了指定的時間該undo數據儘管沒被數據庫
覆蓋也會沒法閃回了,會提示ora-01466錯誤)。post
若是想確保undo數據有效期爲undo_retention指定的時間,能夠經過 爲undo表空間指定Retention Guarantee,以下:spa
CREATE TABLE flashback_test (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));
INSERT INTO flashback_test VALUES('d1','s','s');
INSERT INTO flashback_test VALUES('d2','sw','sf');
INSERT INTO flashback_test VALUES('d3','swd','ss');
刪除數據
DELETE FROM flashback_test WHERE a='d1';
--基於TIMESTAMP時間的返回查詢
SELECT *FROM flashback_test AS OF TIMESTAMP SYSDATE - 15/1440;
提示ORA-01466:沒法讀取數據-表定義已更改
可是沒有作過表修改啊,奇怪了
DELETE FROM flashback_test WHERE a='d2';
SELECT *FROM flashback_test AS OF TIMESTAMP SYSDATE - 10/1440;
1 d2 sw sf
2 d3 swd ss
可是第一條記錄找不回來了,看來返回查詢只能在必定時間內,超過了該時間就沒法查詢了。
--基於SCN的返回查詢
SQL> select timestamp_to_scn(to_date('20100105160606','yyyy-mm-dd hh24:mi:ss')) from dual;
select dbms_flashback.get_system_change_number from dual;
select current_scn from v$database;
GRANT EXECUTE ON dbms_flashback TO fyzh_ora;--受權通常用戶可執行dbms_flashback包
SELECT dbms_flashback.get_system_change_number FROM dual;--查看當前的SCN
SELECT *FROM flashback_test AS OF SCN 12486407805791;
1 d3 swd ssrest
經過以下語句能夠準確的獲取當前的時間點
SQL> variable scn number;
SQL> exec :scn:=dbms_flashback.get_system_change_number (scn爲3373273)
select count(1) from t;--20000條記錄
delete from t;
select count(1) from t;--如今只有0條記錄
select count(1) from t as of scn :scn;查找在刪以前的某個時間點,數據還是20000條
如今將表閃回到3373273這個點
flashback table t to scn:scn;
提示「ORA-08189: 由於未啓用行移動功能, 不能閃回表」錯誤,執行以下語句
alter table t enable row movement;--容許對行rowid進行移動
再進行閃回
flashback table t to scn:scn;
此時再查詢該表
select count(1) from t;恢復了20000條記錄。
咱們也能夠經過flashback_transaction_query這個視圖中獲取想要閃回的時間點。
日誌
TRUNCATE TABLE flashback_test;
SELECT * FROM flashback_transaction_query WHERE table_name='FLASHBACK_TEST';
FLASHBACK TABLE flashback_test TO SCN 12486407806290;
提示ORA-01466:沒法讀取數據-表定義已更改
說明:ddl操做不會記錄到flashback_transaction_query視圖中,且也不能執行閃回
CREATE TABLE flashback_test (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));
INSERT INTO flashback_test VALUES('d1','s','s');
INSERT INTO flashback_test VALUES('d2','sw','sf');
INSERT INTO flashback_test VALUES('d3','swd','ss');
1.刪除表
--刪除表
DROP TABLE flashback_test;
--查看回收站,該表存在回收站中
SELECT * FROM user_recyclebin WHERE original_name='FLASHBACK_TEST';
--執行閃回
FLASHBACK TABLE flashback_test TO BEFORE DROP;
--執行閃回後,該表已不在回收站,在查看該表已經恢復
SELECT * FROM flashback_test;
2.刪除表且執行purge操做
--刪除表
DROP TABLE flashback_test PURGE;
--查看回收站,發現沒有在回收站中
SELECT * FROM user_recyclebin WHERE original_name='FLASHBACK_TEST';
3.清除回收站
PURGE TABLE original_name;--清除回收站中的某個表
PURGE INDEX original_name;--清除回收站中的某個索引
PURGE RECYCLEBIN;--清除本身用戶下的回收站信息
PURGE TABLESPACE tablespace_name;--清除指定表空間下全部在回收站的對象
PURGE TABLESPACE tablespace_name USER user_name;--清除指定表空間指定用戶下在回收站中的對象(drop user 若加上CASCADE關鍵字則不進入回收站)
PURGE DBA_RECYCLEBIN; --從全部用戶的回收站清除全部對象
注:若是被刪除的表不在回收站,則執行flashback drop table時會提示ORA-38305:對象不在回收站中。 htm
不一樣版本查詢介紹
VERSIONS BETWEEN 可以查看指定時間段內undo表空間中記錄的不一樣版本
1.建立表
CREATE TABLE ff (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));
2.分別做插入,更新,刪除操做
INSERT INTO ff VALUES('d1','s','s');
UPDATE ff SET a='u_d2' WHERE a='d1';
DELETE FROM ff WHERE a='d1';
3.查看 該時間內ff表非操做狀況
1)VERSIONS BETWEEN TIMESTAMP minvalue AND MAXVALUE 方式
SELECT versions_starttime,
versions_endtime,
versions_xid,
versions_operation,
a,
b,
c
FROM ff VERSIONS BETWEEN TIMESTAMP minvalue AND maxvalue
ORDER BY versions_starttime;
VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID VERSIONS_OPERATION A B C
------------------------ ---------------------------- ---------------- ------------------ ----- ----- ----
30-12月-11 01.27.57 下午 30-12月-11 01.28.36 下午 0900000035070000 I d1 s s
30-12月-11 01.28.36 下午 0100140069060000 U u_d1 s s
2)VERSIONS BETWEEN TIMESTAMP to_date('2011-12-30 13:22:00', 'yyyy-mm-dd hh24:mi:ss') AND to_date('2011-12-30 13:23:00', 'yyyy-mm-dd hh24:mi:ss')
SELECT versions_starttime,
versions_endtime,
versions_xid,
versions_operation,
a,
b,
c
FROM ff VERSIONS BETWEEN TIMESTAMP to_date('2011-12-30 13:22:00', 'yyyy-mm-dd hh24:mi:ss') AND to_date('2011-12-30 13:23:00', 'yyyy-mm-dd hh24:mi:ss');
3)VERSIONS BETWEEN SCN 12486407818849 AND 12486407818864
SELECT *FROM flashback_transaction_query WHERE table_name='FF';
SELECT versions_starttime,
versions_endtime,
versions_xid,
versions_operation,
a,
b,
c
FROM ff VERSIONS BETWEEN SCN 12486407818849 AND 12486407818864;
GRANT SELECT ON flashback_transaction_query TO fyzh_ora;--直接賦予該表的select權限仍是沒法查詢,提示權限不夠
GRANT SELECT ANY TRANSACTION TO fyzh_ora;--必須授予ANY TRANSACTION才行
CREATE TABLE flashback_test (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));
--插入三條記錄
INSERT INTO flashback_test VALUES('d1','s','s');
INSERT INTO flashback_test VALUES('d2','sw','sf');
INSERT INTO flashback_test VALUES('d3','swd','ss');
--執行刪除操做
DELETE FROM flashback_test WHERE a='d1';
SELECT xid, operation, table_name, undo_sql
FROM flashback_transaction_query
WHERE xid IN
(SELECT versions_xid
FROM flashback_test versions BETWEEN TIMESTAMP minvalue AND maxvalue); 對象
查詢結果以下圖所示:
SQL> show parameter retention guarantee;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 1440
undo_retention integer 900
1.建立表並插入數據
CREATE TABLE flashback_test (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));
INSERT INTO flashback_test VALUES('d1','s','s');
INSERT INTO flashback_test VALUES('d2','sw','sf');
INSERT INTO flashback_test VALUES('d3','swd','ss');
DELETE FROM flashback_test WHERE a= 'd1';
2.FLASHBACK DATABASE
1)通常用戶下執行:
SQL> FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24);
FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24)
ORA-01031: 權限不足
2)採用sys用戶執行:
SQL> FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24);
FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24)
ORA-38757: 要閃回數據庫, 數據庫必須已裝載但不能打開。
3)關閉數據庫並裝載數據庫
C:\Users\thinkpad>sqlplus/nolog
SQL*Plus: Release 11.1.0.7.0 - Production on 星期四 12月 29 16:05:16 2011
Copyright (c) 1982, 2008, Oracle. All rights reserved.
SQL> conn sys/fyzh@fgisdb as SYSDBA --sys用戶登陸
已鏈接。
SQL> SHUTDOWN IMMEDIATE;--關閉數據庫
數據庫已經關閉。
已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> startup MOUNT;--裝載數據庫,沒法識別監聽,退出從新以sys登陸可解決
ORA-12514: TNS: 監聽程序當前沒法識別鏈接描述符中請求的服務
SQL> exit
從 Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 斷開
C:\Users\thinkpad>sqlplus/nolog
SQL*Plus: Release 11.1.0.7.0 - Production on 星期四 12月 29 16:06:19 2011
Copyright (c) 1982, 2008, Oracle. All rights reserved.
SQL> conn sys/fyzh as SYSDBA --再次登陸
已鏈接到空閒例程。
SQL> startup mount; --裝載數據庫
ORACLE 例程已經啓動。
Total System Global Area 535662592 bytes
Fixed Size 1348508 bytes
Variable Size 251661412 bytes
Database Buffers 276824064 bytes
Redo Buffers 5828608 bytes
數據庫裝載完畢。
4)再次執行仍是報錯
SQL> FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24);
FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24)
ORA-38726: 未啓用閃回數據庫事件記錄。
SQL> flashback database to restore point BEFORE_DROP;
flashback database to restore point BEFORE_DROP
ORA-38780: 還原點 'BEFORE_DROP' 不存在。
5)開啓閃回功能
SQL> alter database flashback on;
alter database flashback on
ORA-38706: 沒法啓用 FLASHBACK DATABASE 事件記錄。
ORA-38707: 還沒有啓用介質恢復。
6)開啓歸檔和閃回
SQL> alter database archivelog;
Database altered
SQL> alter database flashback on;
Database altered
7)再次執行
SQL> FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 0.1/24);
FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 0.1/24)
ORA-38729: 執行 FLASHBACK 的閃回數據庫日誌數據不足。
SQL> FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 0.01/24);
Done
8)開啓數據庫
SQL> alter database open;
alter database open
*
第 1 行出現錯誤:
ORA-01589: 要打開數據庫則必須使用 RESETLOGS 或 NORESETLOGS 選項
SQL> alter database open noresetlogs;
alter database open noresetlogs
*
第 1 行出現錯誤:
ORA-01610: 使用 BACKUP CONTROLFILE 選項的恢復必須已完成
SQL> alter database open resetlogs;
數據庫已更改。
9)查看 表還存在,數據2條
注:1.必須具備DBA權限
2.數據庫必須處在裝載狀態
3.必須啓用介質恢復
4.必須開啓閃回和歸檔(必須在歸檔模式下才能開啓閃回)
5.閃回好後,開啓數據庫要使用 RESETLOGS 或 NORESETLOGS 選項
6.使用該功能,須要以前就已經開啓歸檔模式和閃回,不然等數據損壞再打開已經來不及了
復原點是手動建立的一個時間點,數據庫能夠閃回到建立的該復原點。
普通復原點:只是在閃回或恢復操做中爲指定之前的SCN或時間點提供方便。但不保證數據庫在全部情形下都保留成功執行
閃回數據庫操做所需的閃回數據庫日誌。
建立普通復原點:CREATE RESTORE POINT test_point;
有保證的復原點:保證能夠把數據庫倒退到由復原點指定的SCN或時間點.
建立有保證的復原點:CREATE RESTORE POINT test_storepoint GUARANTEE FLASHBACK DATABASE;
刪除復原點:DROP RESTORE POINT point_name;
查看復原點:v$restore_point視圖
建立復原點注意事項:
1.建立復原點必須打開歸檔模式
2.建立復原點能夠不打開閃回
3.建立復原點若閃回沒打開數據庫需爲裝載狀態
SQL> CREATE RESTORE POINT test_storepoint GUARANTEE FLASHBACK DATABASE;
CREATE RESTORE POINT test_storepoint GUARANTEE FLASHBACK DATABASE
第 1 行出現錯誤:
ORA-38784: 沒法建立還原點 'TEST_STOREPOINT'。
ORA-38787: 在閃回數據庫處於關閉狀態時, 建立第一個可靠還原點須要裝載模式。
4.建立了復原點後,數據庫的閃回由原來的no狀態變成了RESTORE POINT ONLY
SQL> CREATE RESTORE POINT test_storepoint GUARANTEE FLASHBACK DATABASE;
還原點已建立。
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
RESTORE POINT ONLY
利用復原點閃回數據庫:
FLASHBACK DATABASE TO RESTORE POINT test_storepoint;