关闭

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

标签: oracle数据还原恢复truncate
2720人阅读 评论(4) 收藏 举报
分类:
文章开始之前,先把重要的事情说三遍,不要随便用‘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 数据库新建表造数据,演示灾难的发生

-- Create table
	create table EMP
	(
	  empno    NUMBER(4) not null,
	  ename    VARCHAR2(10),
	  job      VARCHAR2(9),
	  mgr      NUMBER(4),
	  hiredate DATE,
	  sal      NUMBER(7,2),
	  comm     NUMBER(7,2),
	  deptno   NUMBER(2)
	)


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

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

2.3.1 开始恢复数据

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

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

sqlplus / as sysdba;

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

alter system checkpoint; 

3.执行命令

select d.TS#        ts,
			   d.FILE#      fno,
			   d.FILE#      fno,
			   d.NAME       filename,
			   d.BLOCK_SIZE block_size
		from v$datafile d
		order by ts;


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

select ts#,file# from v$datafile order by ts# ;select name from v$datafile order by ts# ;select BLOCK_SIZE from v$datafile order by ts# ;

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


得到的内容类似:



4.下载安装odu数据库恢复软件ODU

将以上查询结果复制粘贴到control.txt中
control.txt文件中的数据格式为:表空间号 文件号 相对文件号 文件名 块大小 是否大文件表空间
每列之间用空白分隔,可以只需要前四列,即块大小和是否大文件表空间可省略,块大小省略时,数据文件的默认块大小为config.txt中block_size的大小。下面是一个示例的数据:


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

正确运行程序后结果如下:


control.txt粘贴的时候ts#要由小到大的顺序否则会报错
can not get bootstrap$ address from SYSTEM tablespace
正确格式如下:


6.在运行后的界面输入

ODU> unload dict


7.ODU> desc SCOTT.EMP      

PS:(SCOTT:用户名 EMP:表名)



8.ODU> scan extent tablespace 4 

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


9.ODU> dump datafile 4 block 146  

dump数据文件数据块,上面的数字看8命令得到的结果



10.ODU> unload table SCOTT.EMP object 73196

数字73196看第8步命令图



11.此时odu的data目录下会出现三个文件



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



到这一步数据的恢复工作已经做完,最后一步就是将数据导入到数据库中

13.数据导入数据库

网上有很多说直接用CMD进入ODU文件夹的data路径下,然后
sqlldr scott/密码 control=OUD中DATA中的ctl名称.ctl

例如:sqlldr SCOTT/orcl control=ODU_0000074585.ctl
试了很多次,报对象找不到的错误。后来发现是ctl文件的里面写的有问题

解决办法:我在data文件夹下新建了一个load_data.ctl文件(名字随便取),然后将原来的ctl文件的内容拷贝过来

--Generated by ODU,for table ""."ODU_0000073196"
--
OPTIONS(BINDSIZE=8388608,READSIZE=8388608,ERRORS=-1,ROWS=50000)
LOAD DATA
INFILE 'ODU_0000073196.txt' "STR X'0d0a'"
APPEND INTO TABLE "ODU_0000073196"
FIELDS TERMINATED BY X'7c' TRAILING NULLCOLS
(
    "EMPNO" ,
    "ENAME" CHAR(10),
    "JOB" CHAR(9),
    "MGR" ,
    "HIREDATE" DATE "yyyy-mm-dd hh24:mi:ss",
    "SAL" ,
    "COMM" ,
    "DEPTNO" 
)


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

OPTIONS(BINDSIZE=8388608,READSIZE=8388608,ERRORS=-1,ROWS=50000)
LOAD DATA
INFILE 'ODU_0000073196.txt' "STR X'0d0a'"
APPEND INTO TABLE "EMP"
FIELDS TERMINATED BY '|' TRAILING NULLCOLS
(
    "EMPNO" ,
    "ENAME" CHAR(10),
    "JOB" CHAR(9),
    "MGR" ,
    "HIREDATE" DATE "yyyy-mm-dd hh24:mi:ss",
    "SAL" ,
    "COMM" ,
    "DEPTNO" 
)


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

sqlldr scott/tiger control=load_data.ctl
数据库表中数据完全恢复





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

5
0
查看评论

oracle数据库误删数据恢复方法

1、查询过去某指定时间点数据库表中的数据(不需要开启闪回) select * from 表名 AS OF TIMESTAMP TO_TIMESTAMP('2017-05-01','yyyy-mm-dd'); 2、从回收站中还原表(不需要开启闪回) FLASHBA...
  • Wewon_real
  • Wewon_real
  • 2017-07-01 10:44
  • 171

VS2010出现灾难性错误的解决办法

之前本人利用VS2010 在编写一个基于对话框的程序的时候,要在对话框类C….DLG中添加函数,右键点击类向导,此时界面上弹出一个消息框,告知出现灾难性事故,结果是打不开类向导(其他类的向导还是可以打开的)。小编尝试各种解决方法,经过仔细的查找,发现原因在于把资源属性选项卡中把对话框该类的ID 给不...
  • u014028070
  • u014028070
  • 2014-08-01 10:58
  • 1492

VBA 灾难性故障恢复小记(一)

VBA 灾难性故障恢复小记(一)VBA开发的程序脆弱吗?如果你不了解它的运行机制,使用以VBA开发的程序的确是危险的。记得小生很早以前初次接触VBA时就遇到了一个大麻烦,那时用的是WIN98+OFFICE97。虽然过去近十年了,那次的灾难还是记忆犹新。故事是这样展开的。对不起,喝口水。西西....记...
  • tzds7
  • tzds7
  • 2007-08-18 12:46
  • 1058

拒做伸手党:自己动手找资源

最近,A站、B站接连被查,站内大量动漫、影视资源一夜消失,收藏夹一夜变坟场。有网友调侃,不如以后直接上C站看吧(CCTV.com),中美合拍的动画片《哪吒与变形金刚》更是直呼辣眼睛。各大流媒体网站纷纷中枪,那么,在今后观赏抗日神剧的日子里,我们如何找到那些藏在阴暗角落瑟瑟发抖的美剧、动漫呢? ...
  • sinat_33960344
  • sinat_33960344
  • 2017-07-14 18:08
  • 372

Delphi 7编写MySQL的程序用ADO控件出现“灾难性故障”

在ADO Connection控件测试的时候都是测试成功的,实际运行后出现“灾难性故障”的提示。 网上查阅了下原因,是MySQL的ODBC驱动有问题,更换了一个MyODBC-3.51.03.exe,程序就正常了。
  • Cinway
  • Cinway
  • 2012-12-25 12:27
  • 746

java调用ocx出现灾难性故障<属转载>

Exception in thread "main" com.jacob.com.ComFailException: A COM exception has been encountered: At Invoke of: isLogin Description: 灾难性故障 ...
  • hsh860116
  • hsh860116
  • 2014-05-22 12:23
  • 1238

MFC 灾难性故障

某日,修改了一个类的Dialog的name,结果导致了使用类向导直接挂掉,提示灾难性故障。 这个类是使用向导生成的, 解决办法: 类视图,察看属性中Dialog一项中的名字比如IDD_LVtoolxxxx等,这里已经固定好了dialog的名称,所以修改资源视图中的dialog的name后,...
  • SBaini
  • SBaini
  • 2013-05-07 10:48
  • 846

zookeeper学习系列(一)zookeeper简介

1 zookeeper作用。 一个消息进行网络传输,当网络发生故障时,发送方并不知道接收方是否收到消息。发送方唯一能做的就是再次进行连接,并且进行轮询来确定接收方是否已接收信息。zookeeper不能解决局部故障,但是提供了一些工具集,用来建立安全处理局部故障的分布式应用。 2 zookeeper基...
  • fanfan159357
  • fanfan159357
  • 2015-12-01 01:10
  • 298

《复兴之路》第二集:峥嵘岁月 解说词

《复兴之路》是中央电视台第一部全面、系统地梳理中国近现代历史的系列节目。虽然我不是很喜欢看政论片。但是这一部拍的确实很好,尤其是第二集,讲述了革命先烈的奋斗史,就像一部创业史一样,看后确实让人激情澎湃。对比一下我们今天的生活,感觉自己实在没有必要为生活和工作而长吁短叹。 北京天安门已经成为...
  • leixiaohua1020
  • leixiaohua1020
  • 2013-09-22 15:15
  • 2701

【IDE-Visual Studio】灾难性故障(异常来自 HRESULT:0x8000FFFF (E_UNEXPECTED))

故障说明:使用vs2010时,由于文件创建MFC类时,移除文件后重新创建正确的基类,覆盖之前创建的文件造成,在“解决方案资源管理器”点击“cpp”文件弹出该提示。 解决方法:在“解决方案资源管理器”,重命名cpp文件,双击打开后,改回原名即可。
  • chenlu5201314
  • chenlu5201314
  • 2016-09-05 15:44
  • 3138
    个人资料
    • 访问:74750次
    • 积分:1460
    • 等级:
    • 排名:千里之外
    • 原创:61篇
    • 转载:3篇
    • 译文:5篇
    • 评论:15条
    欢迎关注


    博客专栏
    技术交流和分享
    工作邮箱:humf@vip.qq.com
    技术分享和交流QQ群:432135803
    微信公众号
    微信公众号
    分享到: 微信 更多
    2