找回数据库表中误删除的数据

 

如果数据库中误删除了一个表中的记录,例如删除了一个非常重要的雇员信息,并且该事务已经提交了,如何快速找回误删除的数据呢?

这种情况下可以利用数据库的闪回功能实现找回丢失的数据。具体的说就是行闪回。

行级闪回是指获取先前某个时间点或某个SCN值时表的行数据。行级闪回有两种方式,一是闪回到某个时间点,二是闪回到某个SCN号。

实验如下:

首先以SYS用户连接数据库,查询数据库是否开启了闪回功能。

SQL> select flashback_on from v$database;

FLASHBACK_ON

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

NO

SQL>

如果没有开启闪回功能,则需要SHUTDOWN IMMEDIATE数据库,然后将数据库加载到MOUNT状态,使用ALTER DATABASE FLASHBACK ON 开启数据库闪回功能。

还需要设置参数db_flashback_retention_target。实例如下:

SQL> shutdown immediate;

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup mount;

ORACLE 例程已经启动。

Total System Global Area  289406976 bytes

Fixed Size                  1248600 bytes

Variable Size              92275368 bytes

Database Buffers          192937984 bytes

Redo Buffers                2945024 bytes

数据库装载完毕。

SQL> select name,log_mode,open_mode,flashback_on from v$database;

NAME      LOG_MODE     OPEN_MODE  FLASHBACK_ON

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

MYORACLE  ARCHIVELOG   MOUNTED    NO

SQL> alter database flashback on;

数据库已更改。

SQL> alter system set db_flashback_retention_target=3600;

系统已更改。

SQL> alter database open;

数据库已更改。

以SCOTT用户连接数据库,在EMP表中插入一些数据:

SQL> conn scott/tiger;

已连接。

SQL> insert into myemp(empno,ename,job,sal) values(8007,'zhangsan','clerk',3000);

已创建 1 行。

SQL> insert into myemp(empno,ename,job,sal) values(8087,'zhangsan','clerk',3000);

已创建 1 行。

SQL> commit;

提交完成。

SQL> update myemp set ename='maliu' where empno=8087;

已更新 1 行。

SQL> commit;

提交完成。

做一个查询

SQL> select versions_starttime,versions_endtime,versions_xid,versions_operation,ename

2  from myemp

3  versions between timestamp minvalue and maxvalue

4  order by versions_starttime;

VERSIONS_STARTTIME             VERSIONS_ENDTIME               VERSIONS_XID     V ENAME

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

10-10月-08 06.41.55 下午                                      08000E00B7020000 I zhangsan

10-10月-08 06.41.55 下午       10-10月-08 06.42.31 下午       08000E00B7020000 I zhangsan

10-10月-08 06.42.31 下午                                      06002F00B6020000 U maliu

JONES

MARTIN

BLAKE

CLARK

SCOTT

KING

TURNER

ADAMS

VERSIONS_STARTTIME             VERSIONS_ENDTIME               VERSIONS_XID     V ENAME

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

JAMES

FORD

MILLER

WARD

lisi

SMITH

ALLEN

已选择18行。

执行删除操作:

SQL> delete from myemp where empno=8087;

已删除 1 行。

SQL> commit;

提交完成。

执行查询可以看到:

SQL> select versions_starttime,versions_endtime,versions_xid,versions_operation,ename

2  from myemp

3  versions between timestamp minvalue and maxvalue

4  order by versions_starttime;

执行查询可以看到如下结果:

在这个查询中可以看到一些非常重要的信息,显示了对表所执行的操作。VERSIONS_STARTTIME列、VERSIONS_ENDTIME列、VERSIONS_XID列等等都是伪列,其中V列表示对表做了什么操作(I表示INSERT、U表示UPDATE、D表示DELETE);VERSIONS_XID列显示了更改事务标识符。有关该事务的更多信息可以在视图FLASHBACK_TRANSACTION_QUERY中进行查询。

SQL> select undo_sql from flashback_transaction_query

2  where xid='07002C00BA020000';

UNDO_SQL

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

Insert into "SCOTT"."MYEMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('8087','maliu','clerk',NULL,NULL,'3000',NULL,NULL);

经过查询,可以看到被删除的行在插入时的语句,这样就可以使用这个语句进行恢复数据了。

flashback_transaction_query视图包含了一些非常重要的信息,例如提交操作的时间标记和SCN、查询开始时的SCN、时间标记以及其他一些信息等。可以通过查看这个视图的结构获得更多的详细信息。

SQL> desc flashback_transaction_query;

名称

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

XID

START_SCN

START_TIMESTAMP

COMMIT_SCN

COMMIT_TIMESTAMP

LOGON_USER

UNDO_CHANGE#

OPERATION

TABLE_NAME

TABLE_OWNER

ROW_ID

UNDO_SQL

最后需要注意的问题:

对表数据更新一段时间后,只有在初始化参数UNDO_RETENTION设置的时间内才可以查询到表的数据更改记录。而且,只有初始化参数UNDO_MANAGEMENT设置为AUTO后才能使用闪回查询。

SQL> conn / as sysdba;

已连接。

SQL> show parameter UNDO_RETENTION;

NAME                                 TYPE        VALUE

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

undo_retention                       integer     900

SQL> show parameter UNDO_MANAGEMENT;

NAME                                 TYPE        VALUE

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

undo_management                      string      AUTO

SQL>

转载于:https://blog.51cto.com/jintengfei/1087201

2012 12 12 (109)闪回操作相关推荐

  1. oracle10G 错误删除数据或者表 闪回功能帮你忙。。。闪回操作例子

    闪回查询 (1).查询闪回 例如: 1)在删除员工smith记录后,希望查询到删除该行记录前的值,则可以查询emp在'2007-02-11 23:34:05'时的数据,查询方法如下: select * ...

  2. oracle中闪回和回滚,oracle闪回操作详解

    Oracle的闪回 oracle中为什么会有闪回呢!它的作用是什么呢?我们来学习一下闪回吧!闪回和回滚异曲同工之妙. 一闪回的介绍 (1)在Oracle的操作工程中,会不可避免地出现操作失误或者用户失 ...

  3. oracle数据误操作恢复【flashback闪回操作】

    几张表的数据全部执行了delete * 操作. 接到问题立刻知道了事件的严重性,立即开始研究解决办法. 了解到数据库是oracle 10G. 经查询可以使用flashback闪回操作进行恢复,这下放心 ...

  4. ORACLE 各种闪回操作

    1.Flashback Database(利用闪回日志恢复) Oracle Flashback Database特性允许通过SQL语句Flashback Database语句,让数据库前滚到当前的前一 ...

  5. MySQL模拟Oralce闪回操作

    在前面的文章中我们介绍了MySQL误操作后数据恢复(update,delete忘加where条件),大 概操作是通过sed命令把binlog中相关SQL误操作给逆向回来,然后导入SQL文件来恢复错误操 ...

  6. oracle 闪回操作(flashback)

    234390216 的留下学习 原文地址 http://haohaoxuexi.iteye.com/blog/1594391 Oracle的闪回功能可以在对数据库进行不完全恢复的情况下,对某一个指定的 ...

  7. Oracle数据库中的锁,闪回操作(二)

    目录 1.锁机制 2.闪回 (1)查询闪回 (2)表闪回 (3)删除闪回 (4)回收站管理 (5)数据库闪回 (6)归档闪回 3.Undo表空间 (1)undo表空间管理的优点 (2)undo表空间管 ...

  8. oracle中闪回概念,Oracle数据库的闪回操作

    通过DELETE删除数据后相当于放入回收站,一般情况下可以找回:通过UPDATE更新数据后数据库也会保留数据快照.闪回就是恢复指定时间的数据快照以达到恢复数据的目的. 根据步骤一查询出数据快照,恢复数 ...

  9. oracle闪回操作

    一.查询指定时间的数据快照 --1.查询执行过SQL语句,确定快照的时间 SELECT R.FIRST_LOAD_TIME,R.SQL_TEXT,R.* FROM V$SQLAREA R  WHERE ...

最新文章

  1. Datatable删除行的Delete和Remove方法介绍
  2. 关于mysql优化_MYSQL---关于MYSQL优化
  3. php读取西门子plc_PLC对模拟量信号,是怎么进行处理的?
  4. 这是我拼命做科研的原因,2018年最感人的一个真实故事
  5. Java程序员须知的七个日志管理工具
  6. Python3爬虫实战——QQ空间自动点赞程序(上)
  7. python xlwt_python使用xlwt编辑excel
  8. 人工智能(AI)经历了怎样的发展历程?
  9. excel合并两列内容_Python实战:合并 Excel 表格
  10. 恶意流量监测开源系统:Maltrail
  11. MVP2006成都聚会图片
  12. SpringBoot+Mybatis+Mysql结合微信小程序实现登录
  13. 数据挖掘——文本挖掘-关键字提取
  14. e签宝认证服务API PHP请求签名鉴权生成
  15. C++ 检测程序是否在运行
  16. 华为鸿蒙系统能玩安卓游戏吗_华为鸿蒙系统出来后安卓游戏账号还能用吗 鸿蒙和安卓游戏数据会互通吗...
  17. php link rel= icon,link
  18. 终于收到黑客防线7月份样刊了
  19. 20200417-SiC+移相全桥文献
  20. 解决企业邮箱发邮箱数量上限问题

热门文章

  1. 谷歌X实验室的“无用”发明
  2. 独家 | 揭秘出行巨头Uber的机器学习平台与团队
  3. 沉迷游戏自学编程,创建游戏帝国,却黯然退场的“鬼才程序员”
  4. 任务队列,消息队列和rpc的区别是什么?
  5. UOJ#179. 线性规划(线性规划)
  6. vim介绍,vim颜色显示,vim一般模式下移动光标,vim一般模式下的复制、剪切和粘贴...
  7. java-23种设计模式详解(一)
  8. VMware中国的“七年之痒”,真的会有大动荡吗?
  9. android好用的第三方库2018使用总结
  10. OpenStack 架构图