2012 12 12 (109)闪回操作
找回数据库表中误删除的数据
如果数据库中误删除了一个表中的记录,例如删除了一个非常重要的雇员信息,并且该事务已经提交了,如何快速找回误删除的数据呢?
这种情况下可以利用数据库的闪回功能实现找回丢失的数据。具体的说就是行闪回。
行级闪回是指获取先前某个时间点或某个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)闪回操作相关推荐
- oracle10G 错误删除数据或者表 闪回功能帮你忙。。。闪回操作例子
闪回查询 (1).查询闪回 例如: 1)在删除员工smith记录后,希望查询到删除该行记录前的值,则可以查询emp在'2007-02-11 23:34:05'时的数据,查询方法如下: select * ...
- oracle中闪回和回滚,oracle闪回操作详解
Oracle的闪回 oracle中为什么会有闪回呢!它的作用是什么呢?我们来学习一下闪回吧!闪回和回滚异曲同工之妙. 一闪回的介绍 (1)在Oracle的操作工程中,会不可避免地出现操作失误或者用户失 ...
- oracle数据误操作恢复【flashback闪回操作】
几张表的数据全部执行了delete * 操作. 接到问题立刻知道了事件的严重性,立即开始研究解决办法. 了解到数据库是oracle 10G. 经查询可以使用flashback闪回操作进行恢复,这下放心 ...
- ORACLE 各种闪回操作
1.Flashback Database(利用闪回日志恢复) Oracle Flashback Database特性允许通过SQL语句Flashback Database语句,让数据库前滚到当前的前一 ...
- MySQL模拟Oralce闪回操作
在前面的文章中我们介绍了MySQL误操作后数据恢复(update,delete忘加where条件),大 概操作是通过sed命令把binlog中相关SQL误操作给逆向回来,然后导入SQL文件来恢复错误操 ...
- oracle 闪回操作(flashback)
234390216 的留下学习 原文地址 http://haohaoxuexi.iteye.com/blog/1594391 Oracle的闪回功能可以在对数据库进行不完全恢复的情况下,对某一个指定的 ...
- Oracle数据库中的锁,闪回操作(二)
目录 1.锁机制 2.闪回 (1)查询闪回 (2)表闪回 (3)删除闪回 (4)回收站管理 (5)数据库闪回 (6)归档闪回 3.Undo表空间 (1)undo表空间管理的优点 (2)undo表空间管 ...
- oracle中闪回概念,Oracle数据库的闪回操作
通过DELETE删除数据后相当于放入回收站,一般情况下可以找回:通过UPDATE更新数据后数据库也会保留数据快照.闪回就是恢复指定时间的数据快照以达到恢复数据的目的. 根据步骤一查询出数据快照,恢复数 ...
- oracle闪回操作
一.查询指定时间的数据快照 --1.查询执行过SQL语句,确定快照的时间 SELECT R.FIRST_LOAD_TIME,R.SQL_TEXT,R.* FROM V$SQLAREA R WHERE ...
最新文章
- Datatable删除行的Delete和Remove方法介绍
- 关于mysql优化_MYSQL---关于MYSQL优化
- php读取西门子plc_PLC对模拟量信号,是怎么进行处理的?
- 这是我拼命做科研的原因,2018年最感人的一个真实故事
- Java程序员须知的七个日志管理工具
- Python3爬虫实战——QQ空间自动点赞程序(上)
- python xlwt_python使用xlwt编辑excel
- 人工智能(AI)经历了怎样的发展历程?
- excel合并两列内容_Python实战:合并 Excel 表格
- 恶意流量监测开源系统:Maltrail
- MVP2006成都聚会图片
- SpringBoot+Mybatis+Mysql结合微信小程序实现登录
- 数据挖掘——文本挖掘-关键字提取
- e签宝认证服务API PHP请求签名鉴权生成
- C++ 检测程序是否在运行
- 华为鸿蒙系统能玩安卓游戏吗_华为鸿蒙系统出来后安卓游戏账号还能用吗 鸿蒙和安卓游戏数据会互通吗...
- php link rel= icon,link
- 终于收到黑客防线7月份样刊了
- 20200417-SiC+移相全桥文献
- 解决企业邮箱发邮箱数量上限问题
热门文章
- 谷歌X实验室的“无用”发明
- 独家 | 揭秘出行巨头Uber的机器学习平台与团队
- 沉迷游戏自学编程,创建游戏帝国,却黯然退场的“鬼才程序员”
- 任务队列,消息队列和rpc的区别是什么?
- UOJ#179. 线性规划(线性规划)
- vim介绍,vim颜色显示,vim一般模式下移动光标,vim一般模式下的复制、剪切和粘贴...
- java-23种设计模式详解(一)
- VMware中国的“七年之痒”,真的会有大动荡吗?
- android好用的第三方库2018使用总结
- OpenStack 架构图