Как сжать файл журнала в SQL Server после неизвестного периода без резервного копирования? - PullRequest
1 голос
/ 23 октября 2019

Недавно я взял на себя управление базой данных, которая использовалась в течение 2-3 лет, и у нее не было плана обслуживания журнала транзакций. Файл БД занимает 8 ГБ, а файл журнала транзакций - колоссальные 54 ГБ. Я начал резервное копирование файла журнала, и мне нужно освободить это место на диске. Я сравнил свою БД с другими сайтами в моей компании, у которых были построены надлежащие планы обслуживания, и их журналы транзакций составляют примерно 4 ГБ, что я и ожидал. Это первый раз, когда я сталкиваюсь с этой проблемой.

Я выполнил полное резервное копирование БД и настроил первоначальный план обслуживания журнала транзакций, но мне нужно сжать этот файл * .ldf, потому чтоэто так непропорционально. Я искал доски объявлений переполнения стека в надежде найти похожую ситуацию. Основываясь на этом исследовании, я попробовал DBCC SHRINKFILE, но это не дало ожидаемых результатов. Я восстановил базу данных в исходное состояние (размер файла журнала увеличился) и попробовал метод восстановления Full-Simple-Full, чтобы обрезать журнал, но все еще не смог освободить место. Я даже попытался удалить файл .ldf и пройти через процесс очистки статуса (Ожидание восстановления). Я вернулся к функции восстановления DBCC CHECKDB, но после очистки состояния (Ожидание восстановления) я вообще не смог сделать резервную копию журнала транзакций. Я начал получать сообщение об ошибке 42000 50000, которое также ссылается на ошибку 3013. В конце я удалил весь беспорядок и вернул его в исходное состояние. Я постарался быть как можно более подробным, и буду рад уточнить или объяснить, если это необходимо. Как я уже сказал, я впервые столкнулся с чем-то подобным, но я всегда начинал свои проекты с самого начала. Это первый раз, когда я запрыгнул в середину чего-то, что было построено кем-то другим, и сломалось, когда я его получил.

ALTER DATABASE [DBName] SET EMERGENCY;

GO

ALTER DATABASE [DBName] set single_user

GO

DBCC CHECKDB ([DBName], REPAIR_ALLOW_DATA_LOSS) WITH ALL_ERRORMSGS;

GO 

ALTER DATABASE [DBName] set multi_user 

GO

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

1 Ответ

0 голосов
/ 24 октября 2019

Если вы используете 2008 или старше, вы можете попробовать 'BACKUP LOG WITH TRUNCATE_ONLY'

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

...