SQL Serverデータベースファイルを移動するにはどうすればよいですか?


103

データベースがあり.mdf.ldfファイルを別の場所に移動したい。ただし、MSSQLSERVERサービスを停止したくはありません。別のサーバーにエクスポートしたくありません。

これどうやってするの?

回答:


154

データベースファイルを移動するためにSQL Serverサービスを停止する必要はありませんが、特定のデータベースをオフラインにする必要があります。これは、ファイルにアクセスしている間はファイルを移動できず、データベースをオフラインにすると、ファイルがSQL Serverアプリケーションで使用されなくなるためです。

それらを移動するプロセスは非常に簡単です。デタッチ/アタッチについてはすでに説明しましたが、これほど複雑ではありません。

ALTER DATABASEコマンドを使用してファイルの場所を変更します。

USE master; --do this all from the master
ALTER DATABASE foo
MODIFY FILE (name='DB_Data1'
             ,filename='X:\NewDBFile\DB_Data1.mdf'); --Filename is new location

このコマンドで古い場所を宣言する必要はありません。このパスの変更はすぐには有効になりませんが、次回データベースが起動するときに使用されます。

データベースをオフラインに設定する

(私はWITH ROLLBACK IMMEDIATE皆を追い出し、現在開いているすべてのトランザクションをロールバックするために使用します)

ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;

ファイルを新しい場所に移動/コピーします

お気に入りの方法を使用してファイルをコピーするだけです( 'n Drag、XCopy、Copy-Item、Robocopyをクリックします)

データベースをオンラインにする

ALTER DATABASE foo SET ONLINE;

詳細については、こちらをご覧ください


13
これは私のために働いた。例えば:私の場合は、あまりにも最初のコマンドを使用して、LDFファイルを移動しなければならなかった USE master; --do this all from the master ALTER DATABASE foo MODIFY FILE (name='DB_Data1_log' ,filename='X:\NewDBFile\DB_Data1_log.ldf'); --Filename is new location
デウィリース

1
また、ファイル名を更新して、ファイルダイアログに表示される内容と一致させるだけで、フルテキストインデックスファイルを移動することもできます。
DShook

24
データベースファイルを移動した後、「NT SERVICE \ MSSQLSERVER」ユーザーにアクセス許可があることを確認してください。そうしないと、データベースをオンラインに戻そうとしたときにエラーが発生します。
Demonslay335

「名前」とは何ですか?ドキュメントでは、「logical_name」があります。彼らはどういう意味ですか?
ジョニー

2
@mlhDev実際、私の場合、MODIFY FILE順序は変更可能です。最初にMODIFY FILEを実行すると、コマンドが正常に実行され、オフラインオンライン操作の後に場所が変更されることがわかります(言い回しは異なりますが、アイデアは得られます)。ただし、オフライン->ファイルの移動->オンラインの順序は重要な理由です。Demonslay335のメモにもマークを付けます。ファイルの許可は重要です。
ライオネットチェン

50

MDFおよびLDFファイルは保護されており、データベースがオンラインの間は移動できません。

データベースの動作を停止してもかまわない場合は、それを実行DETACHし、ファイルを移動してから実行しますATTACH

  • データベースの名前を右クリックします
  • 選択する Properties
  • Filesタブに移動します
  • MDFおよびLDFファイルのPathおよびFileNameを書き留めます。この手順は、見つからないファイルを検索したくない場合に重要です...
  • データベース名を右クリック
  • 選択する Tasks -> Detach
  • 必要な場所にファイルを移動します
  • Databasesサーバーのノードを右クリックします
  • 選択する Attach
  • クリックしてAdd、ボタン
  • 新しい場所を指す
  • クリック OK

今は大丈夫です。情報DETACH- ATTACHプロセスを見つけることができるここに

リンクについてDETACH- データベースをSQL Serverの同じインスタンスに保持する場合ATTACHは、ALTER DATABASEステートメントを使用することをお勧めします。ユーザーデータベースの移動の詳細なリファレンス。

移動中に実行し続けたい場合は、BACKUP-を実行しRESTOREます。復元プロセスでは、データベースファイルの新しい場所を定義できます。


3
私は、再接続時に、ファイルアクセスの問題を回避するには、管理者としてSQL Management Studioを開いてお勧めします
Simon_Weaver

6

システムデータベースファイルを移動するには、次の手順を実行します。

  1. SSMSでsaユーザーとしてログインします

  2. 安全のために、ユーザーが作成したデータベースのバックアップを取ります。

  3. SSMSからサーバーに接続されているすべてのセッションを強制終了します。

  4. 次のコマンドを実行して、システムデータベースの現在のファイルの場所を確認します。

    USE master;
    SELECT * FROM sys.master_files;

パスを特定し、ファイルの現在のパスを書き留めます。

  1. TSQLを使用して、マスターを除くすべてのデータベースのファイルパスを変更します。

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )

例えば:

ALTER DATABASE tempdb
MODIFY FILE ( NAME = tempdev
, FILENAME = "DestinationPath\tempdb.mdf");

ALTER DATABASE tempdb
MODIFY FILE ( NAME = templog
, FILENAME = "DestinationPath\templog.ldf");

ALTER DATABASE model
MODIFY FILE ( NAME = modeldev
, FILENAME = "DestinationPath\model.mdf");

ALTER DATABASE model
MODIFY FILE ( NAME = modellog
, FILENAME = "DestinationPath\modellog.ldf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBData
, FILENAME = "DestinationPath\msdbdata.mdf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBLog
, FILENAME = "DestinationPath\msdblog.ldf");

これで、ファイルの場所が変更されました。

必ずldfファイルとmdfファイルの両方を移動してください

  1. SSMSでサーバーを右クリックし、プロパティを選択します。内部プロパティは[データベース設定]に移動します。データとログのデータベースのデフォルトの場所を宛先パスに変更します。サーバーからログオフします。

    例:変更C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\E:\projects\DataBaseFiles\MSSQL\DATA\

  2. SQL Serverのインスタンスを停止します。

  3. ファイルを新しい場所にコピーします。Robocopyを使用してファイルを移動し、アクセス許可を宛先フォルダーにコピーします。cmdを開き、管理者として実行し、次のコマンドを使用します。

    robocopy / sec sourceFolder destinationFolder

ソースの場所に移動してコマンドを実行することをお勧めします。コピーされたシステムデータベースファイル以外の他のファイルを削除します。例えば:

 robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\

(ここでは、すべてのシステムデータベースファイルを新しい場所に移動しています。)

  1. [スタート]メニューから、[すべてのプログラム]、[Microsoft SQL Server]、[構成ツール]の順にポイントし、[SQL Server構成マネージャー]をクリックします。

SQL Server構成マネージャーで次の手順を実行します。

[SQL Serverサービス]ノードで、SQL Serverのインスタンス(たとえば、SQL Server(MSSQLSERVER))を右クリックし、[プロパティ]を選択します。[SQL Server(instance_name)プロパティ]ダイアログボックスで、[スタートアップパラメータ]タブをクリックします。[既存のパラメーター]ボックスで、-dパラメーターを選択して、マスターデータファイルを移動します。[更新]をクリックして変更を保存します。[起動パラメータの指定]ボックスで、パラメータをmasterデータベースの新しいパスに変更します。[既存のパラメーター]ボックスで、–lパラメーターを選択して、マスターログファイルを移動します。[更新]をクリックして変更を保存します。[起動パラメータの指定]ボックスで、パラメータをmasterデータベースの新しいパスに変更します。

データファイルのパラメーター値は-dパラメーターの後に、ログファイルの値は-lパラメーターの後にする必要があります。次の例は、マスターデータファイルのデフォルトの場所のパラメーター値を示しています。

-dC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\master.mdf
-lC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\mastlog.ldf

マスターデータファイルの計画的な再配置がE:\ SQLDataの場合、パラメーター値は次のように変更されます。

-dE:\projects\DataBaseFiles\MSSQL\DATA\master.mdf
-lE:\projects\DataBaseFiles\MSSQL\DATA\mastlog.ldf

インスタンス名を右クリックし、[停止]を選択して、SQL Serverのインスタンスを停止します。SQL Serverのインスタンスを再起動します。

  1. saSSMSでユーザーとしてログインし、次のクエリを実行してデータベースファイルの場所を確認します。

    USE master;
    SELECT * FROM sys.master_files;

全部終わった。


SQL関数を使用して、すべてのデータベースのタスクを自動化できます:stackoverflow.com/a/19505918/439524
amuliar

3

ステップバイステップで行います:

  1. すべての接続を閉じる
    ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

  2. ステータスがオフラインのデータベースを設定する
    ALTER DATABASE MyDB SET OFFLINE

  3. 新しいパスに
    ALTER DATABASE MyDB MODIFY FILE(Name = MyDB、Filename = 'N:\ DATA \ MyDB.MDF')

  4. データベースをオンラインのステータスで設定する
    ALTER DATABASE MyDB SET ONLINE

  5. マルチユーザー
    ALTER DATABASE MyDB SET MULTI_USERを設定します


3

データベースをオフラインにすることなく、データベースデータファイルを移動する方法があります(ログファイルに対してこれを行う方法があるかどうかはまだわかりません)。

Dejan Nakarada-Kordicには、このメソッドの説明とスクリプトがあります:https : //www.itprotoday.com/sql-server/move-database-files-without-taking-database-offline

短いバージョンでは、新しい場所に別のデータベースファイルを追加し、DBCC ShrinkfileをオプションEMPTYFILEとともに使用して、古いファイルから新しいファイルにデータを移動します。これが完了したら、古いデータファイルを削除できます。

私のソリューションではなく、自分でこのソリューションを探していましたが、実稼働環境に非常に役立つことがわかりました。

トーフィン


1

次の4つの簡単な手順に従ってください。

  1. SSMSを開き、ウィンドウの上部から[ 新しいクエリ ]オプションを選択します。次に、新しいパスに移動するデータベースの検索パスに対して次のクエリをコピーして実行し、CurrentLocation列に表示されるパスをメモします。

SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');

  1. 次に、そのパスに移動して、Database_Name.mdfおよびDatabase_Name_log.ldfファイルの名前を書き留めます。次に、データベースを特定の場所に移動するために、次の2つのクエリを実行します。

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME , FILENAME = 'NEW_PATH\DATABASE_NAME.mdf');

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME_log , FILENAME = 'NEW_PATH\DATABASE_FILE_NAME_log.ldf');

  1. 次に、オブジェクトエクスプローラー(左側)で表示できるサーバーを右クリックして停止しますServer_Name

    ここに画像の説明を入力してください

  2. 次に、両方のファイルを古いパスから新しいパスに移動し、Server_Nameを右クリックしてサーバーを再起動します。最初のステップのクエリを再度実行して、データベースの新しいパスを確認します。


0

これが最良の方法であるかどうかはわかりません(そうではないことを教えてください)。

最初に、データベースを.bakファイルにバックアップします。次に、同じ.bakファイルからデータベースを復元し、復元タスクのファイルオプションで新しい.mdfおよび.ldfファイルの場所を選択します。

復元中はデータベースにアクセスできないため、メンテナンスウィンドウのない運用環境では実行しません。私が上で見た他の方法にも同様の欠点があります。復元タスクが完了したら、古いファイルを削除する必要はありません。自動的に行われます。


1
このシナリオにはいくつかの欠点があります。復元する場合、元のDBを上書きするか、名前を変更する必要があります。大規模なデータベースの場合、この方法は深刻なIOオーバーヘッドをもたらします。detach-attachまたはalter dbメソッドで説明されているようにファイルを移動する方がはるかに高速です。ファイルが同じNTFSパーティション内で移動される場合、それはメタデータ操作のみです。
vonPryz

@Ali-バックアップと復元。時間がかかる場合がありますが、一般に安全な方法です。アーロンバートランドの分析を参照してください:blogs.sqlsentry.com/aaronbertrand/bad-habits-file-backups また:sqlmag.com/blog/should-i-be-using-san-snapshots-backup-solution
RLF

非常に大規模なデータベースの場合、このアプローチ(およびデタッチ/アタッチアプローチ)では、かなりのダウンタイムが発生します。これを回避するには、ソースデータベースを完全復旧モードにしてから、デスティネーションDBを非稼働のままにして初期バックアップリストアを実行します。次に、1つ以上のトランザクションログをバックアップ/復元します。データベースを停止する必要があるのは、トランザクションログの最終的なバックアップ/復元中のみです。これには、任意の小さな時間とサイズを含めることができます。明らかに、別の名前に復元してから名前のスワップを実行する必要もあります。このアプローチは、ログ配布とほぼ同等です。
ブライアン

0

既存の回答を補足するには、次のスクリプトを使用してALTER DATABASE ... MOVE ...、すべてのデータベースのステートメントを作成します。

SELECT 'ALTER DATABASE ' + QUOTENAME(d.name) + 
       ' MODIFY FILE (name=' + QUOTENAME(f.name, '''') +
       ', filename=' + QUOTENAME(REPLACE(f.physical_name, 'C:\', 'D:\'), '''') +
       ');'
  FROM sys.master_files AS f 
       INNER JOIN sys.databases AS d ON f.database_id = d.database_id
 WHERE d.name <> 'master';

注意:

  • REPLACE(f.physical_name, 'C:\', 'D:\')ファイルパスに対して行う変換に置き換えます。

  • masterそのパスはSQL Serverのスタートアップオプションによって決定されるため、免除されます(詳細については、この回答を参照してください)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.