Ich habe eine Datenbank und möchte die Dateien .mdf
und .ldf
an einen anderen Ort verschieben. Ich möchte den MSSQLSERVER
Dienst jedoch nicht beenden und nicht auf einen anderen Server exportieren.
Wie kann ich das machen?
quelle
Ich habe eine Datenbank und möchte die Dateien .mdf
und .ldf
an einen anderen Ort verschieben. Ich möchte den MSSQLSERVER
Dienst jedoch nicht beenden und nicht auf einen anderen Server exportieren.
Wie kann ich das machen?
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 .
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
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 verschiebenATTACH
.Properties
Files
RegisterkartePath
undFileName
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
- ausRESTORE
. Während des Wiederherstellungsprozesses können Sie den neuen Speicherort der Datenbankdateien definieren.quelle
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:
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:
(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.
Wenn der geplante Umzug für die Stammdatendatei E: \ SQLData lautet, werden die Parameterwerte wie folgt geändert:
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.
quelle
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
quelle
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
quelle
Befolgen Sie diese einfachen 4 Schritte:
CurrentLocation
Spalte anzeigen.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.
quelle
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.
quelle
So ergänzen Sie die vorhandenen Antworten: Hier ist ein Skript zum Erstellen der
ALTER DATABASE ... MOVE ...
Anweisungen für alle Datenbanken: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 ).quelle