数据改动丢失,数据库莫名其妙回滚问题

sun1976 2008-07-16 09:16:11
sqlserver2000数据改动忽然消失,有人知道什么原因,如何解决吗
通过查询分析其执行的sql,向一个表(表上无触发器)做了如下操作
1删除了acctrule='01'的数据delete from xxx where acctrule='01'
2从备份库相同表取acctrule='01'的数据写回去,insert into xxx select * from xxx_bak..xxx where acctrule='01'

执行后从客户端程序检查,查询结果已经看到改变后的数据列表

在保证没有任何人删除数据的情况下(就我和邻座同事连着这个数据库,我用sqlserver查询分析器,同事客户端程序,程序我们自己写的,没有删除操作,而且保证只做了查询一个动作)
刚刚执行的sql结果新加的几行数据消失,数据库恢复到了删除和insert 都没执行前的状态
我的数据库有7个调度作业,每天下班前做一个备份
没有设置这些自动备份前没遇到过此类问题

请专家帮忙分析下可能是什么原因造成的,及如何解决
谢谢
...全文
338 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hery2002 2008-07-18
  • 打赏
  • 举报
回复
是否可以做个一段时间的Monitor,
的确,这种非常规性的问题,
很难track的.
zjcxc 2008-07-18
  • 打赏
  • 举报
回复
如果这个问题只发生过一次, 那可能没有办法查原因

但如果时而有发生, 跟踪是可以跟踪到原因的
tianhuo_soft 2008-07-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sun1976 的回复:]
问题是这个问题无法人为重现,所以没的跟踪啊
[/Quote]

在触发器里面设置 如果遇到这种情况

写入事件
sun1976 2008-07-17
  • 打赏
  • 举报
回复
问题是这个问题无法人为重现,所以没的跟踪啊
zjcxc 2008-07-17
  • 打赏
  • 举报
回复
事件探查器跟踪一下就知道是怎么回事了
mylgken 2008-07-17
  • 打赏
  • 举报
回复
从备份库相同表取acctrule='01'的数据写回去,insert into xxx select * from xxx_bak..xxx where acctrule='01'
缺 commit
mylgken 2008-07-17
  • 打赏
  • 举报
回复
是不是没有"提交事务"
yesyesyes 2008-07-17
  • 打赏
  • 举报
回复
同事和你同时使用?
同事的程序锁定了表?
sun1976 2008-07-17
  • 打赏
  • 举报
回复
再顶,定到有人能解决为止
昵称被占用了 2008-07-16
  • 打赏
  • 举报
回复
如果是个老问题,一针见血指出你的问题是很难的,提供个思路吧:

sql server事务有种我们很少用的方式,叫做隐性事务,在隐性事务状态下,打开事务是自动的,但是提交事务需要写语句,在这种状态下,如果没有写提交和回滚事务的语句,那它的应用程序退出的时候会自动回滚事务,可能出现你说的现象。但是有个前提,你的程序的查询时设置的隔离级别应该是很低的,才能在其他客户端查到暂时的信息
sun1976 2008-07-16
  • 打赏
  • 举报
回复
类似问题在一家用户处也出现过一次,他写的数据第二天开机(服务器是不关机的)再看没有了
我当时也是怀疑他是否真的保存了
或者是否有人恢复过数据库
他也说没有,然后我只能说再发现这个问题不要做任何操作直接叫我过去,结果到现在没有再出现过
sun1976 2008-07-16
  • 打赏
  • 举报
回复
谢谢各位!
完美行动:
发表于:2008-07-16 11:03:492楼 得分:0
sql server profiler去跟踪。
没有用过,能具体一点吗?
另外这个问题是随机出现的,也就是说是不可再现的,我无法认为触发这个问题,所以不知道如何跟踪

海阔天空
8成是误报,给你几个提示
1、sqlserver查询分析器查询的sql用 select * from xxx where acctrule='01' ,而不要用select * from xxx,别太相信自己的眼睛
2、确认select * from xxx_bak..xxx where acctrule='01' 有数据
1
误报是不会的,我们的客户程序是pb写的带过滤条件的数据窗口,肯定带了where acctrule='01'
而且我有个习惯就是删除前使用带相同where的select语句先检查是否真的要删这些数据,写入后也同样的where条件在目标表查询检查,不会是误报的
2
select * from xxx_bak..xxx where acctrule='01' 确实有数据,原来40条,删除重新写入会59条,后来莫名其妙的自己回到了40条
昵称被占用了 2008-07-16
  • 打赏
  • 举报
回复
8成是误报,给你几个提示
1、sqlserver查询分析器查询的sql用 select * from xxx where acctrule='01' ,而不要用select * from xxx,别太相信自己的眼睛
2、确认select * from xxx_bak..xxx where acctrule='01' 有数据





hery2002 2008-07-16
  • 打赏
  • 举报
回复
可不可能是备份的时候会回滚当前没有提交的事务?
偶乱说的,
没有理论依据支持,
等高手 :)
nzperfect 2008-07-16
  • 打赏
  • 举报
回复
sql server profiler去跟踪。
sun1976 2008-07-16
  • 打赏
  • 举报
回复
自己顶,请兄弟们帮忙顶起
hery2002 2008-07-16
  • 打赏
  • 举报
回复
这个问题好像之前有人提过,
是个POS机的案例,
当时也是没有好的处理方式.
能否查查日志?
使用log explorer检查一下那一段时间内做过些什么动作?

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧