システム データベースを再構築する
適用対象: SQL Server
master、model、msdb、または resource の各システム データベースの損傷による問題を解決したり、既定のサーバー レベルの照合順序を変更したりするには、システム データベースを再構築する必要があります。 このトピックでは、SQL Server でシステム データベースを再構築する手順について説明します。
この記事は、インデックスのリビルド とは関係ありません。
制限事項
master
、model
、msdb
、tempdb
の各システム データベースを再構築する場合は、元の場所からデータベースを削除して再作成する必要があります。 再構築ステートメントに新しい照合順序を指定する場合は、その照合順序の設定でシステム データベースが作成されます。 これらのデータベースに対するユーザーの変更はすべて失われます。 たとえば、master
データベースのユーザー定義オブジェクト、msdb
にスケジュールされたジョブ、または model
データベースの既定のデータベース設定に対する変更が対象になります。
前提条件
システム データベースを再構築する前に次の作業を行い、システム データベースを現在の設定に復元できるようにしておいてください。
サーバー全体のすべての構成値を記録します。
SELECT * FROM sys.configurations;
SQL Server のインスタンスと現在の照合順序に適用されているすべての修正プログラムを記録します。 システム データベースの再構築後にこれらの修正プログラムを再適用する必要があります。
SELECT SERVERPROPERTY('ProductVersion ') AS ProductVersion, SERVERPROPERTY('ProductLevel') AS ProductLevel, SERVERPROPERTY('ResourceVersion') AS ResourceVersion, SERVERPROPERTY('ResourceLastUpdateDateTime') AS ResourceLastUpdateDateTime, SERVERPROPERTY('Collation') AS Collation;
システム データベースのすべてのデータとログ ファイルの現在の場所を記録します。 システム データベースを再構築すると、すべてのシステム データベースがそれぞれ元の場所にインストールされます。 システム データベースのデータまたはログ ファイルを別の場所に移動していた場合は、そのファイルを再度移動する必要があります。
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'));
master
、model
、msdb
の各データベースの現在のバックアップを探します。SQL Server のインスタンスがレプリケーション ディストリビューターとして構成されている場合は、
distribution
データベースの現在のバックアップを探します。システム データベースの再構築に必要な権限を持っていることを確認してください。 この操作を実行するには、 sysadmin 固定サーバー ロールのメンバーである必要があります。 詳細については、「 サーバー レベルのロール」を参照してください。
master
、model
、msdb
のデータおよびログのテンプレート ファイルのコピーがローカル サーバーに存在することを確認します。 テンプレート ファイルの既定の場所は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
に移動します。
システム データベースを再構築する
次の手順では、master
、model
、msdb
、tempdb
のシステム データベースを再構築します。 再構築するシステム データベースを指定することはできません。 クラスター化されたインスタンスの場合、この手順はアクティブ ノードで実行する必要があります。また、手順を実行する前に、対応するクラスター アプリケーション グループ内のSQL Server リソースをオフラインにしておく必要があります。
この手順では resource
データベースが再構築されません。 このトピックで後述する「resource データベースの再構築」セクションを参照してください。
SQL Server インスタンスのシステム データベースを再構築する
SQL Server インストーラーのメディアをディスク ドライブに挿入するか、コマンド プロンプトから、ディレクトリをローカル サーバーの
setup.exe
ファイルがある場所に変更します。 SQL Server 2022 (16.x) の場合、サーバー上の既定の場所はC:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\SQLServer2022
です。コマンド プロンプト ウィンドウから、次のコマンドを入力します。 角かっこは省略可能なパラメーターであることを示します。 ブラケットを入力しないでください。 ユーザー アカウント制御 (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
ログ ファイルのディレクトリを指定します。
既定値: システム データ ディレクトリセットアップによりシステム データベースの再構築が完了すると、メッセージが表示されることなく、コマンド プロンプトに戻ります。 Summary.txt ログ ファイルを調査し、プロセスが正常に完了したことを確認します。 このファイルは
C:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\Logs
に配置されます。RebuildDatabase シナリオでは、システム データベースが削除され、クリーンな状態で再インストールされます。
tempdb
ファイルの数の設定は保持されないため、tempdb
ファイルの数の値をセットアップ中に知ることはできません。 そのため、RebuildDatabase シナリオでは再度追加されるtempdb
ファイルの数を特定できません。tempdb
ファイルの数の値は、SQLTEMPDBFILECOUNT パラメーターで再度指定できます。 パラメーターが指定されていない場合、RebuildDatabase により、既定の数のtempdb
ファイルが追加されます。これは、CPU の数と同数のtempdb
ファイルまたは 8 のうち少ない方の数です。
再構築後の作業
データベースを再構築した後は、次の追加作業の実行が必要になる場合があります。
master
、model
、およびmsdb
の各データベースの、最新の完全バックアップを復元します。 詳細については、「システム データベースのバックアップと復元 (SQL Server)」を参照してください。重要
サーバー照合順序を変更した場合は、システム データベースを復元しないでください。 復元すると、新しい照合順序が元の照合順序の設定に置き換わります。
バックアップが存在しないか、復元されたバックアップが最新のものでない場合は、欠けているエントリを再作成します。 たとえば、ユーザー データベース、バックアップ デバイス、SQL Server ログイン、エンドポイントなどの存在しないエントリをすべて再作成します。 エントリを再作成する場合、エントリの作成時と同じスクリプトを実行してください。
重要
不正ユーザーによる変更を防ぐために、スクリプトを保護しておくことをお勧めします。
SQL Server のインスタンスがレプリケーション ディストリビューターとして構成されている場合は、
distribution
データベースを復元する必要があります。 詳細については、「 レプリケートされたデータベースのバックアップと復元」を参照してください。システム データベースを記録した以前の場所に移動します。 詳細については、「 システム データベースの移動」を参照してください。
サーバー全体の構成値が記録した以前の値と一致することを確認します。
リソース データベースを再構築する
次の手順では、resource
システム データベースを再構築します。 resource
データベースを再構築する際にすべてのホット フィックスが失われるため、再適用する必要があります。
リソース システム データベースを再構築する
配布メディアから、SQL Server セットアップ プログラム (
setup.exe
) を起動します。左側のナビゲーション領域で [メンテナンス]を選択し、[修復]を選択します。
セットアップ サポート ルールおよびセットアップ サポート ファイルのルーチンが実行されて、システムに必須コンポーネントがインストールされていること、およびコンピューターがセットアップの検証ルールに合格していることが確認されます。 [OK] または [インストール] を選択して続行します。
[インスタンスの選択] ページで、修復するインスタンスを選択し、[次へ]を選択します。
修復ルールが実行され、操作が検証されます。 続けるには、[次へ] を選択します。
[修復の準備完了] ページで [修復]を選択します。 [完了] ページでは、操作が完了したことが示されます。
新しい msdb データベースを作成する
msdb
データベースが破損したか、疑わしい状態の場合に、msdb
データベースのバックアップがなければ、msdb
スクリプトで新しい instmsdb
データベースを作成することができます。
警告
instmsdb.sql
スクリプトを使用して msdb
データベースを再構築すると、ジョブ、警告、オペレーター、メンテナンス計画、バックアップ履歴、ポリシー ベースの管理設定、データベース メール、パフォーマンス データ ウェアハウスなど、msdb
に格納されていた情報がすべて消去されます。
SQL Server エージェント、SSRS、SSIS、SQL Server をデータ ストアとして使用するすべてのアプリケーションなど、データベース エンジンに接続するすべてのサービスを停止します。
コマンド ラインで次のコマンドを実行し、SQL Server を開始します。
NET START MSSQLSERVER /T3608
詳細については、「 データベース エンジン、SQL Server エージェント、SQL Server Browser サービスの開始、停止、一時停止、再開、および再起動 」を参照してください。 Trace Flag 3608 について詳細は、「TF3608」をご覧ください。
別のコマンド ライン ウィンドウで、
msdb
データベースをデタッチします。これには次のコマンドを実行します (<servername>
は SQL Server: のインスタンスに置き換えます)。SQLCMD -E -S<servername> -dmaster -Q"EXEC sp_detach_db msdb"
Windows エクスプローラーを使用して、
msdb
データベースの各ファイルの名前を変更します。 これらのファイルは、既定で SQL Server インスタンスの DATA サブフォルダーにあります。SQL Server 構成マネージャーを使用して、追加のトレース フラグなしでデータベース エンジン サービスを通常どおり停止して再起動します。
コマンド プロンプト ウィンドウで 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
をバージョンとインスタンスに対応するディレクトリに置き換えます。Windows のメモ帳を使用して
instmsdb.out
ファイルを開き、エラーの出力を確認します。インスタンスにインストールされている CU を再適用すると、
msdb
データベースが現在の CU レベルにアップグレードされます。ジョブや警告など、
msdb
データベースに格納されていたユーザー コンテンツを再作成します。msdb
データベースをバックアップします。
tempdb データベースをリビルドする
tempdb
データベースが破損していて、データベース エンジンを起動できない場合に、すべてのシステム データベースをリビルドすることなく、tempdb
をリビルドすることができます。
現在の
tempdb.mdf
ファイルおよびtemplog.ldf
ファイルが欠落していない場合は、名前を変更します。sqlservr アプリケーション を使用して、コマンド プロンプトから SQL Server を起動します。
sqlservr -c -f -T3608 -T4022 -s <instance> -mSQLCMD
既定のインスタンス名の場合
MSSQLSERVER
、名前付きインスタンス場合はMSSQL$<instance_name>
を使用します。 トレース フラグ 4022 によって、スタートアップ ストアド プロシージャの実行が無効になります。-mSQLCMD
では、sqlcmd.exe のみがサーバーに接続できます。 詳細については、「他の開始オプション」を参照してください。Note
SQL Server が開始された後も、コマンド プロンプト ウィンドウが開いたままになっていることを確認してください。 コマンド プロンプト ウィンドウを閉じると、プロセスが終了します。
sqlcmd を使用してサーバーに接続し、次のストアド プロシージャを使用して
tempdb
データベースの状態をリセットします。exec master..sp_resetstatus tempdb
コマンド プロンプト ウィンドウで
Ctrl
+C
を押下してサーバーをシャットダウンします。SQL Server サービスを再起動します。 これにより、
tempdb
データベース ファイルの新しいセットが作成され、tempdb
データベースが復旧します。
再構築エラーのトラブルシューティング
コマンド プロンプト ウィンドウには、構文エラーおよびその他の実行時エラーが表示されます。 セットアップ ステートメントに次の構文エラーがないか調査してください。
パラメーター名の前のスラッシュ記号 (
/
) の欠如。パラメーター名とパラメーター値の間の等号 (
=
) の欠如。パラメーター名と等号の間の空白文字の存在。
構文に指定されていないコンマ (
,
) またはその他の文字の存在。
再構築操作が完了した後で、SQL Server ログにエラーがないか調査します。 既定の場所は C:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\Logs
です。 再構築プロセスの結果を含むログ ファイルを探すには、ディレクトリをコマンド プロンプトから Logs フォルダーに変更し、 findstr /s RebuildDatabase summary*.*
を実行します。 この検索により、システム データベースの再構築結果を含むログ ファイルが検出されます。 ログ ファイルを開き、該当するエラー メッセージがないか調査します。