Früher habe ich Datenbanken aufgrund von SAN-Neukonfigurationen und -Migrationen fast ständig verschoben.
Unter der Annahme, dass Sie einen ganzen Server gleichzeitig verschieben, würde ich mit so etwas wie Ihrem Pfad Nr. 2 fortfahren. (Wenn Sie jeweils eine Datenbank verschieben und schließlich jede Datenbank auf einem Server ausführen, wäre dies problematischer, da Sie die Pfade zu den Dateien ändern müssten.)
Beachten Sie, dass "single_user" nicht unbedingt SIE bedeutet. Sie könnten zu DBCC CHECKDB eine Datenbank gehen und nicht in der Lage sein, hineinzukommen, weil jemand bereits dort ist. Bereiten Sie ein Skript vor, das Sie ausführen können, um "jeden außer Ihnen" aus einer Datenbank heraus zu booten, und bewahren Sie es an einem handlichen Ort auf. Beachten Sie, dass SQL 2000 nicht die gleichen Funktionen bietet wie die neueren Versionen.
Ein alter Trick besteht darin, den SQL Server-Dienst anzuhalten. Dadurch werden neue Anmeldungen verhindert, aber jeder, der bereits verbunden ist, kann wie gewohnt fortfahren. Also: Verbindung über ein SSMS-Fenster herstellen, damit Sie arbeiten können, dann den Dienst anhalten, dann die unerwünschten Verbindungen entfernen, Ihre Sache über das SSMS-Befehlsfenster erledigen (nicht über die GUI, da viele Verbindungen hergestellt und getrennt werden) und dann die Pause beenden der Service. Warnung: Ich bin nicht sicher, wie sich das auf einem Cluster auswirken würde. Möglicherweise möchten Sie ein Failover durchführen.
Es ist praktisch, alle App-Benutzer von einem Server fernzuhalten, bis Sie mit Ihrer Arbeit fertig sind. Andernfalls können Verbindungen entstehen, während Sie versuchen, Dinge zu tun, die zu Ressourcenkonflikten und / oder Langsamkeit führen können. Ich habe in der Vergangenheit je nach der genauen Situation die folgenden Methoden verwendet: Deaktivieren der App-Server Verwendung von ALTER DATABASE. SET RESTRICTED_USER (Wenn App-Konten Mitglieder der Rollen db_owner, sysadmin oder dbcreator sind, ist dies ein Problem. ) Teilen Sie den Benutzern mit, dass das System zu einem bestimmten Zeitpunkt offline sein wird, z. B. an einem Sonntagmorgen. (Dies funktioniert nicht in einer "für echte" 24x7-Umgebung.) Entfernen der Netzwerkkarte, mit der die App-Server oder Benutzer konfrontiert sind. (In diesem Fall könnte ich über eine andere Netzwerkkarte, die mit einem Netzwerk nur für Administratoren verbunden ist, oder über ILO einsteigen.)
Das Trennen einer großen Anzahl von Datenbanken und das erneute Zuordnen von Datenbanken kann eine Menge Arbeit bedeuten. Wenn Sie dies tun, stellen Sie sicher, dass Sie Ihr "Attach" -Skript im Voraus geschrieben haben.
Ich hatte viel Erfolg damit, den SQL Server zu stoppen, alles zu kopieren, die Laufwerksbuchstaben zu ändern und SQL Server zu starten. Kein Lösen / Befestigen. Solange SQL Server ausgeschaltet ist und Sie Dateien kopieren (nicht VERSCHIEBEN), können Sie auch beim Verschieben der Systemdatenbanken keine allzu großen Probleme bekommen. Da die Pfade identisch sind, stellt SQL Server nicht fest, dass sich etwas geändert hat, während der Dienst ausgeschaltet war. Stellen Sie einfach sicher, dass Sie die Laufwerksbuchstaben wieder auf die richtigen Volumes verweisen, da sonst die Situation für Sie schlecht wird.
Mein häufigstes Problem war, dass ich die ACLs für die Dateiverzeichnisse nicht korrekt abgerufen habe. Neuere Versionen von SQL Server können besser nur die Berechtigungen festlegen, die das Dienstkonto benötigt, während ältere Versionen weniger umständlich erscheinen. Wenn Sie vergessen, die ACLs festzulegen, und das Dienstkonto kein lokaler Administrator ist (was ich nicht empfehlen würde), werden beim Starten der Instanz möglicherweise eine oder mehrere Datenbanken nicht geöffnet. Keine Panik, ändern Sie einfach die ACLs und hängen Sie die Datenbank an.
Ich benutze normalerweise ROBOCOPY, um diese Art von Arbeit zu erledigen. Es gibt einen Befehlszeilenschalter zum Beibehalten von ACLs.
Die Verwendung einer CRC-Berechnung / -Verifizierung ist keine schlechte Idee, aber das habe ich noch nie getan. Wenn die Datenbanken wiederhergestellt werden, führe ich CHECKDB () auf allen aus. Normalerweise bereite ich ein Skript dafür vor, anstatt mich darauf zu verlassen, dass ein Wartungsjob manuell gestartet wird. Auf diese Weise kann ich zuerst einige kleinere Datenbanken überprüfen, bevor ich eine große Datenbank überprüfe, deren Ausführung viele Minuten oder Stunden dauern kann. Ich bezweifle, dass eine CRC-Überprüfung (oder ein Redgate Data Compare-Tool) etwas finden würde, das CHECKDB () vermissen würde, und wenn dies der Fall wäre, wäre SQL Server nicht in der Lage, dies zu beheben.
Nachdem ich die Dateien kopiert, aber bevor ich die Instanz neu starte, werde ich den Dateipfad der ALTEN Ordner leicht ändern, indem ich einen der Ordner umbenenne. Dies ist eine zusätzliche Überprüfung des Problems "Ups, der Server zeigt immer noch auf die alten Dateien".
Beeilen Sie sich nicht, die alten Dateien zu löschen und Speicherplatz auf dem alten Speicher wiederherzustellen, und stellen Sie doppelt sicher, dass Ihre vollständigen Sicherungen erfolgreich ausgeführt wurden. Testen Sie die Wiederherstellung einiger dieser Sicherungen an einem anderen Ort. Sobald Sie gute checkdb () -Läufe und gute vollständige Backups haben, können Sie darüber nachdenken, diesen alten Speicher zu löschen und die Lefthand herunterzufahren.
Die schlimmsten Probleme, die ich mit diesen Migrationen hatte, sind passiert, nachdem ich dachte, ich wäre erledigt. Das würde der SAN-Administrator sagen, dass etwas passiert ist und meine Dateisysteme verschlüsselt wurden. (Neu partitioniert, neu formatiert, erneut kopiert.)
Ein weiteres spaßiges Problem ist, dass das SAN ohne ersichtlichen Grund langsam ist. Wenn Sie der Meinung sind, dass das Kopieren Ihrer Daten 10 Stunden dauert und Sie zu 30% zu Stunde 9 kopiert werden, liegt ein Problem vor. Beobachten Sie die Übertragungszeiten (beim Kopieren wird% kopiert und es werden Zeitschätzungen angezeigt, oder Sie können Perfmon verwenden) und haben Sie einen Fallback-Plan, wenn etwas schief geht.
Ich bin mir auch nicht sicher, ob Ihre Volumes für Sie partitioniert werden, aber Sie möchten vielleicht sichergehen, dass sie einen Versatz von 1 MB verwenden. Unter Windows Server 2008 und höher sollte dies kein Problem sein. Unter älteren Betriebssystemen ist dies der Fall. Es gibt eine Tonne googlable Sachen auf diesem, und Ihre Lagertypen sollten darüber Bescheid wissen, aber ich würde fragen.