Oracle的闪回技术--闪回错误的DML操作

  提交DML操作后,该操作使用的还原段就可以被其它对象使用了,为了保证闪回操作时这些数据仍然被保存在还原段中,可能需要重新设置undo_retention参数,表示一个事务提交后,该事务的数据必须保存在还原段中的时间;但是这也并不能完全保证指定的时间的数据一定能够被恢复,还原表空间没有足够的时间时,仍会覆盖要求保留的磁盘空间。

查看undo_retention的当前值:

SQL> show parameter undo_retention

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
undo_retention                 integer     900

默认是900s

设置undo_retention的值为2个小时

SQL> alter system set undo_retention = 7200;

系统已更改。

  

实例测试:

  目标:将emp_bak表中的员工的工资统一更新为9999,提交后使用闪回技术回滚回初始值。

--更新emp_bak

SQL> update emp_bak set sal = 9999;

已更新10行。
SQL> commit;

提交完成。

--查出更新操作对应的事务号

SQL> select  versions_xid,ename,sal from emp_bak
  2         versions between scn minvalue and maxvalue
  3         where empno = 7900;

VERSIONS_XID     ENAME            SAL
---------------- ---------- ---------
08001D0018060000 JAMES        9999.00
                 JAMES         950.00

  versions_xid为事务号,minvalue为最小值,maxvalue为最大值。

--从数据字典flashback_transaction_query中查询出事务号所对应的SCN号

select start_scn from flashback_transaction_query
  2         where xid = hextoraw(‘08001D0018060000‘);

 START_SCN
----------
   2206522
   2206522
   2206522
   2206522
   2206522
   2206522
   2206522
   2206522

已选择8行。

--启用行移动功能, 否则不能闪回表

SQL> alter table scott.emp_bak enable row movement;

表已更改。

--闪回表

SQL> flashback table scott.emp_bak to scn 2206522;

闪回完成。

SQL> select sal from scott.emp_bak where empno=7900;

       SAL
----------
       950

闪回已经完成了。

 注意闪回是闪回到该SCN之前的一个状态。

附录:

除了根据SCN号闪回,还可以根据时间闪回

如果查询flashback_transaction_query视图中的列operation全是unknown 而且undo_sql 也为空,要开启对DML更改引用的列值和主键值的日志记录

SQL>  alter database add supplemental log data (primary key) columns;

再查询就可以见到了

SQL> select  start_scn,operation,undo_sql from flashback_transaction_query
  2         where xid = hextoraw(‘05000C00DE060000‘);

 START_SCN OPERATION                        UNDO_SQL
---------- -------------------------------- --------------------------------------------------------------------------------
   2210297 UPDATE                           update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAT‘;
   2210297 UPDATE                           update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAS‘;
   2210297 UPDATE                           update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAR‘;
   2210297 UPDATE                           update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAQ‘;
   2210297 UPDATE                           update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAP‘;
   2210297 UPDATE                           update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAO‘;
   2210297 UPDATE                           update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAN‘;
   2210297 UPDATE                           update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAM‘;
   2210297 UPDATE                           update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAL‘;
   2210297 UPDATE                           update "SCOTT"."EMP_BAK" set "JOB" = NULL where ROWID = ‘AAASNGAAEAAAADrAAK‘;
时间: 2024-11-03 21:50:20

Oracle的闪回技术--闪回错误的DML操作的相关文章

php中对MYSQL操作之预处理技术(1)数据库dml操作语句

<?php //预处理技术 //创建一个mysqli对象 $mysqli = new MySQLi("主机名","mysql用户名","密码","数据库名"); //判断是否链接成功 if($mysqli->connect_error){ die($mysqli->connect_error); } //创建预编译对象 $sql = "insert into 表名 (name,qq,age) val

oracle 闪回技术--闪回删除

1.查看是否启动闪回删除 SQL> show parameter recyclebin; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ recyclebin string on 启动闪回 2.测试闪回删除的表: 创建两个一样的表,然后都删除,进行恢复. SQL> create table edu.test_flash(id number(12),na

Oracle闪回技术--更新ing

Oracle10g中引入了闪回技术,但这并不意味着所有的表都能闪回成功,当没有足够的磁盘空间,Oracle将使用回收站中的磁盘空间,而且位图连接索引和引用完整性约束也不受回收站的保护. recyclebin参数的设置 show parameter bin --展示是否使用了闪回技术,默认是使用闪回技术的alter session set recyclebin=off; --在session级别修改alter system set recyclebin=off DEFERRED; --不加DEFE

oracle中闪回错误的dml操作原理

原理: Oracle根据还原表空间信息,利用还原表空间中的数据,类似一致性读取方法,可以把表置于一个删除前的时间点(或SCN),从而将数据找回. 删除删除错误的dml操作的oracle的前提准备: 一.保证可以闪回两个小时之前的数据 show parameter undo_retention 显示事务在undo表空间中至少保存的时间.表示一个事务提交以后,该事务的数据至少要在还原表空间中保存的undo_retention参数指定的时间(秒). alter system set undo_rete

Oracle闪回技术详解

概述: 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成).需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或是介质丢失的错误,闪回技术就回天乏术了,还是得借助于Oracle一些高级的备份恢复工具如RAMN去完成(这才是Oracle强大备份恢复机制的精髓所在啊)  撤销段(UNDO SEGMENT) 在讲闪回技术前,需要先了解Oracle中一个逻辑结构--撤销段.因为大部分闪回技术

Oracle闪回技术(Flashback)

闪回技术有闪回表.闪回删除.闪回查询.闪回事务查询.闪回事务.闪回数据库.闪回数据归档.其中,闪回查询.闪回事务查询用来“观察”过去:闪回数据归档并不是一个独立的功能,其功能是扩展闪回查询的时间窗口:闪回表.闪回删表能够以表为单位“回到”过去:闪回事务能够以事务为单位“回到”过去:闪回数据库能够以数据库为单位“回到”过去. 一. 闪回表(Flashback Table) 闪回表是利用UNDO表空间的撤销数据,所以能把表闪回到多久之前受到undo_retention,UNDO表空间的数据文件是否启

Oracle 六大闪回技术,flashback

Flashback 技术是以Undo segment中的内容为基础的, 因此受限于UNDO_RETENTON参数. 要使用flashback 的特性,必须启用自动撤销管理表空间. 在Oracle 11g里又出了一个新特性:Oracle Flashback Data Archive. FDA通过将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和undo区别开来, 这样就可以为闪回归档区单独设置存储策略,使之可以闪回到指定时间之前的旧数据而不影响undo策略. 在Or

Oracle 11g R2 闪回技术

为了使数据库能够从任何逻辑错误中迅速恢复,oracle推出了闪回技术.采用该技术,可以对行级和事物级的数据变化进行恢复,减少了数据恢复的时间,而且操作简单.通过SQL语句就可以实现数据的恢复,大大提高了数据库恢复的效率.闪回技术是数据库恢复技术历史上一次重大的进步,从根本上改变了数据恢复. 闪回技术包括以下各项: 闪回查询:(FLASHBACK QUERY):查询过去某个时间点或某个SCN值时表中的数据信息 闪回版本查询(FLASHBACK Version query):查询过去某个时间段或某个

Oracle 闪回技术

一.配置闪回数据库 1.数据库处于归档日志模式 SQL> select log_mode from v$database; LOG_MODE ------------ ARCHIVELOG 2.创建闪回恢复区 SQL> alter system set db_recovery_file_dest_size=10G; System altered. SQL> alter system set db_recovery_file_dest='D:\oracle\product\11.2.0\d