[SQL][Troubleshooting]在 SQL Server 2008 環境下無法使用 SSMS 進行備份

[SQL][Troubleshooting]在 SQL Server 2008 環境下無法使用 SSMS 進行備份

這幾天收到一個很特別的案件,異常的環境是使用 SQL Server 2008 的環境下,當使用 SSMS 利用  GUI 的方式要進行資料庫備份的時候,不論選擇甚麼樣的資料庫,都會出現如下的訊息。

image

 

如果使用另外一台 SQL Server 2008 R2 的 SSMS ( 英文版 ),連接有問題的 SQL Server 2008,選擇備份的時候也是會有同樣的訊息。但如果另外安裝 SQL Server 2012 的 Management Studio 來使用的話,則就沒有任何問題。

image

 

這個問題之前有遇到過類似的狀況,但當時問題是發生在 SQL Agent 裡面有重複的 job_id,因此很直覺的就使用語法查看一下

select * from msdb.dbo.sysjobs

 

看起來裡面雖然有一兩個工作,但也都沒有重複。而有朋友建議,因為是備份的時候發生,會不會是備份的歷史資料內有重複的紀錄,查看一下有問題的 Server,的確有非常大的備份紀錄資料,因此我們就嘗試使用以下的語法,來清除所有的備份紀錄。

DECLARE @Now DATETIME
SET @Now = GETDATE()
EXEC msdb.dbo.sp_delete_backuphistory @Now
GO

 

清除資料後也檢查一下 msdb,壓縮之後發覺釋放將近 95% 以上的空間,看來真的是有把所有備份紀錄清除,但對問題的解決還是沒有任何的幫助。因此決定開大決,把 SQL Profiler 開起來,來攔截一下到底 SSMS 在做甚麼處理的時候發生問題

image

 

從 SQL Profiler 所攔到訊息,看起來 SSMS 最後是在抓取 SQL Server 有哪些資料庫名稱,而且只有取單一這個欄位在處理的時候就發生問題,因此問題似乎是發生在資料庫名稱,因此我們也比照同樣的方式來試試看,試試看否取出來的資料是有問題的。客戶端的資料庫看起來雖然是非常的多,但看起來命名都沒有甚麼異常,而從第一筆看到最後一筆的時候,忽然看到一個特殊的資料,原來客戶端的 SQL Server 的定序是採用「Chinese_Taiwan_Stroke_Bin2」,正常來說他們的資料庫命名習慣是 XXX + 年月日,但是剛好某一天需要把其中的資料庫給還原回來,因此多產生了一個 xxx + 年月日的資料庫,雖然 SSQL Server 定序有區分大小寫,而那個資料庫也很順利地產生了,但是在備份的時候疑似 SQL Server 會取出所有的資料庫名稱放到一個 「System.Collections.Generic.Dictionary」的結構來存放資料,應該是在這個時候沒有區分大小寫才導致發生這樣的問題。

 

既然知道問題那就簡單了,確認一下使用的方式後,就可以採用 ALTER DATABASE [舊名稱] MODIFY NAME = [新名稱] 的指令修改之後,避開大小寫所造成的誤會之後,就可以正常運作了。