Sauvegarde de plusieurs bases de données au même moment

10

Habituellement, lorsque nous démarrons la sauvegarde, nous n'autorisons pas les modifications à valider ou la base de données ne sera pas accessible. Je veux dire que la base de données sera en mode mono-utilisateur mais je veux démarrer la sauvegarde et libérer la base de données pour utilisation. De plus, une fois que j'ai démarré la sauvegarde, je ne souhaite pas que les modifications en cours soient enregistrées dans le fichier de sauvegarde. Je veux savoir comment je peux y parvenir dans Microsoft SQL Server 2012.Veuillez m'aider.

Eh bien, laissez-moi d'abord expliquer mon problème. Actuellement, je mets la base de données en mode mono-utilisateur jusqu'à la fin de la sauvegarde. Ce mode servira à éviter les changements de données lorsque la sauvegarde est en cours. Mais mon application est liée aux multiples bases de données (chaque base de données est interconnectée et il y a des var dbs qui continuent de créer mensuellement). La sauvegarde de toutes ces bases de données est donc devenue un processus fastidieux et, plus important encore, je dois garder les utilisateurs hors du système lorsque la sauvegarde est en cours.

Je recherche donc un mécanisme de sauvegarde qui répondra aux exigences mentionnées ci-dessous.

  1. Démarrez la sauvegarde de tous les dbs à la fois et libérez la db pour l'utiliser.
  2. Comme les bases de données sont liées entre elles, je souhaite conserver la cohérence des données dans les fichiers de sauvegarde. Donc, en raison de cette exigence de cohérence des données, je ne veux pas que les modifications en cours soient validées dans mon fichier de sauvegarde.

Tout ce que je veux, c'est une sauvegarde de tous les dbs à un moment donné.

Praveen
la source
2
Vous n'avez pas besoin de mettre votre base de données en mode mono-utilisateur lorsque vous effectuez des sauvegardes. SQL Server n'inclura jamais de transactions non validées dans votre sauvegarde. Pour une réponse plus complète, veuillez modifier votre publication pour inclure les détails de votre modèle de récupération, que vous parliez de sauvegardes du journal des transactions, de sauvegardes complètes ou incrémentielles, ainsi que du problème que vous rencontrez. En l'état, votre question n'est pas claire.
Daniel Hutmacher
1
Que voulez-vous réaliser avec cette sauvegarde? Récupération totale jusqu'à ce point - ou autre chose? En d'autres termes ... Si vous devez effectuer une restauration à partir de cette sauvegarde, qu'est-ce qui devrait être restauré --- toute modification DDL? Modifications des données, ou quoi?
Seventyightightist
Ce que vous voulez n'est pas possible dans SQL 2012. Dans les jours SQL 7.0, le jeu de sauvegarde de base de données a été utilisé pour recréer la base de données telle qu'elle était au moment où l'instruction BACKUP a commencé. À partir de SQL 2000 et versions ultérieures, un jeu de sauvegarde de base de données est utilisé pour recréer la base de données telle qu'elle était au moment où l'instruction BACKUP s'est terminée.
stacylaray
@DanielHutmacher Je recherche des sauvegardes complètes.
Praveen

Réponses:

13

Je suppose que votre tâche consiste à créer un ensemble de sauvegardes où vous pouvez les restaurer toutes en un seul point statique (pas de transactions ouvertes) (tous synchronisés). Semblable à ce qu'un point de repos fera pour vous dans DB2. Malheureusement, rien dans SQL Server ne fait exactement cela. Cependant, en supposant que vos bases de données sont en mode de récupération complète, vous pouvez faire quelque chose de similaire.

Vous pouvez créer une seule MARKEDtransaction sur toutes les bases de données à la fois . Ensuite, vous effectuez une sauvegarde du journal des transactions de chaque base de données. En supposant que vous suivez vos sauvegardes de journaux (que vous devriez être de toute façon), les sauvegardes de journaux ne prennent pas très longtemps. Et il n'est pas nécessaire d'empêcher quiconque d'être dans le système (sauf peut-être assez longtemps pour que vous puissiez créer votre transaction marquée).

À ce stade, si vous devez effectuer une restauration, vous effectuez une RESTORE STOPBEFOREMARKsur chacune de vos bases de données. Cela restaurera toutes les bases de données au même point (en fonction de votre transaction). Remarque: Il existe également un STOPATMARK si vous souhaitez inclure cette transaction.

Si vous voulez un exemple, j'en ai un dans le lien ci-dessus avec pas mal de lecture supplémentaire.

Je sais que cela ne répond pas exactement à votre question, mais j'espère que cela résoudra votre problème.

Kenneth Fisher
la source
2
C'est ainsi que BizTalk gère les sauvegardes ponctuelles de plusieurs bases de données. Si cela fonctionne pour Microsoft BizTalk, c'est à peu près une fonctionnalité bien testée.
Max Vernon
Nous l'utilisons pour les bases de données TFS dans les envois de journaux que nous avons modifiés en alwaysOn.
Kin Shah
1
Un détail (implicite mais non dit) pour conduire la réponse de Ken à la maison: vous ne pouvez pas avoir une sauvegarde complète cohérente sur plusieurs bases de données. Le plus proche que vous pouvez faire est d'effectuer une série de sauvegardes complètes, immédiatement suivie d'une transaction marquée, puis d'une série de sauvegardes de journaux. Cette première série de sauvegardes de journaux "confirmerait" la cohérence au point dans le temps.
AMtwo
@AMtwo techniquement, vous pourriez le faire en utilisant la méthode OPs. Verrouillez tout le monde hors du système, assurez-vous qu'il n'y a pas de connexions actives (peut-être marquer les bases de données comme étant en lecture seule / restreintes), puis effectuez des sauvegardes complètes de chaque base de données. Cependant, comme l'OP l'a déclaré, ce n'est pas la meilleure méthode au monde.
Kenneth Fisher
7

Votre question est similaire à celle à laquelle j'ai répondu - Sauvegarder et restaurer les bases de données 10-20 SQL Server dans un état ~ synchrone?

En supposant que votre modèle de récupération de base de données est COMPLET, vous devez effectuer une sauvegarde complète, puis utiliser les transactions marquées .

Permet de démystifier vos mythes ...

Démarrez la sauvegarde de tous les dbs à la fois et libérez la db pour l'utiliser.

Des mythes de sauvegarde (vous conseille fortement de lire tous les mythes de sauvegarde) :

Les opérations de sauvegarde ne prennent pas de verrous sur les objets utilisateur. Les sauvegardes provoquent une charge de lecture très lourde sur le sous-système d'E / S, il peut donc sembler que la charge de travail est bloquée, mais ce n'est pas vraiment le cas. C'est juste en train de ralentir. Il y a un cas spécial où une sauvegarde qui doit récupérer des extensions enregistrées en masse prendra un verrou de fichier qui pourrait bloquer une opération de point de contrôle - mais DML n'est jamais bloqué.

Comme les bases de données sont liées entre elles, je souhaite conserver la cohérence des données dans les fichiers de sauvegarde. Donc, en raison de cette exigence de cohérence des données, je ne veux pas que les modifications en cours soient validées dans mon fichier de sauvegarde.

Les transactions marquées vous aideront à effectuer une sauvegarde de LOG cohérente et vous pourrez les restaurer à l'aide de RESTORE ... WITH STOPBEFOREMARK = '<mark_name>'

N'oubliez pas que les transactions marquées pour toutes les bases de données de l'instance sont également enregistrées dans le dbo.logmarkhistorytableau de la MSDBbase de données.

Kin Shah
la source
-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

pour plus de détails: https://blogs.technet.microsoft.com/letsdothis/2013/11/06/backup-multiple-sql-databases-in-a-single-swoop/

thambu
la source
Cela ne garantit pas les mêmes sauvegardes au même moment. Il s'agit simplement d'une séquence de sauvegardes consécutives.
vonPryz