`
together
  • 浏览: 219235 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

曾经发生在身边开发过程中的灵异事件

阅读更多
  这些年的开发过程中,稀奇古怪的问题没少遇到。所谓常在河边走,早晚遇见鬼。
  举几个例子,当年用IP卡打电话太多太勤,竟然有好几次在打完电话之后,发现卡上的余额一点没少!肯定是电信的计费系统有问题,哼哼,被他们剥削了这么久,占他们一点便宜也心安理得!听说现在经常还有个人银行卡莫名其妙多钱少钱的事情,觉得银行的系统也不过尔尔。

分享几个我曾经遇到的几个怪问题,比较有难度和迷惑性。可有同道也遇到过类似的奇怪问题?
动用你智慧的大脑,先分析一下这几个事件的原因。稍后我会给出最终的解决方式,但不一定是正确的和最好的。集思广议先。
问题一、客户无法登录系统
  貌似,这不能称得上是一个问题吧?按常理,无法登录,那肯定server端出问题了,或者是程序,或者是数据库。再不济,也是客户自己的原因。
  话说在2002年的某一天,公司网站(apache+php)出现了全国约一半的用户无法登录的情况,输完用户名和密码就报“该页无法显示”(恨人啊,你要再说得详细点也好),但是在我们公司内部,是可以正常登录的。不能登录的用户分布在全国各个地区,但不解的是,在同一个地区,竟然也有部分用户能登录部分不能登录的情况。这是怎么回事?大家都是一头雾水。要说server端有问题吧,又有一半的用户能登录。要说那一半不能登录的用户客户端或网络的问题吧,可是他们的情况不一,分散全国各地,怎么会这么巧合呢?再说B/S结构,客户就是只需要浏览器的嘛。
  亲自到北京的一个客户那里去,在他们的电脑上试了一下,还真是报这样的错误(试着登录了几十次,竟然有一次还登录成功了,怪)。
  why??

问题二、数据库事务部分失效
  一个系统中有一个数据导入的模块,一直运行得很正常很正常。突然有一天,客户反映最近有一部分数据经常丢失,导不进去。甚为惊讶,不应该啊,我们是开启了事务的,要导就全导进去,或者全部无法导入,怎么会出现只导入一部分数据的情况呢?而且,把数据拿到我们这边的测试环境中,一点问题也没有啊。只好亲自到客户那边,自己一试,还真是会少一部分数据。而且每次少的数量都不一样,就是没有一次全部导入的!
  检查代码,事务开启/执行sql/提交/回滚,没问题。
  在运行过程中跟踪每一条导入数据的sql语句,没有发现哪一条sql报错。最后也正常执行了commit。
  把所有的sql打印出来,统一放到sql客户端去手工执行,数据全部导入,一条不少!
  代码也没问题,sql也没问题,事务也没问题,那问题还是出现了,why??
  [数据库是sqlserver2000]

问题三、系统的查询统计速度极慢
  一个决策支持系统,主要做统计分析,数据量虽然很大(10几个G),但运行得一直很稳定,速度也还不错。但突然有一天,客户反映统计分析的速度变得极慢,慢到无法使用。
  到现场,代码没问题,并且一直没动过。那就处理数据库吧,重建索引,不行;重新部署安装环境,不行;重新安装sql server,不行。
  把统计分析的代码取出来,到sql客户端执行,速度挺快的嘛!为什么同样的代码,在程序里执行就那么慢呢?
  why??
  [数据库是sqlserver2000]

问题四、表单信息无法提交
  由于客户众多(几万家),所以报的错也是五花八门。
  有一个表单提交(post),有很多小数据项,大概有三四十项的数据吧。提交后台保存,一般都没什么问题。但是就是有几个客户反映,他们一提交,后台程序就报错(前台javascript并没报错),提示他们要先输入数据。我们这边做测试,填入和客户一模一样的数据,不报错啊!怎么回事?
分享到:
评论
41 楼 mayu 2006-10-30  
估计你们的测试没有完全走通吧?
40 楼 LucasLee 2006-10-30  
猜测可以,但不要把不确定的结论当作确定的来说。
否则容易误导别人。
39 楼 together 2006-10-30  
jobs 写道
问题三是游标的问题。如果你是喜欢动手的人,肯定知道如何解决,否则就不要管了 
好多人对这个问题乱猜啊,一看就知道缺少SQL Server应用经验,否则是不会不知道的或者没遇到过的。包括我挺佩服的ajoo,趁这个机会BS一下你

我本人不是专业DBA,所以没有做过深入的数据库研究。另外本公司的DBA水平也不太强。

想到点什么,顺便再补充一点,由于这个系统主要的工作是统计分析,因此在应用中用到了大量的临时表操作,临时表在统计结束后,会被删除。那是否会是由于经常创建和drop临时表,而导致的opencursor问题呢?
PS:临时表的空间都不会大,主要作用是提高运算速度。
38 楼 ajoo 2006-10-29  
jobs 写道
问题三是游标的问题。如果你是喜欢动手的人,肯定知道如何解决,否则就不要管了 

好多人对这个问题乱猜啊,一看就知道缺少SQL Server应用经验,否则是不会不知道的或者没遇到过的。包括我挺佩服的ajoo,趁这个机会BS一下你

我还真是没有完全弄明白这是怎么回事.cursor也是有可能的,反正app发过来得都是opencursor的命令.

我能确信的就两点:
1.app过来的query plan确实很傻.
2.重建统计就解决了问题.

jobs知道这个问题的答案,何不分享出来?功德无量地!(btw, 我还是有sql server的使用经验地.google group也查了,没找到答案.于是也只知道乱猜)
37 楼 together 2006-10-28  
wzgme 写道
sql server 的数据库文件按固定值 比如100M增长,根据实际数据调整不要太大,不要用默认百分比。

sorry,我没说清楚。这个库是基本上不增长的,都是一些基础数据,数据量基本上不变。它只是经常参与其它数据库的统计分析操作。
36 楼 wzgme 2006-10-28  
sql server 的数据库文件按固定值 比如100M增长,根据实际数据调整不要太大,不要用默认百分比。
35 楼 together 2006-10-28  
ajoo 写道
3我是遇到过的。而且不止一次。最后的解决方法:
1。sql profiler里面有一个记录query plan的功能,把它打开
2。看query plan,发现从application发过来的query使用的plan非常傻。
3。估计可能是application的driver影响或者是ansi_sql, ansi_null, quoted_identifier之类的古怪参数的不同导致的app和query analyzer的区别。
4。每天都重建stats,bingo。

嗯,多谢。我们的这个系统,是一年左右就出现一次这样的问题。快到时间了又。等下次按你说的来试试。
34 楼 ajoo 2006-10-28  
3我是遇到过的。而且不止一次。最后的解决方法:
1。sql profiler里面有一个记录query plan的功能,把它打开
2。看query plan,发现从application发过来的query使用的plan非常傻。
3。估计可能是application的driver影响或者是ansi_sql, ansi_null, quoted_identifier之类的古怪参数的不同导致的app和query analyzer的区别。
4。每天都重建stats,bingo。
33 楼 jasonhsu 2006-10-27  
together 写道
欢迎大家继续提供案例和解决方式。
三、系统的查询统计速度极慢
解决方式:创建一个新的数据库,将原库中所有数据导入到新库中。使用新的数据库,查询速度恢复正常。
分析原因:磁盘性能问题,也属于sqlserver自己的问题。
sqlserver数据库,和oracle/db2不同,每一个库中的所有数据,全部保存在mdf/ldf这两个文件中,创建一个新的数据库,将在磁盘上划分一块新的空间,供新库使用。这个新的空间在最初的时候,磁盘性能是不错的。但在经常进行OLAP一段时间之后,数据库内部的检索以及和其它数据库的关联查询性能,可能会大幅降低。具体原因,可能需要去问微软的专家了。

总结一句话:sqlserver真的是不堪大用。它有优点,易用、方便。但在事务完整性上的拙劣表现,让它无法胜任关键业务。

以上全部为事实描述,希望有人可以从中,分析出更具体准确的原因来。
不过以上错误,可能很难重现。把这几个问题解决的过程中,已经把思维发散到了极限。


有没有考虑过数据文件被感染病毒的可能性。WORD文件也会出这样的问题,呵呵。
32 楼 ddandyy 2006-10-27  
2我们遇到过 循环更新的时候  突然数据库连接就断掉  同样的数据我们这边没问题  客户那边就有问题   因为无法去现场 所以我们就加了一些DEBUG给客户  后来客户就没回音了  不知道他们怎么处理的

3我估计是数据库文件里面的结构乱掉了  类似磁盘碎片那种东西吧
31 楼 LucasLee 2006-10-27  
together 写道


批评得对!

欢迎大家发表意见


together老兄的态度很正么!共勉共勉
30 楼 together 2006-10-27  
Lucas Lee 写道
together 写道
Lucas Lee 写道
对于2,我猜可能在sqlserver驱动中有某种参数可以设置?或者换用JTDS或SQLSERVER最新的官方驱动试试?改代码的方式实在不太好,特别是改成一个大SQL的方式。

其实 原来的代码,运行了很久,都是正常的。所以,代码、驱动、数据库都没问题。但问题还是出现了,所以我也只能怀疑是sqlserver的事务处理机制有问题。可能出现这种问题的机率很小吧,或者是在某种特定条件下(诸如服务器硬件、操作系统、其它软件的影响)下,才会出现 。


运行了很久都正常不代表他们就没有隐藏的bug,这不是一回事,你不能由此就只怀疑SQLServer一个地方,所有相关的链条都应该怀疑。

together 写道

引用
对于3,我觉得更奇怪了。明明用SQL客户端是可以正常查询出来的,为什么你就认为是旧的数据库的磁盘性能问题呢?不明白

我到现在也在疑惑呢。我怀疑是磁盘性能的原因,就是因为我新建一个库并把原有数据导入后,它就一切正常了。而在原库基础上,不论你怎么折腾,它就是慢。而且把原有的两个库文件,挪到其它分区,速度一样的慢。

要说真正的原因,估计都是一头雾水。



所以,你搞定了这个问题,这很好;但看来还没有找到根源,这也许不是很重要;唯一我觉得不太好的地方是,不该由此总结出一个不成熟的结论,应该记住解决方案、对猜测的部分仍然保持怀疑。


批评得对!

欢迎大家发表意见
29 楼 LucasLee 2006-10-27  
together 写道
Lucas Lee 写道
对于2,我猜可能在sqlserver驱动中有某种参数可以设置?或者换用JTDS或SQLSERVER最新的官方驱动试试?改代码的方式实在不太好,特别是改成一个大SQL的方式。

其实 原来的代码,运行了很久,都是正常的。所以,代码、驱动、数据库都没问题。但问题还是出现了,所以我也只能怀疑是sqlserver的事务处理机制有问题。可能出现这种问题的机率很小吧,或者是在某种特定条件下(诸如服务器硬件、操作系统、其它软件的影响)下,才会出现 。


运行了很久都正常不代表他们就没有隐藏的bug,这不是一回事,你不能由此就只怀疑SQLServer一个地方,所有相关的链条都应该怀疑。

together 写道

引用
对于3,我觉得更奇怪了。明明用SQL客户端是可以正常查询出来的,为什么你就认为是旧的数据库的磁盘性能问题呢?不明白

我到现在也在疑惑呢。我怀疑是磁盘性能的原因,就是因为我新建一个库并把原有数据导入后,它就一切正常了。而在原库基础上,不论你怎么折腾,它就是慢。而且把原有的两个库文件,挪到其它分区,速度一样的慢。

要说真正的原因,估计都是一头雾水。



所以,你搞定了这个问题,这很好;但看来还没有找到根源,这也许不是很重要;唯一我觉得不太好的地方是,不该由此总结出一个不成熟的结论,应该记住解决方案、对猜测的部分仍然保持怀疑。
28 楼 LucasLee 2006-10-27  
together 写道

原因在哪里?个人分析,这两种杀毒软件都有自动更新功能,在某个版本升级之后,可能启动了额外的防火墙机制,将提交数据大于多少K的请求给屏蔽掉。由于我们的表单中数据项比较多,因此一次提交的请求中会有约几K的数据,可能会被杀毒软件屏蔽,造成数据无法提交。国外的norton/mcafee/kapasky,都没有这样的问题


是的,现在网络环境乱了,B/S想要零客户端维护是不可能了,那些流氓软件、杀毒软件、防火墙什么玩意的,都可能是你的麻烦。
27 楼 Feiing 2006-10-27  
为啥把杀毒写成杀素 ? 看了挺别扭
26 楼 together 2006-10-27  
再补一个:
由于客户众多(几万家),所以报的错也是五花八门。
有一个表单提交(post),有很多小数据项,大概有三四十项的数据吧。提交后台保存,一般都没什么问题。但是就是有几个客户反映,他们一提交,后台程序就报错(前台javascript并没报错),提示他们要先输入数据。

我们这边做测试,填入和客户一模一样的数据,不报错啊!由于这样的客户较少,也找不出原因来,关键是无法重现这种错误!


N久以后,才终于知道为什么。再碰到类似的问题,客服就问对方:“请问您是否安装了瑞星或者金山毒霸?”,对方回答是。客服:“请您把它卸载之后再试试”。乖的客户就听话,卸载,没问题。有比较刁的客户,就死活不干,那意思就咬定是我们的系统的问题了,人家那么有名的杀毒软件,而且以前也用它们来杀毒,都没问题,怎么现在会有问题呢???

原因在哪里?个人分析,这两种杀毒软件都有自动更新功能,在某个版本升级之后,可能启动了额外的防火墙机制,将提交数据大于多少K的请求给屏蔽掉。由于我们的表单中数据项比较多,因此一次提交的请求中会有约几K的数据,可能会被杀毒软件屏蔽,造成数据无法提交。国外的norton/mcafee/kapasky,都没有这样的问题

微软的windows2003server,就搞了一个这么东西,IIS6默认的上传文件最大为200K,这够干什么的啊?结果大家只好都去改配置文件。他也不事先告诉你,幸好这世界上有一个google。国内的这几个杀毒厂家,好的不跟人学,专门学这些偷偷摸摸的东西,厉害一点搞得你连网都上不了。曾经有一个大客户报告说我们的系统死活都用不了了,结果现场一看,人家刚装了一个金山网镖,会自动屏蔽所有非IE发出的对外的HTTP请求。
25 楼 together 2006-10-27  
Lucas Lee 写道
对于2,我猜可能在sqlserver驱动中有某种参数可以设置?或者换用JTDS或SQLSERVER最新的官方驱动试试?改代码的方式实在不太好,特别是改成一个大SQL的方式。

其实 原来的代码,运行了很久,都是正常的。所以,代码、驱动、数据库都没问题。但问题还是出现了,所以我也只能怀疑是sqlserver的事务处理机制有问题。可能出现这种问题的机率很小吧,或者是在某种特定条件下(诸如服务器硬件、操作系统、其它软件的影响)下,才会出现 。

引用
对于3,我觉得更奇怪了。明明用SQL客户端是可以正常查询出来的,为什么你就认为是旧的数据库的磁盘性能问题呢?不明白

我到现在也在疑惑呢。我怀疑是磁盘性能的原因,就是因为我新建一个库并把原有数据导入后,它就一切正常了。而在原库基础上,不论你怎么折腾,它就是慢。而且把原有的两个库文件,挪到其它分区,速度一样的慢。

要说真正的原因,估计都是一头雾水。
24 楼 LucasLee 2006-10-27  
我看你的解决方式也够诡异的...赫赫
虽然可能不需要这么做,或者说有更好的方式;但不过不管怎么样,绕也绕过去了,实际工作中能到这个地步也不容易了。

对于2,我猜可能在sqlserver驱动中有某种参数可以设置?或者换用JTDS或SQLSERVER最新的官方驱动试试?改代码的方式实在不太好,特别是改成一个大SQL的方式。

对于3,我觉得更奇怪了。明明用SQL客户端是可以正常查询出来的,为什么你就认为是旧的数据库的磁盘性能问题呢?不明白
23 楼 together 2006-10-27  
欢迎大家继续提供案例和解决方式。
现在解释一下最初三个问题的解决方法:
一、客户无法登录系统
解决方法:清空存放php session的目录
分析原因:个人猜测这与php的session处理机制有关系。它的session会统一放在一个文件夹中,每个session对应一个文件。session失效后文件也会删除。

有可能是php的session有部分记忆功能,在session中会记录用户的IP地址,当某些IP段的用户来访问时,可能造成session管理混乱,导致无法创建正确的session文件。
这个原因我说不太具体,但是在公司的两个网站上确实每两年就出现一次。有过类似经历的可以具体指导一下。

二、数据库事务部分失效
解决方法:将所有的sql(约千条左右),拼成一个大sql(oracle不支持这种拼接方式),最终将拼接后的sql一次提交执行。数据完全入库。

分析原因:应该是sqlserver数据库本身的事务处理机制不够完善。在access数据库中也出现了类似的问题。就是说,在事务中间,执行每一条sql都没有报错,但有可能会在最后的commit过程中,由于磁盘或者网络的原因,导致某些数据没有正式写入数据库。由于sqlserver2000是继承自7.0,而7.0是微软全新开发的数据库,并不像oracle一样有一个长期的积累和完整的版本过渡。因此sqlserver7.0/2000一直不太让人放心。

友情提示:执行大数据量处理时,如果可能最好一次提交所有的sql,这样大大减少和数据库服务器的交互,也降低了出错的机率。

三、系统的查询统计速度极慢
解决方式:创建一个新的数据库,将原库中所有数据导入到新库中。使用新的数据库,查询速度恢复正常。
分析原因:磁盘性能问题,也属于sqlserver自己的问题。
sqlserver数据库,和oracle/db2不同,每一个库中的所有数据,全部保存在mdf/ldf这两个文件中,创建一个新的数据库,将在磁盘上划分一块新的空间,供新库使用。这个新的空间在最初的时候,磁盘性能是不错的。但在经常进行OLAP一段时间之后,数据库内部的检索以及和其它数据库的关联查询性能,可能会大幅降低。具体原因,可能需要去问微软的专家了。

总结一句话:sqlserver真的是不堪大用。它有优点,易用、方便。但在事务完整性上的拙劣表现,让它无法胜任关键业务。

以上全部为事实描述,希望有人可以从中,分析出更具体准确的原因来。
不过以上错误,可能很难重现。把这几个问题解决的过程中,已经把思维发散到了极限。
22 楼 together 2006-10-27  
saneblue 写道
问题2是不是要在begin transaction前先执行set xact_abort on呢?

已经加过了。这个选项只需设置一次。

相关推荐

    做一个恐怖、灵异的资讯类APP

    在这个标题中,我们关注的是开发一个以恐怖和灵异为主题的资讯应用程序。这涉及到多个IT领域的知识,包括但不限于移动应用开发(Android或iOS)、用户界面设计、内容管理系统、后端服务集成以及数据分析。 在移动...

    灵异相机 GhostCam v1.9.4

    灵异相机 GhostCam v1.9.4 版本:1.9.4软件语言:非中文软件类别:特效相机软件大小:8.23 MB适用固件:2.1及更高固件内置广告:有广告适用平台:Android 一款相机拍照软件,用它拍的照片会看到灵异现象! ...

    rails 常见灵异错误汇总

    在Ruby on Rails开发过程中,开发者可能会遇到各种各样的“灵异”错误,这些错误往往令人困惑,有时甚至让人感到无从下手。Rails框架虽然强大且灵活,但其复杂性也意味着可能出现各种意料之外的问题。以下是一些常见...

    Ext2.1API中文文档

    Ext2.1 API中文文档是针对Ext JS框架的2.1版本提供的开发接口参考手册,主要面向Web前端开发者,特别是那些使用JavaScript进行富互联网应用程序(RIA)开发的人员。Ext JS是一个强大的JavaScript库,用于构建功能...

    记一次灵异般的 Bug 调试经历1

    【标题】:“记一次灵异般的 Bug 调试经历1” 【描述】:这篇文章讲述了作者在Quora上的一个热门经历,他受雇于一位心理学家修复一款输出异常的软件,该软件由其前任研究生编写。软件会在用户交互时显示不友好的潜...

    PHPWind论坛 恐怖-灵异风格

    PHPWind论坛 恐怖-灵异风格

    Ext 开发指南 学习资料

    8.10. 灵异事件,Ext.state 8.11. 所谓的事件 8.12. 回头谈一谈Ext里的ajax 9. 沉寂吧!我们要自己的控件。 9.1. 下拉树形选择框TreeField 9.2. 带全选的checkbox树形CheckBoxTree 9.3. 带全选的checkbox的grid 9.4....

    软件测试方法论-黑盒测试篇-开发人员眼中的测试方法

    7. **合,分析问题**:在发现问题后,测试人员需要深入分析,排除“灵异”现象,利用各种工具如Spy++(用于窗口和控件的监控)、Depends(分析程序依赖)等加速问题定位。此外,远程调试服务工具可以帮助远程解决...

    英语鬼故事.doc

    1. 鬼故事与文化:这个文档是一个关于英语鬼故事的集合,讲述了发生在爱丁堡的一段真实(或被认为是真实)的灵异经历。鬼故事是各种文化中常见的传统,它们反映了人类对未知、超自然现象以及死亡的好奇与恐惧。 2. ...

    帝国CMS仿五十一区灵异奇闻异事猎奇未解之谜网站模板.txt

    帝国CMS仿五十一区灵异奇闻异事猎奇未解之谜网站模板.txt

    关羽信仰普及背景的先行研究及对其的批判.docx

    但这些灵异事件主要发生在早已存在关羽庙宇的地方或是由官僚组织修建的庙宇。这意味着关羽信仰在东南地区的普及,并非全然由于对抗倭寇的需要。此外,万历年间,即使倭寇威胁已经减弱,关羽信仰仍然迅速普及,这表明...

    做Oracle数据库迁移,碰上了灵异的字符集问题,懵了

    这个就是那个出现灵异现象的test.dmp文件 博文链接:https://rainbamboo.iteye.com/blog/215343

    帝国cms7.5仿五十一区灵异奇闻异事末解之谜猎奇网站源码带手机版.txt

    帝国cms7.5仿五十一区灵异奇闻异事末解之谜猎奇网站源码带手机版.txt

Global site tag (gtag.js) - Google Analytics