zoukankan      html  css  js  c++  java
  • Oracle闪回详解

    1、问题定义

    闪回是dba做的工作。现在也可授权给某个用户。

    闪回的定义:就是将用户错误的操作回恢到以前的状态。即使你的事务提交的commit。

    如果你删除了一个表。Drop table(DDL) 不用commit直接生效的。

    闪回:flashback。

    概念:

    Oracle默认有2G硬盘空间,这2G的数据,保存的是用户的某些操作记录。如果用户操作的数据在这2G之内的。则可以条件闪回。

    这个区域可以设置为最大10G。

    在Oracle中,默认还有一个选项,时间选项。默认是900秒。

    通过以下方式可以查询这个时间选项:

    clip_image002

    可以修改这个值:

    clip_image004

    2、闪回

    闪回分类:

    1:闪回表中的数据 –

    闪回执行错误的CRUD语句。

    且是提交以后的数据。

    即对insert,update,delete有效。且已经提交了,则可以使用闪回。

    2:闪回删除

    错误的执行了drop table语句。则通过闪回删除可以找回以前数据。

    3:闪回版本查询

    向一个表中,做的任何一个commit语句。Oracle数据库,都会给你记录一个版本。

    4:闪回事务查询

    执行了多条sql语句,且是对多个表,或是对一个表的多次操作。

    闪回的语法:

    Flashback table {tableName} to

    {

    (scn|timestamp)

    |

    Before drop

    }

    SCN :System Changement Number – 其实就是一个时间。与时间一一对应的

    Timestamp: 时间点 ,sysdate

    --如何获取时间号:SCN

    通过一个函数:

    clip_image006

    2.1、闪回表

    必须要打开行移动功能,为rowid设置移动空间。

    clip_image008

    根据SCN时间号闪回:

    clip_image010

    根据时间闪回:

    clip_image012

    2.2、闪回删除

    就是闪回通过drop删除到回收站中的表数据。

    Flashback table tableName to before drop;

    SQL> --删除stud这表

    SQL> drop table stud;

    表已删除。

    SQL> select *from tab;

    TNAME TABTYPE CLUSTERID

    --------------- ---------------- ----------

    BIN$O1guMhXtQtK TABLE

    BrmH0wA44/Q==$0

    BONUS TABLE

    DEPT TABLE

    EMP TABLE

    SALGRADE TABLE

    SYS_TEMP_FBT TABLE

    已选择6行。

    SQL> --通过show 可以查看回收站中信息

    SQL> show recyclebin;

    ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME

    ---------------- ------------------------------ ------------ -------------------

    STUD BIN$O1guMhXtQtKBrmH0wA44/Q==$0 TABLE 2013-03-28:19:29:16

    SQL> --闪回

    SQL> flashback table stud to before drop;

    闪回完成。

    SQL> show recyclebin;

    SQL> select *from tab;

    TNAME TABTYPE CLUSTERID

    --------------- ---------------- ----------

    BONUS TABLE

    DEPT TABLE

    EMP TABLE

    SALGRADE TABLE

    STUD TABLE

    SYS_TEMP_FBT TABLE

    已选择6行。

    SQL> select * from stud;

    ID NAME

    ---------- ----------

    1 Jack

    2 张三

    3 Rose

    表如果重名:

    SQL> drop table stud;

    表已删除。

    SQL> show recyclebin;

    ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME

    ---------------- ------------------------------ ------------ -----------------

    STUD BIN$jMt4lVtBQXieHhRHitV3KA==$0 TABLE 2013-03-28:19:33:

    STUD BIN$4mfx44bSSo+NPkgEhU/Mig==$0 TABLE 2013-03-28:19:31:

    SQL> --通过表名闪回,只会删除最近删除的那一个

    SQL> flashback table stud to before drop;

    闪回完成。

    SQL> select * from stud;

    AGE ADDR

    ---------- ------------------------------------------------------------

    90 山东

    SQL> show recyclebin;

    ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME

    ---------------- ------------------------------ ------------ -----------------

    STUD BIN$4mfx44bSSo+NPkgEhU/Mig==$0 TABLE 2013-03-28:19:31:

    SQL> flashback table stud to before drop rename to stud2;

    闪回完成。

    SQL> select * from stud2;

    ID NAME

    ---------- ----------

    1 Jack

    2 张三

    3 Rose

    还有一种闪加方式:

    clip_image014

    2.3、闪回版本查询

    在Oracle数据库中,有一个对象versions记录的是对某个表的commit操作。

    记录下的信息

    1:versions_starttime – 什么时间开始的。对insert

    2:versions_endtime – 什么时间数据就没有了,当执行delete,update时。

    3:versions_startscn – 与1对应

    4:versions_endscn – 与2对应

    5:versions_xid – 操作的事务的id。

    2.3.1、在Oracle中事务的边界

    开始:

    在Oracle中以insert,update,delete为事务的开始标记。

    结束:

    在执行rollback,commit.

    在执行DDL(create ,drop ,alter)语句时,也是事务的结束。Commit

    示例:

    SQL> select *from stud;

    AGE ADDR

    ---------- ----------------------------------------

    90 山东

    SQL> insert into stud values(12,'BJ');

    已创建 1 行。

    SQL> select * from stud;

    AGE ADDR

    ---------- ----------------------------------------

    90 山东

    12 BJ

    SQL> create table stss(iii int);

    表已创建。

    SQL> rollback;

    回退已完成。

    SQL> select * from stud;

    AGE ADDR

    ---------- ----------------------------------------

    90 山东

    12 BJ

    SQL> commit;

    提交完成。

    SQL> delete from stud where age=12;

    已删除 1 行。

    SQL> select * from stud;

    AGE ADDR

    ---------- ----------------------------------------

    90 山东

    SQL> drop table st;

    drop table st

    *

    第 1 行出现错误:

    ORA-00942: 表或视图不存在

    SQL> select * from stud;

    AGE ADDR

    ---------- ----------------------------------------

    90 山东

    SQL> rollback;

    回退已完成。

    SQL> select * from stud;

    AGE ADDR

    ---------- ----------------------------------------

    90 山东

    SQL>

    2.3.2、查询一个表的版本信息

    对于versions而言语法:

    Select id,name,

    Versions_xid

    From person

    Versions between ( scn | timestamp) minvalue and maxvalue;

    SQL> select id,name,versions_xid from person versions between timestamp minvalue

    and maxvalue;

    ID NAME VERSIONS_XID

    ---------- ---------- ----------------

    22 BCCCCC 0500130099020000

    2 BBBBB 0500130099020000

    11 ABBBB 0700020080020000

    1 AAA 0700020080020000

    2.4、闪回事务查询

    原则就是根据某个versions_xid- 事务id

    对应这versionss_id会有一个撤销的sql==== undo_sql

    即对于insert的commit来说,则撤销应该是delete

    clip_image016

    在oracle中,有一个表

    Flashback_transaction_query表。保存了所有用户可撤销的sql语句。

    以下是这个表的结构:

    Table_name

    Undo_sql

    Xid对应的就是versions_xid

    Grant select any transaction to scott;

  • 相关阅读:
    (转载)正向代理与反向代理的区别
    Java设计模式系列之装饰者模式
    工作中使用到的技术和工具分享
    Springboot+mybatis整合
    云计算入门和实践
    tesseract系列(1) -- tesseract用vs编译成库
    nodepad++ 让所有的加号收缩折叠展开的快捷键
    tesseract系列(4) -- tesseract训练问题总结
    tessereact的链接收藏
    菜鸟cmake使用
  • 原文地址:https://www.cnblogs.com/xiaweifeng/p/3688911.html
Copyright © 2011-2022 走看看