ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

oracle-闪回

2022-07-19 02:00:06  阅读:173  来源: 互联网

标签:insert 闪回 undo testfb oracle table flashback


简介

作用:
错误的增删改,并commit; 错误的删除表;
获取表上的历史操作记录;
撤销已经提交的事务
类型:
闪回表中的数据:将表回退到过去的一个时间点上
闪回删除的表:还原Oracle回收站
闪回事务
闪回数据库(了解):将数据库回退到过去的一个时间点上
闪回归档日志(了解)

闪回参数设置

查看闪回参数:

sysdba登录,show parameter undo ;

SQL> show parameter undo;

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
undo_management                      string                 AUTO
undo_retention                       integer                900
undo_tablespace                      string                 UNDOTBS1

修改闪回时间:

alter system set undo_retention=1200 scope=both;
超出3912M的数据,在1200秒内可以闪出。

scope:
memory:内存。修改只改 当前数据库;重启后仍然是900秒。
spfile:文件。只改物理文件,不改当前数据库;重启后才变为1200秒。
both:以上二者

将表回退到过去的一个时间或SCN上。

闪回表需要授权:
grant flashback any table to scott; 授权闪回所有表的权限给scott用户

计算scn:
select timestamp_to_scn(sysdate) scn from dual ;

示例:

create table testfb
(
    id  number,
    name  varchar2(20)
);
insert into testfb values(1,'zhangsan') ;
insert into testfb values(2,'lisi') ;
insert into testfb values(1,'zhangsan') ;

记录此时的时间 select timestamp_to_scn(sysdate) scn from dual ;

删除数据并提交:

delete from testfb where id=1;	
commit ;

闪回表:
flashback table testfb to scn 12312 ;

闪回报错

SQL> flashback table testfb to scn 1195871;
flashback table testfb to scn 1195871
                *
第 1 行出现错误:
ORA-08189: 因为未启用行移动功能, 不能闪回表
SQL> alter table testfb enable row movement ;  -- 报错:开启行移动 
表已更改。
SQL> flashback table testfb to scn 1195871;
闪回完成。
SQL>

注意:
1.要闪回表,必须知道闪回的时间-->SCN,如何知道闪回的时间?
2.系统表(数据字典)不能被闪回
3.闪回表不能跨越DDL(create table…)

管理员没有回收站,无法闪回。登录sys 演示
ORA-08185: 用户 SYS 不支持闪回

闪回删除的表(还原回收站中的表)

drop table testfb;删除表

show recyclebin; 查看回收站

SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
BONUS            BIN$HB5wdBWnQnmjR2EVrXaMxg==$0 TABLE        2022-07-17:00:32:32
DEPT             BIN$FmyIP67ZSjmqUaSK20QN4A==$0 TABLE        2022-07-17:00:32:15
EMP              BIN$RtL2dYlURHKyjDkbWGepmA==$0 TABLE        2022-07-17:00:32:07
SALGRADE         BIN$AuXxE/UzQDueaotLzuWmTA==$0 TABLE        2022-07-17:00:59:45
SALGRADE         BIN$Ne5pjI+gRn6PQS079HSqEQ==$0 TABLE        2022-07-17:00:32:44
STUDENT          BIN$2Me6JX/lRzaNU5STr8fifg==$0 TABLE        2022-07-17:00:59:26
TESTFB           BIN$p0uIW1njR1CJAhmiOvsfpQ==$0 TABLE        2022-07-17:12:19:13
SQL>

闪回表:
flashback table 表原名 to before drop;
默认情况下:如果回收站中存在多个同名的表,使用表名闪回 闪回的是最近一次删除的表

如果闪回的表和库中目前的表重名,则冲突,必须重命名rename to ...
flashback table testfb to before drop rename to test2

指定闪回某个表
flashback table '回收站中的名字' to before drop ;

使用回收站名称闪回表,需要加单引号

purge recyclebin; --清空回收站

drop table 表名 purge ; -- 直接彻底删除一张表(不过回收站)

闪回表是否恢复触发器:
flashback table 表名 to before drop [rename to 新表名] enable|disable(默认) triggers;

闪回事务

事务闪回需要在数据字典中根据事务号查询undo_sql,然后执行nudo_sql闪回

准备数据

insert into testfb values(1,'zhangsan1') ;
insert into testfb values(2,'zhangsan2') ;
insert into testfb values(3,'zhangsan3') ;
commit; --第1个版本
insert into testfb values(4,'zhangsan4') ;
insert into testfb values(5,'zhangsan5') ;
insert into testfb values(6,'zhangsan6') ;
commit; --第2个版本
insert into testfb values(7,'zhangsan7') ;
insert into testfb values(8,'zhangsan8') ;
insert into testfb values(9,'zhangsan9') ;
commit; --第3个版本

查询事务号(需要使用 伪列)

select id,name,versions_xid,versions_operation,versions_starttime,versions_endtime from testfb versions between timestamp minvalue and maxvalue;

SQL> select id,name,versions_xid,versions_operation,versions_starttime,versions_endtime from testfb versions between timestamp minvalue and maxvalue;
        ID NAME                                     VERSIONS_XID     VE VERSIONS_STARTTIME                                                          VERSIONS_ENDTIME
---------- ---------------------------------------- ---------------- -- --------------------------------------------------------------------------- ---------------------------------------------------------------------------
         6 zhangsan6                                02000A004E030000 I  19-7月 -22 01.09.43 上午
         5 zhangsan5                                02000A004E030000 I  19-7月 -22 01.09.43 上午
         4 zhangsan4                                02000A004E030000 I  19-7月 -22 01.09.43 上午
         3 zhangsan3                                0700110090020000 I  19-7月 -22 01.09.16 上午
         2 zhangsan2                                0700110090020000 I  19-7月 -22 01.09.16 上午
         1 zhangsan1                                0700110090020000 I  19-7月 -22 01.09.16 上午

versions_xid(事务号)
select id,name from testfb versions between timestamp minvalue and maxvalue ; --查询所有版本

查询undo_sql

select operation,undo_sql from flashback_transaction_query where xid='事务号';

SQL> select operation,undo_sql from flashback_transaction_query where xid='02000A004E030000';

OPERATION
----------------------------------------------------------------
UNDO_SQL
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
INSERT
delete from "SCOTT"."TESTFB" where ROWID = 'AAASRDAAEAAAAJdAAF';

INSERT
delete from "SCOTT"."TESTFB" where ROWID = 'AAASRDAAEAAAAJdAAE';

INSERT
delete from "SCOTT"."TESTFB" where ROWID = 'AAASRDAAEAAAAJdAAD';


OPERATION
----------------------------------------------------------------
UNDO_SQL
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
BEGIN
  1. 权限不足
    select operation,undo_sql from flashback_transaction_query where xid='03001F007E030000'
    第 1 行出现错误:
    ORA-01031: 权限不足
    grant select any transaction to scott;
  2. 查询undo_sql全部显示UNKNOWN
    未开启日志,闪回事务 实际上 借助的是日志,未开启日志之前提交的事务不支持回滚
    alter database add supplemental log data;

执行operate对应的undo_sql

全部撤销需要执行该事务号对应的全部的undo_sql,如果只执行某一条undo_sql,则只撤销该条undo_sql对应的dml

标签:insert,闪回,undo,testfb,oracle,table,flashback
来源: https://www.cnblogs.com/jiyuchen1/p/16483035.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有