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


11

При спробі відобразити дзеркальну базу даних за допомогою наступної команди

ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ

Я отримую таку помилку

Msg 1475, Рівень 16, Стан 105, Рядок 1
База даних "test0916aj8CJ" може містити об'ємні внесені зміни, які не були резервні копії. Зробіть резервну копію журналу в основній базі даних або в основній базі даних. Потім відновіть цю резервну копію або в базі даних дзеркал, щоб увімкнути дзеркальне відображення бази даних, або на кожній вторинній базі даних, щоб ви могли приєднати її до групи доступності.

Чи можна це зробити без резервної бази даних? Або я повинен створити резервну копію, а потім відкинути її. Це для новоствореного db, тому мені в цьому разі резервна копія все одно не потрібна.

Я спробував наступне ...

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

але описаний вище метод також не працював.

Спасибі


Кілька речей ... Ви насправді не відображаєтесь із цією командою, але додаєте базу даних до групи доступності. Що потім змушує мене запитати про налаштування вашої АГ, в якому режимі відновлення знаходяться ваші бази даних і чому, щоб виправити проблему з журналом, ви виконуєте резервну копію COPY_ONLY, яка залишає журнал неушкодженим, а не те, що помилка вказує, що ви робите. ? Мені здалося б, ти пропускаєш кілька кроків або сильно розгублений у тому, що ти намагаєшся зробити.
Стів Манґямелі

Відповіді:


15

Легко спростувати помилку, яку ви отримали

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

Нижче наведена помилка, яку ви отримаєте:

База даних "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 або Mirroring.

В якості примітки і для повноти картини , для сценарію розповідаючи backup to NUL, читати цей запис в блозі Гейл Шоу.


5

Чому TO DISK = N’NUL’?

Я не розумію, чому ви використовуєте TO DISK = N’NUL’:

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL

Якщо ви це зробите, резервна копія зберігається в NUL(тобто = в нікуди / нічого) і не може бути використана, оскільки її файл не існує.

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

Резервне копіювання LOG

Перш ніж додати БД до групи, ви повинні її підготувати. Коли ви хочете підготувати вторинну БД, потрібно взяти та відновити принаймні 1 резервну копію журналу транзакцій. Дзеркало використовує його для визначення того, які транзакції вже синхронізовані у вторинній БД, а які транзакції ще не синхронізовані з первинною БД.

Тому ви повинні створити резервну копію журналів транзакцій у первинному БД:

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

COPY_ONLYОпція повинна використовуватися. Це гарантує, що журнали не будуть усічені в кінці резервної копії LOG.

Первинний ланцюг резервного копіювання БД

Однак ви не можете відновити резервну копію журналу самостійно, тобто без ланцюга резервного копіювання (див. Відповідь Кіна також). Це означає, що резервна копія журналу транзакцій повинна бути зроблена після того, як було зроблено ПОВНЕ резервне копіювання бази даних (+ необов'язковий диференціал, якщо потрібно).

Оскільки COPY_ONLYопція не розриває ланцюг резервного копіювання, вона також не створює ланцюг резервного копіювання. Цей COPY_ONLYпараметр не можна використовувати для резервного копіювання бази даних.

Резервні копії в порядку:

  • ПОВНА резервна копія бази даних без COPY_ONLYможливості
  • Необов’язковий диференціальний резервний запас
  • 1 Резервне копіювання LOG з COPY_ONLYопцією
  • інша (або більше) резервна копія LOG, якщо потрібно ...

Відновити вторинну БД

Потім резервне копіювання бази даних має бути відновлено (+ диференціальне) на вторинному рівні.

Її потрібно відновити за допомогою NORECOVERYпараметра, оскільки ви також хочете відновити резервну копію LOG після відновлення ПОВНОЇ резервної копії.

Нарешті, ви відновите резервну копію LOG. Вам все одно потрібно скористатися 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 на загальну папку, яка доступна як на первинному, так і на вторинному серверах.
  • Також краще зберігати файли БД на схожих дисках та місцях як на первинному, так і на вторинному серверах.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.