Резервное копирование нескольких баз данных в один и тот же момент времени

10

Обычно, когда мы запускаем резервное копирование, мы не разрешаем вносить изменения, иначе база данных будет недоступна. Я имею в виду, что база данных будет в однопользовательском режиме, но я хочу начать резервное копирование и выпустить БД для использования. Кроме того, после запуска резервного копирования я не хочу, чтобы текущие изменения записывались в файл резервной копии. Я хочу знать, как я могу добиться этого в Microsoft SQL Server 2012. Пожалуйста, помогите мне.

Что ж, позвольте мне сначала объяснить мою проблему. В настоящее время я устанавливаю базу данных в однопользовательский режим, пока резервное копирование не будет завершено. Этот режим будет служить моей цели - избежать изменений данных во время резервного копирования. Но мое приложение связано с несколькими базами данных (каждая база данных взаимосвязана, и существуют базы данных var dbs, которые создаются ежемесячно). Поэтому резервное копирование всех этих баз данных стало утомительным процессом, и что более важно, я должен держать пользователей вне системы во время резервного копирования.

Поэтому я ищу механизм резервного копирования, который будет соответствовать нижеуказанным требованиям.

  1. Начните резервное копирование всех БД одновременно и выпустите БД для использования.
  2. Поскольку базы данных связаны друг с другом, я хочу, чтобы согласованность данных поддерживалась в файлах резервных копий. Поэтому из-за этого требования согласованности данных я не хочу вносить изменения в мой файл резервной копии.

Все, что я хочу, - это резервное копирование всех БД в данный момент времени.

Praveen
источник
2
Вам не нужно устанавливать базу данных в однопользовательский режим при создании резервных копий. SQL Server никогда не будет включать незафиксированные транзакции в вашу резервную копию. Чтобы получить более полный ответ, отредактируйте свою публикацию, включив в нее сведения о своей модели восстановления, будь то резервные копии журнала транзакций, полные или инкрементные резервные копии, а также проблемы, с которыми вы столкнулись. Ваш вопрос немного неясен.
Даниэль Хутмахер
1
Чего вы хотите добиться с помощью этой резервной копии? Полная восстанавливаемость к этому моменту - или что-то еще? Другими словами ... Если вам нужно восстановить из этой резервной копии, что должно быть восстановлено - любые изменения DDL? Изменения в данных или что?
семидесятник
То, что вы хотите, невозможно в SQL 2012. В SQL 7.0 дней набор резервных копий базы данных использовался для воссоздания базы данных, как это было во время запуска оператора BACKUP. Начиная с SQL 2000 и далее, набор резервных копий базы данных используется для воссоздания базы данных, как это было во время выполнения оператора BACKUP.
Stacylaray
@DanielHutmacher Я ищу полные резервные копии.
Правин

Ответы:

13

Я предполагаю, что ваша задача - создать набор резервных копий, в котором вы можете восстановить все из них в одну статическую (без открытых транзакций) точку (все синхронизировано). Подобно тому, что точка покоя сделает для вас в DB2. К сожалению, в SQL Server нет ничего, что делает именно это. Однако, если ваши базы данных находятся в режиме полного восстановления, вы можете сделать что-то подобное.

Вы можете создать одну MARKEDтранзакцию для всех баз данных одновременно . Затем вы делаете резервную копию журнала транзакций каждой базы данных. Предполагая, что вы не отставали от своих резервных копий журналов (которые должны быть в любом случае), резервные копии журналов не занимают много времени. И нет необходимости останавливать кого-либо в системе (за исключением, может быть, достаточно долго, чтобы создать помеченную транзакцию).

На данный момент, если вам нужно сделать восстановление, то вы делаете RESTORE STOPBEFOREMARKна каждой из ваших баз данных. Это восстановит все базы данных в одну точку (в зависимости от вашей транзакции). Примечание. Существует также STOPATMARK, если вы хотите включить эту транзакцию.

Если вы хотите пример, у меня есть один в ссылке выше вместе с небольшим дополнительным чтением.

Я понимаю, что это не совсем отвечает на ваш вопрос, но, надеюсь, это решит вашу проблему.

Кеннет Фишер
источник
2
Именно так BizTalk управляет резервным копированием нескольких баз данных на определенный момент времени. Если это работает для Microsoft BizTalk, это в значительной степени хорошо проверенная функция.
Макс Вернон
Мы используем его для баз данных TFS, при смене журнала мы изменили на AlwaysOn.
Кин Шах
1
Одна (подразумеваемая, но невысказанная) деталь, которая поможет донести ответ Кена до дома: у вас не может быть ПОЛНОЙ резервной копии, согласованной для нескольких БД. Самое близкое, что вы можете получить, - это взять полный набор резервных копий, сразу за ним следует отмеченная транзакция, а затем цикл резервного копирования журналов. Этот первый раунд резервного копирования журналов «подтвердил бы» согласованность до определенного момента времени.
2
@ Технически, вы можете использовать два метода OP. Заблокируйте всех из системы, убедитесь, что нет активных соединений (возможно, отметьте базы данных как доступные только для чтения / ограниченные), затем сделайте полное резервное копирование каждой базы данных. Однако, как заявил ОП, это не лучший метод в мире.
Кеннет Фишер
7

Ваш вопрос похож на тот, на который я ответил - Резервное копирование и восстановление 10-20 баз данных SQL Server в синхронное состояние?

Предполагая, что ваша модель восстановления базы данных FULL, вы должны сделать полную резервную копию и затем использовать помеченные транзакции .

Давайте развенчаем ваши мифы ...

Начните резервное копирование всех БД одновременно и выпустите БД для использования.

Из мифов о резервном копировании (настоятельно советую прочитать все мифы о резервном копировании) :

Операции резервного копирования не блокируют пользовательские объекты. Резервные копии действительно вызывают большую нагрузку чтения в подсистеме ввода-вывода, поэтому может показаться, что рабочая нагрузка блокируется, но на самом деле это не так. Это просто замедляется. Существует особый случай, когда резервная копия, которая должна собирать экстенты с массовой записью, будет блокировать файл, который может заблокировать операцию контрольной точки, но DML никогда не блокируется.

Поскольку базы данных связаны друг с другом, я хочу, чтобы согласованность данных поддерживалась в файлах резервных копий. Поэтому из-за этого требования согласованности данных я не хочу вносить изменения в мой файл резервной копии.

Помеченные транзакции помогут вам сделать последовательное резервное копирование журнала, и вы сможете восстановить их с помощью RESTORE ... WITH STOPBEFOREMARK = '<mark_name>'

Помните, что отмеченные транзакции для всех баз данных в экземпляре также записываются в dbo.logmarkhistoryтаблицу MSDBбазы данных.

Кин Шах
источник
-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

для получения более подробной информации: https://blogs.technet.microsoft.com/letsdothis/2013/11/06/backup-multiple-sql-databases-in-a-single-swoop/

thambu
источник
Это не гарантирует резервное копирование на тот же момент времени. Это просто последовательность последовательных резервных копий.
vonPryz