Flashback version/Transaction Query,FlashbackTable
Flashback version Query
相对于Flashback Query 只能看到某一点的对象状态, Oracle 10g引入的Flashback Version Query可以看到过去某个时间段内,记录是如何发生变化的。 根据这个历史,DBA就可以快速的判断数据是在什么时点发生了错误,进而恢复到之前的状态。
先看一个伪列 ORA_ROWSCN. 所谓的伪列,就是假的,不存在的数据列,用户创建表时虽然没有指定,但是Oracle为了维护而添加的一些内部字段,这些字段可以像普通文件那样的使用。
最熟悉的伪列就是 ROWID, 它相当于一个指针,指向记录在磁盘上的位置。ORA_ROWSCN 是Oracle 10g 新增的,暂且把它看作是记录最后一次被修改时的SCN。 Flashback Version Query 就是通过这个伪列来跟踪出记录的变化历史。
SQL> create table test (id number(2)); 表已创建。 SQL> insert into test values(1); 已创建 1 行。 SQL> insert into test values(2); 已创建 1 行。 SQL> insert into test values(3); 已创建 1 行。 SQL> select ora_rowscn,id from test; ORA_ROWSCN ID
---------- ----------
1161066 1
1161066 2
1161066 3
ORA_ROWSCN记录的是最后一次被修改时的SCN,注意是被提交的修改。如果没有提交,这个伪列不会发生变化。
ORA_ROWSCN 缺省是数据块级别的,也就是一个数据块内的所有记录都是一个ORA_ROWSCN,数据块内任意一条记录被修改,这个数据库块内的所有记录的ORA_ROWSCN都会同时改变。
SQL> INSERT INTO TEST VALUES(4); 已创建 1 行。
SQL> SELECT * FROM TEST; ID
----------
1
2
3
4 SQL> SELECT ORA_ROWSCN FROM TEST; ORA_ROWSCN
----------
1161066
1161066
1161066
1161066
SQL> COMMIT; 提交完成。 SQL> SELECT ORA_ROWSCN,ID FROM TEST; ORA_ROWSCN ID
---------- ----------
1161378 1
1161378 2
1161378 3
1161378 4
如果没有提交,ORA_ROWSCN值不会变。
=================Flashback Transaction Query=============================
Flashback Transaction Query也是使用UNDO信息来实现。利用这个功能可以查看某个事务执行的所有变化,它需要访问flashback_transaction_query 视图,这个视图的XID列代表事务ID,利用这个ID可以区分特定事务发生的所有数据变化。
SQL> create table test (id number(2)); 表已创建。 SQL> insert into test values(1); 已创建 1 行。 SQL> insert into test values(2); 已创建 1 行。
--------------------------------------------------------------
SELECT TABLE_NAME,OPERATION FROM flashback_transaction_query where table_name='TEST';
TABLE_NAME OPERATION
TEST UNKNOWN
TEST UNKNOWN
TEST UNKNOWN
TEST UNKNOWN
operation为什么都是unknown?解决方法:http://www.cnblogs.com/rusking/p/4215272.html
==========================================================================
FLASHBACK TABLE
Flashback Table也是使用UNDO tablespace的内容来实现对数据的回退。该命令相对简单,输入:flashback table table_name to scn(to timestamp) 即可。注意SYS用户不支持闪回。
注意:如果想要对表进行flashback,必须允许表的row movement.
要查看某表是否启用row movement,可以到user_tables 中查询(或all_tables,dba_tables).
例如:
SQL> select row_movement from user_tables where table_name='EMP2'; ROW_MOVE
--------
DISABLED
要启用或禁止某表row movement,可以通过下列语句:
--启用
SQL> ALTER TABLE table_name ENABLE ROW MOVEMENT;
表已更改。
--禁止
SQL> ALTER TABLE table_name DISABLE ROW MOVEMENT;
表已更改。
-------------------------------------------------------
SQL> ALTER TABLE EMP2 ENABLE ROW MOVEMENT; 表已更改。 SQL> SELECT ROW_MOVEMENT FROM USER_TABLES WHERE TABLE_NAME='EMP2'; ROW_MOVE
--------
ENABLED
====================
SQL> ALTER SESSION SET NLS_DATE_FORMAT=
2 "YYYY-MM-DD HH24:MI:SS"; 会话已更改。 SQL> SELECT SYSDATE FROM DUAL; SYSDATE
-------------------
2014-10-16 23:01:14 SQL> SELECT CURRENT_SCN FROM V$DATABASE; CURRENT_SCN
-----------
1164486 SQL> DELETE FROM EMP2; 已删除14行。 SQL> FLASHBACK TABLE EMP2 TO SCN 1164486; 闪回完成。 SQL> SELECT * FROM EMP2; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
……
Flashback table 命令支持同时操作多个表,表名中间以逗号分隔即可,如果你执行一条flashback table命令时同时指定了多个表,要记住单个flashback table 是在同一个事务中,因此这些表的恢复操作要么都成功,要么都失败。
如:
flashback table a,b ,c to scn 1103864;
一些注意事项:
(1)基于undo 的表恢复,需要注意DDL 操作的影响。修改并提交过数据之后,对表做过DDL 操作,包括:drop/modify 列, move 表, drop 分区(如果有的话), truncate table/partition,这些操作会另undo 表空间中的撤销数据失效,对于执行过这些操作的表应用flashback query 会触发ORA-01466 错误。
另外一些表结构修改语句虽然并不会影响到undo 表空间中的撤销记录,但有可能因表结构修改导致undo 中重做记录无法应用的情况,比如对于增加了约束,而flashback query 查询出的undo 记录已经不符合新建的约束条件,这个时候直接恢复显然不可能成功,你要么暂时disable 约束,要么通过适当逻辑,对要恢复的数据进行处理之后,再执行恢复。
(2)基于undo 的表恢复,flashback table 实际上做的也是dml 操作(会在被操作的表上加dml 锁),因此还需要注意triggers 对其的影响,默认情况下,flashback table to scn/timestamp 在执行时会自动disable 掉与其操作表相差的triggers,如果你希望在此期间trigger 能够继续发挥做用,可以在flashback table 后附加 ENABLE TRIGGERS 子句。
=====================Flashback Data Archive略=============
《FROM:http://blog.csdn.net/tianlesoftware/article/details/4677378》
Flashback version/Transaction Query,FlashbackTable的更多相关文章
- Flashback Version/Transaction Query
1.应用Flashback Version Query查询记修改版本 SQL> select dbms_flashback.get_system_change_number from dual; ...
- Flashback Version Query、Flashback Transaction Query快速闪回细粒度数据
Flashback Version Query 闪回版本查询 使用Flashback Version Query 返回在指定时间间隔或SCN间隔内的所有版本,一次commit命令就会创建一个版本. ...
- Oracle Flashback Transaction Query with Oracle Flashback Version Query
Oracle Flashback Transaction Query with Oracle Flashback Version Query In this example, a database a ...
- 闪回之 Flashback Query (dml表、过程、函数、包等)、Flashback version Query
Flashback Query 背景:Flashback 是 ORACLE 自 9i 就开始提供的一项特性,在 9i 中利用oracle 查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数 ...
- 利用flashback transaction query新特性进行事务撤销
具备了flashback version query查询的基础,我们就可以进行基于flashback version query的恢复.这就是flashback transaction query.f ...
- PLSQL_闪回操作3_Fashback Transaction Query
2014-12-09 Created By BaoXinjian
- Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration
Session接口: Session接口 Session 接口对于Hibernate 开发人员来说是一个最重要的接口.然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都 ...
- ocp 1Z0-043 131-205题解析
131. Which three methods can you use to run an Automatic Database Diagnostic Monitor (ADDM) analysis ...
- PLSQL_闪回操作2_Fashback Version Query
2014-12-09 Created By BaoXinjian
随机推荐
- 如何在pl/sql developer 7运行到oracle存储过程设置断点的地方
如何高效调试oracle存储过程,尤其是父子网状调用的存储过程 1,在需要设置断点的oracle存储过程处设置断点 如何设置断点:直接在某行oracle存储过程处单击行首,会在行首显示 ...
- Java这个名字怎么来
Java语言的历程丰富多彩,被现在众多程序员和企业广泛使用,不用质疑这是Java的领先技术的结果. Java是Sun公司开发的一种编程语言,Sun公司最初的方向是让Java来开发一些电器装置程序, ...
- Invalid content was found starting with element 'taglib'”
今天在使用struts-menu制作菜单,在web.xml中写入 <taglib> <taglib-uri>/WEB-INF/struts-menu.tld</ ...
- 路由转发(curl)
<?php ini_set('memory_limit', '640M'); ini_set('default_charset', 'utf-8'); define('webroot', 'ht ...
- 简单的LRU Cache设计与实现
要求: 设计并实现一个LRU缓存的数据结构,支持get和set操作 get(key):若缓存中存在key,返回对应的value,否则返回-1 set(key,value):若缓存中存在key,替换其v ...
- http_load压力测试
http_load是基于linux平台的性能测试工具,它体积非常小,仅100KB.它以并行复用的方式运行,可以测试web服务器的吞吐量与负载. 一.安装http_load A.进入/usr/local ...
- Oracle instr用法
1:实现indexOf功能,.从第1个字符开始,搜索第1次出现子串的位置 ,) as i from dual; select instr('oracle','or') as i from dual; ...
- Tomcat 6.0.32 +Spring dbcp datasource关闭Tomcat出现严重异常
异常如下: 信息: Pausing Coyote HTTP/ -- :: org.apache.catalina.core.StandardService stop 信息: Stopping serv ...
- 关于cookie, iphone及chrome的异同
http://www.blogjava.net/jjshcc/archive/2010/06/13/323517.html http://stackoverflow.com/questions/295 ...
- openssl对数组加密解密的完整实现代码
本例是用C实现的对一个数组进行加密,加密到第二个数组,然后解密到另一个数组的完整实现代码. #include <stdio.h> #include <string.h> #in ...