デタッチまたはアタッチとは何ですか?
デタッチから始めます。SQL Serverでデータベースをデタッチすると、データベースがオフラインになり、デタッチ元のSQL Serverインスタンスから削除されます。データベースのデータとログファイルはそのまま残り、一貫した状態のままになります。そのため、後でデータベースを別のSQL Serverインスタンスに接続できます。アタッチは、適切にデタッチされた(またはSQL Serverの正常にシャットダウンされたインスタンスからコピーされた)データベースのデータとログファイルをSQL Serverのインスタンスに接続し、データベースをオンラインにします。
データベースをデタッチするにはどうすればよいですか?
これは、T-SQLまたはSQL Server Management Studio GUIから実行できます。
GUIで、デタッチするデータベースを右クリックし、選択してAll Tasks
をクリックしDetach
ます。そこからデタッチダイアログが表示されます。最初に接続をドロップして、アクティブな接続を強制的に切断し、実行中の作業をロールバックすることを選択できます。デタッチ前に統計を更新することもできます。
T-SQLの場合:
-- You don't want to be in the database you are trying to detach
USE Master
GO
-- Optional step to drop all active connections and roll back their work
ALTER DATABASE DatabaseName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
-- Perform the detach
EXEC sp_detach_db 'DatabaseName'
GO
システムストアドプロシージャsp_detach_dbには、オプションで渡すことができる2つのパラメーターがあります。
@skipchecks
-許容される入力は'True'
またはの'False'
場合'True'
、SQL Serverはデタッチ前に統計を更新します。'の場合False'
、実行されません。ここで何も指定しない場合、SQL Server 2005以降で統計が更新されます。
@keepfulltextindexfile
-ここでのデフォルトは'True'
-これがtrueに設定されている場合、フルテキストインデックスメタデータはデタッチ中に削除されません。
デタッチの詳細と、以下で強調するリスクの詳細については、Books Onlineの記事を参照してくださいsp_detach_db
。
データベースを接続するにはどうすればよいですか?
T-SQLまたはSQL Server Management Studio GUIからこれを行うこともできます。
(注:適切にデタッチされていないデータベースのデータファイルとログファイルがある場合、アタッチが機能しないことがあります。デタッチが発生すると、データベースがオフラインになり、ログファイルとデータファイルが整合状態になります。これもサービスが正常にシャットダウンされると発生します。)
GUIで、Databases
インスタンスの最上位フォルダーを右クリックし、を選択しますAttach
。次のダイアログで、アタッチするデータベースのプライマリデータファイル(.MDF)を選択し、他のファイルが選択され、適切な場所が指定されていることを確認し、[OK]をクリックしてデータベースをアタッチします。
T-SQLでは、SQL Server 2005以降でこれを行う最適な方法はCREATE DATABASE
コマンドを使用することです。これは、SQL Server 2012以降でサポートされている方法です。使用方法を確認したい場合sp_attach_db
は、書籍のオンライン記事[sp_attach_db][3]
または[sp_attach_single_file_db][4]
ログファイルとデータファイルが使用可能で、それらが一貫している場合、これがT-SQLアプローチです。
-Create DatabaseとFOR ATTACH句を使用して接続する
CREATE DATABASE DatabaseName
ON (FILENAME = 'FilePath\FileName.mdf'), -- Main Data File .mdf
(FILENAME = 'FilePath\LogFileName.ldf'), -- Log file .ldf
(FILENAME = 'FilePath\SecondaryDataFile.ndf) -- Optional - any secondary data files
FOR ATTACH
GO
Create Databaseステートメントの詳細については、オンラインの書籍でも参照できます。
SQL Server Expressでデタッチ/アタッチする方法
実際は同じです。SQL Server Management Studio Expressを使用している場合は、上記のGUIのデタッチ/アタッチダイアログを使用するか、上記のSSMS Expressを介したT-SQLステップも使用できます。Expressとの違いはありません。
あなたはSSMS Expressを持っていない場合は、(それをダウンロードすることができますここでは SQL Server 2012のExpressバージョンです)。
SQLCMD
セッションに入ると、上記と同じT-SQL構造を使用できます。
いつデタッチまたはアタッチを検討する必要がありますか?
最初に、デタッチとアタッチが何のために使われるのかという言葉はありません。このようなトランザクションログバックアップはありません。データベースファイルが誤って削除される可能性がある状態になり、この目的にはまったく良い方法ではありません。
ただし、デタッチとアタッチはいくつかのユースケースに適しています(網羅的ではありません。自由に編集して、より多くの新しい回答を追加または作成してください)。
- 移行の場合もあります(ただし、ここでの回答で説明したように、バックアップ/復元が好ましいです)
- アクティブに使用されなくなったデータベースを削除したいが、必要に応じて後でアタッチする機能がある場合。
- 特定のトラブルシューティング状況では、これが呼び出される場合があります
- データファイルとログファイルの両方を別の環境にバックアップしたり復元したりするスペースがありません(ここにいるべきではありませんが、環境内でdevデータベースを移動するために使用したことがあります。)ログはログファイルのアタッチ/再構築を行いました)
リスクと警告
繰り返しになりますが、ここではオンラインの書籍が優れたリソースですが、データベースのデタッチまたはアタッチに関して留意すべき具体的な考慮事項をいくつか挙げます。
切り離す
- データベースをオフラインにしています。これ以上アクセスできなくなります。これは明らかなはずですが、呼び出す価値があります。これが優れたバックアップオプションではない理由です。
- データベースがオンラインになると、SQL Serverはファイルをロックします。他の状況が発生する可能性があるため、これを試して間違っていることを証明することはお勧めしませんが、通常、SQL Serverがオンラインのときにデータベースファイル(データ、セカンダリデータ、またはログファイル)を削除することはできません。これは良いことです。デタッチすると、そのような保護はありません。これは悪いことです。
- データベースの破損を処理していて、デタッチの最初のステップがある記事を見つけた場合- それは間違っています -破損したデータベースをデタッチした場合、それが原因である可能性があります。そのデータベースを再度アタッチすることはできません。
- ネットワーク全体で運用データベースファイルを切り取って貼り付けると、ファイルレベルの破損が発生する可能性があります。移行を行う際にバックアップ/復元を好むもう1つの理由。
- 保守計画が失敗する可能性があります。状況は、私がしたように、ベストプラクティスをチェックせずにすべてのデータベースの定期的なバックアップを実行するメンテナンスプランを設定していることです。これはうまく機能するので、あなたはそれについて考えるのをやめます。次に、他の誰かが、使用していないデータベースをオフラインにすることにします。「データベース」ダイアログで「状態がオンラインではないデータベースを無視する」オプションをチェックしてメンテナンス計画を変更するまで、メンテナンス計画はそれ以降失敗します。オフラインデータベースだけでは失敗しないことに注意してください。オフラインデータベースをバックアップしようとすると、メンテナンスプランがエラーで失敗するため、一部のオンラインデータベースがバックアップされない可能性があります。(この点については別の著者なので、疑いを持って扱う)
接続
-インターネットからスクリプトを実行したり、空港で見知らぬ人からのパッケージを受け入れたりしないように、検証するための手順を実行せずに、他の人から取得したデータベースを接続しないでください。このデータベースには、環境を危険にさらす可能性のあるトリガーやストアドプロシージャなどのコードが含まれている可能性があります。運用システムではなく、安全なファイアウォール環境で接続するデータベースを確認する必要があります。
SQL Serverの異なるバージョンまたはエディションについてはどうですか?
これらは、バージョン間でのデータベースの復元に関するルールと違いはありません。通常、3つのバージョンについて次のバージョンまで復元できます(たとえば、SQL Server 2008からSQL Server 2012は機能しますが、SQL Server 2000からSQL Server 2012は機能しません)。バックアップ/復元またはデタッチ/アタッチを介してまったく逆戻りすることはできません。オブジェクトをスクリプト化して挿入をスクリプト化して、手動で、またはこれを行うツールを使用して実行する必要があります。エディションの場合、通常はSQL ServerのメインSKU間を移動できます。たとえば、データベースを標準からエンタープライズに追加作業なしで移動できます。ただし、エンタープライズ機能(Say、圧縮、パーティション分割)を使用している場合は、移動する前にこれらの機能を無効にする必要があります。あなたはあなたの機能のアイデアを得ることができます