ユーザー データベースの移動

適用対象: SQL Server

SQL Server では、ALTER DATABASE ステートメントの FILENAME 句で新しいファイルの場所を指定することで、ユーザー データベースのデータ ファイル、ログ ファイル、およびフルテキスト カタログ ファイルを新しい場所に移動することができます。 この方法は、同じ SQL Server インスタンス内でデータベース ファイルを移動する場合に使用できます。 SQL Server の別のインスタンス、または別のサーバーにデータベースを移動するには、バックアップと復元操作かデタッチとアタッチ操作を使用します。

Note

この記事では、ユーザーのデータベース ファイルの移動について説明します。 システム データベース ファイルを移動する方法については、「システム データベースの移動」を参照してください。

考慮事項

データベースを別のサーバー インスタンスに移動するときは、ユーザーおよびアプリケーションに一貫した使用環境を提供するために、データベースのメタデータの一部またはすべてを作成し直す必要が生じる場合があります。 詳細については、「データベースを別のサーバーで使用できるようにするときのメタデータの管理」を参照してください。

SQL Server データベース エンジンの一部の機能は、がデータベース ファイルに情報を格納する方法を変更します。 これらの機能は、SQL Server の特定のエディションでのみ使用できます。 これらの機能を備えたデータベースを、それらをサポートしない SQL Server のエディションに移動することはできません。 現在のデータベースで有効なエディション固有の機能をすべて一覧表示するには、sys.dm_db_persisted_sku_features 動的管理ビューを使用します。

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

フルテキスト カタログは、ファイル システムに格納されるのではなく、データベースに統合されています。 フルテキスト カタログは、データベースの移動時に自動的に移動されます。

Note

Windows サービス アカウントとアクセス許可の構成のサービス アカウントに、ファイル システム内の新しいファイルの場所に対するアクセス許可があることを確認します。 詳細については、「データベース エンジン アクセスのファイル システム権限の構成」を参照してください。

計画に従った再配置の手順

計画に従った再配置の一環としてデータ ファイルやログ ファイルを移動するには、次の手順を実行します。

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

    ALTER DATABASE database_name
        MODIFY FILE (NAME = logical_name, FILENAME = 'new_path\os_file_name');
    
  2. 次のステートメントを実行して、データベースをオフラインにします。

    ALTER DATABASE database_name
        SET OFFLINE;
    

    この操作には、データベースへの排他アクセスが必要です。 データベースに対して別の接続が開かれている場合、すべての接続が閉じられるまで ALTER DATABASE ステートメントはブロックされます。 この動作をオーバーライドするには、WITH <termination>を使用します。 たとえば、データベースへの他のすべての接続を自動的にロールバックして切断するには、次のように使用します。

    ALTER DATABASE database_name
         SET OFFLINE
         WITH ROLLBACK IMMEDIATE;
    
  3. ファイルを新しい場所に移動します。

  4. 次のステートメントを実行します。

    ALTER DATABASE database_name
        SET ONLINE;
    
  5. 次のクエリを実行して、ファイルが変更されたことを確認します。

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

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

スケジュールされたディスク メンテナンスの一環としてファイルを再配置するには、次の手順を実行します。

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

    ALTER DATABASE database_name
        MODIFY FILE (NAME = logical_name, FILENAME = 'new_path\os_file_name');
    
  2. メンテナンスを行うために、SQL Server のインスタンスを停止するか、システムをシャットダウンします。 「SQL Server サービスの開始、停止、一時停止、再開、および再起動」をご覧ください。

  3. ファイルを新しい場所に移動します。

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

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

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

障害復旧の手順

ハードウェア障害が原因でファイルを移動する必要がある場合、次の手順に従って別の場所にファイルを再配置します。

重要

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

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

  2. コマンド プロンプトで次のいずれかのコマンドを入力し、SQL Server のインスタンスを master 限定の復旧モードで開始します。

  3. 移動対象の各ファイルに対して、sqlcmd コマンドか SQL Server Management Studio を使用して、次のステートメントを実行します。

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

    sqlcmd ユーティリティの使用方法については、「sqlcmd - ユーティリティの使用」を参照してください。

  4. sqlcmd ユーティリティまたは SQL Server Management Studio を終了します。

  5. SQL Server のインスタンスを停止します。

  6. ファイルを新しい場所に移動します。

  7. SQL Server のインスタンスを起動します。 たとえば、 NET START MSSQLSERVERを実行します。

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

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

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

  1. master データベースのコンテキストを使用していることを確認します。

    USE master;
    GO
    
  2. 論理ファイル名を返します。

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'AdventureWorks2022')
          AND type_desc = N'LOG';
    GO
    
  3. データベースをオフラインにします。

    ALTER DATABASE AdventureWorks2022
        SET OFFLINE;
    GO
    
  4. ファイルを新しい場所に物理的に移動します。 次のステートメントで、FILENAME で指定したパスをサーバー上でファイルの新しい場所に変更します。

    ALTER DATABASE AdventureWorks2022
        MODIFY FILE (NAME = AdventureWorks2022_Log, FILENAME = 'C:\NewLoc\AdventureWorks2022_Log.ldf');
    GO
    
    ALTER DATABASE AdventureWorks2022
        SET ONLINE;
    GO
    
  5. 新しい場所を確認します。

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'AdventureWorks2022')
          AND type_desc = N'LOG';