最近安裝 SQL Server 2008 後,遇到一些問題,筆記一下過程中發生的狀況與解決方法。
1. 資料庫檔案 (*.mdf) 無法正確附加。解決方式是在資料庫檔案上按右鍵→內容→切換至[安全性]頁籤,將檔案權限設定為「完全控制」給 NETWORK SERVICE 與 SQLServerMSSQLUser$<USERNAME>$MSSQLSERVER 這兩個帳戶。
因為沒有為資料庫檔案的「安全性」加上正確權限,可能會發生錯誤 3415:
伺服器 '*******' 的 附加資料庫 失敗。 (Microsoft.SqlServer.Smo)
如需說明,請按一下: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.50.1447.4+((KJ_RTM).100213-0103+)&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=附加資料庫+Server&LinkId=20476
------------------------------
其他資訊:
執行 Transact-SQL 陳述式或批次時發生例外狀況。 (Microsoft.SqlServer.ConnectionInfo)
------------------------------
資料庫 '******' 無法升級,因為它是唯讀資料庫,或者其中包含唯讀檔案。請先將資料庫或檔案變更為可寫入,再重新執行復原。 (Microsoft SQL Server, 錯誤: 3415)
如需說明,請按一下: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.00.1600&EvtSrc=MSSQLServer&EvtID=3415&LinkId=20476
或是錯誤 5123:
無法擷取此要求的資料。 (Microsoft.SqlServer.Management.Sdk.Sfc)
如需說明,請按一下: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&LinkId=20476
------------------------------
其他資訊:
執行 Transact-SQL 陳述式或批次時發生例外狀況。 (Microsoft.SqlServer.ConnectionInfo)
------------------------------
CREATE FILE 於嘗試開啟或建立實體檔案 'D:\*******.mdf' 時,發現作業系統錯誤 5(存取被拒。)。 (Microsoft SQL Server, 錯誤: 5123)
如需說明,請按一下: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.00.1600&EvtSrc=MSSQLServer&EvtID=5123&LinkId=20476
搜尋一下網路上的各家說法(比方說《SQL 2008 附加資料庫的問題-MDF的檔案權限會被修改》這個討論串),多數都說要在安全性設定權限。如果只加上 NETWROK SERVICE 的權限,會變成錯誤 3415:
伺服器 '*******' 的 附加資料庫 失敗。 (Microsoft.SqlServer.Smo)
如需說明,請按一下: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.50.1447.4+((KJ_RTM).100213-0103+)&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=附加資料庫+Server&LinkId=20476
------------------------------
其他資訊:
執行 Transact-SQL 陳述式或批次時發生例外狀況。 (Microsoft.SqlServer.ConnectionInfo)
------------------------------
資料庫 '******' 無法升級,因為它是唯讀資料庫,或者其中包含唯讀檔案。請先將資料庫或檔案變更為可寫入,再重新執行復原。 (Microsoft SQL Server, 錯誤: 3415)
如需說明,請按一下: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.00.1600&EvtSrc=MSSQLServer&EvtID=3415&LinkId=20476
或是錯誤 5120:
伺服器 '*******' 的 附加資料庫 失敗。 (Microsoft.SqlServer.Smo)
如需說明,請按一下: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.50.1447.4+((KJ_RTM).100213-0103+)&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=附加資料庫+Server&LinkId=20476
------------------------------
其他資訊:
執行 Transact-SQL 陳述式或批次時發生例外狀況。 (Microsoft.SqlServer.ConnectionInfo)
------------------------------
無法開啟實體檔案 "D:\*****.mdf"。作業系統錯誤 5: "5(存取被拒。)"。 (Microsoft SQL Server, 錯誤: 5120)
如需說明,請按一下: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.00.1600&EvtSrc=MSSQLServer&EvtID=5120&LinkId=20476
以上基本上都是設定權限給 NETWORK SERVICE 與 SQL SERVER 即可。(如果你的 SQL Server 是 Express 版本,那麼就是指給 SQLServerMSSQLUser$<USERNAME>$SQLEXPRESS)
附帶一提,有的人的解法會是把資料庫檔案 (*.mdf) 搬移到 SQL server 的資料夾,譬如說,我在 Google 上查到的這篇:《[錯誤代碼]SQL Server無法附加資料庫? 錯誤碼 5120 / 作業系統: 5 權限不足》。但事實上,我後來也只是把檔案權限加上 NETWORK SERVICE 與 SQLServerMSSQLUser$<USERNAME>$MSSQLSERVER,沒有搬移檔案到指定資料夾之下,就解決問題了,如果希望檔案能留置在原來的路徑的,不妨嘗試調整安全性。
2. 附加資料庫檔案失敗,且已經設定安全性、指定正確的權限。這個的解決方法是對資料庫檔案按右鍵→內容→在[一般]頁籤中點選[進階]按鈕→取消[壓縮內容,節省磁碟空間]的勾選。
此方法是參考《檔案 "C:\Program Files\Microsoft SQL Server\MSSQL.2\MSSQL\DATA\master.mdf" 是壓縮檔,但不在唯讀資料庫或檔案群組中。必須解壓縮該檔案 的解決方法》一文得來。
我遇到的錯誤訊息如下:
伺服器 '******' 的 附加資料庫 失敗。 (Microsoft.SqlServer.Smo)
如需說明,請按一下: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.50.1447.4+((KJ_RTM).100213-0103+)&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=附加資料庫+Server&LinkId=20476
------------------------------
其他資訊:
執行 Transact-SQL 陳述式或批次時發生例外狀況。 (Microsoft.SqlServer.ConnectionInfo)
------------------------------
檔案 "D:\Database\******.mdf" 是壓縮檔,但不在唯讀資料庫或檔案群組中。必須解壓縮該檔案。
無法為無效檔案識別碼 2 於資料庫 '******' 中開啟檔案控制銀行 (File Control Bank,FCB)。請確定檔案的位置,執行 DBCC CHECKDB。
無法開啟新資料庫 '******'。CREATE DATABASE 已經中止。 (Microsoft SQL Server, 錯誤: 5118)
如需說明,請按一下: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&EvtSrc=MSSQLServer&EvtID=5118&LinkId=20476
3. 安裝 SQL Server 2008 SP1 一直失敗,錯誤代碼是 84B30002。問題的原因是因為 Windows Update 自動抓的更新檔語系不對,自行手動下載後即完成。
參考《下載與安裝 SQL Server 2008 Service Pack 1 (SP1):版本編號:10.0.2531.0》,得知可以在安裝失敗後觀察 log 檔,我在這裡找到我的安裝 log:
C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\LOG\
這個路徑裡會有很多個資料夾,都是以 [年月日_時分秒] 來命名的,可以依照錯誤發生的時間查詢 log。發現在安裝詳情 (Detail.txt) 裡有一段很有參考價值的錯誤訊息:
「SQL Server 執行個體 MSSQLSERVER 的語言與 SQL Server 更新所預期的語言不相符。已安裝的 SQL Server 產品語言為 中文 (台灣),而預期的 SQL Server 語言為 英文 (美國)。」
我完全沒想過 Windows Update 會幫我抓英文版的 SP1 然後企圖裝在我中文版的 SQL server 上頭……Orz
到官網自己乖乖下載了中文版的 SQL Server 2008 Service Pack 1,手動安裝就過關了。
4. 無法直接在 SQL Server Management Studio 透過圖形介面修改資料表。修改設定後即可使用。
我想要直接透過 SQL Server Management Studio 的圖形介面調整資料表欄位,但系統跑出一個警告訊息視窗:「不允許儲存變更。您所做的變更要求下列資料表必須先卸除然後再重新建立,您可能對無法重新建立的資料表做了變更,或是啟用了[防止儲存需要資料表重建的變更]選項。」
原來預設在工具→選項→Designers,有一個「防止儲存需要資料表重建的變更」預設被勾選起來了,取消就可以直接在 GUI 調整資料表欄位了。調整的方式我是參考《SQL_SQL2008-防止儲存需要資料表重建的變更》這篇。
5. 壓縮、清除 SQL Server Log.ldf 資料時,下指令 "BACKUP LOG [DB_NAME] WITH TRUNCATE_ONLY" 會出現錯誤訊息「'TRUNCATE_ONLY' 不是可辨識的 BACKUP 選項。」解決方法是,當資料庫原本的復原模式為「完整」時,先將資料庫的復原模式切換為「簡單」,再切換回來。
在 SQL Server 2000/2005,我們遇到過大的 *.ldf 檔,會使用下列指令:
--(1)截斷交易記錄檔
BACKUP LOG [資料庫名稱] WITH TRUNCATE_ONLY
--(2)顯示資料庫檔案,找出交易記錄檔的邏輯檔名
EXEC sp_helpdb [資料庫名稱]
--(3)壓縮交易記錄檔
USE [資料庫名稱]
DBCC SHRINKFILE([交易記錄檔的邏輯檔名],2) --ldf檔的邏輯檔名,在(2)可以找出
詳細作法可參考《壓縮SQL Server Log.ldf資料(解決ldf檔案過大問題)》。
但在 SQL Server 2008 會出現錯誤訊息「'TRUNCATE_ONLY' 不是可辨識的 BACKUP 選項。」在此情況下,第一步驟須調整為將復原模式切換至簡單模式。切換復原模式的語法請參考《SQL 2008不支援Backup的Truncat_Only選項 》。
以上,祝大家都可以和自己的 SQL Server 2008 和睦相處。
留言列表