Sollte ich Daten mithilfe von "Trennen" / "Kopieren" / "Anhängen" oder durch "Sichern" / "Wiederholen" migrieren?

17

Ich bin dabei, Datenbankdateien in ein neues SAN (von einem alten SAN) zu migrieren, und ich habe ein paar Optionen, um dies zu implementieren. (1) Es wurde angeregt, den Aufwand für die Wiederherstellung einer vollständigen Sicherung in einer neuen Datenbank auf dem Server zu untersuchen. (2) Mein ursprünglicher Plan war es jedoch, die Dateien aus dem alten SAN in das neue SAN zu kopieren, indem die Datenbank getrennt und dann wieder angefügt wurde.

Mein Bauch sagt mir, dass ich es vorziehen würde, zu trennen, zu kopieren und zu befestigen, da es ausfallsicherer erscheint, aber das mag nur meine Naivität sein. Ich möchte keine Transaktion verpassen oder beim Umbenennen von Datenbanken "etwas kaputt machen".

Ich schätze, meine Frage ist, ob ich mit meiner Skepsis gegenüber der Option BACKUP-RESTORE-Replay gerechtfertigt bin oder nicht, und was sind andere Vorzüge oder Risiken dieser Option?

Swasheck
quelle

Antworten:

16

Persönlich würde ich die Ablöse- / Anbringungsmechanismen vermeiden. Insbesondere in SQL Server 2000 vertraue ich einfach nicht darauf, dass Sie den Server immer sichern und diese Dateien anhängen können. Ich habe viele Geschichten gehört, in denen dies nicht sauber war - nur weil Sie einen Plan B haben, wird Plan A nicht automatisch sinnvoll.

Mit Backup / Restore müssen Sie nicht unbedingt Plan B aufrufen. Wenn das Backup fehlschlägt, ist Ihre Datenbank immer noch aktiv. Wenn die Wiederherstellung fehlschlägt, ist Ihre alte Datenbank noch aktiv. In beiden Fällen können Sie den Betrieb der ursprünglichen Datenbank wiederherstellen und den Plan später erneut aufrufen. Zusätzlich zu der zusätzlichen Sicherheit beim Stoppen und / oder Trennen von SQL Server können Sie damit auch die Hoo-Hats der Sicherungs- / Wiederherstellungsmethode testen (vorausgesetzt, Sie verfügen derzeit über ausreichend Speicherplatz, um die Sicherungen auszuführen, und über eine andere Instanz, um die zu testen wiederherstellen). Sie können die Methode zum Trennen nicht wirklich testen, ohne die Datenbanken zu trennen oder SQL Server zu stoppen. Dies ist außerhalb eines ordnungsgemäßen Wartungsfensters nur schwer möglich. Und schließlich können Sie bei den anderen Ansätzen erst dann mit dem Kopieren der Dateien beginnen, wenn Sie SQL Server getrennt oder heruntergefahren haben.

Ein weiterer Vorteil gegenüber der Pull-the-Drive-Out-From-Under-SQL-Server-Methode: Mit Backup / Restore können Sie verschiedene Dateien auf andere Laufwerksbuchstaben als zuvor verschieben. Als wir beispielsweise auf ein neues SAN migrierten, konnten wir mehr Volumes haben, sodass wir Tempdb nach T: \ (was vorher nicht existierte) verschieben konnten, einige der Daten- und Protokolldateien in neue Laufwerksbuchstaben usw. um die neue I / O-Kapazität besser nutzen zu können. Wenn Sie SQL Server einfach herunterfahren und dann die Datenträger austauschen, müssen Sie dieselben Laufwerksbuchstaben und dieselbe Anzahl von Volumes haben.

Aaron Bertrand
quelle
7

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.

darin straße
quelle
2

Zuerst würde ich die Option betrachten, einfach die Funktion des Speicher-Arrays zu verwenden, um das Verschieben von Daten zu handhaben. Wenn diese nicht verfügbar sind, weil der Anbieter sie nicht unterstützt, Sie sie nicht gekauft haben oder der SAN-Administrator nicht weiß, wie es geht ...

Dann würde ich einfach die folgenden Schritte ausführen.

  1. Präsentieren Sie den neuen Speicher dem SQL Server.
  2. Beenden Sie die SQL Services
  3. KOPIEREN Sie alle Daten vom alten auf das neue Laufwerk (vergessen Sie nicht, die Berechtigungen anzugeben, wenn Sie Robocopy verwenden).
  4. Entfernen Sie die Laufwerksbuchstaben von den alten Laufwerken.
  5. Ändern Sie die Laufwerksbuchstaben der neuen Laufwerke so, dass sie mit den alten Laufwerksbuchstaben übereinstimmen
  6. Starten Sie die SQL Services

Das ist es.

Es ist kein Trennen / Anhängen erforderlich, sofern SQL Server weiß, dass sich nichts geändert hat. Und wenn etwas schrecklich schief geht, haben Sie die alte Kopie der Datenbanken auf der alten LUN auf dem alten Speicherarray. Beim Zurücksetzen müssen lediglich die Laufwerksbuchstaben geändert werden.

mrdenny
quelle