因為 MSSQL 6.5 Server 出現 TempDB 空間不足的訊息,所以通知所有用戶離線並進行系統調教增加空間,然後重新啟動服務就出現下列錯誤訊息:

1
2
3
kernel udactivate(IN_RAM): Operating system error 8(Not enough storage is available to process this command.) encountered
spid1 Device activation error. The physical filename 'IN_RAM' may be incorrect
spid1 crdb_tempdb: Unable to move tempdb into RAM; RAM device doesn't exist, cannot be created, or doesn't have enough space for tempdb

慘了,踩到地雷了。因為當資料庫啟動時,如果系統設定 tempdb 是存放在 RAM 上,則 SQL Server 必須建立 temp_db Device 在可用的系統記憶體空間上,若空間不足無法建立裝置就會導致資料庫啟動失敗而得到上面的錯誤訊息。

解決方式:

1. 開啟命令列視窗(cmd.exe),並以最小的配置模式啟動SQL Server使用下列命令:

sqlservr -c -f

這時會看到命令列視窗傾印錯誤紀錄,然後看到最後一行出現:

kernel   Warning: override, autoexec procedures skipped.

2. 然後再開啟另一個命令列視窗用 sa 身分使用 isql 連線到伺服器。

isql -Usa -Ppassword (若不是本機再加上 -Sservername)

3. 再來重新設定 tempdb in ram 的參數使用下列指令,注意其中的 X 是指定要使用的記憶體大小,以 MB 為單位:

sp_configure ‘tempdb in ram’, X
go

變更組態後,執行下列命令以安裝

reconfigure
go

4. 關閉資料庫:

shutdown
go

5. 然後進行正常啟動 SQL Server

經過上列程序就可以解決無法啟動的問題。

另外要補充的是,曾經有碰到在使用命令列模式的 isql 登入都是出現 login 失敗,帳號密碼確定都沒有錯。真是嚇死人了,後來靈機一動直接改用 isql_w 也就是視窗版的 isql 來嘗試,就可以登入進行問題排除作業。若是在不行可以用別台電腦用 isql 登入看看。這個狀況應該是系統的版本或是更新不正常,導致有些 dll 檔案或路徑有問題。

另外一個快速處理的程序,同樣在命令列模式下用 sqlservr -c -f 啟動,然後回到 Windows 環境下執行 ISQL_W 連線到 SQL Server 並執行下列命令:

sp_configure ‘allow update’, 1
reconfigure with override
go
sp_configure ‘tempdb in ram’, 0
reconfigure with override
go

然後重新啟動 SQL Server 再以正常程序啟動。這個時候的 TempDB 就會建立在硬碟上,大小為 2M,然後就可以使用 Enterprise Manager 將 TempDB 調整到適合的大小。