flashback table不能闪回system表空间下的表。
在其它普通表空间也有限制,不能闪回truncate的表,不能闪回drop table xxpurge的表。
普通的drop table 或者delete ,insert ,update操作都可以闪回。
在sys,或者system用户下,将表建在system表空间,drop后无法flashback,在 select * from sys.recyclebin$中无法找到。报错ORA-38305:object not in recycle bin
在sys,system用户下 ,将表 建在 其它表空间,如 users, SYSAUX, drop 后可以闪回。
如果在其它表空间下的表无法回收,看看你的recycle是否开启了?
show parameter recycle
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
buffer_pool_recycle string
db_recycle_cache_size big integer 0
recyclebin string on
另外 如果一个表上有个索引 删除这个表 然后 闪回它 这个索引是不能自动重建的。
而 flashback database 就厉害啦,什么都可以恢复。 不仅可以恢复truncate的表,还可以恢复drop table xxpurge,还可以恢复 system表空间下被删除的表,好像都可以恢复,真的是可以恢复到指定时刻状态的数据库。
下面是试验过程:
select current_scn from v$database;
--1165719
truncate table test.t1
--1165756
create table system.testsys1 (id11 number);
insert into system.testsys1 values(111);
--1165873
truncate table system.testsys1;
--1165923
drop table system.testsys1 purge;
--1165950SQL>shutdown immediate;
SQL>startup mount;
SQL>flashback database to scn 1165873;
SQL>alter database open read only;
SQL> select * from system.testsys1;
ID11
----------
111
--真厉害,system表空间下被purge的表也可以恢复啊
--可以恢复到任意时点。
SQL>alter database open read only
在这时你可以exp出你想要的表数据,然后再把数据库恢复到最后时刻
SQL>shutdown immediate;
SQL>startup mount;
SQL>flashback database to scn 1165950;
sql>alter database open resetlogs;
可以正常使用数据库啦,可以把你刚才exp出的表再imp进来吧。也可以将数据库恢复到指定的时间点。
Flashback database to timestamp to_timestamp('2013-08-09 11:20:00','yyyy-mm-dd hh24:mi:ss');
下面是别人的文章,写的挺好,我抄来用用:
Flashback是以undo segment中的内容为基础的,因此受限于undo_retenton参数,要使用flashback的特征,必须启动自动撤销表空间。
在Oracle11g中,出现了一个新的特征,oracle flashback data archive(FDA),通过将变化的数据另外存储到创建的一个闪回归档去(flashback archive),以和undo区别开,这样可以单独设置存储策略,使其可以山回到指定时间之前的旧数据而不影响undo策略。 在Oracle 11g中,recyclebin参数发生了微小的变化.
到了11g中,这个参数在session依然可以立即修改并影响当前的session,但如果是在系统一级修改的话,那么就要加deferred参数,对当前已经连接的sesion没有影响,但新连接的session将受到影响
Flashback不支持system表空间下面的对象,也不能从回收站里拿到。故使用sys或是system用户登录时,show recyclebin为空。
启动闪回数据库的步骤:
1, 开启归档模式:alter database archivelog;
2, 配置闪回区:alter system set db_recovery_file_dest=’/../’
3, 配置闪回保留时间,默认是1440minutes:alter system set db_flashback_retention_target=’2880’;
4, 启动闪回数据库:shutdown immediate;startup mount
Alter database flashback on/off;
5, 执行闪回操作:shutdown immediate;startup mount;
Flashback database to timestamp to_date(‘2001-02-03’,’yyyy-mm-dd hh24:mi:ss’);
或是:flashback database to scn 2323534;
Alter database open ready only;检查闪回时刻是否是所需的数据,如果不是,可以继续修改。
检查完毕之后:shutdown immediate;startup mount; alter database open resetlogs;resetlogs是将control file中的scn#与数据文件中的scn#同步,消除时间间隔。
V$flashback_database_log视图,可以查看闪回日志所占的空间,最早能闪回到的scn,最早能闪回到的时间点
7,查看回收站:show recyclebin; 或是select * from sys.recyclebin$查 所有的回收站。
8,恢复被删除的表:flashback table t_name to before drop;如果闪回
的表名与当前的表名相同,需要重命名才可以闪回
Flashback table t_name to before drop rename to t_new;
9,闪回指定的表
查看表结构:desc “BIN$qrjyuHuVotHgQAB/AQAQ3w==$0”;
查看表的记录:select count(*) from “BIN$qrjyuHuVotHgQAB/AQAQ3w==$0”;
安装表名称恢复:flashback table “BIN$qrjyuHuVotHgQAB/AQAQ3w==$0” to before drop;
越过回收站直接删除:drop table t purge;drop user cascade; drop tablespace users including contents;
清空回收站:purge index idx_1;purge user_recyclebin;purge dba_recyclebin;
当设置db_recovery_file_dest为空的时候,也可以取消闪回区,如果已经启用flashback database;则这个方法不能取消。
查看当前的scn:select current_scn from v$database;
查看哪些对象可以利用闪回恢复区来存放:
SQL> select file_type from v$flash_recovery_area_usage;
FILE_TYPE
--------------------
CONTROL FILE
REDO LOG
ARCHIVED LOG
BACKUP PIECE
IMAGE COPY
FLASHBACK LOG
FOREIGN ARCHIVED LOG
7 rows selected.
查看闪回恢复区空间的使用情况:
SQL> select * from v$flash_recovery_area_usage;
本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2011-09/43916.htm
这个文章也很好,如下:
http://www.cnblogs.com/lanzi/archive/2010/12/22/1913769.html
在介绍flashback之前先介绍下undo_retention相关参数
undo_retention:表示undo数据的过期时间。系统默认这个时间设置为900即15分钟。但要注意,保证undo数据在这个时间内有效的前提是undo表空间有足够的空间存储。如果undo空间已满且又有新事务执行则会覆盖原来的undo数据而不管undo数据是否过期。不过,如果undo空间足够,
尽管undo数据已经 过了指定的时间,只要不被覆盖,该undo数据还是存在,因此也还是能够被执行flashback闪回(但是必须在增删改
表记录之前先执行alter table table_name enable row movement即允许该表进行行移动,否则过了指定的时间该undo数据尽管没被
覆盖也会无法闪回了,会提示ora-01466错误)。
如果想确保undo数据有效期为undo_retention指定的时间,可以通过 为undo表空间指定Retention Guarantee,如下:
Alter tablespace undotbs1 retention guarantee; (禁止的话执行:Alter tablespace undotbs1 retention noguarantee;) 这样就可以保证undo表空间尽管已经满了,有新事务出现也不会去覆盖未过期的undo数据。当然此时的新事务执行就要卡住了。具体参考 http://blog.itpub.net/post/602/469270
创建表并插入数据
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的返回查询
查询某个时刻的scn
SQL> select timestamp_to_scn(to_date('20100105160606','yyyy-mm-dd hh24:mi:ss')) from dual;查看scn
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 ss
FLASHBACK TABLE只是针对表的增删改操作进行闪回通过如下语句可以准确的获取当前的时间点
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 操作的闪回实验
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:对象不在回收站中。
不同版本查询介绍
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才行
--创建表flashback_test
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';
--通过版本查询xid,在flashback_transaction_query视图中找出flashback_test表对应删除操作的undo_sql,执行该sql即可闪回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;