使用闪回挽救我们的数据

我们在开发和运维过程中,经常遇到数据被误删除的情况。无论是在应用开发中的Bug,还是修改数据的时候,如果提交了错误数据修改结果,会带来很多问题。一般来说,一旦提交Commit事务,我们是不能获取到之前的数据情况,除非使用较复杂的数据恢复手段,利用备份数据恢复。

但是在Oracle中,可以使用其闪回FlashBack特性来解决这个问题。首先,声明一点,闪回Flashback的范围很大,包括数据库、表、数据均是可以Flashback的,但是机制差别很大。本文说的是简单的数据flashback,用来快速的挽救回我们的数据。

首先构建实验环境,和版本信息。

SQL> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE     11.2.0.1.0       Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 – Production

构建一张简单的数据表,定位时间信息。

SQL> create table t as select owner,object_id,object_name from dba_objects where rownum<3;

Table created

SQL> select sysdate from dual;

SYSDATE

-----------

2011-1-12 8

SQL> select * from t;

OWNER                           OBJECT_ID OBJECT_NAME

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

SYS                                    20 ICOL$

SYS                                    46 I_USER1

SQL> select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss‘) from dual;

TO_CHAR(SYSDATE,‘YYYY-MM-DDHH2

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

2011-01-12 08:23:59 //注意这个时间点。

如果我们此时误删除了数据,并且将删除结果提交。

SQL> delete t;

2 rows deleted

SQL> commit;

Commit complete

SQL> select count(*) from t;

COUNT(*)

----------

0

这时,虽然我们已经commit了删除事务,但是仍可以指定一个时间点,获取到那个时间点的数据。

SQL> select * from t as of timestamp to_timestamp(‘2011-01-12 08:23:59‘,‘yyyy-mm-dd hh24:mi:ss‘);

OWNER                           OBJECT_ID OBJECT_NAME

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

SYS                                    20 ICOL$

SYS                                    46 I_USER1

删除的数据集合又可以查询到。这样恢复数据的思路有了,可以将结果集合直接插入回数据表。

SQL> insert into t select * from t as of timestamp to_timestamp(‘2011-01-12 08:23:59‘,‘yyyy-mm-dd hh24:mi:ss‘);

2 rows inserted

SQL> commit;

Commit complete

SQL> select * from t;

OWNER                           OBJECT_ID OBJECT_NAME

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

SYS                                    20 ICOL$

SYS                                    46 I_USER1

数据恢复了,利用的是闪回特性。

结论:Oracle在进行处理的时候,对过去提交过的数据,是保存过一个镜像的,并且与一个SCN相对应。所谓SCN(System Commit Number),就相当于Oracle系统中的时钟,每次进程会话commit一次,相当于推进一次scn值。相对于时钟,SCN对Oracle数据库至关重要。

对数据,Oracle是可以保存多个版本的。每个版本是和对应的SCN相关联。我们利用闪回,可以一定程度的查找回过去一个时间SCN的数据版本。而SCN是一个绝对整数,如:

// Oracle 9i以上版本中,获取到当前系统SCN的方法;

SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

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

1169694

闪回标准的做法应为:

SQL> select * from t as of scn 1169694;

但是这样做,存在不方便的问题。我们就需要不断的试算合适的SCN取值,相对而言,时间日期较容易理解。使用as of timestamp更加容易。

所谓“No free lunch”,使用闪回是受到一些限制的。

受到系统参数的限制。闪回是一个系统配置,需要系统参数的支持。

//Undo相关的参数

SQL> show parameter undo

NAME                                 TYPE        VALUE

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

undo_management                      string      AUTO

undo_retention                       integer     900

undo_tablespace                      string      UNDOTBS1

在自动管理Undo的情况下,undo_retention表示支持闪回的秒数,默认为15分钟。但是,要注意,这只是一个近似值,实际上要根据系统繁忙程度和其他很多因素来决定闪回的时间。实际上,如果超过了闪回15分钟,可以获得结果。

如果闪回的时间过长,保存的SCN版本已经消失,系统会报错。

SQL> select * from emp as of timestamp to_timestamp(‘2008-01-12 08:23:59‘,‘yyyy-mm-dd hh24:mi:ss‘);

select * from emp as of timestamp to_timestamp(‘2008-01-12 08:23:59‘,‘yyyy-mm-dd hh24:mi:ss‘)

ORA-08180: 未找到基于指定时间的快照

时间: 2024-10-30 09:08:14

使用闪回挽救我们的数据的相关文章

binlog2sql之MySQL数据闪回

DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法费时费力,甚至需要停机维护,并不适合快速回滚.也有团队利用LVM快照来缩短恢复时间,但快照的缺点是会影响mysql的性能.现在有不少好用而且效率又高的开源闪回工具如binlog2sql.mysqlbinlog_flashback,这些工具在工作中给DBA减轻了不少痛苦,以下针对binlog2sql的使用进行实践演练. bin

闪回数据归档(Flashback Data Archive)

转自:http://book.2cto.com/201209/4154.html 闪回查询对撤销数据及参数undo_retention的依赖注定了它们在大事务量的情况下闪回时间窗口将会很小,想要查询数月之前的"旧"数据绝对不可能,但在闪回数据归档面前这并不是不可能的. 闪回数据归档的工作原理是将原本只能保存在UNDO表空间的撤销数据额外的以一种历史表的形式保存在指定的普通表空间(permanent类型的表空间)中.并且不像undo_retention参数那样是个影响整个数据库的设置,闪

Oracle 11g R2 Rman、数据泵、闪回备份与恢复

Oracle 11g R2 Rman备份备份与恢复的定义及分类 备份的定义及分类: 备份就是把数据库复制到转储设备的过程.其中,转储设备是指用于放置数据库副本的磁带或磁盘.通常也将存放于转储设备中的数据库的副本称为原数据库的备份或转储.备份是一份数据副本,从不同的角度分类如下: 从物理与逻辑的角度来分类: 从物理与逻辑的,备份可以分为物理备份和逻辑备份. 物理备份:对数据库操作系统的物理文件(数据文件,控制文件和日志文件)的备份.物理备份又可以分为脱机备份(冷备份)和联机备份(热备份),前者是在

Oracle闪回技术详解

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

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

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

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

Oracle 闪回特性(FLASHBACK DATABASE)

--===================================== -- Oracle 闪回特性(FLASHBACK DATABASE) --===================================== 闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回.表级别闪回.事务 级别闪回,根据闪回对数据的影响程度又可以分为闪回恢复,闪回查询.闪回恢复将修改数据,闪回点之后的数据将全部丢失.而闪回查询则可 以查询数据被DML的

oracle闪回查询和闪回数据库

oracle闪回查询和闪回数据库 区别: 数据闪回查询,只需要启用撤销表空间自动管理回滚信息. 使用闪回删除技术和闪回数据库技术,需要启动回收站,闪回恢复区.(归档模式使用) 具体设置: ---cmd sqlplus nolog sys as sysdba hanatech 具体设置----数据闪回查询的设置: 查看撤销表信息undo: show parameter undo; 设置撤销表信息: alter system set undo_managerment=auto;设置为auto才可以使

【oracle11g,13】表空间管理2:undo表空间管理(调优) ,闪回原理

一.undo空间原理: dml操作会产生undo数据. update时,sever process 会在databuffer 中找到该记录的buffer块,没有就从datafile中找并读入data buffer.在修改之前,原始数据先放到undo段,并在数据块头记录undo段(acitve 状态)中该数据块的位置,读写这个块时会占用事务槽,会将该事务号记录在数据块的头部.然后在进行update,并将该块放到dirty list检查点队列,等待dbwr进行写操作. 二.创建新的undo表空间替换