足够的空间存储。若是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); 对象
查询结果以下图所示:
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;