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

適用対象:SQL Server

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

注意

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

考慮事項

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

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

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

SQL Server 2008 R2 (10.50.x) 以降では、フルテキスト カタログは、ファイル システムに格納されるのではなく、データベースに統合されています。 フルテキスト カタログは、データベースの移動時に自動的に移動されるようになりました。

注意

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

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

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

  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 エージェント、SQL Server Browser サービスの開始、停止、一時停止、再開、および再起動 」を参照してください。

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

  4. SQL Server またはサーバーのインスタンスを再起動します。 詳細については、「 データベース エンジン、SQL Server エージェント、SQL Server Browser サービスの開始、停止、一時停止、再開、および再起動」を参照してください。

  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 エージェント、SQL Server Browser サービスの開始、停止、一時停止、再開、および再起動 」を参照してください。

  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 のログ ファイルを新しい場所に移動します。

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'AdventureWorks2022')  
    AND type_desc = N'LOG';  
GO  
ALTER DATABASE AdventureWorks2022 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 AdventureWorks2022   
    MODIFY FILE ( NAME = AdventureWorks2022_Log,   
                  FILENAME = 'C:\NewLoc\AdventureWorks2022_Log.ldf');  
GO  
ALTER DATABASE AdventureWorks2022 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'AdventureWorks2022')  
    AND type_desc = N'LOG';  

参照