日期:2014-05-20  浏览次数:20905 次

[攒分贴]用c#读取并分析sql2005日志
sqlserver数据被误删,可以用LogExplorer恢复。
用过他的朋友都会被他强悍的功能吸引,我写过一篇详细的操作文档可以参考
http://blog.csdn.net/jinjazz/archive/2008/05/19/2459692.aspx

我们可以自己用开发工具来实现sql日志的读取,这个应用还是很酷的,具体思路

1、首先要了解一个没有公开的系统函数::fn_dblog,他可以读取sql日志,并返回二进制的行数据
2、然后要了解sql的二进制数据是如何存储的,这个可以参考我的blog文章
http://blog.csdn.net/jinjazz/archive/2008/08/07/2783872.aspx
3、用自己擅长的开发工具来分析数据,得到我们需要的信息

我用c#写了一个测试样例,分析了int,char,datetime和varchar的日志情况而且没有考虑null和空字符串的保存,希望感兴趣的朋友能和我一起交流打造属于自己的日志分析工具。

我现在能够实现如下效果:

SQL code
use master
go
create database dbLogTest
go
use  dbLogTest
go
create table log_test(id int ,code char(10),name varchar(20),date datetime,memo varchar(100))
insert into log_test select 100, 'id001','jinjazz',getdate(),'剪刀'
insert into log_test select 65549,'id002','游客',getdate()-1,'这家伙很懒,没有设置昵称'
insert into log_test select -999,'id003','这家伙来自火星',getdate()-1000,'a'

delete from log_test

--use master 
--go
--drop database dbLogTest
 


通过代码输出:

BatchFile code
# 数据对象dbo.log_test的LOP_INSERT_ROWS操作:
# id = 100
# code = id001
# name = jinjazz
# date = 2008-8-7 18:14:03
# memo = 剪刀
#
# 数据对象dbo.log_test的LOP_INSERT_ROWS操作:
# id = 65549
# code = id002
# name = 游客
# date = 2008-8-6 18:14:03
# memo = 这家伙很懒,没有设置昵称
#
# 数据对象dbo.log_test的LOP_INSERT_ROWS操作:
# id = -999
# code = id003
# name = 这家伙来自火星
# date = 2005-11-11 18:14:03
# memo = a
#
# 数据对象dbo.log_test的LOP_DELETE_ROWS操作:
# id = 100
# code = id001
# name = jinjazz
# date = 2008-8-7 18:14:03
# memo = 剪刀
#
# 数据对象dbo.log_test的LOP_DELETE_ROWS操作:
# id = 65549
# code = id002
# name = 游客
# date = 2008-8-6 18:14:03
# memo = 这家伙很懒,没有设置昵称
#
# 数据对象dbo.log_test的LOP_DELETE_ROWS操作:
# id = -999
# code = id003
# name = 这家伙来自火星
# date = 2005-11-11 18:14:03
# memo = a
#
# ************************日志分析完成


代码和步骤比较长,参考我的blog文章

http://blog.csdn.net/jinjazz/archive/2008/08/07/2783909.aspx



------解决方案--------------------
mark