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





Вот простой и очень неэлегантно & потенциально опасный способ.
Я предполагаю, что вы не делаете резервные копии журналов. (Которые обрезают журнал). Мой совет - сменить модель восстановления с полный на просто. Это предотвратит раздувание журнала.
С уважением, удаление / переименование / воссоздание / замена журнала - очень плохая идея. Усадка должна быть менее рискованной, к тому же это довольно просто сделать.
+1 - Неэлегантно или нет, но этот метод пару раз выводил меня из строя с журналами базы данных, которые заполнили весь диск, так что даже команда сжатия не может быть запущена.
Нет ли риска появления в журнале транзакций без отметок?
Это также может быть подходящим для небольших БД, но если у вас БД 3 или 4 ТБ, это может быть не лучшим решением.
Это кажется нормальным, если вы разрабатываете систему в течение длительного времени и загружаете / удаляете тысячи записей в течение периода разработки. Затем, когда вы хотите использовать эту базу данных для развертывания в реальном времени, данные тестирования / разработки, которые были зарегистрированы, являются избыточными и, следовательно, не имеют значения, потеряны ли они, не так ли?
Да, среды разработки могут не заботиться о целостности данных, как в моем случае. Но хотелось бы знать, как вы переименуете файл журнала? Я не могу найти место в SSMS для этого, а Server12 не дает мне доступа к каталогу журналов.
Пример кода TSQL об этом?
Чтобы усечь файл журнала:
Чтобы сжать файл журнала:
Уменьшите базу данных одним из следующих способов:
Использование Enterprise Manager: - Щелкните правой кнопкой мыши базу данных, Все задачи, Сжать базу данных, Файлы, Выбрать файл журнала, ОК.
Использование T-SQL: - Dbcc Shrinkfile ([Log_Logical_Name])
Вы можете найти логическое имя файла журнала, запустив процедуру sp_helpdb или просмотрев свойства базы данных в Enterprise Manager.
Никогда не удаляйте журнал транзакций. Часть ваших данных находится в журнале. Удалите его, и база данных будет повреждена. У меня нет представителя, чтобы проголосовать против.
Для меня DBCC SHRINKFILE не уменьшает файл журнала ldf (восстановление ПРОСТО). Для меня log_reuse_wait_desc не возвращает никаких данных. DBCC SQLPerf (logspace) возвращает 99,99% используемого пространства журнала DBCC LOGINFO возвращает 11059 строк, все Status = 2.
Если вы не используете журналы транзакций для восстановления (т.е. вы всегда делаете только полные резервные копии), вы можете установить для режима восстановления значение «Простой», и журнал транзакций очень быстро сократится и никогда больше не будет заполняться.
Если вы используете SQL 7 или 2000, вы можете включить «усечение журнала на контрольной точке» на вкладке параметров базы данных. Это имеет тот же эффект.
Очевидно, это не рекомендуется в производственной среде, поскольку вы не сможете выполнить восстановление на определенный момент времени.
Установка простого режима восстановления сама по себе не приведет к волшебному сжатию журнала транзакций.
@Aaron Не само по себе, нет. Я предполагал, что OP будет использовать свою тестовую базу данных, и поэтому «журнал транзакций очень скоро сократится», но вы правы в том, что это скорее побочный эффект: простой режим восстановления, вероятно, приведет к уменьшению журнал транзакций скоро
«Simple ... и никогда больше не залить» - неправда. Я видел, как это происходило (за последние 48 часов) в базе данных, где для модели восстановления было установлено значение «SIMPLE». Рост файла журнала был установлен на "ограниченный", и мы проделали огромную работу над этим ... Я понимаю, что это была необычная ситуация. (В нашей ситуации, когда у нас было много места на диске, мы увеличили размер файла журнала и установили для роста файла журнала значение «неограниченный» ... что, кстати, - ошибка интерфейса - проявляется после изменения как «ограничено» "с максимальным размером 2 097 152 МБ.)
@Doug_Ivison Да, в журнале транзакций будут открытые транзакции, но они будут удалены в простом режиме после того, как будет выполнена контрольная точка. Этот ответ предназначен только для того, чтобы быстро сказать: «У моего блока разработки / тестирования есть большой журнал транзакций, и я хочу, чтобы он ушел, поэтому мне не нужно беспокоиться об этом слишком часто», вместо того, чтобы когда-либо планировать запускать в производство среда. Чтобы повторить: Не делайте этого на производстве.
Это все правда, и я понимаю, что это был быстрый подход только для разработки. Почему я прокомментировал: пока это не случилось со мной, я действительно думал, что простая модель восстановления НИКОГДА не может заполниться ... и я думаю, что мне потребовалось больше времени, чтобы выяснить / решить, в то время как я пришел к пониманию, что необычно большие транзакции могут это сделать.
Может быть, после установки в режим полного восстановления тогдасжать (используя пользовательский интерфейс, согласно этому сообщению), чтобы увидеть эффекты уменьшения размера журнала?
По моему опыту, на большинстве серверов SQL не существует резервной копии журнала транзакций. Полное резервное копирование или дифференциальное резервное копирование - обычная практика, но резервное копирование журнала транзакций действительно редко. Таким образом, файл журнала транзакций постоянно увеличивается (до тех пор, пока диск не заполнится). В этом случае модель восстановления должен быть установлен на «просто». Не забудьте также изменить системные базы данных «model» и «tempdb».
Резервное копирование базы данных tempdb не имеет смысла, поэтому модель восстановления этой базы данных всегда должна быть «простой».
Простая установка базы данных не приведет к сжатию файла журнала, в каком бы состоянии он ни находился. Это просто может помочь предотвратить его дальнейший рост (но все же может).
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Пожалуйста, внимательно прочтите комментарии ниже, и я предполагаю, что вы уже прочитали принятый ответ. Как я сказал почти 5 лет назад:
if anyone has any comments to add for situations when this is NOT an adequate or optimal solution then please comment below
Щелкните правой кнопкой мыши имя базы данных.
Выберите Задачи → Сжать → База данных.
Затем нажмите OK!
Обычно я открываю каталог Windows Explorer, содержащий файлы базы данных, чтобы сразу увидеть эффект.
Я был очень удивлен, что это сработало! Обычно я использовал DBCC раньше, но я просто попробовал это, и он ничего не сжал, поэтому я попробовал графический интерфейс (2005), и он отлично сработал - освободил 17 GB за 10 секунд.
В режиме полного восстановления это может не сработать, поэтому вам нужно либо сначала создать резервную копию журнала, либо перейти на Простое восстановление, а затем сжать файл. [спасибо за это @onupdatecascade]
-
PS: Я ценю то, что некоторые прокомментировали относительно опасности этого, но в моей среде у меня не было никаких проблем с этим сам, тем более что я всегда сначала делаю полную резервную копию. Поэтому, пожалуйста, примите во внимание, что такое ваша среда и как это влияет на вашу стратегию резервного копирования и безопасность заданий, прежде чем продолжить. Все, что я делал, это указывал людям на функцию, предоставляемую Microsoft!
рад слышать, что это сработало и для вас! если у кого-то есть какие-либо комментарии для ситуаций, когда это НЕ является адекватным или оптимальным решением, пожалуйста, прокомментируйте ниже.
В режиме полного восстановления это может не сработать, поэтому вам нужно либо сначала создать резервную копию журнала, либо перейти на Простое восстановление, а затем сжать файл.
@onupdatecascade - хороший прием по полному восстановлению. была другая база данных с огромным журналом: переключился на простой, затем сжал базу данных и снова переключился на полную. файл журнала до 500 КБ!
простая команда сжатия из графического интерфейса SQL, похоже, у меня вообще не работает. Я пробовал это несколько раз без уменьшения размера журнала транзакций. Я что-то пропустил ??
вы отключили режим «полного восстановления» и изменили его на «простой» режим? отказ от ответственности: сначала СДЕЛАЙТЕ РЕЗЕРВНУЮ КОПИЮ, если вы это сделаете. у меня никогда не было проблем, но я бы не хотел, чтобы вы потеряли данные
Мне вообще не нужна транзакция lgo. я имею в виду, что я просто работаю с некоторыми данными царапин. Мне не нужно никакого восстановления. независимо от данных, я просто копирую таблицу в новую БД или что-то в этом роде. Могу ли я работать без журнала регистрации? Он становится слишком большим, и если я удалю данные из больших данных, это займет вечность, потому что это запись журнала tx. Если я ограничиваю, то он говорит, что сидит полный и увеличивает его, как его ограничить или полностью отключить?
Извини. Но этот ответ просто НЕ мог быть БОЛЕЕ неправильным. Уменьшая размер базы данных, вы увеличиваете файл журнала транзакций. В ЛЮБОЙ раз, когда вы перемещаете данные в базе данных SQL Server, вам потребуется ведение журнала - раздувание файла журнала. Чтобы уменьшить размер журнала, либо установите для БД «Простое восстановление», либо (если вам нужны / нужны зарегистрированные данные - а вы почти всегда это делаете в производственной среде), сделайте резервную копию журнала. Подробнее читайте в этих простых бесплатных видео: sqlservervideos.com/video/logging-essentialssqlservervideos.com/video/sql2528-log-files
Вау, спасибо за получение 1300+ репутации за этот ответ, но это действительно ужасный совет.
В дополнение к тому, что сказали Майкл и Аарон, если вы переключаетесь между полной и простой моделью восстановления, вам не следует разрешать прикасаться к SQL Server, пока вы, по крайней мере, не изучите основы.
Худший совет на свете. Это очень опасный совет, и его следует удалить.
@RobertLDavis, кто сказал, что я вернулся? ;-)
Вот преувеличение, чтобы продемонстрировать, что происходит и почему периодическое сжатие абсолютно критично: запись A изменяется 1 миллион раз, прежде чем будет выполнено резервное копирование. Что в журнале? 999 999 единиц данных, которые не имеют отношения к делу. Если журналы никогда не сокращаются, вы никогда не узнаете, каковы истинные эксплуатационные расходы базы данных. Кроме того, скорее всего, вы тратите ценные ресурсы на SAN. Усадка - это хороший уход, который позволяет вам оставаться в контакте с окружающей средой. Покажите мне человека, который думает, что вы никогда не должны уменьшаться в размерах, и я покажу вам человека, игнорирующего свое окружение.
это вполне приемлемо для любой базы данных разработки / тестирования, которая в 90% случаев должна работать с БД.
Этот метод, который рекомендует Джон, не рекомендуется, поскольку нет гарантии, что база данных будет подключаться без файла журнала. Измените базу данных с полной на простую, установите контрольную точку и подождите несколько минут. SQL Server очистит журнал, который затем можно сжать с помощью DBCC SHRINKFILE.
... но я делал это десятки раз без проблем. возможно, вы могли бы объяснить, почему БД не может повторно подключиться.
Я иногда (не очень часто) видел, как SQL Server не мог присоединить базу данных обратно к базе данных, когда файл журнала был удален. Это оставляет вам бесполезный файл MDF. Есть несколько возможностей, которые могут вызвать проблему. На ум приходят транзакции, ожидающие отката.
Я согласен с этой тактикой, но ее следует зарезервировать для случаев, когда журнал взорвался из-за какого-то непредвиденного и / или чрезвычайного события. Если вы устраиваете такую работу каждую неделю, вы делаете это очень и очень неправильно.
Да, это только что с нами случилось. Мы хотели избавиться от 20 ГБ файла журнала, так как только что сделали резервную копию данных перед перемещением базы данных. MSSQL ни в коем случае не позволит нам повторно подключить новую базу данных без огромного файла журнала.
Сначала проверьте модель восстановления базы данных. По умолчанию SQL Server Express Edition создает базу данных для простого восстановления. модель (если не ошибаюсь).
Журнал резервного копирования DatabaseName с Truncate_Only:
DBCC ShrinkFile(yourLogical_LogFileName, 50)
SP_helpfile предоставит вам имя логического файла журнала.
Ссылаться на:
Восстановление из полного журнала транзакций в базе данных SQL Server
Если ваша база данных находится в модели полного восстановления и вы не делаете резервную копию TL, измените ее на SIMPLE.
Так я очищаю файлы журналов в своих ящиках для разработчиков. Производственные среды со всеми связанными стратегиями резервного копирования и т. д. Оставляю администраторам баз данных :-)
TRUNCATE_ONLY больше не является опцией в текущих версиях SQL Server и не рекомендуется для версий, которые его поддерживают (см. Ответ Рэйчел).
Используйте команду DBCC ShrinkFile ({logicalLogName}, TRUNCATEONLY). Если это тестовая база данных, и вы пытаетесь сэкономить / освободить место, это поможет.
Однако помните, что журналы передачи имеют своего рода минимальный / устойчивый размер, до которого они будут расти. В зависимости от вашей модели восстановления, возможно, вы не сможете сжать журнал - если он находится в режиме FULL и вы не создаете резервные копии журнала TX, журнал не может быть сжат - он будет расти вечно. Если вам не нужны резервные копии журнала TX, переключите модель восстановления на Простой.
И помните, никогда и ни при каких обстоятельствах не удаляйте файл журнала (LDF)! У вас будет практически мгновенное повреждение базы данных. Приготовлено! Выполнено! Потерянные данные! Если не исправить основной файл MDF, он может навсегда испортиться.
Никогда не удаляйте журнал транзакций - вы потеряете данные! Часть ваших данных находится в журнале TX (независимо от модели восстановления) ... если вы отсоедините и «переименуете» файл журнала TX, который фактически является частью вашей базы данных удаляет.
Для тех, кто удалил журнал передачи, вы можете запустить несколько команд checkdb и исправить повреждение, прежде чем вы потеряете больше данных.
Посмотрите сообщения в блоге Пола Рэндала по этой самой теме, плохой совет.
Также вообще не используйте shrinkfile для файлов MDF, так как это может серьезно фрагментировать ваши данные. Ознакомьтесь с его разделом «Плохие советы» для получения дополнительной информации («Почему не следует сжимать файлы данных»).
Посетите веб-сайт Пола - он отвечает именно на эти вопросы. В прошлом месяце он рассмотрел многие из этих проблем в своей серии статей Миф в день.
+1 За то, что был первым, кто упомянул, что это может быть не самой хорошей идеей! OP указывает тестовую базу данных, но это стоит сделать в более общем случае.
Надо было добавить - Если удалить журнал передачи - Обновить резюме!
Это будет работать, но рекомендуется сначала сделать резервную копию вашей базы данных.
Попробуй это:
USE DatabaseName
GO
DBCC SHRINKFILE( TransactionLogName, 1)
BACKUP LOG DatabaseName WITH TRUNCATE_ONLY
DBCC SHRINKFILE( TransactionLogName, 1)
GO
TRUNCATE_ONLY больше не является опцией в текущих версиях SQL Server и не рекомендуется для версий, которые его поддерживают (см. Ответ Рэйчел).
У меня работает с использованием MSSQL Server 2005 Standard edition
Журнал транзакций БД Уменьшить до минимального размера:
Провел тесты на нескольких БД: эта последовательность работает.
Обычно это сжимается до 2 МБ.
ИЛИ скриптом:
DECLARE @DB_Name nvarchar(255);
DECLARE @DB_LogFileName nvarchar(255);
SET @DB_Name = '<Database Name>'; --Input Variable
SET @DB_LogFileName = '<LogFileEntryName>'; --Input Variable
EXEC
(
'USE ['+@DB_Name+']; '+
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2) ' +
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2)'
)
GO
TRUNCATE_ONLY больше не является опцией в текущих версиях SQL Server и не рекомендуется для версий, которые его поддерживают (см. Ответ Рэйчел).
(Система создаст новый файл журнала.)
Удалите или переместите переименованный файл журнала.
-- DON'T FORGET TO BACKUP THE DB :D (Check [here][1])
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)
Вы можете сначала сделать резервную копию.
спасибо, я не собирался терять на это много времени и ваш ответ был моим лучшим :)
Этот подход устанавливает для типа восстановления значение «ПОЛНЫЙ», даже если раньше тип восстановления был другим.
Сработало как по волшебству! Обратите внимание, что имя файла журнала на самом деле является его логическим именем (которое можно найти в db-> properties-> files)
Я бы включил в этот сценарий предложение BACKUP DATABASE, чтобы никто не забыл об этой части. Я говорю это, потому что несколько лет назад я сжал базу данных на диске, где слишком мало свободного места. В процессе сжатия файлы становились больше, и возникала ошибка Out of Space. Результат: я потерял базу данных. К счастью, база данных журналов потеряла терпимость.
@Dragas В ответе есть ссылка на официальную документацию, возможно, вы захотите взглянуть на нее, на официальную документацию. Кстати, хороший администратор базы данных не будет искать в stackoverflow, как очистить журнал, почти уверен, что они будут знать, но я не администратор базы данных :)
Большинство ответов здесь предполагают, что вам на самом деле не нужен файл журнала транзакций, однако, если ваша база данных использует модель восстановления FULL, и вы хотите сохранить свои резервные копии на случай, если вам нужно восстановить базу данных, тогда не усекает или удаляет log, как предлагают многие из этих ответов.
Удаление файла журнала (путем его усечения, удаления, стирания и т. д.) Приведет к разрыву цепочки резервного копирования и предотвратит восстановление в любой момент времени с момента последнего полного, дифференциального резервного копирования или резервного копирования журнала транзакций до следующего полного или делается дифференциальная резервная копия.
От Статья Microsoft о BACKUP
We recommend that you never use NO_LOG or TRUNCATE_ONLY to manually truncate the transaction log, because this breaks the log chain. Until the next full or differential database backup, the database is not protected from media failure. Use manual log truncation in only very special circumstances, and create backups of the data immediately.
Чтобы этого избежать, сделайте резервную копию файла журнала на диск перед его сжатием. Синтаксис будет выглядеть примерно так:
BACKUP LOG MyDatabaseName
TO DISK='C:\DatabaseBackups\MyDatabaseName_backup_2013_01_31_095212_8797154.trn'
DBCC SHRINKFILE (N'MyDatabaseName_Log', 200)
Я согласен с вашим ответом, за исключением части , 1). Проблема в том, что если вы уменьшите его до 1 МБ, события роста, ведущие к размеру журнала нормальный, будут довольно дорогостоящими, и их будет много, если скорость роста оставить равной 10% по умолчанию.
Ниже приведен сценарий для сжатия журнала транзакций, но я определенно рекомендую сделать резервную копию журнала транзакций перед его сжатием.
Если вы просто уменьшите файл, вы потеряете массу данных, которые могут спасти вам жизнь в случае аварии. Журнал транзакций содержит много полезных данных, которые можно прочитать с помощью стороннего считывателя журнала транзакций (хотя его можно читать вручную, но с огромными усилиями).
Журнал транзакций также необходим, когда речь идет о восстановлении на определенный момент времени, поэтому не просто выбрасывайте его, а обязательно заранее сделайте резервную копию.
Вот несколько сообщений, в которых люди использовали данные, хранящиеся в журнале транзакций, для выполнения восстановления:
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
Вы можете получить подобное сообщение об ошибке, когда выполняемые выше команды
“Cannot shrink log file (log file name) because the logical log file located at the end of the file is in use“
Это означает, что TLOG используется. В этом случае попробуйте выполнить это несколько раз подряд или найдите способ уменьшить активность базы данных.
База данных → щелкните правой кнопкой мыши Характеристики → файл → добавьте еще один файл журнала с другим именем и установите путь, такой же, как у старого файла журнала, с другим именем файла.
База данных автоматически выбирает вновь созданный файл журнала.
Журнал транзакций SQL Server необходимо поддерживать в надлежащем состоянии, чтобы предотвратить его нежелательный рост. Это означает, что резервное копирование журнала транзакций выполняется достаточно часто. Не делая этого, вы рискуете, что журнал транзакций заполнится и начнет расти.
Помимо ответов на этот вопрос, я рекомендую прочитать и разобраться в распространенных мифах о журналах транзакций. Эти показания могут помочь понять журнал транзакций и решить, какие методы использовать для его «очистки»:
От 10 самых важных мифов о журналах транзакций SQL Server:
Myth: My SQL Server is too busy. I don’t want to make SQL Server transaction log backups
One of the biggest performance intensive operations in SQL Server is an auto-grow event of the online transaction log file. By not making transaction log backups often enough, the online transaction log will become full and will have to grow. The default growth size is 10%. The busier the database is, the quicker the online transaction log will grow if transaction log backups are not created Creating a SQL Server transaction log backup doesn’t block the online transaction log, but an auto-growth event does. It can block all activity in the online transaction log
Myth: Regular log shrinking is a good maintenance practice
FALSE. Log growth is very expensive because the new chunk must be zeroed-out. All write activity stops on that database until zeroing is finished, and if your disk write is slow or autogrowth size is big, that pause can be huge and users will notice. That’s one reason why you want to avoid growth. If you shrink the log, it will grow again and you are just wasting disk operation on needless shrink-and-grow-again game
Это случилось со мной, когда файл журнала базы данных был размером 28 ГБ.
Что вы можете сделать, чтобы это уменьшить? Фактически, файлы журнала - это те данные файла, которые SQL-сервер сохраняет, когда транзакция произошла. Для обработки транзакции SQL-сервер выделяет для нее страницы. Но после завершения транзакции они не освобождаются внезапно в надежде, что транзакция может быть похожа на ту же самую. Это удерживает пространство.
Шаг 1: Сначала запустите эту команду в исследуемом запросе к базе данных. пропускной пункт
Шаг 2: Щелкните правой кнопкой мыши базу данных Задача> Резервное копирование Выберите тип резервного копирования как журнал транзакций Добавьте адрес назначения и имя файла для хранения данных резервной копии (.bak)
Повторите этот шаг еще раз, а теперь укажите другое имя файла.
Шаг 3: Теперь заходим в базу данных Щелкните правой кнопкой мыши базу данных
Задачи> Сжатие> Файлы Выберите тип файла как журнал Действие сжатия как освобождение неиспользуемого пространства
Шаг 4:
Проверьте свой файл журнала обычно в SQL 2014 это можно найти по адресу
C: \ Program Files \ Microsoft SQL Server \ MSSQL12.MSSQL2014EXPRESS \ MSSQL \ DATA
В моем случае он уменьшился с 28 ГБ до 1 МБ.
Некоторые другие ответы не сработали для меня: невозможно было создать контрольную точку, пока база данных была в сети, потому что журнал транзакций был заполнен (как иронично). Однако после установки базы данных в аварийный режим я смог сжать файл журнала:
alter database <database_name> set emergency;
use <database_name>;
checkpoint;
checkpoint;
alter database <database_name> set online;
dbcc shrinkfile(<database_name>_log, 200);
Слегка обновленный ответ для MSSQL 2017 и с использованием студии управления SQL-сервером. Я пошел в основном из этой инструкции https://www.sqlshack.com/sql-server-transaction-log-backup-truncate-and-shrink-operations/
У меня была недавняя резервная копия базы данных, поэтому я сделал резервную копию журнала транзакций. Затем я снова сделал резервную копию для хорошей меры. Наконец, я уменьшил размер файла журнала и увеличил его с 20 до 7 МБ, что намного больше соответствует размеру моих данных. Я не думаю, что журналы транзакций когда-либо копировались с тех пор, как это было установлено 2 года назад ... так что поместите эту задачу в календарь обслуживания.