Können die Dateien einer Datenbank kopiert werden, während eine Datenbank online ist?


9

Ich arbeite daran, eine Entwicklungskopie einer Produktionsdatenbank unter SQL Server 2008 R2 SP1 einzurichten. Die Live-Datenbank wird derzeit von zwei Entwicklern nur für schreibgeschützte Abfragen verwendet, aber die neue Datenbank wird auch aktualisiert.

Da die Datenbank 2,1 TB groß ist und insgesamt 3 Tage für die Wiederherstellung und Aktualisierung auf den neuesten Build benötigt hat, den wir zum Testen benötigen, bestand mein ursprünglicher Plan darin, einen neuen Satz von Sicherungsdateien zu erstellen und diese dann wiederherzustellen. Auf diese Weise kann ich die Entwicklungskopie der Datenbank auf derselben SQL-Instanz und demselben Computer erstellen, ohne die aktuelle Datenbank offline schalten zu müssen.

Um ein paar dieser Tage zu sparen, dachte ich jedoch, dass es eine gute Idee sein könnte, einfach die physischen Datenbankdateien zu kopieren und die neue Kopie der Datenbank anzuhängen. Leider erhalte ich beim Kopieren eine Fehlermeldung bezüglich der Sperre, die SQL Server für diese Dateien setzt.

Gibt es eine Möglichkeit, die Live-Datenbankdateien zu kopieren, ohne die Datenbank in einen Offline-Zustand zu versetzen, da ich die Datenbank nur für die Übertragung der Protokolldateien offline schalten kann (ich kann dies beenden, bevor die Leute morgens einsteigen)? Oder sollte ich warten, bis die Leute nach Hause gehen, um das zu tun?

Antworten:


11

Warum dauert das Sichern / Wiederherstellen einer 2,1-TB-Datenbank 3 Tage? Wenn es nur um das Verschieben des Backups geht, würde ich vermuten, dass das Kopieren der MDF / LDF-Dateien tatsächlich langsamer ist, da zumindest das Backup komprimiert werden könnte. Und wenn es nur um das Wiederherstellen geht, sollte das Schreiben der Kopien der Datei dort nicht schneller sein als der Wiederherstellungsprozess selbst - stellen Sie sicher, dass die sofortige Dateiinitialisierung aktiviert ist . Oder erhalten Sie schnellere E / A auf dem sekundären System.

Nein, Sie können die MDF / LDF-Dateien nicht kopieren, während die Datenbank online ist. Dazu müssen Sie sie offline schalten. Und dies ist der absolut MINDESTSICHERE Weg, eine Datenbank zu kopieren. Wenn etwas mit den Dateien passiert, während sie getrennt / offline sind, haben Sie jetzt keine Kopien Ihrer Datenbank.

Ich würde vorschlagen, nach Möglichkeiten zu suchen, um das Sichern / Wiederherstellen zu beschleunigen - ob es sicherstellt, dass Sie Ihre Backups komprimieren und die Dateien auf die bestmögliche Weise übertragen, das beste verfügbare E / A-Subsystem verwenden, bessere E / A-Vorgänge erzielen Stellen Sie sicher, dass IFI aktiviert ist usw.

Eine weitere Option, die in Betracht gezogen werden sollte, ist der Round-Robin-Protokollversand. Vorausgesetzt, die Produktion wird vollständig wiederhergestellt und Sie führen regelmäßige Protokollsicherungen durch, können Sie den Protokollversand an eine Datenbank durchführen, während Entwickler an einer anderen arbeiten. Wenn Sie an einem stabilen Punkt angelangt sind, können Sie ihn mit Wiederherstellung wiederherstellen Lassen Sie die Entwickler wechseln und nehmen Sie die letzten Änderungen mit. Initialisieren Sie nun den Protokollversand für die Kopie neu, an der sie gerade nicht mehr gearbeitet haben, und sie wird beim nächsten "stabilen" Schnitt ohne Wartezeit für sie bereit sein.


Die Sicherung würde eine unbekannte Anzahl von Stunden dauern (ich habe die ursprüngliche Sicherung nicht erstellt). Die Wiederherstellung dauert 10 Stunden, und das Ausführen von Updates, um sie auf unseren Entwicklungs-Build zu bringen, dauert weitere 8 Stunden. Wenn wir also von einem 24-Stunden-Tag sprechen, dauert es nur 18 Stunden. Apropos 8-Stunden-Tage, das sind im Grunde 3 Tage (Hinzufügen einiger Zeit zum Kopieren von Dateien). Es gibt ABSOLUT Möglichkeiten, den Sicherungs- / Wiederherstellungsprozess selbst zu optimieren, und das werde ich jetzt tun, da ich weiß, dass ich so vorgehen möchte.
Sean Long

0

Nein, Sie müssen es offline schalten, um die Dateien zu kopieren. Wenn Sie Ihre Datenbank in kleinere Dateien / Dateigruppen unterteilt haben, kann dies dazu beitragen, dass die Sicherung nach einmaligem Wiederherstellen schneller wiederhergestellt wird (abhängig davon, welche Daten sich ändern und welche Daten für die Entwicklungskopie benötigt werden).


0

Ich habe die anderen Antworten gesehen und sie machen vollkommen Sinn. Um Ihre Frage zu beantworten, können Sie jedoch sicherlich Datenbankdateien kopieren, ohne die Datenbank offline zu schalten. Zu diesem Zweck müssen Sie die SMO-Programmierung verwenden. Überprüfen Sie dies: http://technet.microsoft.com/en-us/library/ms162175(v=sql.100).aspx

Bitte beachten Sie, dass der bereitgestellte Link auf allgemeine SMO-Programmierobjekte verweist und keine spezifische Antwort auf diese Frage darstellt. Ich habe es noch nicht getan, aber ich werde es bald ausprobieren und alle wissen lassen (wenn ich mich erinnere), was ich herausfinde.


-1

Können die Dateien einer Datenbank kopiert werden, während eine Datenbank online ist?

Ja.

Sie müssen lediglich die Datenbank auf schreibgeschützt einstellen:

  1. Lauf:

    USE [master]
    GO
    ALTER DATABASE [Database] SET READ_ONLY WITH NO_WAIT
    GO
    
  2. Kopieren Sie die Datenbankdateien - MDF, LDF usw. - an ihr neues Ziel

  3. Sobald der Kopiervorgang abgeschlossen ist, können Sie den neuen Speicherort trennen und erneut anhängen. Stellen Sie einfach sicher, dass Sie die schreibgeschützte Option zurücksetzen und dass Sie bei der Bearbeitung dieser Dateien dasselbe Benutzerkonto verwenden. Möglicherweise möchten Sie auch die alten Dateien nach dem Verschieben löschen.

Eine andere Methode

Nachdem die Dateien erfolgreich kopiert wurden (Schritt 2 oben):

Sie können die Datenbank auf folgenden Single_UserModus einstellen :

  1. Lauf:

    USE [master]
    GO
    ALTER DATABASE [Database] SET  Single_USER WITH NO_WAIT
    GO
    
  2. D:\ der neue Ort sein

    ALTER DATABASE Database MODIFY FILE
    (NAME = DATABASE, FILENAME = 'D:\DATABASE.mdf')
    GO
    ALTER DATABASE OHDSI MODIFY FILE
    (NAME = DATABASE_LOG, FILENAME = 'D:\DATABASE_LOG.ldf')
    GO
    
  3. Stellen Sie sicher, dass die Datendateien am neuen Speicherort ( D:\) vollen Zugriff auf das Dienstkonto haben, auf dem SQL Server ausgeführt wird.

  4. Starten Sie die SQL-Dienste neu

  5. Lauf:

    USE [master]
    GO
    ALTER DATABASE [Database] SET  Multi_USER WITH NO_WAIT
    GO
    

Erledigt!


Beachten Sie zunächst, dass das Versetzen der Datenbank in den schreibgeschützten Modus einen effektiven Ausfall verursacht, wenn bei normaler Verwendung in die Datenbank geschrieben werden muss. Zweitens würde ich erwarten, dass SQL Server die Dateien weiterhin für die Verwendung sperrt, wenn sie gelesen werden. Wenn Ihre persönliche Erfahrung oder MS-Dokumentation etwas anderes aussagt, bearbeiten Sie dies bitte in Ihrer Antwort. Drittens ist der Rat, den ich allgemein zum Ändern eines Dateispeicherorts gesehen habe, die DB offline zu schalten, nicht nur in den Einzelbenutzermodus. Wenn Sie persönliche Erfahrungen haben oder MS-Dokumente etwas anderes vorschlagen, bearbeiten Sie diese bitte als Antwort. Vielen Dank!
RDFozz

Das ist richtig! Schreibgeschützt verhindert, dass Benutzer schreiben, aber sie können lesen. In Ihrem zweiten Punkt - ja, Sie können die Datenbank offline schalten - ist die Frage, während Sie online sind. Der oben beschriebene Prozess funktioniert mit minimalen Ausfallzeiten. Vielen Dank.
RAVicioso

@RAVicioso Die schreibgeschützte Datenbank ist ebenfalls ein Ausfall. Wenn Sie keine neuen Daten schreiben können (dh Bestellungen entgegennehmen), ist Ihr System effektiv ausgefallen. Das scheint eine schlechte Idee zu sein, nicht?
Erik Darling

@sp_BlitzErik - Die Lösung funktioniert, aber Sie können während dieser Art der Wartung nicht schreiben. In Ihrem Beispiel: "Bestellungen annehmen" wird dies nicht tun.
RAVicioso
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.