1.知识点:可以对照下面的录屏进行阅读
SQL> --1. 错误地删除了记录 SQL> --2. 错误地删除了表 SQL> --3. 查询历史记录 SQL> --4. 如何撤销一个已经提交的事务 SQL> SQL> --闪回的类型 SQL> --1. 闪回表:将表回退到过去的一个时间上 SQL> --2. 闪回删除:Oracle回收站 SQL> --3. 闪回版本查询:所有历史记录 SQL> --4. 闪回事务查询:通过select语句得到一个 undo_sql SQL> --5. 闪回数据库 SQL> --6. 闪回归档日志 -------------------------------------------------------------------------- 需要考虑的事情 FLASHBACK TABLE命令作为单一的事务执行,会得到一个单一的DML锁 表的统计数据不会被闪回 当前的索引和从属的对象会被维持 闪回表操作:1、系统表不能被闪回2、不能跨越DDL操作3、会被写入警告日志4、产生撤销和重做的数据 -------------------------------------------------------------------------- 语法: FLASHBACK TABLE[achema.]2.在Sqlplus下实际执行的结果录屏TO {[BEFORE DROP[RENAME TO table]] [SCN|TIMESTAMP]expr [ENABLE|DISABLE]TRIGGERS} schema:模式名,一般为用户名 TO TIMESTAMP:系统邮戳,包含年月日时分秒 TO SCN:系统更改号 ENABLE TRIGGERS:表示触发器恢复以后为enable状态,而默认为disable状态 TO BEFORE DROP:表示恢复到删除前 RENAME TO table:表示更换表名 -------------------------------------------------------------------------- --SCN:系统改变号(时间) SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') time, 2 timestamp_to_scn(systimestamp) SCN 3 from dual; --scope的取值: momery spfile both --momery:只改当前内存(即数据库),不改参数文件;重启数据库后恢复原样 --spfile:只改参数文件,不改数据库;重启数据库后变为修改后的 --both:数据库,参数都改 --授予闪回权限:grant flashback any table to scott; --授予事务查询权限:grant select any transaction to scott; SQL> -- 1.闪回表:将表回退到过去的一个时间上 SQL> flashback table flashback_table to scn 3784220; SQL> --开启表的行移动 SQL> alter table flashback_table enable row movement; SQL> --2.闪回删除 SQL> flashback table testseq to before drop; SQL> --闪回重名的表 SQL> flashback table testseq to before drop rename to testseq_old; SQL> --查看回收站,管理员没有回收站 SQL> show recyclebin SQL> --清空回收站 SQL> purge recyclebin; SQL> --通过回收站的名字查看表要加双引号 SQL> select * from "BIN$UhseqyX1Reyl5iurpupyEg==$0"; 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> --3.闪回版本查询 SQL> --执行闪回版本查询 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; SQL> --4.闪回事务查询 SQL> --视图flashback_transaction_query SQL> desc flashback_transaction_query 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 事务号; SQL> --通过XID查询事务信息,再利用undo_sql撤销事务操作 SQL> select operation,undo_sql 2 from flashback_transaction_query 3 where xid='080029005C050000';
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 -----------------------