当前位置:首页 > 开发 > 数据库 > 正文

Oracle-闪回

发表于: 2014-05-25   作者:无量   来源:转载   浏览:
摘要: 工作中对数据库的操作经常有误操作,最近研究学习下了oracle提供的各种闪回功能,总结成笔记 1.闪回删除(表级--drop)     当误drop某张表时,可以进行闪回删除操作,恢复删除这张表之前的状态     flashback table tbinstext to before drop 2.闪回表(行级--inse
工作中对数据库的操作经常有误操作,最近研究学习下了oracle提供的各种闪回功能,总结成笔记
1.闪回删除(表级--drop)
    当误drop某张表时,可以进行闪回删除操作,恢复删除这张表之前的状态

   
flashback table tbinstext to before drop

2.闪回表(行级--insert、update、delete)
(一个时间戳对应一个scn点)
方法一:闪回到scn点处
    当对一个表进行了错误的增删改等操作,可以进行闪回表操作,恢复增删改之前的数据状态
    --1.查询某一时间点的时间戳,对应的SCN码,(SCN系统改变号)

   
select timestamp_to_scn(to_timestamp('2014-05-19 19:46:00','yyyy-mm-dd hh24:mi:ss:ff')) SCN from dual;

    --2.要闪回哪张表,对该表开启行移动,如表tbinstext
   
alter table tbinstext enable row movement;

    --3.执行闪回表操作,恢复表到对应的时间戳状态
   
flashback table tbinstext to scn 23405704;

方法二:直接返回到表在某一个时间戳的状态
--1.要闪回哪张表,对该表开启行移动,如表tbinstext

   
alter table tbinstext enable row movement;

    --2.执行闪回表操作,恢复表到对应的时间戳状态
   
flashback table tbinstext to timestamp to_timestamp('2014-05-19 19:46:00','yyyy-mm-dd hh24:mi:ss:ff');

3.闪回查询
    想要查询某个时间点,某个表中的数据
   
select * from tbinstext as of timestamp to_timestamp('2014-05-24 16:45:00','yyyy-mm-dd hh24:mi:ss') 
      where deal_serial_no='';

4.闪回版本查询
    可以查询两个时间点或两个scn之间的所有行的所有版本
    方法一:查询最大时间戳和最小时间戳之间的所有版本

     
select deal_serial_no,--表tbinstext中的字段
	       			 user_id,       --表tbinstext中的字段
	             versions_operation 操作,
	             versions_starttime 起始时间,
	             versions_endtime   结束时间,
	             versions_xid       事务号
	      from tbinstext versions between timestamp minvalue and maxvalue
	      order by 1;

  方法二:查询两个时间戳之间的所以版本
 
select deal_serial_no,
		           user_id,
		           versions_operation 操作,
		           versions_starttime 起始时间,
		           versions_endtime   结束时间,
		           versions_xid       事务号
		    from tbinstext versions between timestamp to_timestamp('2014-05-25 12:00:00', 'yyyy-mm-dd hh24:mi:ss') 
		                         and to_timestamp('2014-05-25 12:12:00', 'yyyy-mm-dd hh24:mi:ss');

方法三:查询两个scn之间的所有版本
 
select deal_serial_no,
               user_id,
               versions_operation 操作,
               versions_starttime 起始时间,
               versions_endtime   结束时间,
               versions_xid       事务号
        from tbinstext versions between scn 23746725 and 23747089;



5.闪回事务(事务级--transation)
flashback_transaction_query视图,存放了所有事务的操作,可以根据事务id进行闪回事务查询,
得到undo_sql,执行undo_sql,来恢复这个事务造成的更改
--1.进行闪回版本查询,得到要闪回的事务id

select deal_serialno, user_id, versions_operation 操作, versions_starttime 起始时间,
                     versions_endtime 结束时间, versions_xid 事务号
    from tbinstext
    versions between timestamp minvalue and maxvalue order by 事务号;

   
    --2.通过xid,查询flashback_transaction_query,得到undo_sql
select operation,undo_sql
	  from flashback_transaction_query
		where xid='03001E0093250000';

--3.执行获取到的undo_sql,来恢复错误事务造成的更改

6.闪回数据库(数据库级)
--1.用sqlplus登录(以管理员权限登录,只有管理员才有权限闪回数据库)
 
SQL>sqlplus sys/hs123 as sysdba

 
--2.配置闪回数据库(闪回数据库,要在归档模式,独占模式下装载数据库,才能执行闪回)
  --确定实例是否为归档模式
 SQL>archive log list;

  数据库日志模式       非归档模式
  自动存档          禁用
  存档终点          USE_DB_RECOVERY_FILE_DEST
  最早的联机日志序列    1171
  当前的日志序列        1173
 
  --将数据库改为归档模式下运行,设为独占模式启动,并启用闪回功能
  --要先关闭数据库,才能配置闪回数据库配置
 
SQL>shutdown immediate;

  数据库已经关闭
  数据库已经卸载
  ORACLE例程已经关闭
 
  --以mount和exclusive模式启动
 
SQL>startup mount exclusive;

  ORACLE例程已经启动
  Total System Global Area 293601280 bytes
  Fixed Size                 1248600 bytes
  Variable Size             88081064 bytes
  Database Buffers         197132288 bytes
  数据库装载完毕
 
  --改为归档模式
 
SQL>alter database archivelog;

  数据库已经更改
 
  --设置参数DB_FLASHBACK_RETENTION_TARGET为希望的值,改值的单位为分钟
  本例设置为3天,1440*3=4320
 
SQL>alter system set db_flashback_retention_target=4320 scope=both;

  系统已经更改
 
  --启动闪回数据哭
 
SQL>alter database flashback on;

  数据库已更改
 
  --将数据库设置为open状态
 
SQL>alter database open;

  数据库已更改
 
  --查看更改后的参数
 SQL>archive log list;

  数据库日志模式          归档模式
  自动存档             启用
  存档终点            USE_DB_RECOVERY_FILE_DEST
  最早的联机日志序列    1171
  下一个存档日志序列    1173
  当前日志序列          1173
 
 
2.闪回数据库
--关闭数据库
SQL>shutdown immediate


--在mount模式下启动数据库
SQL>startup mount


--使用flashback database命令闪回数据
SQL>flashback database to scn 23752574;

或者
SQL>
flashback database to timestamp to_timestamp('2014-05-25 14:30:00','yyyy-mm-dd hh24:mi:ss');


--用resetlogs选项打开数据库,因为要恢复到当前数据库之前的一个时刻
SQL>alter database open resetlogs;

Oracle-闪回

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
oracle11G闪回flashback oracle9i的闪回: 闪回查询从9i引入,可以按照时间点或者SCN向前查 询,获
闪回可以做的操作有如下几种类型: 1、当数据错误删除,并且提交时(flashback table) 2、当错误删
闪回数据库的特性 Flashback Database 功能非常类似与RMAN的不完全恢复, 它可以把整个数据库回退到
我周边的好多人都不愿意再提闪回的事情了,似乎这件事情已经过去了。他们的做法基于各种心理,不便
我周边的好多人都不愿意再提闪回的事情了,似乎这件事情已经过去了。他们的做法基于各种心理,不便
Flashback的目的 在有Flashback之前,如果你对数据误操作,并已提交,这时想回退该误操作,将会是很
闪回功能在ORACLE中默认是关闭的,需要按照下面的方式开启: Sql>startup mount Sql>alter da
Oracle 10g开始提供了类似windows系统的回收站功能,用户在删除表的时候会不是直接删除,而是移动到
最近研究数据恢复,稍微总结一下,以后继续补充: 数据库 级别:Flashback Database 表级别:Flashb
在安装Oracle软件时建议更改undo_retention参数,建议将默认900的值更改为10800秒,即3小时;alter s
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号