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.]
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';
2.在Sqlplus下实际执行的结果录屏
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
-----------------------