日期:2014-05-16  浏览次数:20366 次

sybase ASE tempdb库损坏修复

最近公司的blog系统由于sql脚本访问性能低下,原因一:写的sql脚本实在够复杂,子句嵌套子句,多表关联,一个语句一长串脚本。原因二:开发过程中,多次强调的系统上线前需要把新增加的DAO层脚本发给我们DBA人员检查过,分析过效率如何,趁此也可以进行表结构的设计优化,可惜这个步骤没有贯彻执行,导致全表扫描的脚本也有诸多上线。由于这两个原因导致了,在sql执行过程中产生的worktable庞大,吃tempdb没每秒几兆增长,而且执行sql驻留时间过长后,tempdb无法释放。导致10g的tempdb经常满,而导致数据库挂起,我们DBA在忙着抓取低效sql同时只能通过进程管理以及先添加tempdb空间来暂时解决这个问题,突然今天下午数据库访问出问题了,通过后台日志查看确定在访问tempdb时候出现错误。数据库问题重现。

根据以往曾经处理过的经验,决定进行tempdb的重建修复,然后进行系统数据字典信息转储来恢复用户库,下面是这次重建tempdb,转储恢复用户库的过程步骤:

1.导出备份系统数据字典信息
bcp master..sysusages out sysusages.txt -c  -Sblog_sbar -Usa -P123456
bcp master..sysdevices out sysdevices.txt -c -Sblog_sbar -Usa -P123456
bcp master..sysdatabases out sysdatabases.txt -c -Sblog_sbar -Usa -P123456
bcp master..syslogins out syslogins.txt -c -Sblog_sbar -Usa -P123456
bcp master..sysconfigures out sysconfigures.txt -c -Sblog_sbar -Usa -P123456


2.移走备份系统库以及用户库设备文件
mkdir datbak
mv *.dat databak


3.备份配置文件
mv blog_sbar.cfg blog_sbar.cfg.bak


3.重建服务
清空interfaces的内容


srvbuildres -r ~/rs/blog_sbar.rs
srvbuildres -r ~/rs/blog_sbar_BACKUP.rs


4.字符集设置
cd ~/charsets/utf8/
charset  -Sblog_sbar -Usa -P binary.srt utf8
isql -Sblog_sbar -Usa -P
sp_configure "default character set id",190
--完成后重新启动两次
vi ~/locales/locales.dat


5.导入备份的系统数据字典信息
先设置系统数据字典允许修改
isql -Sblog_sbar -Usa -P
sp_configure "allow updates to system tables",1
delete from sysconfigures;
go
exit
去掉txt文件中关于服务刚创建时的系统信息,master,model,tempdb,systemproc....
bcp master..sysusages in sysusages.txt -c  -Sblog_sbar -Usa -P
bcp master..sysdevices in sysdevices.txt -c -Sblog_sbar -Usa -P
bcp master..sysdatabases in sysdatabases.txt -c -Sblog_sbar -Usa -P
bcp master..syslogins in syslogins.txt -c -Sblog_sbar -Usa -P
bcp master..sysconfigures in sysconfigures.txt -c -Sblog_sbar -Usa -P


6.添加tempdb空间
disk init name  = 'tempdb',physname = '/sda/blog_sbar/tempdb.dat',size  = '10240M',cntrltype= 0,dsync = false
go
alter database tempdb on tempdb=10240 with override
go


7.剥离tempdb占用master的8m设备空间,进行tempdb优化
use tempdb   
go 
sp_dropsegment "default",tempdb,master
go
sp_dropsegment logsegment,tempdb,master
go
sp_dropsegment system,tempdb,master
go
use master
go
sp_configure "allow updates to system tables",1
go
delete from sysusages where dbid=2 and lstart=0----dbid=2是tempdb,lstart=0是master设备
go
update sysusages set lstart=0 where dbid=2 ----这里只考虑一个tempdb设备,多个则不更新
go
sp_configure "allow updates to system tables",0 ----恢复系统表不允许修改

以上的处理步骤同样适用于其他的系统数据库的恢复。