デタッチとアタッチを使用してデータベースを移動する方法 (Transact-SQL)

重要な注意事項重要

データベースを移動するときは、デタッチとアタッチではなく、ALTER DATABASE による計画的再配置用のプロシージャを使用することをお勧めします。詳細については、「ALTER DATABASE (Transact-SQL)」を参照してください。

デタッチしたデータベースは、別の場所に移動し、同じまたは異なるサーバー インスタンスに再アタッチできます。

セキュリティに関する注意セキュリティに関する注意

不明なソースや信頼されていないソースからのデータベースは、アタッチまたは復元しないことをお勧めします。そのようなデータベースには、意図しない Transact-SQL コードを実行したり、スキーマまたは物理データベース構造を変更することによりエラーを発生させる悪意のあるコードが含まれている可能性があるからです。不明なソースや信頼されていないソースのデータベースは、使用する前に、運用に使用していないサーバーでそのデータベースに対し DBCC CHECKDB を実行し、さらに、そのデータベースのストアド プロシージャやその他のユーザー定義コードなどのコードを調べます。

フルテキスト カタログ ファイルを含む SQL Server 2005 データベースを SQL Server 2008 サーバー インスタンスにアタッチする場合、カタログ ファイルは SQL Server 2005 と同様に他のデータベース ファイルと一緒に以前の場所からアタッチされます。詳細については、「フルテキスト検索のアップグレード」を参照してください。フルテキスト カタログ ファイルを含むアップグレードされた SQL Server 2005 データベースを SQL Server 2008 サーバー インスタンスからデタッチする場合、カタログ ファイルは SQL Server 2005 と同様に他のデータベース ファイルと一緒に保持されます。

注意注意

デタッチとアタッチを使用して、SQL Server 2000 または SQL Server 2005 データベースを SQL Server 2008 にアップグレードすることもできます。詳細については、「デタッチとアタッチを使用してデータベースをアップグレードする方法 (Transact-SQL)」を参照してください。

手順

デタッチとアタッチを使用してデータベースをコピーするには

  1. sp_detach_db ストアド プロシージャを使用してデータベースをデタッチします。

  2. Windows エクスプローラまたは Windows コマンド プロンプト ウィンドウで、デタッチされたデータベース ファイルとログ ファイルを新しい場所に移動します。

    注意注意

    単一ファイルのデータベースを移動する場合は、電子メールを使用できます。ただし、ファイル サイズが電子メールで対応できる大きさである場合に限られます。

    新しいログ ファイルを作成する場合でも、ログ ファイルを移動する必要があります。場合によっては、データベースの再アタッチに既存のログ ファイルが必要になります。したがって、デタッチしたログ ファイルを使わずにデータベースを正常にアタッチできるまで、デタッチしたログ ファイルは必ずすべて保管しておいてください。

    注意注意

    ログ ファイルを指定せずにデータベースのアタッチを試みると、アタッチ操作は元の場所でログ ファイルを検索します。ログのコピーが依然として元の場所にある場合は、そのコピーがアタッチされます。元のログ ファイルが使用されないようにするには、新しいログ ファイルのパスを指定するか、ログ ファイルの元のコピーを (新しい場所にコピーした後で) 削除します。

  3. CREATE DATABASE Transact-SQL ステートメントを使用して FOR ATTACH [ WITH <service_broker_option> ] 句または FOR ATTACH_REBUILD_LOG 句 (詳細については、「CREATE DATABASE (Transact-SQL)」を参照してください) を指定し、コピーされたファイルをアタッチします。各データベースには、Service Broker メッセージをそのデータベースにルーティングする際に使用する一意識別子が含まれています。データベースで Service Broker を使用する場合は、「Service Broker の ID の管理」を参照してください。

    注意注意

    オブジェクト エクスプローラを使用したデータベースのアタッチの詳細については、「データベースをアタッチする方法 (SQL Server Management Studio)」を参照してください。

次の例では、MyAdventureWorks という AdventureWorks データベースのコピーを作成しています。Transact-SQL ステートメントは、AdventureWorks をアタッチするサーバー インスタンスに接続されたクエリ エディタ ウィンドウで実行しています。

  1. 次の Transact-SQL ステートメントを実行して AdventureWorks データベースをデタッチします。

    USE master;
    GO
    EXEC sp_detach_db @dbname = N'AdventureWorks';
    GO
    
  2. 任意の方法で、データベース ファイル (AdventureWorks_Data.mdf と AdventureWorks_log) を C:\MySQLServer\AdventureWorks_Data.mdf と C:\MySQLServer\AdventureWorks_Log.ldf にそれぞれコピーします。

    重要な注意事項重要

    実稼動データベースの場合は、データベースとトランザクション ログを別のディスクに配置します。

    ファイルをネットワーク経由でリモート コンピュータのディスクにコピーするには、そのリモート コンピュータの UNC (Universal Naming Convention) 名を使用します。UNC 名の形式は、**\\Servername\Sharename\Path\**Filename です。ローカル ハード ディスクにファイルを書き込む場合と同様、リモート ディスクでのファイルの読み取りや書き込みに必要な適切な権限が、SQL Server のインスタンスで使用するユーザー アカウントに許可されている必要があります。

  3. 次の Transact-SQL ステートメントを使用して、移動したデータベースとログをアタッチします (ログのアタッチは省略できます)。

    USE master;
    GO
    CREATE DATABASE MyAdventureWorks 
        ON (FILENAME = 'C:\MySQLServer\AdventureWorks_Data.mdf'),
        (FILENAME = 'C:\MySQLServer\AdventureWorks_Log.ldf')
        FOR ATTACH;
    GO
    
    注意注意

    SQL Server Management Studio では、新しくアタッチされたデータベースはオブジェクト エクスプローラにすぐに表示されません。このデータベースを表示するには、オブジェクト エクスプローラで、[表示] をクリックし、[最新の情報に更新] をクリックします。オブジェクト エクスプローラの [データベース] ノードを展開すると、データベースの一覧に新しくアタッチされたデータベースが表示されるようになります。