最近公司的blog系統由於sql指令碼訪問效能低下,原因一:寫的sql指令碼實在夠複雜,子句巢狀子句,多表關聯,乙個語句一長串指令碼。原因二:開發過程中,多次強調的系統上線前需要把新增加的dao層指令碼發給我們dba人員檢查過,分析過效率如何,趁此也可以進行表結構的設計優化,可惜這個步驟沒有貫徹執行,導致全表掃瞄的指令碼也有諸多上線。由於這兩個原因導致了,在sql執行過程中產生的worktable龐大,吃tempdb沒每秒幾兆增長,而且執行sql駐留時間過長後,tempdb無法釋放。導致10g的tempdb經常滿,而導致資料庫掛起,我們dba在忙著抓取低效sql同時只能通過程序管理以及先新增tempdb空間來暫時解決這個問題,突然今天下午資料庫訪問出問題了,通過後台日誌檢視確定在訪問tempdb時候出現錯誤。資料庫問題重現,並且在資料庫服務重啟情況下,tempdb還是異常,導致使用者資料庫也不能使用。
根據以往曾經處理過的經驗,決定進行tempdb的重建修復,然後進行系統資料字典資訊轉儲來恢復使用者庫,下面是這次重建tempdb,轉儲恢復使用者庫的過程步驟:
1.如果master庫不能正常recover,在run_***檔案裡加-m -t3607,啟動服務,否則越過1步。
2.匯出備份系統資料字典資訊
bcp master..sysusages out sysusages.txt -c -setoh2 -usa -p123456
bcp master..sysdevices out sysdevices.txt -c -setoh2 -usa -p123456
bcp master..sysdatabases out sysdatabases.txt -c -setoh2 -usa -p123456
bcp master..syslogins out syslogins.txt -c -setoh2 -usa -p123456
bcp master..sysconfigures out sysconfigures.txt -c -setoh2 -usa -p123456
3.停止服務
isql -setoh2 -usa -p123456
shutdown with nowait
go3.移走備份系統庫以及使用者庫裝置檔案
mkdir datbak
mv *.dat databak
4.備份配置檔案
mv etoh2.cfg etoh2.cfg.bak
3.重建服務
清空inte***ces的內容
srvbuildres -r ~/rs/db.rs
srvbuildres -r ~/rs/backup.rs
4.字符集設定
--服務端字符集設定
cd ~/charsets/cp936/
charset -setoh2 -usa -p binary.srt cp936 --服務端字符集,也可以是utf8
isql -setoh2 -usa -p
sp_configure "default character set id",171 --utf8對應190
--完成後重新啟動兩次
修改本地字符集:
編輯sybase使用者home目錄下的locales目錄下的locales.dat檔案。
vi ~/locales/locales.dat
將[linux]段內的locale = default,us_english,cp936中的設定修改為指定設定即可。
5.匯入備份的系統資料字典資訊
先設定系統資料字典允許修改
isql -setoh2 -usa -p
sp_configure "allow updates to system tables",1
delete from sysconfigures
goexit
去掉txt檔案中關於服務剛建立時的系統資訊,master,model,tempdb,systemproc....
bcp master..sysusages in sysusages.txt -c -setoh2 -usa -p
bcp master..sysdevices in sysdevices.txt -c -setoh2 -usa -p
bcp master..sysdatabases in sysdatabases.txt -c -setoh2 -usa -p
bcp master..syslogins in syslogins.txt -c -setoh2 -usa -p
bcp master..sysconfigures in sysconfigures.txt -c -setoh2 -usa -p
6.新增tempdb空間
disk init name = 'tempdb',physname = '/opt/sybase-12.5.4/data/tempdb.dat',size = '2048m',cntrltype= 0,dsync = false
goalter database tempdb on tempdb=2048 with override
go7.剝離tempdb占用master的8m裝置空間,進行tempdb優化
use tempdb
go sp_dropsegment "default",tempdb,master
gosp_dropsegment logsegment,tempdb,master
gosp_dropsegment system,tempdb,master
gouse master
gosp_configure "allow updates to system tables",1
godelete from sysusages where dbid=2 and lstart=0----dbid=2是tempdb,lstart=0是master裝置
goupdate sysusages set lstart=0 where dbid=2 ----這裡只考慮乙個tempdb裝置,多個則不更新
gosp_configure "allow updates to system tables",0 ----恢復系統表不允許修改
go8.覆蓋會服務配置檔案
cp etoh2.cfg.bak etoh2.cfg
以上的處理步驟同樣適用於其他的系統資料庫的恢復。
資料庫損壞解決 資料庫已損壞,無法分配空間
問題描述 使用者將domino公升級完成之後,當使用者試圖訪問server上的郵箱庫時,碰到錯誤資訊 資料庫已損壞,無法分配空間 解答 這個錯誤資訊通常意味著資料庫損壞,在這種情況下,我們通常要用fixup compact updall這幾個命令來嘗試修復資料庫。1.fixup f 這樣的引數會強制...
SQLite資料庫損壞修復
the database disk image is malformed 進入到sqlite3操作指定的資料庫 或者直接 sqlite3 e item.db 操作此資料庫 sqlite databases main e item.db sqlite tables 顯示列表 檢查資料庫是否損壞 sql...
資料庫表損壞的修復
用命令列訪問出現 開始時使用myisamchk r o home test test user.myi進行修復,出現錯誤 myisamchk error myisam sort buffer size is too small。df發現是mysql temp目錄太小,此錶太大。更改my.cnf檔案修...