Oracle闪回详解

时间:2022-06-25 18:43:56

 

1、问题定义

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

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

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

闪回:flashback。

概念:

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

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

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

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

Oracle闪回详解

可以修改这个值:

Oracle闪回详解

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

通过一个函数:

Oracle闪回详解

2.1、闪回表

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

Oracle闪回详解

根据SCN时间号闪回:

Oracle闪回详解

根据时间闪回:

Oracle闪回详解

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

还有一种闪加方式:

Oracle闪回详解

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

Oracle闪回详解

在oracle中,有一个表

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

以下是这个表的结构:

Table_name

Undo_sql

Xid对应的就是versions_xid

Grant select any transaction to scott;