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
www.2cto.com
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 www.2cto.com
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 www.2cto.com
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 ----恢復系統表不允許修改
以上的處理步驟同樣適用於其他的系統數據庫的恢復。
摘自小寶老豆的專欄