デタッチとアタッチを使用してデータベースを移動する方法 (Transact-SQL)
重要 : |
---|
データベースを移動するときは、デタッチとアタッチではなく、ALTER DATABASE による計画的再配置用のプロシージャを使用することをお勧めします。詳細については、「ALTER DATABASE (Transact-SQL)」を参照してください。 |
デタッチしたデータベースは、別の場所に移動し、同じまたは異なるサーバー インスタンスに再アタッチできます。
セキュリティ メモ : |
---|
不明なソースや信頼されていないソースからのデータベースは、アタッチまたは復元しないことをお勧めします。そのようなデータベースには、意図しない Transact-SQL コードを実行したり、スキーマまたは物理データベース構造を変更することによりエラーを発生させる悪意のあるコードが含まれている可能性があるからです。不明なソースや信頼されていないソースのデータベースは、使用する前に、運用に使用していないサーバーでそのデータベースに対し DBCC CHECKDB を実行し、さらに、そのデータベースのストアド プロシージャやその他のユーザー定義コードなどのコードを調べます。 |
Microsoft SQL Server 2005 では、sp_detach_db ストアド プロシージャが強化されています。この強化により、データベースをデタッチする際に、データベースに関連付けられているフルテキスト インデックス ファイルが削除されなくなりました。詳細については、「フルテキスト カタログのアタッチとデタッチ」を参照してください。
メモ : |
---|
デタッチとアタッチを使用して、SQL Server 7.0 または SQL Server 2000 データベースを SQL Server 2005 にアップグレードすることもできます。詳細については、「デタッチとアタッチを使用してデータベースをアップグレードする方法 (Transact-SQL)」を参照してください。 |
手順
デタッチとアタッチを使用してデータベースをコピーするには
sp_detach_db ストアド プロシージャを使用してデータベースをデタッチします。
Windows エクスプローラまたは Windows コマンド プロンプト ウィンドウで、デタッチされたデータベース ファイルとログ ファイルを新しい場所に移動します。
メモ : 単一ファイルのデータベースを移動する場合は、電子メールを使用できます。ただし、ファイル サイズが電子メールで対応できる大きさである場合に限られます。 新しいログ ファイルを作成する場合でも、ログ ファイルを移動する必要があります。場合によっては、データベースの再アタッチに既存のログ ファイルが必要になります。したがって、デタッチしたログ ファイルを使わずにデータベースを正常にアタッチできるまで、デタッチしたログ ファイルは必ずすべて保管しておいてください。
メモ : ログ ファイルを指定せずにデータベースのアタッチを試みると、アタッチ操作は元の場所でログ ファイルを検索します。ログのコピーが依然として元の場所にある場合は、そのコピーがアタッチされます。元のログ ファイルが使用されないようにするには、新しいログ ファイルのパスを指定するか、ログ ファイルの元のコピーを (新しい場所にコピーした後で) 削除します。 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
をアタッチするサーバー インスタンスに接続されたクエリ エディタ ウィンドウで実行しています。
次の Transact-SQL ステートメントを実行して
AdventureWorks
データベースをデタッチします。USE master; GO EXEC sp_detach_db @dbname = N'AdventureWorks'; GO
任意の方法で、データベース ファイル (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 のインスタンスで使用するユーザー アカウントに許可されている必要があります。
次の 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 では、新しくアタッチされたデータベースはオブジェクト エクスプローラにすぐに表示されません。このデータベースを表示するには、オブジェクト エクスプローラで、[表示] をクリックし、[最新の情報に更新] をクリックします。オブジェクト エクスプローラの [データベース] ノードを展開すると、データベースの一覧に新しくアタッチされたデータベースが表示されるようになります。