Sichern mehrerer Datenbanken zum gleichen Zeitpunkt

10

Wenn wir die Sicherung starten, lassen wir normalerweise keine Änderungen zu, oder die Datenbank ist nicht zugänglich. Ich meine, die Datenbank befindet sich im Einzelbenutzermodus, aber ich möchte die Sicherung starten und die Datenbank zur Verwendung freigeben. Sobald ich die Sicherung starte, möchte ich nicht, dass die laufenden Änderungen in die Sicherungsdatei geschrieben werden. Ich möchte wissen, wie ich dies in Microsoft SQL Server 2012 erreichen kann. Bitte unterstützen Sie mich.

Lassen Sie mich zuerst mein Problem erklären. Derzeit setze ich die Datenbank auf den Einzelbenutzermodus, bis die Sicherung abgeschlossen ist. Dieser Modus dient meinem Zweck, die Datenänderungen während der Sicherung zu vermeiden. Meine Anwendung ist jedoch an mehrere Datenbanken gebunden (jede Datenbank ist miteinander verknüpft, und es gibt Variablen, die monatlich erstellt werden). Das Sichern all dieser Datenbanken ist daher zu einem mühsamen Prozess geworden, und was noch wichtiger ist, ich muss die Benutzer während der Sicherung vom System fernhalten.

Daher suche ich nach einem Sicherungsmechanismus, der die unten genannten Anforderungen erfüllt.

  1. Starten Sie die Sicherung aller Datenbankdaten gleichzeitig und geben Sie die Datenbank zur Verwendung frei.
  2. Da Datenbanken miteinander verknüpft sind, möchte ich, dass die Datenkonsistenz in Sicherungsdateien erhalten bleibt. Aufgrund dieser Datenkonsistenzanforderung möchte ich nicht, dass laufende Änderungen in meine Sicherungsdatei übernommen werden.

Alles was ich will ist - Backup aller DBS zu einem bestimmten Zeitpunkt.

Praveen
quelle
2
Sie müssen Ihre Datenbank nicht auf den Einzelbenutzermodus einstellen, wenn Sie Sicherungen durchführen. SQL Server wird niemals nicht festgeschriebene Transaktionen in Ihre Sicherung aufnehmen. Um eine vollständigere Antwort zu erhalten, bearbeiten Sie Ihren Beitrag so, dass er Details zu Ihrem Wiederherstellungsmodell enthält, unabhängig davon, ob es sich um Transaktionsprotokollsicherungen, vollständige oder inkrementelle Sicherungen handelt und um welches Problem es sich handelt. Derzeit ist Ihre Frage etwas unklar.
Daniel Hutmacher
1
Was möchten Sie mit diesem Backup erreichen? Volle Wiederherstellbarkeit bis zu diesem Punkt - oder etwas anderes? Mit anderen Worten ... Wenn Sie aus dieser Sicherung wiederherstellen müssen, was sollte wiederhergestellt werden - irgendwelche DDL-Änderungen? Datenänderungen oder was?
Siebzigjähriger
Was Sie möchten, ist in SQL 2012 nicht möglich. In den Tagen von SQL 7.0 wurde der Datenbanksicherungssatz verwendet, um die Datenbank wie zum Zeitpunkt des Starts der BACKUP-Anweisung neu zu erstellen. Ab SQL 2000 wird ein Datenbanksicherungssatz verwendet, um die Datenbank so neu zu erstellen, wie sie zum Zeitpunkt des Abschlusses der BACKUP-Anweisung war.
Stacylaray
@ DanielHutmacher Ich suche nach vollständigen Backups.
Praveen

Antworten:

13

Ich gehe davon aus, dass Ihre Aufgabe darin besteht, eine Reihe von Sicherungen zu erstellen, in denen Sie alle an einem einzigen statischen Punkt (keine offenen Transaktionen) wiederherstellen können (alle synchron). Ähnlich wie ein Ruhepunkt in DB2 für Sie. Leider gibt es in SQL Server nichts, was genau das tut. Angenommen, Ihre Datenbanken befinden sich im vollständigen Wiederherstellungsmodus, können Sie etwas Ähnliches tun.

Sie können eine einzelne MARKEDTransaktion für alle Datenbanken gleichzeitig erstellen . Anschließend erstellen Sie eine Transaktionsprotokollsicherung für jede Datenbank. Angenommen, Sie halten mit Ihren Protokollsicherungen Schritt (was Sie sowieso sein sollten). Protokollsicherungen dauern nicht lange. Und es besteht keine Notwendigkeit, jemanden daran zu hindern, im System zu sein (außer vielleicht lange genug, um Ihre markierte Transaktion zu erstellen).

Wenn Sie zu diesem Zeitpunkt eine Wiederherstellung durchführen müssen, führen Sie eine RESTORE STOPBEFOREMARKfür jede Ihrer Datenbanken durch. Dadurch werden alle Datenbanken an demselben Punkt wiederhergestellt (basierend auf Ihrer Transaktion). Hinweis: Es gibt auch ein STOPATMARK, wenn Sie diese Transaktion einschließen möchten.

Wenn Sie ein Beispiel möchten, habe ich eines im obigen Link zusammen mit einigen zusätzlichen Informationen.

Mir ist klar, dass dies Ihre Frage nicht genau beantwortet, aber hoffentlich Ihr Problem löst.

Kenneth Fisher
quelle
2
Auf diese Weise verwaltet BizTalk zeitpunktbezogene Sicherungen mehrerer Datenbanken. Wenn es für Microsoft BizTalk funktioniert, ist es eine gut getestete Funktion.
Max Vernon
Wir verwenden es für TFS-Datenbanken beim Logshipping, das wir in alwaysOn geändert haben.
Kin Shah
1
Ein (implizites, aber nicht gesagtes) Detail, um Kens Antwort nach Hause zu bringen: Sie können keine vollständige Sicherung haben, die über mehrere DBs hinweg konsistent ist. Am nächsten können Sie eine Runde vollständiger Sicherungen durchführen, unmittelbar gefolgt von einer markierten Transaktion und einer Runde Protokollsicherungen. Diese erste Runde von Protokollsicherungen würde die Konsistenz bis zum Zeitpunkt "wahr" machen.
Zwei
@AMtwo technisch könnten Sie mit der OPs-Methode. Sperren Sie alle Benutzer aus dem System, stellen Sie sicher, dass keine aktiven Verbindungen vorhanden sind (markieren Sie die Datenbanken möglicherweise als schreibgeschützt / eingeschränkt), und führen Sie dann vollständige Sicherungen aller Datenbanken durch. Wie das OP sagte, ist es jedoch nicht die beste Methode der Welt.
Kenneth Fisher
7

Ihre Frage ähnelt der von mir beantworteten Frage: Sichern und Wiederherstellen von 10-20 SQL Server-Datenbanken in einem synchronen Zustand?

Angenommen, Ihr Datenbankwiederherstellungsmodell ist VOLL, sollten Sie eine vollständige Sicherung erstellen und dann Markierte Transaktionen verwenden .

Lass uns deine Mythen entlarven ...

Starten Sie die Sicherung aller Datenbankdaten gleichzeitig und geben Sie die Datenbank zur Verwendung frei.

Aus Backup-Mythen (Wir empfehlen Ihnen dringend, alle Backup-Mythen zu lesen) :

Sicherungsvorgänge sperren keine Benutzerobjekte. Sicherungen verursachen eine sehr hohe Leselast auf dem E / A-Subsystem, sodass es möglicherweise so aussieht, als würde die Arbeitslast blockiert, dies ist jedoch nicht der Fall. Es wird nur verlangsamt. Es gibt einen Sonderfall, in dem eine Sicherung, die massenprotokollierte Speicherbereiche erfassen muss, eine Dateisperre benötigt, die einen Prüfpunktvorgang blockieren kann - DML wird jedoch niemals blockiert.

Da Datenbanken miteinander verknüpft sind, möchte ich, dass die Datenkonsistenz in Sicherungsdateien erhalten bleibt. Aufgrund dieser Datenkonsistenzanforderung möchte ich nicht, dass laufende Änderungen in meine Sicherungsdatei übernommen werden.

Mit markierten Transaktionen können Sie eine konsistente LOG-Sicherung erstellen und diese mithilfe von wiederherstellenRESTORE ... WITH STOPBEFOREMARK = '<mark_name>'

Beachten Sie, dass markierte Transaktionen für alle Datenbanken in der Instanz auch in der dbo.logmarkhistoryTabelle in der MSDBDatenbank aufgezeichnet werden.

Kin Shah
quelle
-1
--]---- Begin Code ----[
--–declaring variables
DECLARE @dbname VARCHAR(100) -- database name
DECLARE @bupath VARCHAR(100) -- path for backup location
DECLARE @filename VARCHAR(100) -- filename used for backup files
DECLARE @datestamp VARCHAR(25) -- date used for backup file timestamp
-- specify database backup directory
SET @bupath = 'D:\DB Bkp\'
-- file date formatting
SELECT @datestamp = CONVERT(VARCHAR(20),GETDATE(),112) + REPLACE
(CONVERT(VARCHAR(20),GETDATE(),108),':','')
--specify databases to backup
DECLARE db_cursor CURSOR for
SELECT name
FROM master.dbo.sysdatabases
WHERE name not IN ('tempdb') -- excludes these databases, if excluding multiple databases, seprate them by a comma
--backup process
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
   SET @filename = @bupath + @dbname + '_' + @datestamp + '.bak'
   BACKUP DATABASE @dbname TO DISK = @filename WITH INIT,
   CHECKSUM; --init overwrites existing files with the same name, and checksum verifies the backup
       FETCH NEXT from db_cursor INTO @dbname
END
CLOSE db_cursor
DEALLOCATE db_cursor

Für weitere Informationen: https://blogs.technet.microsoft.com/letsdothis/2013/11/06/backup-multiple-sql-databases-in-a-single-swoop/

Thambu
quelle
Dies garantiert keine Backups zum gleichen Zeitpunkt. Es ist lediglich eine Folge aufeinanderfolgender Sicherungen.
vonPryz