前提:接手到一个前公司留下来的项目,项目主要是大数据处理。项目采用的是Sqlserver数据库
描述:每天频繁的从其他三方推送过来的excel的数据批量插入到数据库。触发器,存储过程等其他操作都做了且也优化了,磁盘空间充足,且做了分区操作。但数据出现了一下丢失出错问题。
1:插入数据时会有遗漏,不是全部丢失,是偶尔丢失一两行或者某个字段的值
2:插入的数据,过了一段时间无端的自动消失。
3:插入的数据进行数据整合计算代码计算方式没错且数据也没错,但计算的结果出错,出错的时间为偶尔。
存储过程,触发器里报错了,你不知道。
没有报错,且日志显示成功插入,输入插入操作做了判断。报错会终止一个批次插入也就是当天的数据会全部阻止,但我看了后台数据,没有这种情况。
谢谢了,公司请了高手解决了。是服务器性能的问题(内存和线程)。
碰到这种情况,我们菜鸟一般的做法有三种:
1、找高手,给钱,让他来看我们的系统,十万八万的看情况而定。
好像有人打电话给我,电脑坏了,要么他能判断是硬盘坏了,自己上京东买个换,要么找个人帮他判断,至于给不给钱,嘿嘿。
2、找个跳大神的或者仁波切啥的,给服务器开个光,这是第二种方法。
3、自己学习,找到具体问题,具体故障发生条件,写更好的代码,当然时间成本是三个月,三年或者三十年,不一定。
1.要是找专家,公司就不会接收这个项目(费钱)
2.求神不如跳槽,把坑留给别人
3.术业有专攻,估计这问题不是我涉及的领域,我看了国外网站的一些回答,应该跟微软底层有关。典型的蝴蝶效应问题。
@1混世魔王1: 不要有事儿没事就觉得系统底层有问题.没啥意义.
老老实实做日志.看他什么时候插进去.什么时候被删掉.
@1混世魔王1: 微软底层?蝴蝶效应?这话你敢对你领导说?
@西漠以西: 不敢,因为之前遇到一个这样类似的问题。太坑。
@吴瑞祥: 嗯。每天都在做日志。可是没啥用。算工作量吧。
@西漠以西: 去年搞了的一个项目涉及到服务器底层内存的队列排序问题,结果导致页面无法显示,感觉是不是有点坑。
谢谢了,公司请了高手解决了。是服务器性能的问题(内存和线程)。
说句不好听的.
我觉得你可能计算机基础比较差.在学校没有把那基本基础的书好好学.
哦,估计是。我在大学经常逃课,听不进老师说的东西,也不喜欢看书,还是喜欢待在机房。
多谢提醒,我有空的时候找找大学的书看看
谢谢了,公司请了高手解决了。是服务器性能的问题(内存和线程)。
这个应该是程序或者tsql写的有bug,ms的数据库再怎么说这种问题不至于出现的。
应该不是程序的问题,项目已经有三年的运行期,数据都没出现问题,就是最近才出现。程序没有报异常,我有点怀疑是数据,但是太多的数据,完全不是人工来核查的来的。
@1混世魔王1: 找dba翻数据库日志吧。
@Daniel Cai: 自己的日志显示的是事务完成。数据库的日志同样的内容,太多就不复制了。日志的内容和以前有数据的内容是一样的。所以日志看不出来。
@Daniel Cai: 会不会和服务器缓存有关系或者说是主从服务器复制的时候线程或者内存都对它有影响。在详细说一下结构吧,大体跟分布式结构很像,有多台服务器且会自动递增(备用的服务器很多),因为要每天要接收全国的数据,所以数据量有点大,要进行分拆归类,我看了各台服务器数据了录入时间,有的时候是集中一段时间录入一台,有的时候是几台同时并行录入数据。
谢谢了,公司请了高手解决了。是服务器性能的问题(内存和线程)。
只要不是性能问题,都好解决。怀疑你的问题是并发导致的。
数据库如果同时有多人读写,必须考虑隔离级别,如果性能允许你把你的执行上下文调整到 Serializable 级别,然后检查事务完整性,只要代码逻辑没有写错,肯定不会出现结果和数据丢失问题。
如果上面那个隔离级别出现严重死锁,可以调整到 RepeatableRead级别,但这种情形下就会有幻读了,SQL逻辑必须保证不会出现幻读,也可以保证结果正确。
尽量不要用触发器,或者少用,这个东西贻害无穷,而且没法监控。建议用其它方案替代。
我也觉得是并发的问题,但我在想出现死锁了。后面的数据应该全部不能录入。但有些数据只是缺了一点而且只是某个字段的值。如果出现死锁了应该是一连串的数据滞留吧。触发器没有深入研究过。现在只会用触发器,其他技能还不会。
@1混世魔王1: 那要看请求是怎么样了,一个数据库实例可以并行处理多个请求,是排队的,但不是只排一队,是很多个队。
谢谢了,公司请了高手解决了。是服务器性能的问题(内存和线程)。
这个可能是sql server用excel导入的问题。以前我也遇到过,这方面不懂,等于无解。
感觉是个例,有些项目丢失有些不丢失
也许真的和你说的一样无解。我看了好多大拿,也遇到过类似的问题。他们也没有解决。
谢谢了,公司请了高手解决了。是服务器性能的问题(内存和线程)。
用sql的日志调试吧,能把问题具体到哪一步。看看到底是excel数据读取还是sql的数据处理问题
不懂,只会单独调试vs和单独调试sqlserver,没试过两个可以一起相互调。不会弄。
@1混世魔王1: 单独调试sqlserver就可以了,查看传递过来数据有没有问题。
如果没有,那就比较容易了,读取excel的问题。就去调试vs;
如果有,就调试sql,这一块我就不太熟了,但是只要有日志,一步一步的,总会找到问题所在。
(建议吧从excel读取的数据存到日志里,实际sqlserver存储后,如果发现哪条有问题,可以去核对那条数据是不是从excel里读取的就是错误的。之前我做读取excel时候是会经常有些问题,比如公式生成的数据或者富文本数据)
@lippor: 是这样的。我自己本地调试没有啥问题。数据能完整的导入到数据库。可惜我录入的数据有限时间也有限,不可能用几个T的数据测试,我测了一个G的数据,测试了5天,都没有出现问题。原来的数据缺失是随机性的,没找到啥规律。
谢谢了,公司请了高手解决了。是服务器性能的问题(内存和线程)。
看一下出错的Excel是哪一个,调试一下看看是否能全部获取里面的内容,程序是如何读取Excel文件的?
excel的大小和内容都看了,基本上没有差异。读取excel文件的内容是前面项目杭州一家公司内部封装的dll。应为服务器数据库数据量大,我只复制了数据框架到本地数据库服务器,设置了必要的数据环境,然后用代码调用了没问题。数据完整。
谢谢了,公司请了高手解决了。是服务器性能的问题(内存和线程)。
你们这系统数据量多大?我现在的系统每天插入数据量大概在8000W左右,并没有任何问题,不要低估sqlserver的能力!
我看了其中一台服务器,我用的时间去查询的。每分钟大概在25W条左右,那么一个小时就是1500W,那么一天保守估计是3.6亿。这算的。把我吓了一大跳。感觉算错了。
感觉公司接这个项目就是个坑
谢谢了,公司请了高手解决了。是服务器性能的问题(内存和线程)。
插入数据丢失行、列数据是拼接的问题吧。应该是程序做了什么判断或者异常处理跳过了这些数据
插入成功的数据会无端消失,这就不好解释了。可能被人为或者程序给删除了,也有可能表Merge删除了,都有可能。
数据大,VS+MSSQL 就用 SqlBulkCopy保存数据试试。
谢谢了,公司请了高手解决了。是服务器性能的问题(内存和线程)。
本人菜鸟,我还是怀疑是插入数据的程序出错,数据库不太可能出错。可能是你对数据库做了一些优化,而这些优化法案导致了原来的程序和数据库交互上出现了问题。
还有一种情况,就是第三方来的数据格式或者值有了一些不一察觉的变化,导致了一直未发现的bug冒出来。
谢谢了,公司请了高手解决了。是服务器性能的问题(内存和线程)。