兰色精灵 发表于 2015-1-16 22:27:07

MSSQL编程:一次"危险"的数据恢...

对于update操作,只需要把event中的旧行和新行值对调即可。恢复|数据
一次"危险"的数据恢复履历
owlbird


原因
头几天笔者被一名当数据库办理员的伴侣叫往,他的一台做数据库的服务器没法启动,弄的他焦头烂额,厥后请人来一看,人家一启齿就要2000,没举措只好找我尝尝。我伴侣的这台数据库的操纵体系是win2000server,选择的数据库是sql2000,他事情单元是个传呼台,这台数据库服务器是专门来存储客户材料的,每半个月将数据文件存进磁带内,而失事那天恰好恰是应备份数据库文件,而我伴侣买了一张D版的光盘筹办在服务上读一读,光盘一放进就主动运转,即刻就主动重启,当体系从头引诱时就提醒以下:NON-SYSTEMDISK,PLEASEINSERTASYSTEMDISK(看来D版真是害人又害己啊),明显就没法引诱体系.

处置
若盘算机不克不及从硬盘启动,则我们能够经由过程软盘启动后,试着会见硬盘。假如不克不及会见硬盘,则多是主引诱区大概可引诱分区的引诱区被损坏了这时候候,我们能够使用DEBUG命令等工具软件检察硬盘的主引诱区是不是一般。我用一张Msdos体系软盘来引诱,进进dos体系后,因为该服务器的主分区是NTFS格局,假如不必第三方软件是没法检察分区信息的,不外我想先用DEBUG命令往看一下MBR(硬盘主引诱纪录),操纵以下:

a:>DEBUG
XXXX:XXXXa100汇编编纂命令指令
XXXX:0100movax,0201读取一个扇区
XXXX:0103movbx,0200读至以后段内存0200处
XXXX:0106movcx,0001柱面号=0,相对扇区数=1
XXXX:0109movdx,80磁头号=0,驱动器号=80
XXXX:010Cint13磁盘读写中止
XXXX:010Eint3断点中止
XXXX:010F回车
XXXX:XXXXg=100实行上述指令
XXXX:XXXXd380显现主分区表内容(Hex:1BEH)


上述命令的详解可参看清华年夜学出书的《IBM-PC汇编言语程序计划》,由沈美明温冬婵编著。我再复杂先容一下主分区表。主分区表位于硬盘主引诱纪录(0柱面0磁头1扇区)的后部.从1BEH字节入手下手,共占用64个字节,包括四个分区表项。每一个分区表项的长度为16个字节,它包括一个分区的引诱标记、体系标记、肇端和开头的柱面号、扇区号、磁头号和天职区后面的扇区数和天职区所占用的扇区数。个中"引诱标记"标明此分区是不是可引诱,便是否举动分区。当引诱标记为"80"时,此分区为举动分区;"体系标记"决意了该分区的范例,如"06"为DOSFAT16分区,"0b"为DOSFAT32分区,"83"为LINUXnative分区等;肇端和开头的柱面号、扇区号、磁头号指了然该分区的肇端和停止地位。)

这一看没关系,一看吓一跳,主分区表内参数被大批的26(HEX)所取代,看来这位病毒打造者是位"38"(26H转化为十进数是38),也真够狠的.而我的伴侣又没有对MBR举行备份,这下可贫苦年夜了。不外,一般硬盘0柱面0磁头2扇区是0柱面0磁头1扇区的备份,每当体系引诱乐成,体系会将0柱面0磁头1扇区的内容复制到0柱面0磁头2扇区,而假如安装了SCCOMMANDER,LILO的引诱软件,将会占用0柱面0磁头2扇区,而将0柱面0磁头1扇区的内容复制到0柱面0磁头3扇区,这是人人必要注重的成绩。因而在没有对MBR举行备份的情形下,查找0柱面0磁头从2扇区入手下手的隐含扇区,寻觅备份的MBR,经由过程未被损坏的分区引诱纪录信息从头创建MBR将是一个很好的办理举措.因而我又做了以下操纵:

a:>DEBUG
XXXX:XXXXa100汇编编纂命令指令
XXXX:0100movax,0201读取一个扇区
XXXX:0103movbx,0200读至以后段内存0200处
XXXX:0106movcx,0002柱面号=0,相对扇区数=2
XXXX:0109movdx,80磁头号=0,驱动器号=80
XXXX:010Cint13磁盘读写中止
XXXX:010Eint3断点中止
XXXX:010F回车
XXXX:XXXXg=100实行上述指令
XXXX:XXXXd380显现备份主分区表内容(Hex:1BEH)


还好,病毒打造者还算有点本心,并没有损坏备份的主分区表的纪录信息,那末我们便可使用备份的MBR的纪录信息来重修主分区表,操纵以下:(注我并未加入Debug)
XXXX:XXXXa100
XXXX:0100movax,0301写一个扇区
XXXX:XXXXa106
XXXX:0106movcx,0001柱面号=0,相对扇区数=1
XXXX:XXXXg=100实行上述指令
再将主分区表修改来看是不是已一般写进:
XXXX:XXXXa100
XXXX:0100movax,0201读取一个扇区
XXXX:XXXXg=100实行上述指令
XXXX:XXXXd380显现主分区表内容(Hex:1BEH)
统统一般。不外为了保险起见,仍是将MBR内容备份到软盘上。操纵以下:
XXXX:XXXXrbx
:00
XXXX:XXXXrcx
:0200设定主分区表的巨细为512字节,bx纪录高位字节,cx纪录低位字节
XXXX:XXXXna:mbr.dat文件定名
XXXX:XXXXw0200将内存地点0200入手下手的内容写进软盘
XXXX:XXXXq加入debug

觉得统统ok,但当从头引诱时仍是提醒以下:NON-SYSTEMDISK,PLEASEINSERTASYSTEMDISK,看来成绩多多。只好将该硬盘取下,接在另外一台装有win2000server,分区为NTFS格局的盘算机上作为从盘。但当我双击该分区时,提醒以下:"不克不及会见D:,$volume破坏且没法读取",看来该病毒来头不小,能在win2000server下间接中止,还能修正MFT,病毒打造者的功力真是不浅。我用chkdsk命令想试一试可否修复$volume,了局提醒我没法修复。看来我要完全恢复这台服务器是不太大概了,那末如今最关头的成绩实践就是恢单数据库文件,这才是我伴侣和我真正体贴的,据我伴侣讲他有两个主要的用户数据库文件,分离定名为client1,client2,因而我们一切的存眷就给了这两个数据库,而这两个数据库又分离由后缀名为mdf的文件(用户数据库的主文件),后缀名为log的文件(用户数据库的日记文件,sql2000的数据库主文件由其对应的日记文件来把持所写的内容).固然,数据恢复的万王之王Recovery是我的最好选择,我用的是RecoverNt版。Recovery利用相称复杂,所要注重的是用Recovery读出的文件不克不及恢复到统一个硬盘上,必需恢复到其他硬盘上。但不幸的是,当我用RecoverNt来读取D分区时,因为MFT破坏,万王之王也没法读出一个文件,重复试了几回仍是不可,只好占时作罢。一回抵家,就下定决计好好专研一下win2000的NTFS格局,我手上有两本书,一本是MCSE制胜宝典WIN2000Server,另有一本是InsideMicrosoftWindows2000,ThirdEdition的中文版Windows2000外部揭密,恰是书到用时方恨少。又到网上到处搜刮有关信息,经由两天的专研,经由勇敢的假想,具体的剖析,做出了一个令我至今还不敢信任的办法。

低潮
我筹办将没法读取的D盘初级格局化(注重是初级格局化而不是低格),然后经由过程RecoverNt来读取文件。为何我要如许做,让我渐渐道来。起首我想讲一讲windows的文件体系道理,尽人皆知windows有FAT12,FAT16,FAT32,NTFS等文件格局,而FAT12,FAT16,FAT32文件格局可看做一类,简称FAT格局,而NTFS文件格局又可看做一类。我复杂先容一下FAT格局的文件体系的数据布局,依据其分歧的特性和感化大抵可分为

1.引诱扇区.
2.DBR区(DOSBOOTRECORD)即操纵体系引诱纪录区的意义.
3.FAT表(FileAlloctionTable)位于DBR以后,一样平常应有两个,个中一个为另外一个的备份,它的主要感化是存储了指向文件地点簇的指针(有关观点我将在会商NTFS文件格局时先容).
4.DIR区(Directory)即文件根目次区。
5.DATA区,望文生义这个区是用户寄存数据的中央,占磁盘空间的尽年夜部分,它才是最关头的中央。

如今我们来谈一谈有关NTFS文件格局的基本常识。在NTFS中,一切存储在卷上的数据都包括在文件中,包含用来定位和猎取文件的数据布局,引诱程序和纪录这个卷的(NTFS元数据)的纪录的位图,这表现了NTFS的准绳:磁盘上的任何事物都为文件。在文件中存储统统使得文件体系很简单定位和保护数据,而在NTFS中,卷中一切寄存的数据均在一个叫MFT的文件纪录数组中,叫主文件表(MasterFileTable),MFT是由初级格局化发生的。而MFT则由文件纪录(FileRecord)数组组成。FileRecord的巨细通常为流动的,不论簇的巨细是几,均为1KB,这个观点相称于Linux中的inode。FileRecord在MFT文件纪录数组中物理上是一连的,且从0入手下手编号。MFT仅供体系自己构造、架构文件体系利用,这在NTFS中称为元数据(Metadata)。以以下出Windows2000的NTFS主文件表的主要的元数据文件

0$MFT
1$MFTMirr
2$LogFile
3$Volume
4$AttrDef
5$Directory
6$Bitmap
7$Boot
8$BadClus
9$Secure
10$UpCase
11$Extend

这些NTFS主文件表的主要的元数据文件都以$(美圆标记)入手下手的名字,但标记是被埋没的,在Windows2000中不克不及利用dir命令(乃至加上/a参数)像一般文件一样列出这些元数据文件。实践上FileSystemDriver(ntfs.sys)保护了一个体系变量NtfsProtectSystemFiles用于埋没这些元数据。可是微软公司供应了一个OEMTOOL,叫NFI.EXE,用此工具能够转储NTFS主文件表的主要的元数据文件(元数据:是存储在卷上撑持文件体系格局办理的数据。它不克不及被使用程序来会见,它只能为体系供应服务),以下是我给出的一个例子:

C:>nfid:

File0
MasterFileTable($Mft)
$STANDARD_INFORMATION(resident)
$FILE_NAME(resident)
$DATA(nonresident)logicalsectors32-21151(0x20-0x529f)
$BITMAP(nonresident)logicalsectors16-19(0x10-0x13)

File1
MasterFileTableMirror($MftMirr)
$STANDARD_INFORMATION(resident)
$FILE_NAME(resident)
$DATA(nonresident)
logicalsectors2048284-2048291(0x1f411c-0x1f4123)
(因为篇幅限定,其他省略)

而这些元数据文件文件是体系驱动程序拆卸卷所必须的,win2000给每一个分区赋盘符其实不暗示该分区包括有win2000能够辨认的文件体系格局,假如一旦主文件表破坏,那末该分区在win2000下是没法读获得,那末为了能使该分区可以在win2000能被辨认,也就必需起首重修win2000能够辨认的文件体系格局即主文件表,这可经由过程初级格局化来该分区来完成。这是你大概会想,假如格局化了分区,那末分区的内容不是全没有了吗?仿佛是如许,当笔者翻开已格局化了的D盘,一无所有.尽人皆知,Windows以簇号来定位文件在磁盘存储的地位,在FAT格局的文件体系有关簇号的指针是包括在FAT表中,而在NTFS中有关簇号的指针是包括$MFT及$MFTMirr文件中(注:$MFTMirr为$MFT的备份,假如$MFT纪录被损坏,NTFS就读取$MFTMirr文件,$MFT及$MFTMirr的数据段地位都存储在引诱扇区中,引诱扇区的正本位于分区的末了)。那末$MFT及$MFTMirr文件已被重修,以是我们的文件也就看不见了,可是实践上这些文件并没有真实的消散,他们还躲在磁盘介质中,而recoverNt不是以文件的簇号来定位文件,它用的是低阶的举措,是经由过程文件把持块(FCB)的磁盘存取体例来读出文件的,这是他拙劣的中央,而不是以文件代号式磁盘存取(这必要扩大功效挪用),因而当我用recoverNt读取D盘上的文件时,花了1个多小时,所需的四个文件都找到了,我将之保留到了c:mdf文件家下。

最初
翻开sql2000企业办理器,选中一个实例,右建点击数据库,选择附加数据库,给出数据文件响应的磁盘地位(注重最好主数据文件和响应的日记文件放在统一目次下),统统ok,伴侣的客户数据又找返来了。


跋文:
1.作为一个数据库办理员要常常备份,不时当心,切忌不要想我的伴侣一样粗心,否则成果不可思议。
2.我这篇文章并非想给出甚么详细的办法,只是想会商一下关于数据恢复的头脑体例。
3.假如病毒的打造者能多为他人想想,而不是图一时之利落索性就行了,把本人的伶俐才干用在邪道上。
4.假如有伴侣对此文有分歧定见,尽请指教。



接洽体例owlbird@163.com
有了数据以后,我们就要想一个比较统一的方法来闪回。上面我们说了对于DML操作,可以通过反向执行所有逆操作来实现,对于语句里面的DDL,只能直接跳过。原因是一个DDL不一定有直接的逆操作。

爱飞 发表于 2015-1-19 13:00:56

对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。

变相怪杰 发表于 2015-1-27 05:32:20

SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.

小魔女 发表于 2015-2-5 02:37:56

XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!)

不帅 发表于 2015-2-11 02:50:00

每天坚持做不一样的是,认真做笔录,定时复习。一个月你就可以有一定的收获。当然如果你想在sql方面有一定的造诣,你少不了需要看很多很多的书籍了。

再见西城 发表于 2015-3-1 19:59:50

多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。

飘灵儿 发表于 2015-3-10 23:07:21

每天坚持做不一样的是,认真做笔录,定时复习。一个月你就可以有一定的收获。当然如果你想在sql方面有一定的造诣,你少不了需要看很多很多的书籍了。

活着的死人 发表于 2015-3-17 16:08:01

多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。

admin 发表于 2015-3-24 10:44:01

我们学到了什么?思考问题的时候从表的角度来思考问
页: [1]
查看完整版本: MSSQL编程:一次"危险"的数据恢...