回答:
データベースファイルを移動するために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;
詳細については、こちらをご覧ください。
MODIFY FILE
順序は変更可能です。最初にMODIFY FILEを実行すると、コマンドが正常に実行され、オフラインオンライン操作の後に場所が変更されることがわかります(言い回しは異なりますが、アイデアは得られます)。ただし、オフライン->ファイルの移動->オンラインの順序は重要な理由です。Demonslay335のメモにもマークを付けます。ファイルの許可は重要です。
MDFおよびLDFファイルは保護されており、データベースがオンラインの間は移動できません。
データベースの動作を停止してもかまわない場合は、それを実行DETACH
し、ファイルを移動してから実行しますATTACH
。
Properties
Files
タブに移動しますPath
およびFileName
を書き留めます。この手順は、見つからないファイルを検索したくない場合に重要です...Tasks -> Detach
Databases
サーバーのノードを右クリックしますAttach
Add
、ボタンOK
今は大丈夫です。情報DETACH
- ATTACH
プロセスを見つけることができるここに。
リンクについてDETACH
- データベースをSQL Serverの同じインスタンスに保持する場合ATTACH
は、ALTER DATABASE
ステートメントを使用することをお勧めします。ユーザーデータベースの移動の詳細なリファレンス。
移動中に実行し続けたい場合は、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のインスタンスを再起動します。
sa
SSMSでユーザーとしてログインし、次のクエリを実行してデータベースファイルの場所を確認します。
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-taking-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');
これが最良の方法であるかどうかはわかりません(そうではないことを教えてください)。
最初に、データベースを.bakファイルにバックアップします。次に、同じ.bakファイルからデータベースを復元し、復元タスクのファイルオプションで新しい.mdfおよび.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のスタートアップオプションによって決定されるため、免除されます(詳細については、この回答を参照してください)。
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