Невозможно отразить базу данных SQL Server 2012

11

При попытке зеркалировать базу данных с помощью следующей команды

ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ

Я получаю следующую ошибку

Сообщение 1475, уровень 16, состояние 105, строка 1
База данных «test0916aj8CJ» может содержать массовые зарегистрированные изменения, которые не были сохранены. Сделайте резервную копию журнала в основной базе данных или основной базе данных. Затем восстановите эту резервную копию либо в зеркальной базе данных, чтобы включить зеркалирование базы данных, либо в каждой вторичной базе данных, чтобы можно было присоединить ее к группе доступности.

Можно ли это сделать без поддержки базы данных? Или я должен сделать резервную копию, а затем сбросить резервную копию. Это для вновь созданной базы данных, поэтому мне все равно не нужна резервная копия на данном этапе.

Я попробовал следующее ...

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL
WITH COPY_ONLY, NOFORMAT, INIT,
NAME = Ntest-Full Database Backup’,
SKIP, NOREWIND, NOUNLOAD
GO

но вышеуказанный метод тоже не сработал.

Спасибо

Билл
источник
Пара вещей ... Вы на самом деле не зеркалируете с этой командой, а добавляете базу данных в группу доступности. После этого я спрашиваю о том, как настроен ваш AG, в каком режиме восстановления находятся ваши базы данных и почему, чтобы исправить проблему с журналом, вы выполняете резервную копию COPY_ONLY, которая оставляет журнал нетронутым, а это не то, что указывает ошибка, которую вы делаете. ? Мне может показаться, что вы пропустили несколько шагов или очень смущены тем, что вы пытаетесь сделать.
Стив Мангиамели

Ответы:

15

Легко воспроизвести ошибку, которую вы получили

  • Создать базу данных в режиме полного восстановления на основной.
  • Создать базу данных в режиме полного восстановления в Secondary.
  • Запустите графический интерфейс и попробуйте настроить зеркалирование между первичным и вторичным.

Ниже приведена ошибка, которую вы получите:

База данных «test_mirroring_kin» может содержать массовые зарегистрированные изменения, которые не были сохранены. Сделайте резервную копию журнала в основной базе данных или основной базе данных. Затем восстановите эту резервную копию либо в зеркальной базе данных, чтобы включить зеркалирование базы данных, либо в каждой вторичной базе данных, чтобы можно было присоединить ее к группе доступности. (Microsoft SQL Server, ошибка: 1475)

введите описание изображения здесь

Давайте поймем, что это за ошибка:

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

Вышесказанное не соответствует действительности. После создания базы данных, если вы не выполните полное резервное копирование, даже если база данных находится в режиме полного восстановления, она находится в режиме псевдо-ПРОСТОГО восстановления

Вы можете легко проверить это, используя dbcc dbinfo-> dbi_dbbackupLSNимеющий значение 0:0:0(0x00000000:00000000:0000)или используя скрипт Пола Рэндала

dbcc traceon (3604)
go
dbcc dbinfo('test_mirroring_kin') with tableresults
go
dbcc traceoff (3604)

введите описание изображения здесь

Редактировать: Даже создание первой полной резервной копии с COPY_ONLYопцией не создает цепочку резервного копирования, а также

backup database test_mirroring_kin
to disk = 'D:\test_mirroring_kin_FULL.bak'
with init, stats=10, COPY_ONLY

dbcc dbinfo-> dbi_dbbackupLSNвсе еще имеет значение 0:0:0(0x00000000:00000000:0000). Это означает, что база данных все еще находится в псевдо-простом режиме восстановления.

Что нужно сделать, чтобы устранить вышеуказанную ошибку?

Необходимо создать полную резервную копию + одну резервную копию журнала транзакций на первичной, а затем восстановить ее на вторичной базе данных, with norecoveryа затем присоединить базу данных к группе AG или зеркальному отображению.

В качестве дополнительного примечания и для полноты, для вашего рассказа сценария backup to NUL, прочитайте это сообщение в блоге Гейл Шоу.

Кин Шах
источник
5

Почему TO DISK = N’NUL’?

Я не понимаю, почему вы используете TO DISK = N’NUL’:

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL

Если вы это сделаете, резервная копия будет сохранена в NUL(то есть = в никуда / ничего) и не может быть использована, потому что ее файл не существует.

Хотя NULего также можно использовать в качестве места назначения для резервного копирования журналов, его также не следует использовать, особенно на серверах Prod, поскольку журналы будут потеряны и цепь резервного копирования будет разорвана. (~ похож на SHRINKFILE)

LOG Backup

Перед добавлением БД в группу, вы должны подготовить ее. Если вы хотите подготовить вторичную БД, необходимо сделать и восстановить как минимум 1 резервную копию журнала транзакций. Зеркало использует его, чтобы выяснить, какие транзакции уже синхронизированы на вторичной БД, а какие транзакции еще не синхронизированы с первичной БД.

Поэтому вы должны сделать резервную копию журналов транзакций на первичной БД:

BACKUP LOG [test0916aj8CJ] TO  DISK = N'....bak' 
WITH  COPY_ONLY, FORMAT, INIT,  NAME = N'test0916aj8CJ-Transaction Log  Backup', STATS = 10

COPY_ONLYОпция должна использоваться. Это гарантирует, что журналы не усекаются в конце резервной копии журнала.

Основная цепочка резервных копий БД

Однако вы не можете восстановить резервную копию журнала в одиночку, то есть без цепочки резервных копий (см. Также ответ Kin). Это означает, что резервное копирование журнала транзакций должно выполняться после полного резервного копирования базы данных (+ необязательный дифференциал, если необходимо).

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

Резервные копии по порядку:

  • Полное резервное копирование базы данных без COPY_ONLYопции
  • Дополнительное дифференциальное резервное копирование
  • Резервное копирование 1 журнала с COPY_ONLYопцией
  • другое (или более) резервное копирование журнала при необходимости ...

Восстановите вторичную БД

Затем резервная копия базы данных должна быть восстановлена ​​(+ разностная) на вторичном.

Он должен быть восстановлен с помощью этой NORECOVERYопции, потому что вы также хотите восстановить резервную копию журналов после восстановления полной резервной копии.

Наконец, вы восстановите резервную копию журнала. Вам все еще нужно использовать эту NORECOVERYопцию, потому что зеркало будет продолжать восстанавливать транзакции, как только они появятся.

  • Восстановите ПОЛНУЮ резервную копию с NORECOVERYопцией
  • Восстановите резервную копию DIFF с помощью NORECOVERYопции
  • Восстановите все резервные копии LOG в порядке с NORECOVERYопцией

Давайте сложим все вместе (адаптируем к вашей среде)

  • На основном сервере запустите:

    USE master
    Go
    BACKUP DATABASE [test0916aj8CJ] TO DISK = N'....bak'
    WITH FORMAT, INIT, NAME = N'test0916aj8CJ-Full Database Backup', STATS = 10
    GO
    BACKUP LOG [test0916aj8CJ] TO DISK = N'....bak' 
    WITH COPY_ONLY, FORMAT, INIT, NAME = N'test0916aj8CJ-Transaction Log Backup', STATS = 10
    GO
  • На Вторичном сервере запустите:

    USE master
    Go
    RESTORE DATABASE [test0916aj8CJ] FROM DISK = N'....bak' 
    WITH FILE = 1, NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
    GO
    RESTORE LOG [test0916aj8CJ] FROM DISK = N'....bak' 
    WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
  • Затем вы можете продолжить добавление новой вторичной БД в группу доступности ...

Дополнительные действия

  • Лучше установить параметр DISK для общей папки, доступной как с основного, так и с дополнительного серверов.
  • Также лучше хранить файлы БД на одинаковом диске и в одном месте на основном и дополнительном серверах.
Жюльен Вавассер
источник