sybase数据库中numeric数据类型字段出现跳号的问题
2007-06-06 15:08:57 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鎯у⒔閹虫捇鈥旈崘顏佸亾閿濆簼绨绘い鎺嬪灪閵囧嫰骞囬姣挎捇鏌熸笟鍨妞ゎ偅绮撳畷鍗炍旈埀顒勭嵁婵犲嫮纾介柛灞捐壘閳ь剛鎳撻~婵嬪Ω閳轰胶鐤呯紓浣割儐椤戞瑩宕ョ€n喗鐓曟い鎰靛亝缁舵氨绱撻崘鈺傜婵﹤顭峰畷鎺戔枎閹搭厽袦婵犵數濮崑鎾绘⒑椤掆偓缁夌敻骞嗛悙鍝勭婵烇綆鍓欐俊鑲╃磼閹邦収娈滈柡灞糕偓鎰佸悑閹肩补鈧尙鏁栧┑鐐村灦閹稿摜绮旈悽绋课﹂柛鏇ㄥ灠閸愨偓濡炪倖鍔﹀鈧繛宀婁邯濮婅櫣绱掑Ο璇茶敿闂佺ǹ娴烽弫璇差嚕婵犳碍鏅插璺猴工瀹撳棝姊虹紒妯哄缂佷焦鎸冲畷鎴﹀箻鐠囧弶宓嶅銈嗘尰缁嬫垶绂嶉悙顒佸弿婵☆垳鍘ф禍楣冩倵濮樼偓瀚�

环境: WIN2000 ADV , SYBASE12.5 中文版. 数据加工生产库, 白天上班应用,晚上关机.
问题描述: 今天早上开服务器,启动SYBASE服务时,感觉比平时慢了许多.
查看NT日志,有一条'
Sybase SQLServer _ YESKY 服务因 13 服务性错误而停止。 '
晕了,昨天晚上没有服务就关服务器了 服务起来了,当时检查数据库也没发现什么问题..
上班了,有一道工序的员工反应应用程序出现: 'XX值超出最大范围,请与管理员联系' . 检查相应表里的数据,(该表里有一个字段为numeric,设为自动加1,字段定义为 test1 numeric(10,0) IDENTITY ,) 表现该字段最大值为5028502,而它下面比它小的那个字段值为28501,将值为5028502的这条记录删除,再来,最大值成了5028503.删了再来,5028504. 不行了,看来出问题了....
经多方求教,问题已经得到解决,现写出对问题的分析及解决办法,共大家参考:
出现这个错误与SYBASE处理IDENTITY的策略有关.SYBASE在启动时会取出一段值放在内存中,IDENTITY是从内存中取的,在关机时,再写回到数据库中,如果非正常关机,则…
分析原因:db-server服务器出现故障或用no wait关机。导致分配ID号码块被‘烧毁’,当db-server服务器再次运行时,它会以先前写入磁盘的块的最高号码为基础,开始为下一号码块编号。依据出现故障前被指派到行中的已分配号码的多少,ID号可能会有很大的间隔。
解决方法:在该表上加上with identity_gap = number参数即可.
with identity_gap是为表指定标识间距。此值仅替换为此表设置的标识距。
执行sp_chgattribute 'table_name','identity_gap',number
可用sp_help 查看表的identity_gap的设置
number的值不要设置的过低,会使性能降低
建议为50,这样你的数据最大的数据间隔是50
结果: 执行sp_chgattribute 'table_name','identity_gap',number
问题解决.
教训:一定要正常关机!
其实,这也是大家帮助我解决的,在些也对你们表示感谢!
本人菜鸟一只,但我一直在努力,学习也是一个过程....
发这个帖子的目的,在于抛砖引玉.
希望大家把平时遇到的问题,即使问题已经解决了,也整理一下,贴出来,对于自己也是一个总结.
对于大家也是一个学习,交流的机会....说不定对这个问题,还可以有更好的解决办法呢.
更多精彩
赞助商链接