データベースがあり、.mdf
および.ldf
ファイルを別の場所に移動したい。しかし、MSSQLSERVER
サービスを停止したくなく、別のサーバーにエクスポートしたくありません。
これどうやってするの?
データベースファイルを移動するために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 で説明されています。
MDFおよびLDFファイルは保護されており、データベースがオンラインの間は移動できません。
データベースの動作を停止してもかまわない場合は、データベースをDETACH
移動し、ファイルを移動してからATTACH
することができます。
Properties
を選択しますFiles
タブに移動しますPath
とFileName
をメモします。この手順は、見つからないファイルを検索してしまいたくない場合に重要です...Tasks -> Detach
を選択しますDatabases
ノードを右クリックしますAttach
を選択しますAdd
ボタンをクリックしますOK
をクリックします今は大丈夫です。 DETACH
-ATTACH
プロセスに関する情報は here にあります。
DETACH
-ATTACH
に関するリンクで、データベースをSQL Serverの同じインスタンスに保持している場合は、ALTER DATABASE
ステートメントを使用することをお勧めします。 Move User Databases で詳細を参照してください。
移動中も実行し続けたい場合は、BACKUP
-RESTORE
を実行します。復元プロセスでは、データベースファイルの新しい場所を定義できます。
システムデータベースファイルを移動するには、次の手順に従います。
SSMSにsaユーザーとしてログインします
安全のため、ユーザーが作成したデータベースのバックアップを取ってください。
SSMSからサーバーに接続されているすべてのセッションを強制終了します。
次のコマンドを実行して、システムデータベースの現在のファイルの場所を確認します。
_USE master;
_
SELECT * FROM sys.master_files;
パスを特定し、ファイルの現在のパスを書き留めます。
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ファイルの両方を移動してください
SSMSでサーバーを右クリックし、プロパティを選択します。内部のプロパティは、データベースの設定に移動します。データとログのデータベースのデフォルトの場所を宛先パスに変更します。サーバーからログオフします。
例:_C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\
_を_E:\projects\DataBaseFiles\MSSQL\DATA\
_に変更します
SQL Serverのインスタンスを停止します。
ファイルを新しい場所にコピーします。 Robocopyを使用してファイルを移動し、アクセス許可を宛先フォルダーにコピーします。 cmdを開いて管理者として実行し、次のコマンドを使用します。
robocopy/sec sourceFolder destinationFolder
コマンドを実行するには、ソースの場所に移動することをお勧めします。コピーされたシステムデータベースファイル以外のファイルを削除します。例えば:
_ robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\
_
(ここでは、すべてのシステムデータベースファイルを新しい場所に移動しています。)
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のインスタンスを再起動します。
SSMSにsa
ユーザーとしてログインし、次のクエリを実行してデータベースファイルの場所を確認します。
_USE master;
_
SELECT * FROM sys.master_files;
全部終わった。
あなたは段階的に行います:
すべての接続を閉じる
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ステータスがオフラインのデータベースを設定する
ALTER DATABASE MyDB SET OFFLINE
新しい道へ
ALTER DATABASE MyDB MODIFY FILE(Name = MyDB、Filename = 'N:\ DATA\MyDB.MDF')
データベースをオンラインの状態に設定
ALTER DATABASE MyDB SET ONLINE
マルチユーザーを設定する
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でデータを古いファイルから新しいファイルに移動します。これが完了すると、古いデータファイルを削除できます。
私のソリューションではなく、自分でこのソリューションを探していたところ、本番環境に非常に役立つことがわかりました。
ソーフィン
次の簡単な4つのステップに従ってください。
CurrentLocation
列に表示されているそのパスを書き留めます。
SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');
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');
既存の回答を補足するには、次のスクリプトを使用して、すべてのデータベースの_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の起動オプションによって決定されるためです(たとえば、詳細については この回答 を参照してください)。
これが最善の方法であるかどうかはわかりませんが(そうでない場合は、コメントを歓迎します)、非常にシンプルです(データベースが小さい場合は迅速です)。
まず、データベースを.bakファイルにバックアップします。次に、同じ.bakファイルからデータベースを復元し、復元タスクのファイルオプションで新しい.mdfファイルと.ldfファイルの場所を選択します。
復元中にデータベースにアクセスできないため、メンテナンスウィンドウ以外の運用環境では実行しません。上で見た他の方法にも同様の欠点があります。復元タスクが完了したら、古いファイルを削除する必要はありません。自動的に行われます。