刚刚学习了oralce的闪回,所以自己就进行总结一下。
首先总结需要使用闪回来解决问题:
1.错误地删除了记录。
2.错误地删除表
3.查询历史记录
4.如何撤销有一个提交的事务
根据以上的四个问题就来介绍4个闪回类型
1.闪回表
闪回表就是将表回退到过去的一个时间点上。在需要闪回表的时候我们必须要注意的三个条件:
(1).SCN(System Change Number) 系统改变号这像事务的回滚点一样,我们必须知道我们的表需要闪回 到哪个时间点上。
查询当前的SCN: SELECT TO_CHAR(systimestamp,'YYYY-MM-DD HH24-MI-SS*FF'),
TIMESTAMP_TO_SCN(systimestamp) SCN FROM dual;
我们可以选择闪回表的时间点:
FLASHBACK TABLE tb_name TO TIMESTAMP
to_date('2014-10-06 00:46:40','YYYY-MM- DD HH24:MI:SS');
也可以选择闪回表的SCN值
FLASHBACK TABLE tb_name TO SCN 16400979(要回的SCN的值)
(2).在闪回的时候要开启行移动,这要我们要找回来的表的记录才有地方放置
开启行移动:ALTER TABLE tb_name ENABLE ROW MOVEMENT ;
关闭行移动:ALTER TABLE tb_name DISABLE ROW MOVEMENT ;
(3).对表闪回的时候必须要有闪回的权限
GRANT FLASHBACK ANG TABLE TO user(要授权的用户)
2.闪回删除,本质上是从Oracle的回收站中把表找回来,当我们把表删除后,它会把他放置在回收站 (RECYCLEBIN)中.
(1)oracle的回收站
1.查看回收站: SHOW RECYCLEBIN ;
2.清空回收站:PURGE RECYCLEBIN;
tips:管理员是没有回收站的
(2)从回收站中取回表
1.通过表名闪回表
FLASHBACK TABLE tb_name to before DROP;
2.通过回收站的名字闪回表
FLASHBACK TABLE recyclebin_name to before DROP;
tips:虽然我们通过recyclebin_name来闪回表的时候,名字是独一无二所以不用担心什么;
但是当我们通过表名来闪回表的时候,可能会出现闪回表的情况,所以我们必须给表重命名。
FLASHBACK TABLE old_tb_table TO BEFORE DROP RENAME TO new_tb_name;
3.闪回版本查询
提供了一个审计行改变的查询功能,通过它可以查询到所有已经提交了的行记录。
Oralce在闪回版本查询给我们提供了很多伪列:
versions_start{scn|timestamp}:版本开始的scn或者时间戳
versions_end{scn|timestamp}:版本结束的scn或者时间戳
versions_xid :创建行版本事务
versions_operation:在行上执行的操作
语法:
SELECT col_name ,versions_starttime,versions_endtime,versions_operation,
versions_xid FROM tb_name
VERSIONS BETWEEN timestamp MINVALUE AND MAXVALUE
4.闪回事务查询
闪回事务查询是闪回版本的扩充,通过它可以审计某个事务甚至撤销一个已经提交的事务。
(1)闪回事务查询,首先要了解一个视图 flashback_transaction_query。
flashback_transaction_query 列说明:
SQL> desc flashback_transaction_query
Name Null? Type
----------------------------------------- -------- ----------------------------
XID RAW(8) --事务ID
START_SCN NUMBER --事务起始SCN,即第一个dml的SCN
START_TIMESTAMP DATE --事务其实时间戳,即第一个dm的时间戳
COMMIT_SCN NUMBER --提交事务时的SCN
COMMIT_TIMESTAMP DATE -- 提交事务时的时间戳
LOGON_USER VARCHAR2(30) --本次事务的用户
UNDO_CHANGE# NUMBER --撤销SCN
OPERATION VARCHAR2(32) --执行的dml操作:DELETE,INSERT,UPDATE,BEGIN,UNKNOWN
TABLE_NAME VARCHAR2(256) --dml更改的表
TABLE_OWNER VARCHAR2(32) --表的所有者
ROW_ID VARCHAR2(19) --修改行的ROWID
UNDO_SQL VARCHAR2(4000) --撤销dml的sql语句
----------------------------------------- -------- ----------------------------
(2)闪回事务查询的过程中是两个步骤:首先是先查询要闪回的事务号(XID,要查询XID通过第三点的闪 回版本查询),其次通过事务号(XID)查询UN_SQL。
tips:在查询的时候需要有权限.
GRANT SELECT ANY TRANSACTION TO user.
来源:CSDN
作者:我要变胖子
链接:https://blog.csdn.net/u013546910/article/details/39809537