重建系統資料庫

適用於:SQL Server

您必須重建系統資料庫,才能在 mastermodelmsdbresource 系統資料庫中修正損毀問題,或修改預設的伺服器層級定序。 本文提供在 SQL Server 中重建系統資料庫的逐步指示。

限制事項

重建 mastermodelmsdbtempdb 系統資料庫時,系統會在資料庫的原始位置卸除並重新建立這些資料庫。 如果您在重建陳述式中指定了新的定序,系統就會使用該定序設定來建立系統資料庫。 使用者對這些資料庫所做的任何修改都將遺失。 例如,master 資料庫可能有使用者定義的物件、msdb 有排程的作業,或您可能曾變更 model 資料庫預設的資料庫設定。

必要條件

請在重建系統資料庫之前執行下列工作,以便確保您可以將系統資料庫還原成目前的設定。

  1. 記錄所有伺服器範圍的組態值。

    SELECT * FROM sys.configurations;
    
  2. 記錄所有 SQL Server 執行個體套用的 Hotfix 與目前的定序。 您必須在重建系統資料庫之後重新套用這些 Hotfix。

    SELECT
    SERVERPROPERTY('ProductVersion ') AS ProductVersion,
    SERVERPROPERTY('ProductLevel') AS ProductLevel,
    SERVERPROPERTY('ResourceVersion') AS ResourceVersion,
    SERVERPROPERTY('ResourceLastUpdateDateTime') AS ResourceLastUpdateDateTime,
    SERVERPROPERTY('Collation') AS Collation;
    
  3. 記錄系統資料庫之所有資料和記錄檔的目前位置。 重建系統資料庫會將所有系統資料庫安裝到其原始位置。 如果您已將系統資料庫的資料或記錄檔移至不同的位置,就必須再次移動這些檔案。

    SELECT name, physical_name AS current_file_location
    FROM sys.master_files
    WHERE database_id IN (DB_ID('master'), DB_ID('model'), DB_ID('msdb'), DB_ID('tempdb'));
    
  4. 尋找 mastermodelmsdb 資料庫目前的備份。

  5. 如果 SQL Server 的執行個體設為複本散發者,請找出 distribution 資料庫目前的備份。

  6. 確定您擁有重建系統資料庫的適當權限。 若要執行這項作業,您必須是系統管理員 ( sysadmin ) 固定伺服器角色的成員。 如需詳細資訊,請參閱 伺服器層級角色

  7. 確認本機伺服器有 mastermodelmsdb 資料與記錄範本檔案的複本。 範本檔案的預設位置是 C:\Program Files\Microsoft SQL Server\MSSQL<xx>.MSSQLSERVER\MSSQL\Binn\Templates (<xx> 是您安裝的版本)。 這些檔案會在重建程序期間使用,而且它們必須存在,才能讓安裝程式順利執行。 如果這些檔案已遺失,請執行安裝程式的修復功能,或手動從安裝媒體中複製這些檔案。 若要在安裝媒體上找到這些檔案,請瀏覽至適當的平台目錄 (x86 或 x64),然後瀏覽至setup\sql_engine_core_inst_msi\Pfiles\SqlServr\MSSQL.X\MSSQL\Binn\Templates

重建系統資料庫

下列程序會重建 mastermodelmsdbtempdb 系統資料庫。 您無法指定要重建的系統資料庫。 如果是叢集執行個體,您必須在使用中的節點上執行此程序,而且執行程序前,對應的叢集應用程式群組中的 SQL Server 資源必須離線。

此程序不會重建 resource 資料庫。 請參閱本文稍後的章節「重建資源系統資料庫」。

重建 SQL Server 執行個體的系統資料庫

  1. 在磁碟機插入 SQL Server 安裝媒體,或從命令提示字元變更目錄的位置至本機伺服器上的 setup.exe 檔案。 如果是 SQL Server 2022 (16.x),伺服器的預設位置是 C:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\SQLServer2022

  2. 在 [命令提示字元] 視窗中,輸入下列命令。 方括號是用來表示選擇性參數。 請勿輸入括弧。 使用啟用使用者帳戶控制 (UAC) 的 Windows 作業系統時,必須要有更高的權限才能執行安裝程式。 您必須以管理員的身分執行命令提示字元。

    setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName /SQLSYSADMINACCOUNTS=accounts [ /SAPWD= StrongPassword ] [ /SQLCOLLATION=CollationName ]
    
    參數名稱 描述
    /QUIET 或 /Q 指定不使用使用者介面執行安裝。
    /ACTION=REBUILDDATABASE 指定安裝重新建立系統資料庫。
    /INSTANCENAME=InstanceName SQL Server 執行個體的名稱。 若為預設執行個體,請輸入 MSSQLSERVER。
    /SQLSYSADMINACCOUNTS=accounts 指定要加入至系統管理員 ( sysadmin ) 固定伺服器角色的 Windows 群組或個別帳戶。 指定多個帳戶時,請以空格隔開這些帳戶。 例如,您可以輸入 BUILTIN\Administrators MyDomain\MyUser。 當您要指定的帳戶在帳戶名稱中包含空白時,請以雙引號括住該帳戶。 例如,輸入 NT AUTHORITY\SYSTEM
    [ /SAPWD=StrongPassword ] 指定 SQL Server sa 帳戶的密碼。 如果執行個體使用混合驗證 (SQL Server 和 Windows 驗證) 模式,即需此參數。

    安全性注意事項:sa 帳戶已知是 SQL Server 帳戶,所以常是惡意使用者攻擊的目標。 請務必使用強式密碼登入 sa

    如果是 Windows 驗證模式,請勿指定此參數。
    [ /SQLCOLLATION=CollationName ] 指定新的伺服器層級定序。 這是選擇性參數。 如果沒有指定,就會使用伺服器的目前定序。

    重要事項 變更伺服器層級定序不會變更現有使用者資料庫的定序。 所有新建立的使用者資料庫預設都會使用新的定序。

    如需詳細資訊,請參閱 設定或變更伺服器定序
    [ /SQLTEMPDBFILECOUNT=NumberOfFiles ] 指定 tempdb 資料檔案數目。 此值可以增加為 8 個或與核心數目相同 (兩者取其較高者)。

    預設值:8 個或核心數目 (兩者取其較低者)。
    [ /SQLTEMPDBFILESIZE=FileSizeInMB ] 指定每個 tempdb 資料檔案的初始大小 (MB)。 安裝程式允許的大小上限為 1024 MB。

    預設值:8
    [ /SQLTEMPDBFILEGROWTH=FileSizeInMB ] 指定每個 tempdb 資料檔案的檔案成長遞增值 (MB)。 0 值指出自動成長是關閉的,且不允許其他空間。 安裝程式允許的大小上限為 1024 MB。

    預設值:64
    [ /SQLTEMPDBLOGFILESIZE=FileSizeInMB ] 指定 tempdb 記錄檔的初始大小 (MB)。 安裝程式允許的大小上限為 1024 MB。

    預設值:8.

    允許的範圍:最小值 = 8,最大值 = 1024。
    [ /SQLTEMPDBLOGFILEGROWTH=FileSizeInMB ] 指定 tempdb 記錄檔的檔案成長遞增值 (MB)。 0 值指出自動成長是關閉的,且不允許其他空間。 安裝程式允許的大小上限為 1024 MB。

    預設值:64

    允許的範圍:最小值 = 8,最大值 = 1024。
    [ /SQLTEMPDBDIR=Directories ] 指定 tempdb 資料檔案的目錄。 指定多個目錄時,請以空格隔開這些目錄。 如果您指定多個目錄,tempdb 資料檔案會以循環配置資源方式散布在這些目錄。

    預設值:系統資料目錄
    [ /SQLTEMPDBLOGDIR=Directory ] 指定 tempdb 記錄檔的目錄。

    預設值:系統資料目錄
  3. 當安裝程式完成系統資料庫的重建作業時,它就會返回命令提示字元,而且不會顯示任何訊息。 您可以檢查 Summary.txt 記錄檔來確認此程序是否順利完成。 檔案位於 C:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\Logs

  4. RebuildDatabase 案例會刪除系統資料庫,然後以初始狀態重新安裝系統資料庫。 因為不保存 tempdb 檔案計數的設定,安裝期間不會知道 tempdb 檔案數目的值。 所以 ebuildDatabase 案例不知道要讀取的 tempdb 檔案計數。 您可以使用 SQLTEMPDBFILECOUNT 參數,重新提供 tempdb 檔案數目的值。 如果未提供參數,RebuildDatabase 會新增預設的 tempdb 檔案數目,而 tempdb 檔案數目會與 CPU 計數相同,或為 8 (取數目較低者)。

重建後的工作

重建資料庫後,您可能需要執行下列額外的工作:

  • 還原 mastermodelmsdb 資料庫的最新完整備份。 如需詳細資訊,請參閱系統資料庫的備份與還原 (SQL Server)

    重要

    如果您已變更伺服器定序,請勿還原系統資料庫。 這樣做會將新的定序取代成先前的定序設定。

    如果無法備份,或者還原的備份不是最新,請重新建立任何遺漏的項目。 例如,針對使用者資料庫、備份裝置、SQL Server 登入、端點等,重新建立所有遺漏的項目。 重新建立項目的最佳方式是執行建立這些項目的原始指令碼。

    重要

    我們建議您保護指令碼的安全,防止它們遭受未獲授權的人員更改。

  • 如果 SQL Server 執行個體設為複寫散發者,您即須還原 distribution 資料庫。 如需詳細資訊,請參閱 備份及還原複寫的資料庫

  • 將系統資料庫移至您先前記錄的位置。 如需詳細資訊,請參閱 移動系統資料庫

  • 確認伺服器範圍的組態值符合您先前記錄的值。

重建 resource 資料庫

下列程序會重建 resource 系統資料庫。 重建 resource 資料庫時會遺失所有 Hotfix,所以您必須重新套用。

重建 resource 系統資料庫

  1. 從散發程式媒體啟動 SQL Server 安裝程式 (setup.exe)。

  2. 在左側導覽區域中,選取 [維護],然後選取 [修復]。

  3. 安裝程式支援規則和檔案常式將會執行,以便確保您的系統已安裝必要元件而且電腦通過安裝程式驗證規則。 選取 [確定] 或 [安裝] 繼續進行。

  4. 在 [選取執行個體] 頁面上,選取要修復的執行個體,然後選取 [下一步]。

  5. 修復規則將會執行,以便驗證作業。 若要繼續,請選取 [下一步]。

  6. 在 [已完成修復準備工作] 頁面中,選取 [修復]。 [完成] 頁面會指出作業已完成。

建立新的 msdb 資料庫

如果 msdb 資料庫損毀或不可信,但您沒有 msdb 資料庫的備份,您可以使用 instmsdb 指令碼建立新的 msdb

警告

使用 instmsdb.sql 指令碼重建 msdb 資料庫會清除儲存在 msdb 的所有資訊,例如工作、警示、運算子、維護計畫、備份記錄、原則式管理設定、Database Mail、效能資料倉儲等。

  1. 停止連線資料庫引擎的所有服務,包括 SQL Server Agent、SSRS、SSIS,及使用 SQL Server 作為資料存放區的所有應用程式。

  2. 使用命令,從命令列啟動 SQL Server:

    NET START MSSQLSERVER /T3608
    

    如需詳細資訊,請參閱 启动、停止、暂停、继续、重启 SQL Server 服务。 如需追蹤旗標 3608 的詳細資訊,請參閱 TF3608

  3. 在其他命令列視窗中,執行下列命令以中斷 msdb 資料庫連線,並以 SQL Server 執行個體取代 <servername>

    SQLCMD -E -S<servername> -dmaster -Q"EXEC sp_detach_db msdb"
    
  4. 使用 [Windows 檔案總管] 重新命名 msdb 資料庫檔案。 根據預設,這些命令位於 SQL Server 執行個體的 DATA 子資料夾。

  5. 使用 SQL Server 設定管理員,以正常方式停止並重新啟動資料庫引擎服務,不需要額外的追蹤旗標。

  6. 在命令提示字元視窗中,連線 SQL Server 並執行命令:

    SQLCMD -E -S<servername> -i"C:\Program Files\Microsoft SQL Server\MSSQLXX.INSTANCE_NAME\MSSQL\Install\instmsdb.sql" -o"C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Install\instmsdb.out"
    

    以資料庫引擎執行個體取代 <servername>。 使用 SQL Server 執行個體的檔案系統路徑。 此外,以對應版本和執行個體的目錄,取代 MSSQLXX.INSTANCE_NAME

  7. 使用 [Windows 記事本] 開啟 instmsdb.out 檔,並檢查輸出是否有任何錯誤。

  8. 重新套用安裝在執行個體上的任何 CU,將您的 msdb 資料庫升級至目前的 CU 層級。

  9. 重新建立儲存在 msdb 資料庫的使用者內容,例如工作、警示等。

  10. 備份 msdb 資料庫。

重建 tempdb 資料庫

如果 tempdb 資料庫損毀或不可信,而且無法啟動資料庫引擎,您可以重建 tempdb,而不必重建所有系統資料庫。

  1. 如果沒有遺漏,請重新命名目前的 tempdb.mdftemplog.ldf 檔案。

  2. 使用下列命令,從命令提示字元啟動 SQL Server。

    sqlservr -c -f -T3608 -T4022 -s <instance> -mSQLCMD
    

    如果是預設執行個體名稱,請使用 MSSQLSERVER,如果是具名執行個體,請使用 MSSQL$<instance_name>。 追蹤旗標 4022 會停用啟動預存程序的執行。 -mSQLCMD 只有 sqlcmd.exe 可連線伺服器。 如需詳細資訊,請參閱其他啟動選項

    注意

    啟動 SQL Server 後,請務必保持命令提示字元視窗開啟。 關閉命令提示字元視窗將會終止流程。

  3. 使用 sqlcmd 連線伺服器,然後使用下列預存程序重設 tempdb 資料庫的狀態。

    exec master..sp_resetstatus tempdb
    
  4. 在命令提示字元視窗中按 Ctrl+C,關閉伺服器。

  5. 重新啟動 SQL Server 服務。 這會建立一組新的 tempdb 資料庫檔案,並復原 tempdb 資料庫。

疑難排解重建錯誤

語法和其他執行階段錯誤會顯示在 [命令提示字元] 視窗中。 您可以檢查安裝程式陳述式是否有下列語法錯誤:

  • 每個參數名稱開頭遺漏斜線符號 (/)。

  • 參數名稱與參數值間遺漏等號 (=)。

  • 在參數名稱與等號之間存在空格。

  • 存在逗號 (,) 或語法未指定的其他字元。

完成重建作業後,請檢查 SQL Server 記錄是否有任何錯誤。 預設的記錄位置為 C:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\Logs。 若要找出包含重建程序結果的記錄檔,請在命令提示字元中,將目錄變更為 Logs 資料夾,然後執行 findstr /s RebuildDatabase summary*.*。 這項搜尋將會為您指出包含重建系統資料庫結果的任何記錄檔。 您可以開啟這些記錄檔,然後檢查它們是否有相關的錯誤訊息。

另請參閱