有个朋友拿了些mdf文件给我,让我帮忙查找一些数据,mdf大家都知道是sqlserver数据库,只需要attach上,就可以看到所有内容,但是这个文件实在太大了,而且据说表非常多,如果要一个个查看,肯定不现实,弄个存储过程出来,那也要一个个的数据库查找,不是一般的麻烦,而且机器已经很慢了,再安装一个sqlserver也太麻烦了。
琢磨了一下思路:先查出一两条数据,然后直接找个小点的mdf来分析一下数据存储的结构,写个程序来进行十六进制的数据匹配,然后将其附近的数据输出文件,使用文本格式存储十六进制,最后对结果文件进行分析,找个其他的关键字转换成十六进制进行搜索,剩下的就猜猜好了。
先打开最小的mdf文件(因为没安装sqlserver,只好用vs2010打开的),查出其中几条数据,然后直接用ultraedit打开,进行数据分析:
001.png
30 00 1C三个字节是起始字符,后续两个字节是序号,可以看到01,02这样的增长,第一个红框框是第一个关键字位置,第二个红框框是需要查到的一个什么id,00是分隔符,所以故意加了一个X在后面,方便查找,涂白的东西,是第三个关键字。
解释一点:字节高低位是互换的
比如:一个数字:12345678 转换为16进制是BC614E,存进文件就是:4E 61 BC
于是可以使用二进制的方式读出来,比对字节的值是否是4E,61和BC,也就是78,97和188,如果匹配上了,就将其后续的50个字节读出来,存进文件里,写成文本文件。
得到结果后,根据第三个关键字的十六进制的值,找到匹配上的行,然后根据位置,读出第二个关键字来。
注意读出文件的时候要使用缓冲区,如果不用缓冲区,一个个字节的读,一个一百二十多兆的文件就足够处理四五分钟了,启用缓冲区,大概0.8s就够了。
测试了一下,80多G,大概15分钟处理完,凑活用吧。