分类: Sybase
2011-01-23 10:07:01
关键字: SYBASE,字符集,索引suspect ,"default sort order" ,sp_indsuspect,dbcc checkdb
笔者最近做了一次sybase ASE的字符集顺序调整,是顺序调整,不是更改字符集(数据库启动最后default sort order 选项)。目的是,之前数据库建库时候的首先字符集,对大小写不敏感,影响使用,需要选择一个对大小写敏感的字符集。具体修改的参数命令为:sp_configure “default sortorder id” 。
修改过程如下:
更改完后,数据库无报错,表也正常。启运用的时候,发现应用有问题,启动不了。而且启动的非常慢。经过仔细查找应用日志,发现某些表是“read only”状态。最后对该表进行select into 的备份,发现该表索引已被“suspect”,该表只能读了。系统提示对该表进行“dbcc reindex”操作。后来和SYBASE工程师起得联系,他们好像也没遇到过,只是说根据提示,对该表进行重建索引好了。
问到一个资深的工程师,得到完美解答如下:
1, sybase一般不建议更改字符集的东西,除非must do。
2, sp_configure “default sortorder id”修改后不一定能保证你的对象不会被损坏,一般这个对象指的就是索引。
3, 这个顺序修改后,系统会对一些特殊的系统表做reindex ,但不是所有的系统表;(查看日志,的确如此,比如各个数据库sysobjecs表)
4, 字符集顺序修改会,也会影响某些表的text字段;如果损坏,只能用之前的bcp备份来恢复。
5, 如果数据库有损坏,判断不了,dump备份是没有用的。只有bcp备份恢复回来才有用。
经过笔者进一步使用,发现:1,所有数据库的表,几乎都有索引suspect,包括,master等系统数据库。2,用dbcc checkdb()基本能检查出来并修复;3,用sp_indsuspect 命令可以查询出那些索引被suspect;4,索引被挂起,用,dbcc reindex可以完美修复。
所以,以后要做字符集顺序修改,sp_configure “default sortorder id” xx时,标准流程是:
1, dbcc checkdb()
2, bcp备份数据库;
3, 备份 cfg文件;
4, sp_configure “default sortorder id” xx完成修改;
5, 重启数据库(会有两次)
6, 检查数据库日志;
7, dbccdb checkdb() 检查各个数据库,包括系统库。(很重要)
8, sp_indsuspect 检查各个数据库是否有索引被挂起;
9, 如果有,用dbcc reindex () 修复该表。
10, 检查数据库中包含text字段的数据库表是否正常?主要是text字段是否正常,如果有损坏,需要将之前的该表的bcp备份导回来。
另:非常感谢一位资深的SYBASE数据库先驱,虽然开了自己的公司,当了老总,不过还是那样平易近人,那样亲切。尤其是,可能因为思维过程相近,听他说技术上的东西,还真是一种享受。03年来过云南,他说,他对我有印象,还记得我,暗喜,心甚欢。