您目前已離線,請等候您的網際網路重新連線

您無法將系統資料庫備份還原至不同的 SQL Server 組建

本文曾發行於 CHT264474
徵狀
在不同於原先執行備份之組建的伺服器組建上,您無法還原系統資料庫 (mastermodelmsdb) 的備份。嘗試執行這類還原會導致出現下列錯誤訊息:
伺服器: 訊息 3168,層級 16,狀態 1,行 1
裝置 d:\temp\master.bak 上的系統資料庫備份無法還原,因為它是由不同於這個伺服器版本 (134217920) 的版本 (134217904) 所建立的。
伺服器: 訊息 3013,層級 16,狀態 1,行 1
RESTORE DATABASE 正在異常結束。
發生的原因
在不同的伺服器組建之間,系統資料庫的資料庫結構描述可能已有所變更。為了確保這項結構描述變更不會造成任何不一致性,RESTORE 命令會先檢查備份檔案的伺服器組建編號,與使用者嘗試執行還原所在之伺服器的組建編號是否相同。如果這兩個組建不同,便會產生錯誤訊息,並且還原作業會異常終止。

注意 安裝 Service Pack 或 Hotfix 組建會變更伺服器的組建編號,而且伺服器的組建一定是累加的。

下列是可能會發生這個問題的案例:
  • 使用者嘗試在「伺服器 A」上還原取自「伺服器 B」的系統資料庫備份。「伺服器 A」和「伺服器 B」是不同的伺服器組建。例如,「伺服器 A」可能是 RTM 組建,而「伺服器 B」是 Service Pack 1 (SP1) 組建。
  • 使用者嘗試還原取自相同伺服器的系統資料庫備份,但在進行備份時,伺服器執行的是不同的組建。也就是說,自從執行備份之後,伺服器已升級。
其他可行方案
這種情況下的還原程序相當複雜,如非必要,請勿使用。

解決這個問題的第一步是判斷伺服器的目前組建,以及執行備份所在的 SQL Server 組建。

Microsoft SQL Server 2000 和 Microsoft SQL Server 2005 提供下列兩種方法來判斷目前的 SQL Server 組建:
  • 方法 1
    SELECT @@version
    此程式碼會傳回類似下列的文字:
    Microsoft SQL Server  2000 - 8.00.192 (Intel X86)Jul 31 2000 15:47:46Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: )(1 個資料列受到影響)
  • 方法 2
    SELECT SERVERPROPERTY('ProductVersion')
    此程式碼會傳回類似下列的文字:
    8.00.192(1 個資料列受到影響)
為了本文需求,這個組建編號在下文將稱為「SQL Server 組建」。

您可以在備份檔上使用下列命令,來判斷執行備份所在的組建:
RESTORE HEADERONLYFROM DISK = 'd:\temp\master176.bak'
在產生的輸出中,下列三 (3) 個資料行提供伺服器組建資訊:
SoftwareVersionMajorSoftwareVersionMinorSoftwareVersionBuild
80176
實際輸出還包含其他幾個資料行,但本文只列出相關的資料行,以利說明。為了本文需求,這個組建編號在下文將稱為「備份組建」。

在此範例中,「SQL Server 組建」為 8.00.192,而「備份組建」為 8.00.176。由於這兩個組建不同,因此無法進行還原作業,並且產生錯誤訊息 3168。

解決這個問題的還原程序,會根據使用者嘗試還原的系統資料庫而有所不同。為防範未然,Microsoft 建議您在進行任何步驟之前,先備份所有現有的資料庫 (系統和使用者資料庫)。

如果您嘗試在 master 資料庫上執行還原,可以使用下列步驟成功地還原:
  1. 使用 sp_detach_db 預存程序,卸離系統上的所有使用者資料庫。如需有關卸離使用者資料庫的詳細資訊,請參閱《SQL Server 2000 線上叢書》的<如何附加和卸離資料庫>主題。如果您使用 SQL Server 2005,請參閱《SQL Server 2005 線上叢書》的<卸離及附加資料庫>主題。下列查詢會傳回系統上所有使用者資料庫的清單,這可當做交叉檢查:
    SELECT name FROM SYSDATABASESWHERE dbid > 4
  2. 使用下列命令,備份系統上的 msdbmodel 資料庫:
    BACKUP DATABASE MSDB TO DISK = '<backup device>' WITH NOINIT, NOSKIPBACKUP DATABASE MODEL TO DISK = '<backup device>' WITH NOINIT, NOSKIP
  3. 移除 SQL Server 2000 或 SQL Server 2005。如需有關移除 SQL Server 2000 的詳細資訊,請參閱《SQL Server 2000 線上叢書》的<如何移除 SQL Server 2000>主題。
  4. 重新安裝 SQL Server 2000 或 SQL Server 2005 以及所有必要的 Service Pack 或 Hotfix 組建,將伺服器軟體向前復原至先前判斷的「備份組建」。
  5. 以單一使用者模式啟動伺服器,並使用這個組建的備份檔來還原 master 資料庫。如需有關還原 master 資料庫的指示,請參閱《SQL Server 2000 線上叢書》的<從目前的備份還原 master 資料庫>主題。如果您使用 SQL Server 2005,請參閱《SQL Server 2005 線上叢書》的<還原 master 資料庫>主題。
  6. 成功還原 master 資料庫之後,您必須關閉並重新啟動 SQL Server 服務。
  7. 重新套用任何必要的 Service Pack 或 Hotfix 組建,將伺服器軟體向前復原至「SQL Server 組建」。
  8. 透過在步驟 2 建立的備份來還原 msdbmodel 資料庫。如果您使用 SQL Server 2005,請參閱《SQL Server 2005 線上叢書》的<還原 model 和 msdb 資料庫>主題。
  9. 使用 sp_attach_db 預存程序重新附加所有的使用者資料庫。如需有關如何重新附加資料庫的詳細資訊,請參閱《SQL Server 2000 線上叢書》的<如何附加和卸離資料庫>主題。
master 備份後對 master 資料庫所做的任何變更都會遺失,必須手動重新套用。
如果您嘗試在 modelmsdb 資料庫上進行還原作業,則可以使用下列步驟來解決這個問題。為了以範例來說明這個程序,本文將所要還原的其中一個資料庫 (比如說 msdb) 的原始伺服器稱為「伺服器 A」。這個程序需要在不同的「伺服器 B」上安裝 SQL Server,以避免出現 3168 錯誤訊息。當然,前提是只在「伺服器 A」上才有 msdb 較舊組建的有效備份。
  1. 在「伺服器 B」上安裝 SQL Server 2000 (使用與「伺服器 A」相同的定序設定),以及可將伺服器軟體恢復成「備份組建」的任何必要 Service Pack 或 Hotfix 組建。
  2. 安裝 SQL Server 2000 之後,請啟動 SQL Server 服務,並嘗試從備份檔還原 msdb 資料庫。如果伺服器組建和執行備份的組建是相同的,表示還原成功。
  3. 成功還原之後,請在「伺服器 B」上升級 SQL Server 2000,方法是套用任何必要的 Service Pack 或 Hotfix 組建,將伺服器軟體向前復原至「目前組建」。
  4. 升級完成之後,請備份 msdb 資料庫。現在,您可以在「伺服器 A」上從這個備份進行還原,因為執行備份的伺服器組建和「目前組建」是相同的。
相同的程序也可用在 model 資料庫上。同樣地,在執行備份後對這些資料庫所做的任何變更都會遺失,必須手動重新套用。
其他相關資訊
使用最新、最有效的備份策略,永遠是一種好習慣。這項限制再度說明良好備份策略的重要性。因為這項限制的緣故,您必須在安裝 Service Pack 或 Hotfix 組建來升級伺服器之後,盡快備份系統資料庫。
內容

文章識別碼:264474 - 最後檢閱時間:12/21/2006 08:58:03 - 修訂: 6.3

Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Express Edition, Microsoft SQL Server 2005 Workgroup Edition

  • kbbackup kbprb KB264474
意見反應
document.createElement('meta');m.name='ms.dqp0';m.content='true';document.getElementsByTagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?">