Antworten:
Sie müssen den SQL Server-Dienst nicht beenden, um Datenbankdateien zu verschieben, aber Sie müssen die bestimmte Datenbank offline schalten. Dies liegt daran, dass Sie keine Dateien verschieben können, während auf sie zugegriffen wird, und die Datenbank offline geschaltet wird, um zu verhindern, dass die Dateien von der SQL Server-Anwendung verwendet werden.
Der Vorgang zum Verschieben ist ziemlich einfach. Detach / Attach wurde bereits beschrieben, ist aber bei weitem nicht so komplex.
Ändern Sie die Dateispeicherorte mit einem ALTER DATABASE
Befehl:
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
Beachten Sie, dass Sie den alten Speicherort in diesem Befehl nicht deklarieren müssen. Das Ändern dieses Pfads wird nicht sofort wirksam, sondern beim nächsten Start der Datenbank verwendet.
Setzen Sie die Datenbank offline
(Ich verwende WITH ROLLBACK IMMEDIATE
, um alle derzeit offenen Transaktionen auszuschließen und zurückzusetzen.)
ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;
Verschieben / Kopieren Sie die Dateien an den neuen Speicherort
Kopieren Sie einfach die Dateien mit Ihrer bevorzugten Methode (Click 'n Drag, XCopy, Copy-Item, Robocopy)
Schalten Sie die Datenbank online
ALTER DATABASE foo SET ONLINE;
Sie können sehen , diese im Detail beschrieben hier .
MODIFY FILE
Reihenfolge änderbar. Wenn Sie zuerst MODIFY FILE ausführen, wird Ihnen mitgeteilt, dass der Befehl erfolgreich ausgeführt wurde und der Speicherort nach einer Offline-Online-Operation geändert wird (der Wortlaut ist anders, aber Sie haben die Idee). Die Reihenfolge Offline-> Dateien verschieben-> Online ist jedoch aus offensichtlichen Gründen von Bedeutung. Markieren Sie auch die Notiz von Demonslay335. Dateiberechtigung ist wichtig.
MDF- und LDF-Dateien sind geschützt und können nicht verschoben werden, solange die Datenbank online ist.
Wenn es Ihnen nichts ausmacht, die Datenbank zu stoppen, können Sie DETACH
sie verschieben und dann verschieben ATTACH
.
Properties
Files
RegisterkartePath
und FileName
MDF- und LDF-Dateien . Dieser Schritt ist wichtig, wenn Sie nicht nach fehlenden Dateien suchen möchten ...Tasks -> Detach
Databases
Knoten Ihres ServersAttach
Add
SchaltflächeOK
Du solltest jetzt in Ordnung sein. Infos zum DETACH
- ATTACH
Prozess finden Sie hier .
In dem Link zu DETACH
- ATTACH
wird die using- ALTER DATABASE
Anweisung empfohlen, wenn die Datenbank auf derselben Instanz von SQL Server verbleibt. Weitere Informationen finden Sie unter Benutzerdatenbanken verschieben .
Wenn Sie es in Bewegung halten möchten, führen Sie einen BACKUP
- aus RESTORE
. Während des Wiederherstellungsprozesses können Sie den neuen Speicherort der Datenbankdateien definieren.
Führen Sie die folgenden Schritte aus, um Systemdatenbankdateien zu verschieben:
Melden Sie sich als ein Benutzer in SSMS an
Erstellen Sie aus Sicherheitsgründen eine Sicherungskopie der vom Benutzer erstellten Datenbank.
Beenden Sie alle Sitzungen, die über SSMS mit dem Server verbunden sind.
Führen Sie den folgenden Befehl aus, um den aktuellen Speicherort der Systemdatenbanken zu überprüfen:
USE master;
SELECT * FROM sys.master_files;
Ermitteln Sie den Pfad und notieren Sie den aktuellen Pfad der Dateien.
Verwenden Sie TSQL, um den Dateipfad für alle Datenbanken außer master zu ändern:
ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )
Z.B:
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");
Nun wurde der Speicherort der Datei geändert.
Stellen Sie sicher, dass Sie sowohl ldf- als auch mdf-Dateien verschieben
Klicken Sie in SSMS mit der rechten Maustaste auf den Server und wählen Sie Eigenschaften aus. Innerhalb der Eigenschaften gehen Sie zu den Datenbankeinstellungen. Ändern Sie die Datenbank-Standardspeicherorte für Daten und Protokoll in den Zielpfad. Melden Sie sich vom Server ab.
ZB: wechseln C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\
zuE:\projects\DataBaseFiles\MSSQL\DATA\
Beenden Sie die Instanz von SQL Server.
Kopieren Sie die Datei oder die Dateien an den neuen Speicherort. Verschieben Sie die Dateien mit Robocopy, um die Zugriffsberechtigungen in den Zielordner zu kopieren. Öffnen Sie cmd, führen Sie es als Administrator aus und verwenden Sie den folgenden Befehl:
robocopy / sec sourceFolder destinationFolder
Es ist besser, zum Quellspeicherort zu gehen, um den Befehl auszuführen. Löschen Sie andere Dateien als die kopierten Systemdatenbankdateien. Z.B:
robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\
(Hier verschieben wir alle Systemdatenbankdateien an einen neuen Speicherort.)
Führen Sie die folgenden Schritte in SQL Server Configuration Manager aus:
Klicken Sie im Knoten SQL Server-Dienste mit der rechten Maustaste auf die Instanz von SQL Server (z. B. SQL Server (MSSQLSERVER)), und wählen Sie Eigenschaften aus. Klicken Sie im Dialogfeld Eigenschaften von SQL Server (Instanzname) auf die Registerkarte Startparameter. Wählen Sie im Feld Vorhandene Parameter den Parameter –d aus, um die Stammdatendatei zu verschieben. Klicken Sie auf Aktualisieren, um die Änderung zu speichern. Ändern Sie im Feld Startparameter angeben den Parameter in den neuen Pfad der master-Datenbank. Wählen Sie im Feld Vorhandene Parameter den Parameter –l aus, um die Master-Protokolldatei zu verschieben. Klicken Sie auf Aktualisieren, um die Änderung zu speichern. Ändern Sie im Feld Startparameter angeben den Parameter in den neuen Pfad der master-Datenbank.
Der Parameterwert für die Datendatei muss dem Parameter -d und der Wert für die Protokolldatei dem Parameter -l folgen. Das folgende Beispiel zeigt die Parameterwerte für den Standardspeicherort der Stammdatendatei.
-dC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\master.mdf
-lC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\mastlog.ldf
Wenn der geplante Umzug für die Stammdatendatei E: \ SQLData lautet, werden die Parameterwerte wie folgt geändert:
-dE:\projects\DataBaseFiles\MSSQL\DATA\master.mdf
-lE:\projects\DataBaseFiles\MSSQL\DATA\mastlog.ldf
Beenden Sie die Instanz von SQL Server, indem Sie mit der rechten Maustaste auf den Instanznamen klicken und Beenden wählen. Starten Sie die Instanz von SQL Server neu.
sa
Melden Sie sich als Benutzer in SSMS an und überprüfen Sie den Speicherort der Datenbankdateien, indem Sie die folgende Abfrage ausführen:
USE master;
SELECT * FROM sys.master_files;
Alles erledigt.
Sie machen Schritt für Schritt:
Alle Verbindungen schließen
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
Datenbank mit Status offline setzen
ALTER DATABASE MyDB SET OFFLINE
Zum neuen Pfad
ALTER DATABASE MyDB MODIFY FILE (Name = MyDB, Filename = 'N: \ DATA \ MyDB.MDF')
Datenbank mit Status online setzen
ALTER DATABASE MyDB SET ONLINE
Setze Multi-User ALTER DATABASE MyDB SET MULTI_USER
Es gibt eine Möglichkeit, Datenbankdatendateien zu verschieben (noch nicht sicher, ob dies für Protokolldateien möglich ist), ohne die Datenbank offline zu schalten.
Dejan Nakarada-Kordic hat eine Erklärung + Skripte für diese Methode hier: https://www.itprotoday.com/sql-server/move-database-fileses-without-taking-database-offline
In der Kurzversion fügen Sie am neuen Speicherort eine weitere Datenbankdatei hinzu und verwenden dann DBCC Shrinkfile mit der Option EMPTYFILE, um die Daten aus der alten Datei in die neue Datei zu verschieben. In diesem Fall können Sie die alte Datendatei entfernen.
Nicht meine Lösung, ich habe selbst nach dieser Lösung gesucht und fand sie für unsere Produktionsumgebung sehr nützlich.
Thorfinn
Befolgen Sie diese einfachen 4 Schritte:
CurrentLocation
Spalte anzeigen.
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');
Nun, stoppen Sie den Server durch Rechtsklick auf Server_Name
die Sie im Objekt - Explorer (linke Seite) sehen.
Dann bewegen Sie beiden Dateien aus altem Pfad zu Neuem Pfad und den Server neu starten , indem Sie einen Rechtsklick auf Server_Name. Bestätigen Sie den neuen Datenbankpfad, indem Sie erneut die Abfrage des ersten Schritts ausführen.
Ich bin mir nicht sicher, ob dies der beste Weg ist (ich würde mich über Kommentare freuen, wenn Sie mir mitteilen, wie es nicht ist), aber es ist sehr einfach (und schnell, wenn Sie eine kleine Datenbank haben):
Sichern Sie zunächst die Datenbank in einer .bak-Datei. Stellen Sie dann die Datenbank aus derselben .bak-Datei wieder her, und wählen Sie die neuen Speicherorte für .mdf- und .ldf-Dateien unter den Dateioptionen für die Wiederherstellungsaufgabe aus.
Ich würde es nicht in einer Produktionsumgebung außerhalb eines Wartungsfensters tun, da Sie während der Wiederherstellung nicht auf die Datenbank zugreifen können. Andere Methoden, die ich oben gesehen habe, hätten jedoch ähnliche Nachteile. Nachdem die Wiederherstellungsaufgabe abgeschlossen ist, müssen Sie die alte Datei nicht löschen. Es ist automatisch erledigt.
So ergänzen Sie die vorhandenen Antworten: Hier ist ein Skript zum Erstellen der ALTER DATABASE ... MOVE ...
Anweisungen für alle Datenbanken:
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';
Hinweis:
Ersetzen Sie sie REPLACE(f.physical_name, 'C:\', 'D:\')
durch die gewünschte Umwandlung der Dateipfade.
master
ist ausgenommen, da sein Pfad durch die Startoptionen von SQL Server bestimmt wird ( Details finden Sie beispielsweise in dieser Antwort ).
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