[置顶] 《伸手系列》第二集-oracle数据库“灾难性”数据恢复-(一)

文章开始之前,先把重要的事情说三遍,不要随便用‘truncate’、不要随便用‘truncate’、不要随便用‘truncate’!!!

可能你觉得它比delete速度快的多,但是你是否真的确定你的数据没删错吗吧,你百分百确定是不要的数据,那么你确定你在执行truncate操作的时候,连的是你的测试库吗天晚上的例子,同事加班加累了在测试库测试的时候,没注意在执行truncate表的时候忘了刚刚还在生产库查数据没切换到测试库,然后。。。不多说了,貌似晚上就没回去。。。

下面直接开始吧,不做太多介绍了,着急的可以看后面的第二点恢复数据(请忽略文章的排版比较槽糕0.0)

一、oracle数据库truncate 、delete与drop区别

相同点:
1.truncate和不带where子句的delete、以及drop都会删除表内的数据。
2.drop、truncate都是DDL语句(我说的对吗己想想),执行后会自动提交。
不同点:
1. truncate 和 delete 只删除数据不删除表的结构(定义)
drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。
2. delete 语句是数据库操作语言(dml),这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。
truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment中,不能回滚,操作不触发 trigger。
3.delete 语句不影响表所占用的 extent,高水线(high watermark)保持原位置不动
drop 语句将表所占用的空间全部释放。
truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage;truncate 会将高水线复位(回到最开始)。
4.速度,一般来说: drop> truncate > delete
5.安全性:小心使用 drop 和 truncate,尤其没有备份的时候.否则哭都来不及
使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.
想删除表,当然用 drop
想保留表而将所有数据删除,如果和事务无关,用truncate即可。如果和事务有关,或者想触发trigger,还是用delete。
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
6.delete是DML语句,不会自动提交。drop/truncate都是DDL语句,执行后会自动提交。
7、TRUNCATE TABLE在功能上与不带WHERE子句的DELETE语句相同:二者均删除表中的全部行。但TRUNCATE TABLE比DELETE速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。 
8、TRUNCATE  TABLE删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用DELETE。如果要删除表定义及其数据,请使用DROP TABLE语句。  
9、对于由FOREIGN KEY约束引用的表,不能使用TRUNCATE TABLE,而应使用不带WHERE子句的DELETE语句。由于TRUNCATE  TABLE不记录在日志中,所以它不能激活触发器。    
10、TRUNCATE TABLE不能用于参与了索引视图的表。  

二、数据恢复

2.1、这里介绍两个工具,我下面的演示就是使用的其中一个工具

ODU–ODU全称为Oracle Database Unloader,是由OracleODU开发的类似于Oracle的DUL(Oracle内部著名的数据库恢复工具)的一款恢复软件,用于直接从Oracle数据库的数据文件中获取表数据。
PRM–ParnassusData Recovery Manager(简称PRM-DUL)是企业级ORACLE数据灾难恢复软件,可直接从Oracle9i,10g,11g,12c的数据库数据文件(datafile)中抽取还原数据表上的数据,而不需要通过ORACLE数据库实例上执行SQL来拯救数据。ParnassusData Recovery Manager是一款基于JAVA开发的绿色软件,无需安装,下载解压后便可直接使用。
这两个工具是我稍微了解的(PS:两个正式版的貌似都收费,所以我这里只是演示,大家有其他工具也可以,原理差不多),下面使用的是ODU在windows上安装的数据库进行的演示。

2.2、CSDN下载地址

我在CSDN上上传了自己用的,大家可以下载,也可以直接去官
ODU-win:http://download.csdn.net/download/qq_22260641/10015160
ODU-linux:http://download.csdn.net/download/qq_22260641/10015166
PRM:http://download.csdn.net/download/qq_22260641/10015171

2.3数据恢复演示

2.3.1 数据库新建表造数据,演示灾难的发生

然后造数据,最后truncate表,(这个表在 上随便找的,里面有14条数据)

PS:不管什么原因造成数据无法恢复,一定要保存数据文件,另外,最好避免灾难的办法是备份数据库

2.3.1 开始恢复数据

1.由于在windows下演示,打开CMD

以sysdba连接数据库 (下面根据自己的补全)

2.获取当前系统最新的数据字典

3.执行命令

由于windows命令窗口,以下这个命令会换行显示,不利于我们复制,所以也可以分成三个语句来执行

用PLSQL Developer以sysdba登录执行上面的命令也可以


得到的内容类似:

5.运行udo.exe (有的需要以管理员运行)

6.在运行后的界面输入

8.ODU> scan extent tablespace 4 

(通过上面的命令发现ts(tablespace)为4)扫描表空间4

10.ODU> unload table SCOTT.EMP object 73196

数字73196看第8步命令图

12.打开ODU_0000073196.txt发现数据已经恢复到这个文件中,14条数据全部都在


修改其中一点点,将TABLE后面修改为表名,以及BY后面修改为TXT文件中的间隔符


,然后在CMD中CD 进入data路径下进行操作

数据库表中数据完全恢复
[置顶]        《伸手系列》第二集-oracle数据库“灾难性”数据恢复-(一)

结束语:请不要随便使用truncate!

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91308 人正在系统学习中 相关资源:【内存遍历工具】Cheat.Engine.V5.4.简体中文版-专业指导文档类…

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2017年9月9日
下一篇 2017年9月9日

相关推荐