oracle闪回(flashback)
在oracle 10g中提供闪回操作
那么什么是闪回呢?
l在Oracle的操作工程中,会不可避免地出现操作失误或者用户失误,例如不小心删除了一个表等,这些失误和错误可能会造成重要数据的丢失,最终导致Oracle数据库停止。 l在传统意义上,当发生数据丢失、数据错误问题时,解决的主要办法是数据的导入导出、备份恢复技术,这些方法都需要在发生错误前,有一个正确的备份才能进行恢复。 l为了减少这方面的损失,Oracle提供了闪回技术。有了闪回技术,就可以实现数据的快速恢复,而且不需要数据备份。 l闪回表(flashbacktable) l闪回删除(flashbackdrop) l闪回版本查询(flashbackversion query) l闪回事务查询(flashbacktransaction query) l闪回表,实际上是将表中的数据快速恢复到过去的一个是焦点或者系统改变号SCN上。实现表的闪回,需要使用到与撤销表空间相关的undo信息,通过show parameter undo命令可以了解这些信息。 l用户对表数据的修改操作,都记录在撤销表空间中,这为表的闪回提供了数据恢复的基础。例如,某个修改操作在提交后被记录在撤销表空间中,保留时间为900秒,用户可以在这900秒的时间内对表进行闪回操作,从而将表中的数据恢复到修改之前的状态。l执行表的闪回,需要有flashback any table的权限
FLASHBACK TABLE [schema.]<table_name>
TO
{[BEFORE DROP [RENAMETO table]]
[SCN|TIMESTAMP]expr
[ENABLE|DISABLE]TRIGGERS}
SQL> host cls
SQL> /*
SQL> 1. 错误地删除了记录
SQL> 2. 错误地删除了表
SQL> 3. 查询历史记录
SQL> 4. 如何撤销一个已经提交的事务
SQL>
SQL> 闪回的类型
SQL> 1. 闪回表:将表回退到过去的一个时间上
SQL> 2. 闪回删除:Oracle回收站
SQL> 3. 闪回版本查询:所有历史记录
SQL> 4. 闪回事务查询: 通过select语句得到一个 undo_sql
SQL>
SQL> 5. 闪回数据库
SQL> 6. 闪回归档日志
SQL> */
SQL> --SCN系统改变号(时间)
SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') 时间,
2 timestamp_to_scn(systimestamp) SCN
3 from dual;
时间 SCN
----------------------------- ----------
2012-10-25 10:31:02*000000 3783972
SQL> /*
SQL> SQL> show parameter undo
SQL>
SQL> NAME TYPE VALUE
SQL> ------------------------------------ ----------- --------------------
SQL> undo_management string AUTO
SQL> undo_retention integer 1200
SQL> undo_tablespace string UNDOTBS1
SQL> SQL> --scope的取值: momery spfile both
SQL> SQL> alter system set undo_retention=900 scope=both;
SQL> */
SQL> --权限 grant flashback any table to scott;
SQL> create table flashback_table
2 (fid number,fname varchar2(20));
表已创建。
SQL> insert into flashback_table values(1,'Tom');
已创建 1 行。
SQL> insert into flashback_table values(2,'Mary');
已创建 1 行。
SQL> insert into flashback_table values(3,'Mike');
已创建 1 行。
SQL> commit;
提交完成。
SQL> --当前时间
SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') 时间,
2 timestamp_to_scn(systimestamp) SCN
3 from dual;
时间 SCN
----------------------------- ----------
2012-10-25 10:36:22*046000 3784220
SQL> select * from flashback_table;
FID FNAME
---------- --------------------
1 Tom
2 Mary
3 Mike
SQL> --删除mary
SQL> delete from flashback_table where fid =2;
已删除 1 行。
SQL> commit;
提交完成。
SQL> select * from flashback_table;
FID FNAME
---------- --------------------
1 Tom
3 Mike
SQL> --执行闪回表
SQL> flashback table flashback_table to scn 3784220;
flashback table flashback_table to scn 3784220
*
第 1 行出现错误:
ORA-08189: 因为未启用行移动功能, 不能闪回表
SQL> --开启表的行移动
SQL> alter table flashback_table enable row movement;
表已更改。
SQL> flashback table flashback_table to scn 3784220;
闪回完成。
SQL> select * from flashback_table;
FID FNAME
---------- --------------------
1 Tom
2 Mary
3 Mike
SQL> --问题:如何获取最近的一个时间?
SQL> host cls
SQL> --闪回删除
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
EMP20 TABLE
TESTSAVEPOINT TABLE
TEST2 TABLE
MYPERSON TABLE
EMP10 TABLE
EMPINCOME TABLE
VIEW1 VIEW
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
VIEW2 VIEW
TESTSEQ TABLE
HREMP SYNONYM
MSG1 TABLE
TEST1 TABLE
PM_CI TABLE
PM_STU TABLE
FLASHBACK_TABLE TABLE
SYS_TEMP_FBT TABLE
已选择20行。
SQL> drop table test1;
表已删除。
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST1 BIN$Rn2qG7V+SO2k+aNrG/oYww==$0 TABLE 2012-10-25:10:45:11
SQL> purge recyclebin;
回收站已清空。
SQL> --管理员没有回收站
SQL> select * from TESTSEQ;
TID TNAME
---------- --------------------
3 aaa
4 aaa
5 aaa
8 aaa
SQL> drop table TESTSEQ;
表已删除。
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TESTSEQ BIN$UhseqyX1Reyl5iurpupyEg==$0 TABLE 2012-10-25:10:47:38
SQL> select * from TESTSEQ;
select * from TESTSEQ
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
EMP20 TABLE
TESTSAVEPOINT TABLE
TEST2 TABLE
MYPERSON TABLE
EMP10 TABLE
EMPINCOME TABLE
VIEW1 VIEW
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
VIEW2 VIEW
HREMP SYNONYM
MSG1 TABLE
BIN$UhseqyX1Reyl5iurpupyEg==$0 TABLE
PM_CI TABLE
PM_STU TABLE
FLASHBACK_TABLE TABLE
SYS_TEMP_FBT TABLE
已选择19行。
SQL> select * from BIN$UhseqyX1Reyl5iurpupyEg==$0;
select * from BIN$UhseqyX1Reyl5iurpupyEg==$0
*
第 1 行出现错误:
ORA-00933: SQL 命令未正确结束
SQL> select * from "BIN$UhseqyX1Reyl5iurpupyEg==$0";
TID TNAME
---------- --------------------
3 aaa
4 aaa
5 aaa
8 aaa
SQL> host cls
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TESTSEQ BIN$UhseqyX1Reyl5iurpupyEg==$0 TABLE 2012-10-25:10:47:38
SQL> --执行闪回删除
SQL> flashback table testseq to before drop;
闪回完成。
SQL> show recyclebin
SQL> select * from testseq;
TID TNAME
---------- --------------------
3 aaa
4 aaa
5 aaa
8 aaa
SQL> host cls
SQL> drop table testseq;
表已删除。
SQL> create table testseq(tid number);
表已创建。
SQL> drop table testseq;
表已删除。
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TESTSEQ BIN$ZsXHtmHLTLu40DAC6jiKqg==$0 TABLE 2012-10-25:10:51:22
TESTSEQ BIN$hBllsvl5Tum9hHaSvtQhag==$0 TABLE 2012-10-25:10:51:01
SQL> flashback table testseq to before drop;
闪回完成。
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TESTSEQ BIN$hBllsvl5Tum9hHaSvtQhag==$0 TABLE 2012-10-25:10:51:01
SQL> select * from testseq;
未选定行
SQL> flashback table testseq to before drop;
flashback table testseq to before drop
*
第 1 行出现错误:
ORA-38312: 原始名称已被现有对象使用
SQL> --闪回重名的表
SQL> flashback table testseq to before drop rename to testseq_old;
闪回完成。
SQL> select * from testseq_old;
TID TNAME
---------- --------------------
3 aaa
4 aaa
5 aaa
8 aaa
SQL> host cls
SQL> /*
SQL> 小结:
SQL> 基本概念: 1. SCN 2. 900秒 3. 权限 flashback any tables
SQL> 闪回表:将表回退到过去的一个时间
SQL> 1. 行移动
SQL> 2. 执行闪回表
SQL> 注意: 系统表不能闪回;不能跨越DDL
SQL> 问题: 如何得到离该操作最近的一个时间??
SQL> 闪回删除: Oracle的回收站
SQL> 1. 执行闪回删除
SQL> 2. 通过回收站中的名字闪回(双引号)
SQL> 3. 重名的表
SQL> 4. 触发器(disable)
SQL> */
SQL> host cls
SQL> --闪回版本查询
SQL> create table versions_table
2 (tid number,tname varchar2(20));
表已创建。
SQL> insert into versions_table values(1.'Tom');
insert into versions_table values(1.'Tom')
*
第 1 行出现错误:
ORA-00917: 缺失逗号
SQL> insert into versions_table values(1,'Tom');
已创建 1 行。
SQL> commit;
提交完成。
SQL> insert into versions_table values(2,'Mary');
已创建 1 行。
SQL> commit;
提交完成。
SQL> insert into versions_table values(3,'Mike');
已创建 1 行。
SQL> commit;
提交完成。
SQL> update versions_table set tname='MaryNew' where tid=2;
已更新 1 行。
SQL> commit;
提交完成。
SQL> select * from versions_table;
TID TNAME
---------- --------------------
1 Tom
2 MaryNew
3 Mike
SQL> --如何查询Mary?
SQL> --执行闪回版本查询
SQL> select tid,tname
2 from versions_table
3 versions between TIMESTAMP MINVALUE and MAXVALUE
4 order by 1;
TID TNAME
---------- --------------------
1 Tom
2 MaryNew
2 Mary
3 Mike
SQL> select tid,tname,versions_operation 操作,versions_starttime 起始时间,
2 versions_endtime 结束时间,versions_xid 事务号
3 from versions_table
4 versions between TIMESTAMP MINVALUE and MAXVALUE
5 order by 1,4;
TID TNAME
---------- -------------------- -
起始时间
---------------------------------------------------------------------------
结束时间
---------------------------------------------------------------------------
事务号
----------------
1 Tom I
25-10月-12 11.17.28 上午
03002E005A050000
TID TNAME
---------- -------------------- -
起始时间
---------------------------------------------------------------------------
结束时间
---------------------------------------------------------------------------
事务号
----------------
2 Mary I
25-10月-12 11.17.37 上午
25-10月-12 11.18.16 上午
02000D0064050000
TID TNAME
---------- -------------------- -
起始时间
---------------------------------------------------------------------------
结束时间
---------------------------------------------------------------------------
事务号
----------------
2 MaryNew U
25-10月-12 11.18.16 上午
0600030065050000
TID TNAME
---------- -------------------- -
起始时间
---------------------------------------------------------------------------
结束时间
---------------------------------------------------------------------------
事务号
----------------
3 Mike I
25-10月-12 11.17.46 上午
0400130061050000
SQL> set linesize 150
SQL> col tid for 99
SQL> col tname for a10
SQL> col 操作 for a8
SQL> col 起始时间 for a40
SQL> col 结束时间 for a40
SQL> select tid,tname,versions_operation 操作,versions_starttime 起始时间,
2 versions_endtime 结束时间,versions_xid 事务号
3 from versions_table
4 versions between TIMESTAMP MINVALUE and MAXVALUE
5 order by 1,4;
TID TNAME 操作 起始时间 结束时间 事务号
--- ---------- -------- ---------------------------------------- ---------------------------------------- ----------------
1 Tom I 25-10月-12 11.17.28 上午 03002E005A050000
2 Mary I 25-10月-12 11.17.37 上午 25-10月-12 11.18.16 上午 02000D0064050000
2 MaryNew U 25-10月-12 11.18.16 上午 0600030065050000
3 Mike I 25-10月-12 11.17.46 上午 0400130061050000
SQL> col 起始时间 for a30
SQL> col 结束时间 for a30
SQL> col 操作 for a4
SQL> select tid,tname,versions_operation 操作,versions_starttime 起始时间,
2 versions_endtime 结束时间,versions_xid 事务号
3 from versions_table
4 versions between TIMESTAMP MINVALUE and MAXVALUE
5 order by 1,4;
TID TNAME 操作 起始时间 结束时间 事务号
--- ---------- ---- ------------------------------ ------------------------------ ----------------
1 Tom I 25-10月-12 11.17.28 上午 03002E005A050000
2 Mary I 25-10月-12 11.17.37 上午 25-10月-12 11.18.16 上午 02000D0064050000
2 MaryNew U 25-10月-12 11.18.16 上午 0600030065050000
3 Mike I 25-10月-12 11.17.46 上午 0400130061050000
SQL> host cls
SQL> --闪回事务查询
SQL> create table transaction_table
2 (tid number,tname varchar2(20));
表已创建。
SQL> --第一个事务
SQL> insert into transaction_table values(1,'Tom');
已创建 1 行。
SQL> insert into transaction_table values(2,'Mary');
已创建 1 行。
SQL> insert into transaction_table values(3,'Mike');
已创建 1 行。
SQL> commit;
提交完成。
SQL> --第二个事务
SQL> update transaction_table set tname='MaryNew' where tid=2;
已更新 1 行。
SQL> delete from transaction_table where tid =3;
已删除 1 行。
SQL> commit;
提交完成。
SQL> --如何撤销第二个事务??
SQL> --视图flashback_transaction_query
SQL> desc flashback_transaction_query
名称 是否为空? 类型
----------------------------------------------------------------------------------- -------- --------------------------------------------------------
XID RAW(8)
START_SCN NUMBER
START_TIMESTAMP DATE
COMMIT_SCN NUMBER
COMMIT_TIMESTAMP DATE
LOGON_USER VARCHAR2(30)
UNDO_CHANGE# NUMBER
OPERATION VARCHAR2(32)
TABLE_NAME VARCHAR2(256)
TABLE_OWNER VARCHAR2(32)
ROW_ID VARCHAR2(19)
UNDO_SQL VARCHAR2(4000)
SQL> --得到XID
SQL> select tid,tname,versions_operation 操作,versions_starttime 起始时间,
2 versions_endtime 结束时间,versions_xid 事务号
3 from transaction_table
4 versions between TIMESTAMP MINVALUE and MAXVALUE
5 order by 事务号;
TID TNAME 操作 起始时间 结束时间 事务号
--- ---------- ---- ------------------------------ ------------------------------ ----------------
3 Mike I 25-10月-12 11.29.38 上午 25-10月-12 11.30.23 上午 0100100060050000
2 Mary I 25-10月-12 11.29.38 上午 25-10月-12 11.30.23 上午 0100100060050000
1 Tom I 25-10月-12 11.29.38 上午 0100100060050000
2 MaryNew U 25-10月-12 11.30.23 上午 080029005C050000
3 Mike D 25-10月-12 11.30.23 上午 080029005C050000
SQL> select operation,undo_sql
2 from flashback_transaction_query
3 where xid='080029005C050000';
OPERATION
--------------------------------
UNDO_SQL
------------------------------------------------------------------------------------------------------------------------------------------------------
DELETE
insert into "SCOTT"."TRANSACTION_TABLE"("TID","TNAME") values ('3','Mike');
UPDATE
update "SCOTT"."TRANSACTION_TABLE" set "TNAME" = 'Mary' where ROWID = 'AAANpoAAEAAAAJvAAB';
BEGIN
SQL> insert into "SCOTT"."TRANSACTION_TABLE"("TID","TNAME") values ('3','Mike')
2 ;
已创建 1 行。
SQL> update "SCOTT"."TRANSACTION_TABLE" set "TNAME" = 'Mary' where ROWID = 'AAANpoAAEAAAAJvAAB';
已更新 1 行。
SQL> commit;
提交完成。
SQL> select * from transaction_table;
TID TNAME
--- ----------
1 Tom
2 Mary
3 Mike
SQL> spool off
- Oracle闪回flashback总结
- Oracle闪回(FlashBack)数据库
- oracle 使用闪回事务查询是 视图flashback_transaction_query中列operation为unknown 问题分析
- oracle 11g Flashback Data Archive(闪回数据归档)
- Oracle 六大闪回技术,flashback
- Oracle 闪回特性(FLASHBACK DATABASE)
- Oracle 闪回特性(FLASHBACK DATABASE)
- Oracle Flashback 闪回查询功能操作范例(9i and 10g)
- Oracle闪回归档(下) —— Oracle Flashback Archive
- 利用oracle flashback技术恢复数据之 ――事务级别闪回
- oracle flashback 闪回
- Oracle 闪回特性(Flashback Query、Flashback Table)
- oracle 11g Flashback Data Archive(闪回数据归档)
- Oracle闪回归档(上) —— Oracle Flashback Archive
- oracle利用flashback 闪回功能恢复delete数据
- Oracle 闪回特性(Flashback Version、Flashback Transaction)
- Oracle闪回flashback总结
- Oracle flashback 闪回 笔记
- Oracle闪回归档(上) —— Oracle Flashback Archive
- oracle中flashback闪回区常存储的内容