Как сжать физический файл журнала транзакций, когда он является основным в зеркале?


8

Мы настроили зеркальное отображение базы данных на выходных и забыли снова включить задание резервного копирования журналов транзакций. Когда я пришел этим утром, журнал транзакций увеличился до 58 ГБ и занял большую часть дискового пространства.

Я сделал ручное резервное копирование журнала транзакций на диск, чтобы снова запустить базу данных, однако запуск DBCC SHRINKFILE, по-видимому, не уменьшает физический размер файла журнала транзакций.

DBCC SHRINKFILE (N'MyDatabaseName_Log', 1000)

Если я проверю использование журнала с помощью

DBCC SQLPERF(LOGSPACE)

Я вижу, что используется только 22% текущего журнала

Имя журнала Размер журнала (МБ) Используемое пространство журнала (%) Состояние
MyDatabaseName 55440,87 22,38189 0

Если я проверяю log_reuse_wait_descв sys.databses, единственная запись, которую я вижу DATABASE_MIRRORING, так что я предполагаю, что зеркало играет роль в том, почему физический размер файла журнала не уменьшается?

SELECT log_reuse_wait_desc
FROM sys.databases
WHERE name = N'MyDatabaseName';

Я также заметил, что мое основное состояние зеркального отображения базы данных - Приостановлено, и попытка Возобновить его немедленно завершается с ошибкой:

Удаленный партнер по зеркальному отображению для базы данных «MyDatabaseName», обнаружена ошибка 5149, состояние 1, серьезность 25. Зеркальное отображение базы данных приостановлено. Устраните ошибку на удаленном сервере и возобновите зеркалирование или удалите зеркалирование и заново установите экземпляр зеркального сервера.

Журналы ошибок на зеркальном сервере также содержат эту ошибку, но также содержат ошибки о переполнении диска файла журнала.

В MODIFY FILE обнаружена ошибка 112 операционной системы (на диске недостаточно места.) При попытке расширить физический файл.

а также

F: \ Databaselogs \ MyDatabaseName_1.ldf: обнаружена ошибка 112 операционной системы (недостаточно места на диске).

Основной сервер имеет 60 ГБ на диске файлов журнала (здесь находятся другие базы данных), в то время как зеркальный сервер имеет только 45 ГБ.

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

Как я могу уменьшить размер моего физического файла журнала транзакций без ущерба для зеркалирования или цепочки резервного копирования?

Я использую SQL Server 2005


Что вторичный сервер имеет в журнале ошибок SQL Server? У вас должно быть несколько сообщений в журнале ошибок, в которых говорится о том, что привело к приостановке сеанса зеркалирования.
Томас Стрингер

@ThomasStringer Я действительно собирался опубликовать свой собственный ответ на этот вопрос ... Я думаю, что мой ответ заключается в том, что я не могу, по крайней мере, не отключив зеркало и не настроив его заново. Пространство на зеркальном сервере, зарезервированное для файлов журналов, меньше, чем пространство на главном сервере (на главном сервере размещаются другие базы данных), и у меня нет никакого способа уменьшить размер зеркального журнала транзакций. Я также обновил свой вопрос сообщениями об ошибках от зеркального сервера, хотя
Рэйчел

Ответы:


2

Из того, что я могу сказать, я не могу.

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

Эта теория подкрепляется тем фактом, что после удаления зеркалирования DBCC SHRINKFILEкоманда корректно сжимает физический файл журнала и log_reuse_wait_descвозвращается к ожиданию.LOG_BACKUP

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

Поэтому я собираюсь полностью удалить зеркало и снова все настроить (очень медленный процесс с базой данных 300 ГБ). И на этот раз я позабочусь о том, чтобы размер журнала транзакций был достаточно мал перед запуском зеркала, и чтобы резервные копии журнала транзакций работали, как только зеркало будет запущено.

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


1
Другим вариантом может быть создание резервной копии diff и восстановление ее на зеркало. Это может не сработать, но стоит попробовать, если вы или кто-либо еще столкнетесь с этим снова.
cfradenburg

@cfradenburg Да, я пытался это сделать, но в моем случае это не сработало из-за того, что время резервного копирования менялось на выходные, а дисковое пространство на зеркале было максимально увеличено. Это определенно стоит попробовать, прежде чем полностью удалить зеркало и начать все сначала.
Рейчел

1

Сегодня мы столкнулись с той же проблемой с нашими базами данных, которые по какой-то причине прекратили резервное копирование журналов транзакций за последние 3 месяца, и журналы выросли до 200 ГБ.

Точно такие же коды ошибок, как в вашей ситуации, и зеркалирование не возобновится. Диск был полностью заполнен на зеркале.

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

Затем вошел в резервные копии плана обслуживания и запустил резервное копирование базы данных и журнала транзакций вручную. Даже после резервного копирования файлы журнала транзакций все еще были огромными. Поэтому мне приходилось неоднократно указывать SQL Studio сокращать файлы журналов (освобождать все неиспользуемое пространство), и после нескольких попыток в течение нескольких часов он сокращал их до более управляемого размера.

Надеюсь это поможет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.