Чи можу я скоротити файл журналу транзакцій у дзеркальній базі даних?


9

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

Щоб зробити короткий опис, я налаштував дзеркальне відображення бази даних, але забув переконатися, що робота, що створює резервну копію журналу транзакцій, знову запустилася, а журнал транзакцій виріс майже до 60 Гб.

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

З цього питання щодо обслуговування журналу транзакцій у дзеркальній базі даних ви не можете створити резервну копію журналу на дзеркалі, але коли вас запитали конкретно в коментарях про те, як зменшити зарослий файл журналу в базі даних дзеркала, коментар залишився, що

Один із способів зробити це - перехід на дзеркальну базу даних та зменшення розміру. Ретельно протестуйте це в невиробничому середовищі, щоб переконатися, що він має таку поведінку, яку ви бажаєте / очікуєте.

Здається, це говорить про те, що можуть бути інші способи зменшити файл журналу на дзеркалі, і цей метод не обов'язково може бути безпечним для виконання на виробничому сервері.

Чи є спосіб безпечно скоротити файл журналу транзакцій на дзеркалі бази даних?


2
Єдиний підтримуваний спосіб - зменшити файл на головній, що також зменшить файл на дзеркалі. Якщо ваше дзеркало вже не те саме, що головне, ви дійсно не хочете намагатися перейти до дзеркала. Розбийте дзеркальне відображення та відтворіть його, як ви сказали у своєму попередньому запитанні.
Макс Вернон

Відповіді:


6

DBCC SHRINKFILEКоманда буде дзеркальні від основних до дзеркальної базі даних. Ось кілька доказів.

Створіть вибіркову базу даних про головну:

create database MirroredDb;
go

Створіть ту саму базу даних із резервної копії NORECOVERY:

restore database MirroredDb
from disk = '\\backupdir\MirroredDb.bak'
with norecovery;
go

Налаштуйте дзеркальний сеанс, однак, який спосіб ви обрали.

На головній базі даних подивіться розміри файлів бази даних:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Мій набір результатів виглядає наступним чином:

name            size
MirroredDb      392
MirroredDb_log  104

У дзеркальній базі даних створіть знімок і перегляньте ту саму інформацію:

create database MirroredDbss
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb.ss'
)as snapshot of MirroredDb;

use MirroredDbss;
go

select
    name,
    size
from sys.database_files;

Мій набір результатів виглядає наступним чином:

name            size
MirroredDb      392
MirroredDb_log  104

Тепер виростіть файл журналу транзакцій у головній базі даних (я довів його до 1 ГБ):

alter database MirroredDb
modify file
(
    name = MirroredDb_log,
    size = 1GB
);
go

Переглядаючи розмір журналу транзакцій основної бази даних , тепер ми бачимо скоригований розмір:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Мій набір результатів виглядає наступним чином:

name            size
MirroredDb      392
MirroredDb_log  131072

Створіть ще один знімок на дзеркальній базі даних та подивіться розмір файлу журналу транзакцій там:

create database MirroredDbss2
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb2.ss'
)as snapshot of MirroredDb;

use MirroredDbss2;
go

select
    name,
    size
from sys.database_files;

Мій набір результатів виглядає наступним чином:

name            size
MirroredDb      392
MirroredDb_log  131072

Тепер зробіть DBCC SHRINKFILEна основний :

use MirroredDb;
go

dbcc shrinkfile('MirroredDb_log', 0);
go

select
    name,
    size
from sys.database_files;

Мій набір результатів такий:

name            size
MirroredDb      392
MirroredDb_log  104

Створіть третій і останній знімок у дзеркальній базі даних та подивіться на розмір:

create database MirroredDbss3
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb3.ss'
)as snapshot of MirroredDb;

use MirroredDbss3;
go

select
    name,
    size
from sys.database_files;

І я отримую такий набір результатів:

name            size
MirroredDb      392
MirroredDb_log  104

Отже, як ви бачите тут, DBCC SHRINKFILEкоманда насправді відображається до дзеркальної бази даних.


Дякую, що я не зрозумів, що розмір файлу журналу також було скопійовано з основного сервера. Але якщо дзеркало не функціонує через розмір журналу транзакцій, чи єдине рішення видалити та відтворити дзеркало? Немає можливості безпечно зменшити дзеркальний журнал, коли процес дзеркального відображення не функціонує?
Рейчел

Ви не можете підключитися до дзеркальної бази даних, тому ви не можете запустити DBCC SHRINKFILEна ній. Що стосується того, якщо ви можете виправити дзеркальний сеанс, не видаляючи дзеркальне відображення в цій базі даних, там слід провести ще трохи розслідування. Схоже, його було призупинено через розмір файлу. Ви намагалися відновити партнера?
Томас Стрінгер

Так, але це негайно повернулося до припинення. Я припускаю, що через те, що дзеркальне відображення минуло занадто багато часу, тому багато даних все-таки потрібно передати, перш ніж потрапити в частину "файла журналу скорочення". Я сподівався, що існує якийсь інший спосіб, про який я просто не знав, наприклад, щось, про що я міг би запустити з дзеркальної бази даних, щоб зменшити файл, або якась маніпуляція з файловою системою, але, схоже, це не так. Ваша відповідь все ще дуже корисна, тому дякую :)
Рейчел

Сподіваюся, більше немає. Після того, як база даних буде призупинена / відключена, і резервне копіювання журналу буде виконано на первинному, ви змушені отримати повернення дзеркала синхронно без повторного введення.
Джейсон Камберленд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.