システム データベースの移動

適用対象: SQL Server

この記事では、SQL Server のシステム データベースを移動する方法について説明します。 システム データベースの移動は、次のような場合に役立つことがあります。

  • 障害復旧。 たとえば、ハードウェア障害により、データベースが問題のあるモードになっている場合や、シャットダウンされた場合など。

  • 計画に従った再配置。

  • スケジュールされたディスク メンテナンスとしての再配置。

次の手順は、SQL Server の同じインスタンス内でデータベース ファイルを移動する場合に適用されます。 SQL Server の別のインスタンスにデータベースを移動する場合や、別のサーバーに移動する場合は、バックアップと復元操作を使用します。

この記事の手順では、データベース ファイルの論理名が必要です。 論理名を取得するには、 sys.master_files カタログ ビューで name 列に対するクエリを実行します。

重要

システム データベースを移動した後に master データベースを再構築すると、すべてのシステム データベースがそれぞれ既定の場所にインストールされるため、システム データベースを再度移動する必要があります。

システム データベースの移動

計画に従った再配置やスケジュールされたメンテナンス操作の中でシステム データベースのデータ ファイルやログ ファイルを移動するには、次の手順を実行します。 これには、modelmsdbtempdb のシステム データベースが含まれます。

重要

この手順は、master データベースと Resource データベース以外のすべてのシステム データベースに適用されます。 master データベースを移動する手順については、この記事の後半を参照してください。 Resource データベースは移動できません。

  1. sys.master_files カタログ ビューを確認して、移動するデータベース ファイルの既存の場所を記録します。

  2. SQL Server データベース エンジンのサービス アカウントに、ファイルの新しい場所への完全なアクセス許可があることを確認します。 詳細については、「Windows サービス アカウントと権限の構成」を参照してください。 データベース エンジン サービス アカウントが新しい場所のファイルを制御できない場合、SQL Server インスタンスは起動しません。

  3. 移動対象のそれぞれのデータベース ファイルに対して、次のステートメントを実行します。

    ALTER DATABASE database_name
        MODIFY FILE (NAME = logical_name, FILENAME = 'new_path\os_file_name');
    

    サービスを再起動するまでは、データベースは既存の場所のデータ ファイルとログ ファイルを使い続けます。

  4. SQL Server のインスタンスを停止して、メンテナンスを実行します。 「SQL Server サービスの開始、停止、一時停止、再開、および再起動」をご覧ください。

  5. データベース ファイル (複数可) を新しい場所にコピーします。 この手順は tempdb システム データベースには必要ありません (これらのファイルは、新しい場所に自動的に作成されます)。

  6. SQL Server またはサーバーのインスタンスを再起動します。 「SQL Server サービスの開始、停止、一時停止、再開、および再起動」をご覧ください。

  7. 次のクエリを実行して、ファイルが変更されたことを確認します。 システム データベースは新しい物理ファイルの場所を報告します。

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    
  8. 手順 5 では、データベース ファイルを移動せずにコピーしたので、これで使われていないデータベース ファイルを以前の場所から安全に削除することができます。

補足情報: msdb システム データベースを移動した後

msdb データベースを移動し、データベース メールを構成した場合、さらに次の手順を実行します。

  1. 次のクエリを実行して、msdb データベースで Service Broker が有効になっていることを確認します。

    SELECT is_broker_enabled
    FROM sys.databases
    WHERE name = N'msdb';
    

    Service Broker が msdb で有効でない場合、データベース メールを機能させるために再度有効にする必要があります。 詳細については、ALTER DATABASE ... SET ENABLE_BROKER に関するページを参照してください。

    ALTER DATABASE msdb
        SET ENABLE_BROKER
        WITH ROLLBACK IMMEDIATE;
    

    is_broker_enabled の値が 1 になっていることを確認します。

  2. テスト メールを送信して、データベース メールが動作していることを確認します。

障害復旧の手順

ハードウェア障害が原因でファイルを移動する必要がある場合、次の手順に従って別の場所にファイルを再配置します。 この手順は、master データベースと Resource データベース以外のすべてのシステム データベースに適用されます。 次の例では、Windows のコマンドライン プロンプトと sqlcmd ユーティリティを使います。

重要

データベースを起動できないとき、データベースが問題のあるモードか復旧できない状態にある場合、ファイルを移動できるのは、sysadmin 固定ロールのメンバーだけです。

  1. SQL Server データベース エンジンのサービス アカウントに、ファイルの新しい場所への完全なアクセス許可があることを確認します。 詳細については、「Windows サービス アカウントと権限の構成」を参照してください。 データベース エンジン サービス アカウントが新しい場所のファイルを制御できない場合、SQL Server インスタンスは起動しません。

  2. SQL Server のインスタンスが起動していたら停止します。

  3. コマンド プロンプトで次のいずれかのコマンドを入力し、SQL Server のインスタンスを master 限定の復旧モードで開始します。 起動パラメーター 3608 を使うと、SQL Server が master データベース以外のデータベースを自動的に起動し、復旧するのを防ぐことができます。 詳細については、起動パラメーターTF3608 に関する記事を参照してください。

    これらのコマンドで指定されるパラメーターでは、大文字と小文字が区別されます。 パラメーターが次のように指定されていない場合、コマンドは失敗します。

    既定 (MSSQLSERVER) のインスタンスの場合は、次のコマンドを実行します。

    NET START MSSQLSERVER /f /T3608
    

    名前付きインスタンスの場合は、次のコマンドを実行します。

    NET START MSSQL$instancename /f /T3608
    

    「SQL Server サービスの開始、停止、一時停止、再開、および再起動」をご覧ください。

  4. トレース フラグ 3608 と /f でサービスを起動した後すぐに、sqlcmd でサーバーへの接続を開始し、利用可能な単一の接続を要求します。 たとえば、既定 (MSSQLSERVER) インスタンスと同じサーバーでローカルに sqlcmd を実行し、Active Directory 統合認証で接続する場合、次のコマンドを実行します。

    sqlcmd
    

    ローカル サーバー上の名前付きインスタンスに、Active Directory 統合認証で接続するには、次のようにします。

    sqlcmd -S localhost\instancename
    

    sqlcmd の構文の詳細については、「sqlcmd utility」を参照してください。

    移動対象の各ファイルに対して、sqlcmd コマンドか SQL Server Management Studio を使用して、次のステートメントを実行します。 sqlcmd ユーティリティの使用方法については、「sqlcmd - ユーティリティを使用する」を参照してください。 sqlcmd セッションを開いたら、移動するファイルごとに以下のステートメントを 1 回ずつ実行します。

    ALTER DATABASE database_name
        MODIFY FILE (NAME = logical_name, FILENAME = 'new_path\os_file_name');
    GO
    
  5. sqlcmd ユーティリティまたは SQL Server Management Studio を終了します。

  6. SQL Server のインスタンスを停止します。 たとえば、コマンドライン プロンプトで NET STOP MSSQLSERVER を実行します。

  7. ファイル (複数可) を新しい場所にコピーします。

  8. SQL Serverのインスタンスを再起動します。 たとえば、コマンドライン プロンプトで NET START MSSQLSERVER を実行します。

  9. 次のクエリを実行して、ファイルが変更されたことを確認します。

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    
  10. 手順 7 では、データベース ファイルを移動せずにコピーしたので、これで使われていないデータベース ファイルを以前の場所から安全に削除することができます。

master データベースの移動

master データベースを移動するには、次の手順を実行します。

  1. SQL Server データベース エンジンのサービス アカウントに、ファイルの新しい場所への完全なアクセス許可があることを確認します。 詳細については、「Windows サービス アカウントと権限の構成」を参照してください。 データベース エンジン サービス アカウントが新しい場所のファイルを制御できない場合、SQL Server インスタンスは起動しません。

  2. [スタート] メニューから [SQL Server 構成マネージャー] を見つけて起動します。 予期される場所の詳細については、「SQL Server 構成マネージャー」を参照してください。

  3. SQL Server Services ノードで、SQL Server のインスタンス (たとえば、SQL Server (MSSQLSERVER)) を右クリックし、プロパティをクリックします。

  4. [SQL Server (instance_name) のプロパティ] ダイアログ ボックスで、[起動時のパラメーター] タブを選びます。

  5. [既存のパラメーター] ボックスで、-d パラメーターを選びます。 [起動時のパラメーターの指定] ボックスで、パラメーターを master "データ" ファイルの新しいパスに変更します。 [更新] を選んで変更を保存します。

  6. [既存のパラメーター] ボックスで、-l パラメーターを選びます。 [起動時のパラメーターの指定] ボックスで、パラメーターを master "ログ" ファイルの新しいパスに変更します。 [更新] を選んで変更を保存します。

    -d パラメーターの後にデータ ファイルのパラメーター値を指定し、 -l パラメーターの後にログ ファイルのパラメーター値を指定します。 次の例は、master データ ファイルの既定の場所のパラメーター値を示します。

    -dC:\Program Files\Microsoft SQL Server\MSSQL<version>.MSSQLSERVER\MSSQL\DATA\master.mdf
    -lC:\Program Files\Microsoft SQL Server\MSSQL<version>.MSSQLSERVER\MSSQL\DATA\mastlog.ldf
    

    master データ ファイルの計画に従った再配置場所が E:\SQLData の場合、パラメーター値を次のように変更します。

    -dE:\SQLData\master.mdf
    -lE:\SQLData\mastlog.ldf
    
  7. [OK] を選んで変更を永続的に保存し、[SQL Server (instance_name) プロパティ] ダイアログ ボックスを閉じます。

  8. SQL Server のインスタンス名を右クリックして [停止] をクリックし、インスタンスを停止します。

  9. ファイル master.mdfmastlog.ldf(複数可) を新しい場所にコピーします。

  10. SQL Serverのインスタンスを再起動します。

  11. master データベースのファイルが変更されたことを確認するため、次のクエリを実行します。

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID('master');
    
  12. この時点で、SQL Server は通常どおり実行されるはずです。 ただし、Microsoft では、 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\instance_ID\Setup( instance_IDMSSQL13.MSSQLSERVERのようになります) のレジストリ エントリを調整することもお勧めします。 そのハイブで、SQLDataRoot 値を master データベース ファイルの新しい場所の新しいパスに 変更します。 レジストリの更新に失敗すると、修正プログラムの適用やアップグレードが失敗する可能性があります。

  13. 手順 9 では、データベース ファイルを移動せずにコピーしたので、これで使われていないデータベース ファイルを以前の場所から安全に削除することができます。

Resource データベースの移動

Resource データベースの場所は \<drive>:\Program Files\Microsoft SQL Server\MSSQL\<version>.<instance_name>\MSSQL\Binn\ です。 データベースは移動できません。

補足情報: すべてのシステム データベースを移動した後

すべてのシステム データベースを新しいドライブやボリューム、または別のドライブ文字を使用する別のサーバーに移動した場合は、次の更新を行います。

  • SQL Server エージェントのログ パスを変更します。 このパスを更新しないと、SQL Server エージェントは起動しません。

  • データベースの既定の場所を変更します。 既定の場所として指定したドライブ文字やパスが存在しない場合、新しいデータベースが作成されない可能性があります。

SQL Server エージェントのログ パスの変更

すべてのシステム データベースを新しいボリュームに移動した場合、または別のドライブ文字を使用した別のサーバーに移行した場合、SQL Agent エラー ログ ファイル SQLAGENT.OUT のパスが存在しなくなった場合は、次の更新を行います。

  1. SQL Server Management Studio のオブジェクト エクスプローラーで、[SQL Server エージェント] を展開します。

  2. [エラー ログ] を右クリックし、[構成] を選びます。

  3. [SQL Server エージェント エラー ログの構成] ダイアログ ボックスで、SQLAGENT.OUT ファイルの新しい場所を指定します。 既定の場所は C:\Program Files\Microsoft SQL Server\MSSQL\<version>.<instance_name>\MSSQL\Log\ です。

データベースの既定の場所の変更

  1. SQL Server Management Studio の オブジェクト エクスプローラーから、目的の SQL Server インスタンスに接続します。 インスタンスを右クリックし、 [プロパティ]をクリックします。

  2. [サーバーのプロパティ] ダイアログ ボックスで、 [データベースの設定]を選択します。

  3. [データベースの既定の場所]で、データ ファイルとログ ファイルの両方の新しい場所を参照します。

  4. 変更を完了するため、SQL Server サービスをいったん停止してから開始します。

A. tempdb データベースの移動

次の例では、計画に従った再配置の一環として、 tempdb データ ファイルとログ ファイルを新しい場所に移動します。

ヒント

この機会に、tempdb ファイルのサイズと配置が最適かどうかを確認してください。 詳細については、「SQL Server の tempdb のパフォーマンスの最適化」を参照してください。

tempdb は SQL Server のインスタンスが開始されるたびに再作成されるので、データ ファイルとログ ファイルを物理的に移動する必要はありません。 手順 4 でサービスを再起動すると、新しい場所にファイルが作成されます。 サービスを再起動するまでは、tempdb は既存の場所のデータ ファイルとログ ファイルを使い続けます。

  1. tempdb データベースの論理ファイル名と、ディスク上での現在の場所を確認します。

    SELECT name,
           physical_name AS CurrentLocation
    FROM sys.master_files
    WHERE database_id = DB_ID(N'tempdb');
    GO
    
  2. SQL Server データベース エンジンのサービス アカウントに、ファイルの新しい場所への完全なアクセス許可があることを確認します。 詳細については、「Windows サービス アカウントと権限の構成」を参照してください。 データベース エンジン サービス アカウントが新しい場所のファイルを制御できない場合、SQL Server インスタンスは起動しません。

  3. ALTER DATABASEを使用して、各ファイルの場所を変更します。

    USE master;
    GO
    
    ALTER DATABASE tempdb
        MODIFY FILE (NAME = tempdev, FILENAME = 'E:\SQLData\tempdb.mdf');
    GO
    
    ALTER DATABASE tempdb
        MODIFY FILE (NAME = templog, FILENAME = 'F:\SQLLog\templog.ldf');
    GO
    

    サービスを再起動するまでは、tempdb は既存の場所のデータ ファイルとログ ファイルを使い続けます。

  4. SQL Server のインスタンスをいったん停止してから起動します。

  5. ファイルの変更を確認します。

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'tempdb');
    
  6. 使われていない tempdb ファイルを元の場所から削除します。