Как очистить журнал транзакций SQL Server? - PullRequest
536 голосов
/ 11 сентября 2008

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

Ответы [ 21 ]

694 голосов
/ 17 августа 2013

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

Сначала сделайте полную резервную копию

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

Если вы заботитесь о восстановлении на момент времени

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

Предположительно, ваша база данных находится в режиме восстановления FULL. Если нет, то убедитесь, что это:

ALTER DATABASE testdb SET RECOVERY FULL;

Даже если вы регулярно выполняете полное резервное копирование, файл журнала будет увеличиваться и увеличиваться до тех пор, пока вы не выполните резервное копирование log - это для вашей защиты, а не для ненужного расходования места на диске. Вы должны выполнять эти резервные копии журнала довольно часто, в соответствии с вашими целями восстановления. Например, если у вас есть бизнес-правило, которое гласит, что вы можете позволить себе потерять не более 15 минут данных в случае аварии, у вас должно быть задание, которое будет резервировать журнал каждые 15 минут. Вот скрипт, который будет генерировать имена файлов с метками времени на основе текущего времени (но вы также можете делать это с планами обслуживания и т. Д., Только не выбирайте какие-либо параметры сжатия в планах обслуживания, они ужасны).

DECLARE @path NVARCHAR(255) = N'\\backup_share\log\testdb_' 
  + CONVERT(CHAR(8), GETDATE(), 112) + '_'
  + REPLACE(CONVERT(CHAR(8), GETDATE(), 108),':','')
  + '.trn';

BACKUP LOG foo TO DISK = @path WITH INIT, COMPRESSION;

Обратите внимание, что \\backup_share\ должен находиться на другом компьютере, который представляет другое базовое устройство хранения. Резервное копирование их на одну и ту же машину (или на другую машину, которая использует те же базовые диски, или другую виртуальную машину, расположенную на том же физическом хосте), на самом деле не поможет вам, поскольку, если машина взорвется, вы потеряете базу данных. и его резервные копии. В зависимости от вашей сетевой инфраструктуры может иметь больше смысла делать резервные копии локально, а затем передавать их в другое место за кулисами; в любом случае вы хотите как можно быстрее удалить их с основного компьютера базы данных.

Теперь, когда у вас запущены регулярные резервные копии журналов, разумно будет сжать файл журнала до чего-то более разумного, чем то, на что он был создан. Это означает , а не означает, что нужно запускать SHRINKFILE снова и снова, пока файл журнала не станет размером 1 МБ - даже если вы часто выполняете резервное копирование журнала, все равно необходимо учитывать сумму любых одновременных транзакций, которые могут произойти , События автоматического увеличения файла журнала являются дорогостоящими, поскольку SQL Server должен обнулять файлы (в отличие от файлов данных, когда включена мгновенная инициализация файла), и пользовательские транзакции должны ждать, пока это произойдет. Вы хотите выполнять эту процедуру «расти-сжимать-расти-сжимать» как можно меньше, и вы, конечно же, не хотите, чтобы ваши пользователи платили за нее.

Обратите внимание, что вам может потребоваться выполнить резервное копирование журнала дважды, прежде чем станет возможным сокращение (спасибо, Роберт).

Итак, вам нужно найти практичный размер для вашего файла журнала. Никто здесь не может сказать вам, что это такое, не зная намного больше о вашей системе, но если вы часто сокращали файл журнала, и он снова рос, хороший водяной знак, вероятно, на 10-50% выше, чем самый большой, на котором он был , Допустим, это составляет 200 МБ, и вы хотите, чтобы все последующие события автоматического увеличения составляли 50 МБ, затем вы можете настроить размер файла журнала следующим образом:

USE [master];
GO
ALTER DATABASE Test1 
  MODIFY FILE
  (NAME = yourdb_log, SIZE = 200MB, FILEGROWTH = 50MB);
GO

Обратите внимание, что если размер файла журнала в настоящее время> 200 МБ, вам может потребоваться сначала запустить его:

USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);
GO

Если вас не волнует восстановление на момент времени

Если это тестовая база данных, и вы не заботитесь о восстановлении на определенный момент времени, то вам следует убедиться, что ваша база данных находится в режиме SIMPLE восстановления.

ALTER DATABASE testdb SET RECOVERY SIMPLE;

Перевод базы данных в режим восстановления SIMPLE гарантирует, что SQL Server повторно использует части файла журнала (по существу, постепенно выводя из строя неактивные транзакции) вместо того, чтобы расти, чтобы вести запись всех транзакций ( как FULL восстановление происходит до тех пор, пока вы не создадите резервную копию журнала). События CHECKPOINT помогут управлять журналом и следить за тем, чтобы он не увеличивался, если вы не генерируете большую активность t-log между CHECKPOINT с.

Далее, вы должны быть абсолютно уверены, что этот рост журнала действительно был вызван ненормальным событием (скажем, ежегодной весенней уборкой или восстановлением ваших самых больших показателей), а не из-за обычного ежедневного использования. Если вы сократите файл журнала до смехотворно небольшого размера, а SQL Server просто придется снова увеличить его, чтобы он соответствовал вашей обычной деятельности, что вы получили? Удалось ли вам использовать то дисковое пространство, которое вы освободили, только временно? Если вам нужно немедленное исправление, вы можете запустить следующее:

USE yourdb;
GO
CHECKPOINT;
GO
CHECKPOINT; -- run twice to ensure file wrap-around
GO
DBCC SHRINKFILE(yourdb_log, 200); -- unit is set in MBs
GO

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

Некоторые вещи, которые вы не хотите делать

  • Создайте резервную копию журнала с параметром TRUNCATE_ONLY, а затем SHRINKFILE. С одной стороны, эта опция TRUNCATE_ONLY устарела и больше не доступна в текущих версиях SQL Server. Во-вторых, если вы используете модель восстановления FULL, это разрушит цепочку журналов и потребует новую полную резервную копию.

  • Отключение базы данных, удаление файла журнала и повторное присоединение . Я не могу подчеркнуть, насколько это может быть опасно. Ваша база данных может не восстановиться, она может появиться как подозрительная, вам, возможно, придется вернуться к резервной копии (если она у вас есть) и т. Д. И т. Д.

  • Использовать опцию «Сжать базу данных» . DBCC SHRINKDATABASE и вариант плана обслуживания, позволяющий сделать то же самое, - плохие идеи, особенно если вам действительно нужно только решить проблему журнала. Выберите файл, который хотите настроить, и отрегулируйте его независимо, используя DBCC SHRINKFILE или ALTER DATABASE ... MODIFY FILE (примеры выше).

  • Сократите файл журнала до 1 МБ . Это выглядит заманчиво, потому что, эй, SQL Server позволит мне делать это в определенных сценариях и смотреть на все свободное место! Если ваша база данных предназначена только для чтения (и это так, вы должны пометить ее как таковую, используя ALTER DATABASE), это просто приведет к множеству ненужных событий роста, поскольку журнал должен учитывать текущие транзакции независимо от модели восстановления. Какой смысл временно освобождать это пространство, просто чтобы SQL Server мог вернуть его медленно и мучительно?

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

Будьте активны

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

Наихудшие возможные настройки: 1 МБ или 10%. Как ни странно, это настройки по умолчанию для SQL Server (на которые я жаловался и просил изменений безрезультатно ) - 1 МБ для файлов данных и 10% для файлов журналов. Первое слишком мало в наше время, а второе каждый раз приводит к более длинным и продолжительным событиям (скажем, размер файла журнала составляет 500 МБ, первый рост - 50 МБ, следующий - 55 МБ, следующий - 60,5 МБ и т. д. и т. д. - и при медленном вводе / выводе, поверьте мне, вы действительно заметите эту кривую).

Дополнительная литература

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

Пост в блоге, который я написал в 2009 году, когда я увидел несколько постов «Вот как сжать файл журнала», * .

Сообщение в блоге, написанное Брентом Озаром четыре года назад и указывающее на несколько ресурсов, в ответ на статью в журнале SQL Server Magazine, в которой не была опубликована .

Сообщение в блоге Пола Рэндала, объясняющее, почему обслуживание t-log важно и , почему вы не должны сжимать файлы данных, либо .

У Майка Уолша есть отличный ответ, охватывающий также некоторые из этих аспектов, в том числе причины, по которым вы не сможете сразу сжать файл журнала .

183 голосов
/ 19 января 2009

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Пожалуйста, внимательно прочитайте комментарии ниже, и я предполагаю, что вы уже прочитали принятый ответ. Как я сказал почти 5 лет назад:

если у кого-то есть комментарии для ситуаций, когда это НЕ адекватное или оптимальное решение, пожалуйста, прокомментируйте ниже


  • Щелкните правой кнопкой мыши на имени базы данных.

  • Выберите задачи → Сжать → База данных

  • Затем нажмите OK !

Обычно я открываю каталог Windows Explorer, содержащий файлы базы данных, чтобы сразу увидеть эффект.

Я был очень удивлен, что это сработало! Обычно я использовал DBCC раньше, но я просто попробовал это, и он ничего не уменьшал, поэтому я попробовал GUI (2005), и он работал отлично - освободил 17 ГБ за 10 секунд

В режиме полного восстановления это может не сработать, поэтому сначала необходимо выполнить резервное копирование журнала или перейти к Простому восстановлению, а затем сжать файл. [спасибо @onupdatecascade за это]

-

PS: Я ценю то, что некоторые комментируют относительно опасностей этого, но в моей среде у меня не было никаких проблем, делающих это сам, тем более, что я всегда сначала делаю полное резервное копирование. Поэтому, прежде чем продолжить, примите во внимание, какова ваша среда и как это влияет на стратегию резервного копирования и безопасность заданий. Все, что я делал, это указывал людям на функцию, предоставляемую Microsoft!

178 голосов
/ 31 октября 2011
USE AdventureWorks2008R2;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2008R2_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY FULL;
GO

От: DBCC SHRINKFILE (Transact-SQL)

Сначала вы можете сделать резервную копию.

54 голосов
/ 18 марта 2013

Ниже приведен скрипт для сокращения журнала транзакций, но я определенно рекомендую сделать резервную копию журнала транзакций перед его сжатием.

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

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

Вот несколько сообщений, в которых люди использовали данные, сохраненные в журнале транзакций, для выполнения восстановления:

USE DATABASE_NAME;
GO

ALTER DATABASE DATABASE_NAME
SET RECOVERY SIMPLE;
GO
--First parameter is log file name and second is size in MB
DBCC SHRINKFILE (DATABASE_NAME_Log, 1);

ALTER DATABASE DATABASE_NAME
SET RECOVERY FULL;
GO

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

«Невозможно сжать файл журнала (имя файла журнала), потому что логический файл журнала, расположенный в конце файла, используется «

Это означает, что TLOG используется. В этом случае попробуйте выполнить это несколько раз подряд или найдите способ уменьшить активность базы данных.

28 голосов
/ 15 сентября 2008

Если вы не используете журналы транзакций для восстановления (т. Е. Вы всегда выполняете только полное резервное копирование), вы можете установить режим восстановления на «Простой», и журнал транзакций будет очень быстро сокращаться и никогда не будет заполняться снова.

Если вы используете SQL 7 или 2000, вы можете включить «усечение журнала на контрольной точке» на вкладке опций базы данных. Это имеет тот же эффект.

Очевидно, что в производственных средах это не рекомендуется, поскольку вы не сможете восстановить на определенный момент времени.

27 голосов
/ 11 сентября 2008

Вот простой и очень не элегантный & потенциально опасный способ.

  1. Резервная БД
  2. Отсоединение БД
  3. Переименовать файл журнала
  4. Прикрепить БД
  5. Новый файл журнала будет воссоздан
  6. Удалить переименованный файл журнала.

Я предполагаю, что вы не делаете резервные копии журналов. (Которые усекают журнал). Мой совет - изменить модель восстановления с полная на простая . Это предотвратит переполнение журнала.

9 голосов
/ 10 июня 2015

Журнал транзакций SQL Server должен поддерживаться надлежащим образом, чтобы предотвратить его нежелательный рост. Это означает, что резервные копии журнала транзакций выполняются достаточно часто. Не делая этого, вы рискуете заполнить журнал транзакций и начать расти.

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

Из 10 самых важных мифов журнала транзакций SQL Server :

Миф: мой SQL Server слишком занят. Я не хочу делать резервные копии журнала транзакций SQL Server

Одной из самых больших операций с высокой производительностью в SQL Server является событие автоматического увеличения файла журнала онлайн-транзакций. Если резервные копии журналов транзакций не выполняются достаточно часто, журнал транзакций в Интернете будет заполнен и будет расти. Размер роста по умолчанию составляет 10%. Чем занятее база данных, тем быстрее будет расти оперативный журнал транзакций, если не будут созданы резервные копии журнала транзакций. Создание резервной копии журнала транзакций SQL Server не блокирует оперативный журнал транзакций, но происходит событие автоматического роста. Может блокировать всю активность в онлайн журнале транзакций

С Мифы журнала транзакций :

Миф: регулярное сжатие бревен - хорошая практика обслуживания

FALSE. Рост журнала очень дорог, потому что новый блок должен быть обнулен. Вся операция записи останавливается в этой базе данных до тех пор, пока не завершится обнуление, и если запись на диск идет медленно или размер авторастания большой, эта пауза может быть огромной, и пользователи заметят. Это одна из причин, почему вы хотите избежать роста. Если вы сжимаете журнал, он снова увеличивается, и вы просто тратите время на работу с дисками в ненужной игре «Сжатие и рост снова»

9 голосов
/ 31 января 2013

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

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

Из статьи Microsoft BACKUP

Мы рекомендуем вам никогда не использовать NO_LOG или TRUNCATE_ONLY, чтобы вручную усекать журнал транзакций, потому что это разрывает цепочку журналов. До тех пор следующее полное или дифференциальное резервное копирование базы данных, база данных не защищен от сбоя СМИ. Используйте ручное усечение журнала только в очень особые обстоятельства и немедленно создавать резервные копии данных.

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

BACKUP LOG MyDatabaseName 
TO DISK='C:\DatabaseBackups\MyDatabaseName_backup_2013_01_31_095212_8797154.trn'

DBCC SHRINKFILE (N'MyDatabaseName_Log', 200)
8 голосов
/ 07 февраля 2009

Этот метод, который рекомендует Джон, не рекомендуется, так как нет гарантии, что база данных будет прикреплена без файла журнала. Измените базу данных с полной на простую, установите контрольную точку и подождите несколько минут. SQL Server очистит журнал, который затем можно сжать с помощью DBCC SHRINKFILE.

5 голосов
/ 24 мая 2010

Используйте команду DBCC ShrinkFile ({logicalLogName}, TRUNCATEONLY). Если это тестовая база данных, и вы пытаетесь сохранить / освободить место, это поможет.

Помните, что журналы TX имеют своего рода минимальный / устойчивый размер, до которого они будут расти. В зависимости от модели восстановления вы не сможете сжать журнал - если в режиме FULL и вы не создаете резервные копии журнала TX, журнал не может быть сокращен - он будет расти вечно. Если вам не нужны резервные копии журнала TX, переключите модель восстановления на Simple .

И помните, никогда и ни при каких обстоятельствах не удаляйте файл журнала (LDF)! У вас будет практически мгновенное повреждение базы данных. Приготовленный! Готово! Потерянные данные! Если оставить «не восстановленным», основной файл MDF может быть поврежден навсегда.

Никогда не удаляйте журнал транзакций - вы потеряете данные! Часть ваших данных находится в журнале TX (независимо от модели восстановления) ... если вы отсоедините и «переименуете» файл журнала TX, который эффективно удалит часть вашей базы данных.

Для тех, кто удалил журнал TX, вы можете запустить несколько команд checkdb и исправить повреждение, прежде чем потерять больше данных.

Ознакомьтесь с постами Пола Рэндала в блоге на эту тему, плохой совет .

Также в общем случае не используйте shrinkfile для файлов MDF, так как это может серьезно фрагментировать ваши данные. Посетите его раздел «Плохие советы» для получения дополнительной информации («Почему вы не должны сжимать свои файлы данных»)

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

...