Backup di più database nello stesso momento


10

Di solito quando si avvia il backup non è consentito il commit delle modifiche o il database non sarà accessibile. Voglio dire, il database sarà in modalità utente singolo, ma voglio avviare il backup e rilasciare il db per l'uso. Inoltre, una volta avviato il backup non voglio che le modifiche in corso vengano scritte nel file di backup. Voglio sapere come posso ottenere questo risultato in Microsoft SQL Server 2012. Aiutatemi.

Bene, lasciami spiegare prima il mio problema. Attualmente sto impostando il database in modalità utente singolo fino al completamento del backup. Questa modalità servirà al mio scopo di evitare la modifica dei dati quando è in corso il backup. Ma la mia applicazione è legata a più database (ogni database è collegato tra loro e ci sono var dbs che continuano a creare su base mensile). Quindi il backup di tutti questi database è diventato un processo noioso e, soprattutto, devo tenere gli utenti fuori dal sistema quando il backup è in corso.

Quindi sto cercando un meccanismo di backup che soddisfi i requisiti di seguito indicati.

  1. Avviare il backup di tutti i db alla volta e rilasciare il db per l'uso.
  2. Dato che i database sono collegati tra loro, voglio mantenere la coerenza dei dati nei file di backup. Pertanto, a causa di questo requisito di coerenza dei dati, non voglio che le modifiche in corso vengano impegnate nel mio file di backup.

Tutto quello che voglio è - il backup di tutti i dbs in un determinato momento.


2
Non è necessario impostare il database in modalità utente singolo quando si eseguono i backup. SQL Server non includerà mai transazioni senza commit nel backup. Per una risposta più completa, modifica il tuo post per includere i dettagli del tuo modello di recupero, sia che tu intenda i backup del registro delle transazioni, i backup completi o incrementali, nonché il problema che stai riscontrando. Allo stato attuale, la tua domanda non è chiara.
Daniel Hutmacher,

1
Cosa vuoi ottenere da questo backup? Completa recuperabilità fino a questo punto - o qualcos'altro? In altre parole ... Se è necessario ripristinare da questo backup, cosa deve essere ripristinato --- eventuali modifiche DDL? Modifiche ai dati o cosa?
Seventyeightist

Ciò che si desidera non è possibile in SQL 2012. Nei giorni SQL 7.0, il set di backup del database è stato utilizzato per ricreare il database com'era al momento in cui è stata avviata l'istruzione BACKUP. A partire da SQL 2000 e successivi, viene utilizzato un set di backup del database per ricreare il database com'era al momento in cui è stata completata l'istruzione BACKUP.
Stacylaray,

@DanielHutmacher Sto cercando backup completi.
Praveen,

Risposte:


13

Suppongo che il tuo compito sia quello di creare una serie di backup in cui è possibile ripristinarli tutti su un singolo punto statico (nessuna transazione aperta) (tutti sincronizzati). Simile a quello che farà un punto di sospensione per te in DB2. Sfortunatamente non c'è nulla in SQL Server che faccia esattamente questo. Tuttavia, supponendo che i database siano in modalità di recupero COMPLETO, è possibile fare qualcosa di simile.

È possibile creare una singola MARKEDtransazione su tutti i database contemporaneamente . Quindi si esegue un backup del registro delle transazioni di ciascun database. Supponendo che tu stia al passo con i tuoi backup dei log (che dovresti comunque essere) i backup dei log non impiegano molto tempo. E non è necessario impedire a nessuno di essere nel sistema (tranne forse abbastanza a lungo per creare la transazione contrassegnata).

A questo punto, se è necessario eseguire un ripristino, eseguire una operazione RESTORE STOPBEFOREMARKsu ciascuno dei database. Ciò ripristinerà tutti i database nello stesso punto (in base alla transazione). Nota: esiste anche un STOPATMARK se si desidera includere quella transazione.

Se vuoi un esempio ne ho uno nel link sopra insieme a un bel po 'di lettura aggiuntiva.

Mi rendo conto che questo non risponde esattamente alla tua domanda, ma spero che risolva il tuo problema.


2
In questo modo BizTalk gestisce i backup temporizzati di più database. Se funziona per Microsoft BizTalk, è praticamente una funzionalità ben collaudata.
Max Vernon,

Lo usiamo per i database TFS nel log shipping che abbiamo cambiato in alwaysOn.
Kin Shah,

1
Un dettaglio (implicito ma non detto) per portare a casa la risposta di Ken: non è possibile avere un backup COMPLETO coerente su più DB. Il più vicino possibile è fare un giro di backup completi, immediatamente seguito da una transazione contrassegnata, quindi un giro di backup del registro. Quel primo round di backup dei log "realizzerebbe" la coerenza fino al momento.
Due

@AM Due tecnicamente è possibile utilizzando il metodo OPs. Bloccare tutti fuori dal sistema, assicurarsi che non vi siano connessioni attive (magari contrassegnare i database come di sola lettura / con restrizioni), quindi eseguire i backup completi di ogni database. Tuttavia, come affermato dall'OP, non è il metodo migliore al mondo.
Kenneth Fisher,

7

La tua domanda è simile a quella a cui ho risposto: il backup e il ripristino di database SQL Server 10-20 in uno stato ~ sincrono?

Supponendo che il modello di recupero del database sia COMPLETO, è necessario eseguire un backup completo e utilizzare Transazioni contrassegnate .

Consente di sfatare i tuoi miti ...

Avviare il backup di tutti i db alla volta e rilasciare il db per l'uso.

Dai miti del backup (consiglio vivamente di leggere tutti i miti del backup) :

Le operazioni di backup non bloccano gli oggetti utente. I backup causano un carico di lettura molto pesante sul sottosistema I / O, quindi potrebbe sembrare che il carico di lavoro sia bloccato, ma in realtà non lo è. Viene solo rallentato. C'è un caso speciale in cui un backup che deve recuperare estensioni registrate in blocco richiederà un blocco di file che potrebbe bloccare un'operazione di checkpoint, ma DML non viene mai bloccato.

Dato che i database sono collegati tra loro, voglio mantenere la coerenza dei dati nei file di backup. Pertanto, a causa di questo requisito di coerenza dei dati, non voglio che le modifiche in corso vengano impegnate nel mio file di backup.

le Transazioni contrassegnate ti aiuteranno a eseguire un backup LOG coerente e sarai in grado di ripristinarle utilizzando RESTORE ... WITH STOPBEFOREMARK = '<mark_name>'

Ricordare che anche le transazioni contrassegnate per tutti i database sull'istanza sono registrate nella dbo.logmarkhistorytabella nel MSDBdatabase.


-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

per maggiori dettagli: https://blogs.technet.microsoft.com/letsdothis/2013/11/06/backup-multiple-sql-d database-in-a - single - swoop/


Ciò non garantisce gli stessi backup temporizzati. È semplicemente una sequenza di backup consecutivi.
vonPryz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.