Как уменьшить размер файла журнала SQL Server

10

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

DBA говорит, что я должен использовать backup log dbname with truncate_only

И хотя все выглядит так, как будто он выполняется правильно в SQL Query Analyzer, размер файла ldf по-прежнему превышает 2 ГБ.

** Разъяснение, основанное на некоторых комментариях и некоторых ответах ниже. *** Конкретная рассматриваемая база данных - это база данных на моем ноутбуке, и я использую ее только для процессов разработки. Файл журнала увеличивался до такой степени, что считалось, что он должен был заполнить диск. Там нет никакого производственного риска. Я понимаю, что метод в вопросе, который я задал, и ответ, который я принял, рискованны в производственной среде. *

Рон Туффин
источник
наверняка это дублирующий вопрос?
JamesRyan
Я посмотрел и смог найти только один, который задавал вопрос о том, когда происходит сбой SHRINKFILE. В то время это не имело смысла, поэтому я разместил этот вопрос. Я решил удалить вопрос, но потом решил, что в одной лодке будут и другие. Если вы можете найти повторяющийся вопрос (который на самом деле задает тот же вопрос, а не похожий), я буду рад удалить этот вопрос.
Рон Туффин
На первой странице поиска есть около 8 ответов, которые включают его, но я думаю, вы должны знать, что вы ищете. Я вижу это так часто, как часть ответа, я был удивлен, что его не задали так прямолинейно.
JamesRyan
Ответ очень зависит от варианта восстановления базы данных: простой или полный?
Ричард
1
Спасибо за разъяснения, Рон. Поскольку это база данных dev, вам нужно изменить модель восстановления на SIMPLE в дополнение к уменьшению размера файла журнала, в противном случае ваша проблема повторится.
BradC

Ответы:

11

О, ужас! Пожалуйста, перестаньте говорить людям, что они должны сжать свои файлы журнала!

Если вы попали в эту ситуацию, очень вероятен один из следующих случаев:

  1. Ваша база данных находится в режиме полного восстановления, и она действительно должна быть в простом режиме
  2. Ваша база данных находится в режиме полного восстановления, и вы должны регулярно делать резервные копии журналов.
  3. Ваша база данных находится в режиме полного восстановления, а резервные копии журналов по какой-то причине терпят неудачу
  4. Вы выполняете огромные транзакции, которые увеличивают размер файла журнала

Ответ на каждый из них следующий:

Если (1), то переключите базу данных в простой режим.
Если (2), то запланируйте регулярное резервное копирование журнала.
Если (3), то исправьте запланированное резервное копирование журнала.
Если (4), то просто не делайте этого :) Вместо этого выполните работать небольшими партиями.

Обратите внимание, что ни один из них не требует использования (не рекомендуется) «резервное имя журнала базы данных с truncate_only»

Вместо этого, как только вы очистите файл журнала, используя один из вышеперечисленных методов, затем уменьшите (теперь пустой) журнал с помощью:

DBCC SHRINKFILE ('log logical name', 2000)

Всегда указывайте разумный конечный размер, иначе он уменьшится почти до 0, и в следующий раз, когда он понадобится, потребуется время, чтобы вырасти.

BradC
источник
Жаль, что принятый ответ был таким быстрым. Это один из вопросов, которые я использую, чтобы отсеять администраторов SQL во время интервью. Если они вернутся с резервной копией с truncate_only, это засчитывается как 2, поражающие биту.
Джим Б
2
Я согласен, что это последнее, что нужно сделать, уменьшить файл. Правильное обслуживание устраняет необходимость в этом. Но как только он станет большим и вы захотите его поменьше, вам придется его уменьшить. Однако при сжатии лучше уменьшить файл как можно меньше, а затем увеличить его до правильного размера с шагом 8 ГБ. Это оптимизирует количество VLF в файле. Смотрите - sqlskills.com/BLOGS/KIMBERLY/post/… .
Брайан Найт
1
Интересная ссылка, кажется, она применяется только в том случае, если ваш транс-лог превышает 8Gb. Я думаю, что мнение BradC (или, по крайней мере, мое) заключается в том, что да, есть чрезвычайные ситуации, которые заставят вас сжать ваш лог-файл, но вы должны понимать, что если вы запускаете пресловутый бэкап / w trunc, а затем shrinkfile, вы только что перевернули цепочку резервного копирования (надеюсь, это не было чем-то важным), и, кроме проблем с дисковым пространством, вполне вероятно, что у вас есть серьезные проблемы с сервером sql, вероятно, с точки зрения дизайна базы данных или с точки зрения архитектуры. Не исправляя основную ошибку, вы в лучшем случае купили себе время.
Джим Б
4

после выполнения «резервного копирования с truncate_only» вы должны выполнить следующую команду, чтобы уменьшить

dbcc SHRINKFILE (logfilename,shrink_tosize)

например

dbcc SHRINKFILE (mydatabase_Log,512)
Mani
источник
3

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

USE <database>;

DBCC SHRINKFILE (<log logical file name>)

Это сократит это для вас.

Брайан Найт
источник