Я не эксперт по SQL, и мне напоминают об этом каждый раз, когда мне нужно сделать что-то помимо основ. У меня есть тестовая база данных небольшого размера, но журнал транзакций определенно есть. Как очистить журнал транзакций?
sql-server
transaction-log
Kilhoffer
источник
источник
Ответы:
Уменьшение размера файла журнала должно быть действительно зарезервировано для сценариев, в которых произошел неожиданный рост, который, как вы ожидаете, не произойдет снова. Если размер файла журнала снова увеличится до того же размера, то временное его сжатие достигается не очень сильно. Теперь, в зависимости от целей восстановления вашей базы данных, это те действия, которые вы должны предпринять.
Сначала сделайте полную резервную копию
Никогда не вносите никаких изменений в вашу базу данных, не убедившись, что вы можете восстановить ее, если что-то пойдет не так.
Если вы заботитесь о восстановлении на момент времени
(И под восстановлением на момент времени я имею в виду, что вы заботитесь о возможности восстановления чего-либо, кроме полной или дифференциальной резервной копии.)
Предположительно ваша база данных находится в
FULL
режиме восстановления. Если нет, то убедитесь, что это:Даже если вы регулярно выполняете полное резервное копирование, файл журнала будет увеличиваться и увеличиваться до тех пор, пока вы не выполните резервное копирование журнала - это для вашей защиты, а не для ненужного расходования места на диске. Вы должны выполнять эти резервные копии журнала довольно часто, в соответствии с вашими целями восстановления. Например, если у вас есть бизнес-правило, которое гласит, что вы можете позволить себе потерять не более 15 минут данных в случае аварии, у вас должно быть задание, которое будет резервировать журнал каждые 15 минут. Вот скрипт, который будет генерировать имена файлов с метками времени на основе текущего времени (но вы также можете делать это с планами обслуживания и т. Д., Только не выбирайте какие-либо параметры сжатия в планах обслуживания, они ужасны).
Обратите внимание, что это
\\backup_share\
должно быть на другом компьютере, который представляет другое устройство хранения данных. Резервное копирование на один и тот же компьютер (или на другой компьютер, использующий те же базовые диски, или другую виртуальную машину, расположенную на том же физическом хосте) на самом деле не поможет вам, так как, если компьютер взорвется, вы потеряете базу данных. и его резервные копии. В зависимости от вашей сетевой инфраструктуры может иметь больше смысла делать резервные копии локально, а затем переносить их в другое место за кулисами; в любом случае вы хотите как можно быстрее удалить их с основного компьютера базы данных.Теперь, когда вы выполняете регулярное резервное копирование журналов, разумно будет сжать файл журнала до чего-то более разумного, чем то, что было создано до сих пор. Это не означает
SHRINKFILE
повторный запуск до тех пор, пока файл журнала не станет размером 1 МБ - даже если вы часто выполняете резервное копирование журнала, ему все равно необходимо учитывать сумму любых одновременных транзакций, которые могут произойти. События автоматического увеличения файла журнала являются дорогостоящими, поскольку SQL Server должен обнулять файлы (в отличие от файлов данных, когда включена мгновенная инициализация файла), и пользовательские транзакции должны ждать, пока это произойдет. Вы хотите выполнять эту процедуру как можно меньше, и вы, конечно, не хотите, чтобы ваши пользователи платили за нее.Обратите внимание, что вам может потребоваться выполнить резервное копирование журнала дважды, прежде чем станет возможным сокращение (спасибо Роберту).
Итак, вам нужно найти практичный размер для вашего файла журнала. Никто здесь не может сказать вам, что это такое, не зная намного больше о вашей системе, но если вы часто сжимали файл журнала, и он снова рос, хороший водяной знак, вероятно, на 10-50% выше, чем самый большой, на котором он был , Допустим, это составляет 200 МБ, и вы хотите, чтобы все последующие события автоматического увеличения составляли 50 МБ, затем вы можете настроить размер файла журнала следующим образом:
Обратите внимание, что если размер файла журнала> 200 МБ, вам может понадобиться сначала выполнить это:
Если вы не заботитесь о восстановлении на момент времени
Если это тестовая база данных, и вы не заботитесь о восстановлении на определенный момент времени, то вам следует убедиться, что ваша база данных находится в
SIMPLE
режиме восстановления.Перевод базы данных в
SIMPLE
режим восстановления гарантирует, что SQL Server повторно использует части файла журнала (по существу, постепенно исключая неактивные транзакции), вместо того, чтобы расти, чтобы вести учет всех транзакций (какFULL
восстановление делает до тех пор, пока вы не создадите резервную копию журнала).CHECKPOINT
события помогут контролировать журнал и убедиться, что он не должен расти, если вы не генерируете большую активность t-log междуCHECKPOINT
s.Затем вы должны быть абсолютно уверены в том, что этот рост журнала действительно произошел из-за ненормального события (скажем, ежегодной весенней уборки или восстановления ваших самых больших показателей), а не из-за обычного ежедневного использования. Если вы сократите файл журнала до смехотворно небольшого размера, а SQL Server просто придется снова увеличить его, чтобы он соответствовал вашей обычной деятельности, что вы получили? Удалось ли вам использовать то дисковое пространство, которое вы освободили, только временно? Если вам нужно немедленное исправление, вы можете выполнить следующее:
В противном случае установите соответствующий размер и скорость роста. Согласно примеру в случае восстановления на момент времени, вы можете использовать тот же код и логику, чтобы определить, какой размер файла является подходящим, и установить приемлемые параметры автоматического роста.
Некоторые вещи, которые вы не хотите делать
Сделайте резервную копию журнала с помощью
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, которая не должна была быть опубликована .
Сообщение в блоге Пола Рэндала, объясняющее, почему обслуживание t-log важно и почему вы не должны сокращать свои файлы данных .
У Майка Уолша есть отличный ответ, охватывающий также некоторые из этих аспектов, в том числе причины, по которым вы не сможете сразу сжать файл журнала .
источник
От: DBCC SHRINKFILE (Transact-SQL)
Вы можете сделать резервную копию в первую очередь.
источник
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Пожалуйста, внимательно прочитайте комментарии ниже, и я предполагаю, что вы уже прочитали принятый ответ. Как я сказал почти 5 лет назад:
Щелкните правой кнопкой мыши на имени базы данных.
Выберите Задачи → Сжать → База данных.
Тогда нажмите OK!
Я обычно открываю каталог Windows Explorer, содержащий файлы базы данных, чтобы сразу увидеть эффект.
Я был очень удивлен, что это сработало! Обычно я использовал DBCC раньше, но я просто попробовал это, и он ничего не уменьшал, поэтому я попробовал GUI (2005), и он работал отлично - освободил 17 ГБ за 10 секунд
В режиме полного восстановления это может не сработать, поэтому сначала необходимо выполнить резервное копирование журнала или перейти к Простому восстановлению, а затем сжать файл. [спасибо @onupdatecascade за это]
-
PS: я ценю то, что некоторые комментируют относительно опасностей этого, но в моей среде у меня не было никаких проблем, делающих это сам, тем более, что я всегда делаю полное резервное копирование сначала. Поэтому, прежде чем продолжить, примите во внимание, что ваша среда и как это влияет на вашу стратегию резервного копирования и безопасность заданий. Все, что я делал, это указывал людям на функцию, предоставляемую Microsoft!
источник
Ниже приведен скрипт для сжатия журнала транзакций, но я бы определенно рекомендовал сделать резервную копию журнала транзакций перед его сжатием.
Если вы просто уменьшите файл, вы потеряете кучу данных, которые могут стать спасением в случае аварии. Журнал транзакций содержит много полезных данных, которые можно прочитать с помощью стороннего устройства чтения журналов транзакций (его можно прочитать вручную, но с чрезмерными усилиями).
Журнал транзакций также является обязательным, когда речь идет о восстановлении во времени, поэтому не просто выбрасывайте его, но обязательно сделайте резервную копию заранее.
Вот несколько сообщений, в которых люди использовали данные, хранящиеся в журнале транзакций, для выполнения восстановления:
Как просмотреть журналы транзакций в SQL Server 2008
Прочитайте файл журнала (* .LDF) в SQL Server 2008
Вы можете получить ошибку, которая выглядит следующим образом при выполнении команд выше
Это означает, что TLOG используется. В этом случае попробуйте выполнить это несколько раз подряд или найдите способ уменьшить активность базы данных.
источник
Вот простой и очень не элегантный и потенциально опасный способ.
Я предполагаю, что вы не делаете резервные копии журналов. (Которые усекают журнал). Мой совет - сменить модель восстановления с полной на простую . Это предотвратит распространение журнала.
источник
Если вы не используете журналы транзакций для восстановления (т. Е. Вы выполняете только полное резервное копирование), вы можете установить режим восстановления «Простой», и журнал транзакций будет очень быстро сокращаться и никогда не будет заполняться снова.
Если вы используете SQL 7 или 2000, вы можете включить «усечение журнала на контрольной точке» на вкладке параметров базы данных. Это имеет тот же эффект.
Это не рекомендуется в производственных средах, очевидно, поскольку вы не сможете восстановить на определенный момент времени.
источник
Simple
... и никогда больше не заправляйся» - неправда. Я видел, как это происходило (за последние 48 часов) в базе данных, где для Модели восстановления было установлено значение «ПРОСТО». Размер файла журнала был установлен как «ограниченный», и мы проделали огромную работу с ним ... Я понимаю, что это была необычная ситуация. (В нашей ситуации, когда у нас было много места на диске, мы увеличили размер файла журнала и установили рост файла журнала в «неограниченный» ... который, кстати, --interface bug--, после изменения отображается как «ограниченный» "с максимальным размером 2 097 152 МБ.)Этот метод, который рекомендует Джон, не рекомендуется, так как нет никакой гарантии, что база данных будет прикреплена без файла журнала. Измените базу данных с полной на простую, установите контрольную точку и подождите несколько минут. SQL Server очистит журнал, который затем можно сжать с помощью DBCC SHRINKFILE.
источник
До сих пор большинство ответов здесь предполагают, что на самом деле вам не нужен файл журнала транзакций, однако, если ваша база данных использует
FULL
модель восстановления и вы хотите сохранить резервные копии на случай, если вам нужно восстановить базу данных, не обрезайте и не удаляйте файл журнала, как предлагают многие из этих ответов.Удаление файла журнала (путем его усечения, удаления, стирания и т. Д.) Нарушит цепочку резервного копирования и не позволит вам восстановить данные в любой момент времени с момента последнего полного резервного копирования, разностного резервного копирования или резервного копирования журнала транзакций до следующего полного или дифференциальное резервное копирование сделано.
Из статьи Microsoft о
BACKUP
Чтобы избежать этого, сделайте резервную копию файла журнала на диск, прежде чем сжимать его. Синтаксис будет выглядеть примерно так:
источник
, 1)
части. Проблема в том, что если вы сократите его до 1 МБ, события роста, приводящие к нормальному размеру журнала, будут весьма дорогостоящими, и их будет много, если скорость роста останется равной 10% по умолчанию.Журнал транзакций SQL Server необходимо правильно поддерживать, чтобы предотвратить его нежелательный рост. Это означает, что резервные копии журнала транзакций выполняются достаточно часто. Не делая этого, вы рискуете заполнить журнал транзакций и начать расти.
Помимо ответов на этот вопрос, я рекомендую прочитать и понять распространенные мифы журнала транзакций. Эти чтения могут помочь понять журнал транзакций и решить, какие методы использовать, чтобы «очистить» его:
Из 10 самых важных мифов журнала транзакций SQL Server :
Из мифов журнала транзакций :
источник
Сначала проверьте модель восстановления базы данных. По умолчанию SQL Server Express Edition создает базу данных для простой модели восстановления (если я не ошибаюсь).
Журнал резервного копирования DatabaseName с Truncate_Only:
SP_helpfile даст вам логическое имя файла журнала.
Ссылаться на:
Восстановление из полного журнала транзакций в базе данных SQL Server
Если ваша база данных находится в модели полного восстановления и если вы не делаете резервную копию TL, измените ее на ПРОСТОЙ.
источник
TRUNCATE_ONLY
больше не является опцией в текущих версиях SQL Server, и он не рекомендуется для версий, которые его поддерживают (см . ответ Рэйчел ).Используйте
DBCC ShrinkFile ({logicalLogName}, TRUNCATEONLY)
команду. Если это тестовая база данных и вы пытаетесь сохранить / освободить место, это поможет.Помните, что журналы TX имеют своего рода минимальный / устойчивый размер, до которого они будут расти. В зависимости от модели восстановления вы не сможете сжать журнал - если в режиме FULL и вы не создаете резервные копии журнала TX, журнал нельзя сжать - он будет расти вечно. Если вам не нужны резервные копии журнала TX, переключите модель восстановления на Simple .
И помните, никогда и ни при каких обстоятельствах не удаляйте файл журнала (LDF)! У вас будет практически мгновенное повреждение базы данных. Приготовленный! Выполнено! Потерянные данные! Если оставить «не восстановленным», основной файл MDF может быть поврежден навсегда.
Никогда не удаляйте журнал транзакций - вы потеряете данные! Часть ваших данных находится в журнале TX (независимо от модели восстановления) ... если вы отсоедините и «переименуете» файл журнала TX, который эффективно удаляет часть вашей базы данных.
Для тех, кто удалил журнал TX, вы можете запустить несколько команд checkdb и исправить повреждение, прежде чем потерять больше данных.
Проверьте сообщения в блоге Пола Рэндэла на эту самую тему, плохой совет .
Также в общем случае не используйте shrinkfile для файлов MDF, так как это может серьезно фрагментировать ваши данные. Посетите его раздел Bad Advice для получения дополнительной информации («Почему вы не должны сжимать свои файлы данных»)
Посетите веб-сайт Пола - он освещает эти самые вопросы. В прошлом месяце он прошел через многие из этих вопросов в своей серии « Миф в день ».
источник
Чтобы усечь файл журнала:
Чтобы сжать файл журнала:
Сократите базу данных:
Использование диспетчера предприятия: - Щелкните правой кнопкой мыши базу данных, Все задачи, Сжать базу данных, Файлы, Выберите файл журнала, ОК.
Использование T-SQL: - Dbcc Shrinkfile ([Log_Logical_Name])
Вы можете найти логическое имя файла журнала, запустив sp_helpdb или просмотрев свойства базы данных в Enterprise Manager.
источник
По моему опыту, на большинстве SQL-серверов нет резервной копии журнала транзакций. Полное или дифференциальное резервное копирование является обычной практикой, но резервное копирование журнала транзакций действительно редко. Таким образом, файл журнала транзакций растет вечно (пока диск не заполнится). В этом случае модель восстановления должна быть установлена на « простой ». Не забудьте также изменить системные базы данных "model" и "tempdb".
Резервное копирование базы данных «tempdb» не имеет смысла, поэтому модель восстановления этой базы данных всегда должна быть «простой».
источник
(Система создаст новый файл журнала.)
Удалите или переместите переименованный файл журнала.
источник
Это случилось со мной, где размер файла журнала базы данных составлял 28 ГБ.
Что вы можете сделать, чтобы уменьшить это? На самом деле, файлы журнала - это те данные файла, которые SQL-сервер хранит при выполнении транзакции. Для обработки транзакции SQL-сервер выделяет страницы для одного и того же. Но после завершения транзакции они не освобождаются внезапно в надежде на то, что транзакция будет похожа на ту же. Это держит пространство.
Шаг 1. Сначала запустите эту команду в контрольной точке исследуемого запроса к базе данных.
Шаг 2: Щелкните правой кнопкой мыши базу данных. Задача> Резервное копирование. Выберите тип резервного копирования в качестве журнала транзакций. Добавьте адрес назначения и имя файла, чтобы сохранить данные резервной копии (.bak).
Повторите этот шаг еще раз и в это время дайте другое имя файла
Шаг 3: Теперь перейдите в базу данных. Щелкните правой кнопкой мыши базу данных.
Задачи> Сжатие> Файлы. Выберите тип файла как действие «Сжать журнал», чтобы освободить неиспользуемое пространство.
Шаг 4:
Проверьте ваш файл журнала в SQL 2014, как правило, это можно найти на
C: \ Program Files \ Microsoft SQL Server \ MSSQL12.MSSQL2014EXPRESS \ MSSQL \ DATA
В моем случае его уменьшено с 28 ГБ до 1 МБ
источник
Попробуй это:
источник
TRUNCATE_ONLY
больше не является опцией в текущих версиях SQL Server, и он не рекомендуется для версий, которые его поддерживают (см . ответ Рэйчел ).База данных → щелкните правой кнопкой мыши Свойства → файл → добавьте другой файл журнала с другим именем и задайте путь такой же, как и у старого файла журнала с другим именем.
База данных автоматически забирает вновь созданный файл журнала.
источник
Это будет работать, но рекомендуется сначала сделать резервную копию вашей базы данных.
источник
Некоторые другие ответы у меня не сработали: невозможно было создать контрольную точку, пока БД была в сети, потому что журнал транзакций был полон (как это ни парадоксально). Однако после перевода базы данных в аварийный режим мне удалось сжать файл журнала:
источник
Пример:
источник
TRUNCATE_ONLY
больше не является опцией в текущих версиях SQL Server, и он не рекомендуется для версий, которые его поддерживают (см . ответ Рэйчел ).Слегка обновленный ответ, для MSSQL 2017 и с использованием студии управления SQL-сервером. Я пошел в основном из этих инструкций https://www.sqlshack.com/sql-server-transaction-log-backup-truncate-and-shrink-operations/
У меня была последняя резервная копия БД, поэтому я сделал резервную копию журнала транзакций. Затем я снова зарезервировал его для хорошей меры. Наконец, я сжал файл журнала и перешел с 20 ГБ до 7 МБ, что намного больше соответствует размеру моих данных. Я не думаю, что журналы транзакций когда-либо были заархивированы с тех пор, как они были установлены 2 года назад ... так что поместите эту задачу в календарь обслуживания.
источник
Журнал транзакций БД сжимается до минимального размера :
Я сделал тесты на нескольких БД: эта последовательность работает .
Обычно он уменьшается до 2 МБ .
ИЛИ по сценарию:
источник
TRUNCATE_ONLY
больше не является опцией в текущих версиях SQL Server, и он не рекомендуется для версий, которые его поддерживают (см . ответ Рэйчел ).