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

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

注意

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

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

注意

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

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

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

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

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

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

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name, FILENAME = 'new_path\os_file_name' );
    
  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 のインスタンスを停止するか、システムをシャットダウンします。詳細については、「サービスの停止」を参照してください。

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

  4. 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 のみを復旧するモードで開始します。

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

      NET START MSSQLSERVER /f /T3608
      
    • 名前付きインスタンスの場合は、次のコマンドを実行します。

      NET START MSSQL$instancename /f /T3608
      

    詳細については、「SQL Server のインスタンスを起動する方法 (net コマンド)」を参照してください。

  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>');
    

使用例

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

USE master;
GO
-- Return the logical file name.
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'AdventureWorks2008R2')
    AND type_desc = N'LOG';
GO
ALTER DATABASE AdventureWorks2008R2 SET OFFLINE;
GO
-- Physically move the file to a new location.
-- In the following statement, modify the path specified in FILENAME to
-- the new location of the file on your server.
ALTER DATABASE AdventureWorks2008R2 
    MODIFY FILE ( NAME = AdventureWorks2008R2_Log, 
                  FILENAME = 'C:\NewLoc\AdventureWorks2008R2_Log.ldf');
GO
ALTER DATABASE AdventureWorks2008R2 SET ONLINE;
GO
--Verify the new location.
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'AdventureWorks2008R2')
    AND type_desc = N'LOG';