web-dev-qa-db-ja.com

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

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

これどうやってするの?

116
user2645263

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

それらを移動するプロセスはかなり簡単です。 Detach/Attachについてはすでに説明しましたが、それほど複雑ではありません。

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;

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

お好きな方法でファイルをコピーするだけです(クリックアンドドラッグ、XCopy、Copy-Item、Robocopy)。

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

ALTER DATABASE foo SET ONLINE;

詳細は here で説明されています。

168
Mike Fal

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

データベースの動作を停止してもかまわない場合は、データベースをDETACH移動し、ファイルを移動してからATTACHすることができます。

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

今は大丈夫です。 DETACH-ATTACHプロセスに関する情報は here にあります。

DETACH-ATTACHに関するリンクで、データベースをSQL Serverの同じインスタンスに保持している場合は、ALTER DATABASEステートメントを使用することをお勧めします。 Move User Databases で詳細を参照してください。

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

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

  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. SSMSにsaユーザーとしてログインし、次のクエリを実行してデータベースファイルの場所を確認します。

    _USE master;
    SELECT * FROM sys.master_files;
    _

全部終わった。

6
abhay sreekumar

あなたは段階的に行います:

  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

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

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

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

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

ソーフィン

3

次の簡単な4つのステップに従ってください。

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

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

  1. 次に、そのパスに移動し、Database_Name.mdfDatabase_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. ここで、Stopサーバーを右クリックしてServer_Nameは、オブジェクトエクスプローラ(左側)に表示されます。

    enter image description here

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

1
Karan Raiyani

既存の回答を補足するには、次のスクリプトを使用して、すべてのデータベースの_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の起動オプションによって決定されるためです(たとえば、詳細については この回答 を参照してください)。

1
Heinzi

これが最善の方法であるかどうかはわかりませんが(そうでない場合は、コメントを歓迎します)、非常にシンプルです(データベースが小さい場合は迅速です)。

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

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

0
Ali