Tworzenie kopii zapasowych wielu baz danych w tym samym momencie

10

Zwykle po rozpoczęciu tworzenia kopii zapasowej nie zezwalamy na zatwierdzanie zmian lub baza danych nie będzie dostępna. Mam na myśli, że baza danych będzie w trybie pojedynczego użytkownika, ale chcę rozpocząć tworzenie kopii zapasowej i zwolnić db do użytku. Ponadto po uruchomieniu kopii zapasowej nie chcę, aby bieżące zmiany były zapisywane w pliku kopii zapasowej. Chcę wiedzieć, jak mogę to osiągnąć w programie Microsoft SQL Server 2012. Proszę o pomoc.

Cóż, najpierw wyjaśnię mój problem. Obecnie ustawiam bazę danych na tryb pojedynczego użytkownika, dopóki kopia zapasowa nie zostanie ukończona. Ten tryb służy mojemu celowi unikania zmian danych podczas tworzenia kopii zapasowej. Ale moja aplikacja jest powiązana z wieloma bazami danych (każda baza danych jest ze sobą połączona i istnieją różne pliki db, które są tworzone co miesiąc). Tworzenie kopii zapasowych wszystkich tych baz danych stało się żmudnym procesem i, co ważniejsze, muszę trzymać użytkowników z dala od systemu podczas tworzenia kopii zapasowej.

Szukam mechanizmu tworzenia kopii zapasowych, który spełni poniższe wymagania.

  1. Rozpocznij tworzenie kopii zapasowej wszystkich dbs na raz i zwolnij db do użytku.
  2. Ponieważ bazy danych są ze sobą połączone, chcę zachować spójność danych w plikach kopii zapasowych. Z powodu tego wymogu spójności danych nie chcę, aby zmiany były zapisywane w moim pliku kopii zapasowej.

Chcę tylko - wykonać kopię zapasową wszystkich dbs w danym momencie.

Praveen
źródło
2
Podczas tworzenia kopii zapasowych nie musisz ustawiać bazy danych w trybie pojedynczego użytkownika. SQL Server nigdy nie uwzględni niezatwierdzonych transakcji w kopii zapasowej. Aby uzyskać bardziej kompletną odpowiedź, edytuj swój wpis, aby zawierał szczegóły modelu odzyskiwania, niezależnie od tego, czy masz na myśli kopie zapasowe dziennika transakcji, kopie pełne lub przyrostowe, a także jaki masz problem. W tej chwili twoje pytanie jest nieco niejasne.
Daniel Hutmacher
1
Co chcesz osiągnąć dzięki tej kopii zapasowej? Pełna odzyskalność do tego momentu - czy coś innego? Innymi słowy ... Jeśli musisz przywrócić z tej kopii zapasowej, co należy przywrócić --- jakieś zmiany DDL? Zmiany danych lub co?
Sevyeightist
To, czego chcesz, nie jest możliwe w SQL 2012. W SQL 7.0 dni, zestaw kopii zapasowych bazy danych był używany do odtworzenia bazy danych, tak jak było w momencie uruchomienia instrukcji BACKUP. Począwszy od SQL 2000 i późniejszych, zestaw kopii zapasowych bazy danych jest używany do odtworzenia bazy danych, tak jak w momencie zakończenia instrukcji BACKUP.
stacylaray
@DanielHutmacher Szukam pełnych kopii zapasowych.
Praveen

Odpowiedzi:

13

Zakładam, że Twoim zadaniem jest utworzenie zestawu kopii zapasowych, w których możesz przywrócić je wszystkie do jednego statycznego punktu (bez otwartych transakcji) (wszystkie w synchronizacji). Podobne do tego, co zrobi ci punkt wyciszenia w DB2. Niestety w SQL Server nie ma nic, co mogłoby to zrobić. Jednak zakładając, że twoje bazy danych są w trybie PEŁNEGO odzyskiwania, możesz zrobić coś podobnego.

Możesz utworzyć pojedynczą MARKEDtransakcję we wszystkich bazach danych jednocześnie . Następnie wykonujesz kopię zapasową dziennika transakcji dla każdej bazy danych. Zakładając, że nadążasz za kopiami zapasowymi dziennika (które i tak powinieneś być), kopie zapasowe dziennika nie zajmują dużo czasu. I nie ma potrzeby powstrzymywania nikogo przed wejściem do systemu (może z wyjątkiem wystarczająco długiego czasu, aby utworzyć zaznaczoną transakcję).

W tym momencie, jeśli musisz wykonać przywracanie, wykonaj czynności RESTORE STOPBEFOREMARKna każdej ze swoich baz danych. Spowoduje to przywrócenie wszystkich baz danych do tego samego punktu (na podstawie Twojej transakcji). Uwaga: Istnieje również STOPATMARK, jeśli chcesz uwzględnić tę transakcję.

Jeśli chcesz przykład, mam go w powyższym linku wraz z sporo dodatkowej lektury.

Zdaję sobie sprawę, że to nie odpowiada dokładnie na twoje pytanie, ale mam nadzieję, że rozwiązuje twój problem.

Kenneth Fisher
źródło
2
W ten sposób BizTalk zarządza kopiami zapasowymi wielu baz danych w czasie. Jeśli działa dla Microsoft BizTalk, jest to właściwie dobrze przetestowana funkcja.
Max Vernon
Używamy go do baz danych TFS w logistyce, którą zmieniliśmy na alwaysOn.
Kin Shah
1
Jeden (domyślny, ale niewypowiedziany) szczegół, który sprowadza odpowiedź Kena do domu: Nie możesz mieć PEŁNEJ kopii zapasowej spójnej na wielu bazach danych. Najbliższe, jakie możesz przyjść, to runda pełnych kopii zapasowych, po której następuje natychmiast zaznaczona transakcja, a następnie runda kopii zapasowych dziennika. Ta pierwsza runda kopii zapasowych dziennika „poprawiłaby” spójność do momentu.
AMtwo
@AMtwo technicznie można to zrobić za pomocą metody OP. Zablokuj wszystkich poza systemem, upewnij się, że nie ma aktywnych połączeń (może oznaczyć bazy danych jako tylko do odczytu / ograniczone), a następnie wykonaj pełne kopie zapasowe każdej bazy danych. Jednak, jak stwierdził PO, nie jest to najlepsza metoda na świecie.
Kenneth Fisher
7

Twoje pytanie jest podobne do pytania, na które odpowiedziałem - Tworzenie kopii zapasowych i przywracanie baz danych SQL Server 10-20 do ~ stanu synchronicznego?

Zakładając, że model odzyskiwania bazy danych jest PEŁNY, powinieneś zrobić pełną kopię zapasową, a następnie użyć Oznaczonych transakcji .

Obala wasze mity ...

Rozpocznij tworzenie kopii zapasowej wszystkich dbs na raz i zwolnij db do użytku.

Z mitów o kopiach zapasowych (zdecydowanie zalecamy przeczytanie wszystkich mitów o kopiach zapasowych) :

Operacje tworzenia kopii zapasowych nie blokują obiektów użytkowników. Kopie zapasowe powodują naprawdę duże obciążenie odczytu w podsystemie we / wy, więc może wyglądać, jakby obciążenie zostało zablokowane, ale tak naprawdę nie jest. To tylko spowolnienie. Istnieje szczególny przypadek, w którym kopia zapasowa, która musi pobierać masowo rejestrowane zakresy, przyjmuje blokadę pliku, która może zablokować operację punktu kontrolnego - ale DML nigdy nie jest blokowany.

Ponieważ bazy danych są ze sobą połączone, chcę zachować spójność danych w plikach kopii zapasowych. Z powodu tego wymogu spójności danych nie chcę, aby zmiany były zapisywane w moim pliku kopii zapasowej.

zaznaczone Transakcje pomogą ci wykonać spójne kopie zapasowe dziennika i będziesz mógł je przywrócić za pomocą RESTORE ... WITH STOPBEFOREMARK = '<mark_name>'

Pamiętaj, że transakcje oznaczone dla wszystkich baz danych w instancji są również rejestrowane w dbo.logmarkhistorytabeli w MSDBbazie danych.

Kin Shah
źródło
-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

więcej szczegółów: https://blogs.technet.microsoft.com/letsdothis/2013/11/06/backup-multiple-sql-databases-in-a-single-swoop/

Thambu
źródło
To nie gwarantuje sam punkt kopii czasowych. To tylko sekwencja kolejnych kopii zapasowych.
vonPryz