sybase ASE tempdb庫損壞修復

2021-06-08 01:55:43 字數 3066 閱讀 1209

最近公司的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檔案修...