oracle闪回表详解

--- 说明闪回数据库

--- 使用闪回表将表内容还原到过去的特定时间点

--- 从删除表中进行恢复

--- 使用闪回查询查看截止到任一时间点的数据库内容

--- 使用闪回版本查询查看某一行在一段时间内的各个版本

--- 使用闪回事务查询查看事务处理历史记录或行

会还原表及其关联对象(如索引、约束条件、触发器等)中的数据。

所谓闪回表,就是将表里的数据回退到历史的某个时间点,比如回退到用户误删除数据之前的时间点,从而将误删除的数据恢复回来,在这个操作过程中,数据库仍然可用而且不需要额外的空间。

闪回表利用的是UNDO表空间里记录的数据被改变前的值,因此,如果闪回表时所需要的
undo数据,由于保留时间超过了初始化参数undo_retention所指定的值,从而导致该undo数据库数据被其他事务覆盖的话,那么就不能恢复
到指定的时间了,除非在UNDO表空间上指定了retention guarantee选项。

使用闪回表,可将一组表恢复到特定的时间点,而不需要执行传统时间点恢复操作。

在数据库联机时,通过只回退对指定表及其相关对象所做的更改,闪回表操作可原位完成。

闪回表语句可作为单个事务处理来执行。必须成功闪回所有表,否则会回退整个事务处理。

· 使用闪回表,可将一个或多个表恢复到特定的时间点,而不需要还原备份

· 从回滚段表空间检索数据后可执行闪回表操作

· 执行闪回表操作需要FLASHBACK TABLE 权限

· 必须对要执行闪回操作的表启动行移动

//由于闪回表的操作会修改表里的数据,从而有可能引起数据行的移动。比如某一行数据当前在A数据块里,而在把表闪回到以前的某个时间点时,在那个时间上,该行
数据位于B数据块里,于是在闪回表的操作中,数据行从当前A数据块转移到B数据块,因此在闪回表之前,必须启动数据行移动特性。

闪回表:注意事项

·  整个FLASHBACK TABLE 语句是在一个事务处理中执行的。数据操作语言(DML)互斥锁。

·  会保留所有现有的索引。不会重新创建删除的索引。还会自动保留相关的提交时实体化视图。

·  FLASHBACK TABLE 语句只要不违反任何表约束条件,就闪回FLASHBACK TABLE 语句中指定的表。
不能对系统表、远程表和固定表执行闪回表操作。

1. 实验:闪回表用法

[email protected]>conn tyger/tyger
Connected.

[email protected]>create table tyger as select * from scott.emp;
Table created.

[email protected]>select count(*) from tyger;
  COUNT(*)
----------
        14

[email protected]>select dbms_flashback.get_system_change_number from dual;              
 //查看当前系统SCN

GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1045621

[email protected]>delete from tyger where rownum <5;
4 rows deleted.

[email protected]>commit;
Commit complete.

[email protected]>select count(*) from tyger;
  COUNT(*)
----------
        10

[email protected]>alter table tyger enable row movement;                  
  //启用表tyger的行移动
Table altered.

[email protected]>flashback table tyger to scn 1045621;
Flashback complete.

[email protected]>select count(*) from tyger;
  COUNT(*)
----------
        14

实验2:启用闪回数据库

1. 设置闪回恢复区保留时间3天

[email protected]>show parameter flashback
NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ------------------------------
db_flashback_retention_target        integer                          1440              //db_flashback_retention_target 用于定义一个时间上限  单位是分钟

[email protected]>alter system set db_flashback_retention_target=4320;

[email protected]>show parameter flashback
NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ------------------------------
db_flashback_retention_target        integer                          4320

2. 查看当前闪回状态,未开启闪回,开启闪回(mount状态开启闪回)

[email protected]>select flashback_on from v$database;
FLASHBACK_ON
------------------
NO

[email protected]>alter database flashback on;
alter database flashback on
*
ERROR at line 1:
ORA-38759: Database must be mounted by only one instance and not open.

[email protected]>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
[email protected]>startup mount;
ORACLE instance started.

Total System Global Area  314572800 bytes
Fixed Size                  1219160 bytes
Variable Size             121636264 bytes
Database Buffers          188743680 bytes
Redo Buffers                2973696 bytes
Database mounted.

3. 开启闪回,必须在归档模式下开启 

[email protected]>archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     29
Next log sequence to archive   31
Current log sequence           31

[email protected]>alter database flashback on;
Database altered.

4. 打开数据库,查看闪回状态

[email protected]>alter database open;
Database altered.

[email protected]>select flashback_on from v$database;
FLASHBACK_ON
------------------
YES

实验3:闪回数据库用途                      -----实验参考eygle 的循序渐进oracle

[email protected]>conn tyger/tyger
Connected.
[email protected]>select count(*) from tyger;
  COUNT(*)
----------
         1

[email protected]>select count(*) from test;
  COUNT(*)
----------
        14

[email protected]>alter session set nls_date_format=‘yyyy-mm-dd hh24:mi:ss‘;
Session altered.

[email protected]>select sysdate from dual;
SYSDATE
-------------------
2014-03-11 15:47:14

[email protected]>truncate table tyger;
Table truncated.

[email protected]>select sysdate from dual;
SYSDATE
-------------------
2014-03-11 15:47:38

[email protected]>truncate table test;
Table truncated.

[email protected]>select sysdate from dual;
SYSDATE
-------------------
2014-03-11 15:48:03

闪回需要在Mount状态下进行,可以指定Timestamp/SCN/Sequence进行闪回。

首先将数据库闪回到第一时间点,以Redo only的方式打开数据库:

[email protected]>startup mount;
ORACLE instance started.

Total System Global Area  314572800 bytes
Fixed Size                  1219160 bytes
Variable Size             130024872 bytes
Database Buffers          180355072 bytes
Redo Buffers                2973696 bytes
Database mounted.

[email protected]>flashback database to timestamp
  2  to_timestamp(‘2014-03-11 15:47:14‘,‘yyyy-mm-dd hh24:mi:ss‘);
Flashback complete.

[email protected]>alter database open read only;                
    //以read only原因:如果数据恢复的不够理想,可以关闭数据库继续进行恢复
Database altered.

[email protected]>select count(*) from tyger.tyger;
  COUNT(*)
----------
         1

[email protected]>select count(*) from tyger.test;
  COUNT(*)
----------
        14

数据恢复不理想,继续进行恢复     ---前提:以redo only打开数据库

[email protected]>startup mount;
ORACLE instance started.

Total System Global Area  314572800 bytes
Fixed Size                  1219160 bytes
Variable Size             130024872 bytes
Database Buffers          180355072 bytes
Redo Buffers                2973696 bytes
Database mounted.

[email protected]>flashback database to timestamp
  2  to_timestamp(‘2014-03-11 15:47:38‘,‘yyyy-mm-dd hh24:mi:ss‘);
Flashback complete.

[email protected]>alter database open read only;
Database altered.

[email protected]>select count(*) from tyger.tyger;
  COUNT(*)
----------
         0

[email protected]>select count(*) from tyger.test;
  COUNT(*)
----------
        14

如果数据恢复确认完成,就可以以resetlogs打开数据库,恢复工作       ------重置日志,不能再flashback至resetlogs之前的时间点

[email protected]>alter database open resetlogs;
Database altered.

时间: 2024-10-29 19:10:42

oracle闪回表详解的相关文章

Oracle闪回技术详解

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

Oracle 闪回表实验

作业:闪回表实验 1.构造测试表flb_test,数据不小于10000行: [email protected]>create table flb_test(id number,dd date); Table created. [email protected]>begin 2  for i in 1..10000 3  loop 4  insert into flb_test values (i,sysdate+i); 5  end loop; 6  end; 7  / PL/SQL proc

MySQL Flashback 闪回功能详解

阅读目录 1. 简介 2. 闪回原理 3. flashback安装 4. 使用简介 5. Flashback工具使用注意点 回到顶部 1. 简介 mysqlbinlog flashback(闪回)用于快速恢复由于误操作丢失的数据.在DBA误操作时,可以把数据库恢复到以前某个时间点(或者说某个binlog的某个pos).比如忘了带where条件的update.delete操作,传统的恢复方式是利用全备+二进制日志前滚进行恢复,相比于传统的全备+增备,flashback显然更为快速.简单. 目前My

oracle中的dual表详解

oracle中的dual表详解 1.DUAL表的用途 Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中 --查看当前连接用户 SQL> select user from dual; USER ------------------------------ SYSTEM --查看当前日期.时间 SQL> select sysdate from dual; SYSDATE ----------- 2007-1-24 1 SQL> sele

Oracle闪回技术之一Oracle 11g 利用FlashTable (闪回表)恢复(用delete)误删的数据

闪回表,实际上就是将表中的数据快速恢复到过去的一个时间点或者系统改变号SCN上.实现表的闪回,需要用到撤销表空间相关的UNDO信息,通过SHOW PARAMETER UNDO命令就可以了解这些信息.用户对表的数据的修改操作,都记录在撤销表空间中,这为表的闪回提供的数据恢复的基础. 修改记录被提交到undo表空间中的默认保留时间为900秒,用户可以在这900秒的时间内对表的进行闪回操作,从而将表中的数据恢复的修改前的状态. 如上图显示的默认900秒,我们通过sql来修改这个默认时间为1200: f

Oracle 闪回特性(FLASHBACK DATABASE)

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

[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下) ——通过知识共享树立个人品牌. 继上六篇: [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程之四:把游标说透(

oracle中imp命令详解 .

oracle中imp命令详解 Oracle的导入实用程序(Import utility)允许从数据库提取数据,并且将数据写入操作系统文件.imp使用的基本格式:imp[username[/password[@service]]],以下例举imp常用用法. 1. 获取帮助 imp help=y 2. 导入一个完整数据库 imp system/manager file=bible_db log=dible_db full=y ignore=y 3. 导入一个或一组指定用户所属的全部表.索引和其他对象

ORACLE PL/SQL编程详解

ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问.由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理.除此之外,可以在ORACLE数据库的某些客户端工具中,使用PL/SQL语言也是该语言的一个特点.本章的主要内容是讨论引入PL/SQL语言的必要性和该语言的