Как очистить журнал транзакций SQL Server?

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

В Management Studio должна быть команда: «Щелкните, чтобы сжать журнал», и все готово.

frenchie 20.06.2015 04:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
607
2
1 290 600
20

Ответы 20

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

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

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

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

onupdatecascade 06.08.2009 10:11

+1 - Неэлегантно или нет, но этот метод пару раз выводил меня из строя с журналами базы данных, которые заполнили весь диск, так что даже команда сжатия не может быть запущена.

Shaul Behr 26.02.2012 13:13

Нет ли риска появления в журнале транзакций без отметок?

Paul 02.07.2013 12:10

Это также может быть подходящим для небольших БД, но если у вас БД 3 или 4 ТБ, это может быть не лучшим решением.

Jaques 17.12.2014 09:47

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

JsonStatham 07.12.2016 15:03

Да, среды разработки могут не заботиться о целостности данных, как в моем случае. Но хотелось бы знать, как вы переименуете файл журнала? Я не могу найти место в SSMS для этого, а Server12 не дает мне доступа к каталогу журналов.

Nelda.techspiress 04.08.2017 20:15

Пример кода TSQL об этом?

Kiquenet 28.01.2021 23:22

Чтобы усечь файл журнала:

  • Резервное копирование базы данных
  • Отсоедините базу данных, используя Enterprise Manager или выполнив: Sp_DetachDB [DBName]
  • Удалите файл журнала транзакций. (или переименуйте файл, на всякий случай)
  • Повторно подключите базу данных снова, используя: Sp_AttachDB [DBName]
  • Когда база данных присоединяется, создается новый файл журнала транзакций.

Чтобы сжать файл журнала:

  • Журнал резервного копирования [DBName] с No_Log
  • Уменьшите базу данных одним из следующих способов:

    Использование Enterprise Manager: - Щелкните правой кнопкой мыши базу данных, Все задачи, Сжать базу данных, Файлы, Выбрать файл журнала, ОК.

    Использование T-SQL: - Dbcc Shrinkfile ([Log_Logical_Name])

Вы можете найти логическое имя файла журнала, запустив процедуру sp_helpdb или просмотрев свойства базы данных в Enterprise Manager.

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

ripvlan 24.07.2015 20:10

Для меня DBCC SHRINKFILE не уменьшает файл журнала ldf (восстановление ПРОСТО). Для меня log_reuse_wait_desc не возвращает никаких данных. DBCC SQLPerf (logspace) возвращает 99,99% используемого пространства журнала DBCC LOGINFO возвращает 11059 строк, все Status = 2.

Kiquenet 28.01.2021 23:23

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

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

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

Установка простого режима восстановления сама по себе не приведет к волшебному сжатию журнала транзакций.

Aaron Bertrand 17.08.2013 19:04

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

Jonathan 19.08.2013 14:22

«Simple ... и никогда больше не залить» - неправда. Я видел, как это происходило (за последние 48 часов) в базе данных, где для модели восстановления было установлено значение «SIMPLE». Рост файла журнала был установлен на "ограниченный", и мы проделали огромную работу над этим ... Я понимаю, что это была необычная ситуация. (В нашей ситуации, когда у нас было много места на диске, мы увеличили размер файла журнала и установили для роста файла журнала значение «неограниченный» ... что, кстати, - ошибка интерфейса - проявляется после изменения как «ограничено» "с максимальным размером 2 097 152 МБ.)

Doug_Ivison 10.12.2013 22:10

@Doug_Ivison Да, в журнале транзакций будут открытые транзакции, но они будут удалены в простом режиме после того, как будет выполнена контрольная точка. Этот ответ предназначен только для того, чтобы быстро сказать: «У моего блока разработки / тестирования есть большой журнал транзакций, и я хочу, чтобы он ушел, поэтому мне не нужно беспокоиться об этом слишком часто», вместо того, чтобы когда-либо планировать запускать в производство среда. Чтобы повторить: Не делайте этого на производстве.

Jonathan 17.01.2014 13:51

Это все правда, и я понимаю, что это был быстрый подход только для разработки. Почему я прокомментировал: пока это не случилось со мной, я действительно думал, что простая модель восстановления НИКОГДА не может заполниться ... и я думаю, что мне потребовалось больше времени, чтобы выяснить / решить, в то время как я пришел к пониманию, что необычно большие транзакции могут это сделать.

Doug_Ivison 17.01.2014 15:56

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

The Red Pea 24.01.2021 17:57

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

Резервное копирование базы данных tempdb не имеет смысла, поэтому модель восстановления этой базы данных всегда должна быть «простой».

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

Aaron Bertrand 17.08.2013 19:04

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Пожалуйста, внимательно прочтите комментарии ниже, и я предполагаю, что вы уже прочитали принятый ответ. Как я сказал почти 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!

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

Simon_Weaver 16.04.2009 03:46

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

onupdatecascade 06.08.2009 10:12

@onupdatecascade - хороший прием по полному восстановлению. была другая база данных с огромным журналом: переключился на простой, затем сжал базу данных и снова переключился на полную. файл журнала до 500 КБ!

Simon_Weaver 17.09.2009 10:28

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

Vikram 12.05.2010 11:38

вы отключили режим «полного восстановления» и изменили его на «простой» режим? отказ от ответственности: сначала СДЕЛАЙТЕ РЕЗЕРВНУЮ КОПИЮ, если вы это сделаете. у меня никогда не было проблем, но я бы не хотел, чтобы вы потеряли данные

Simon_Weaver 13.05.2010 01:40

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

Munish Goyal 05.01.2011 01:21

Извини. Но этот ответ просто НЕ мог быть БОЛЕЕ неправильным. Уменьшая размер базы данных, вы увеличиваете файл журнала транзакций. В ЛЮБОЙ раз, когда вы перемещаете данные в базе данных SQL Server, вам потребуется ведение журнала - раздувание файла журнала. Чтобы уменьшить размер журнала, либо установите для БД «Простое восстановление», либо (если вам нужны / нужны зарегистрированные данные - а вы почти всегда это делаете в производственной среде), сделайте резервную копию журнала. Подробнее читайте в этих простых бесплатных видео: sqlservervideos.com/video/logging-essentialssqlservervideos.com/video/sql2528-log-files

Michael K. Campbell 17.08.2013 10:06

Вау, спасибо за получение 1300+ репутации за этот ответ, но это действительно ужасный совет.

Aaron Bertrand 17.08.2013 19:02

В дополнение к тому, что сказали Майкл и Аарон, если вы переключаетесь между полной и простой моделью восстановления, вам не следует разрешать прикасаться к SQL Server, пока вы, по крайней мере, не изучите основы.

Robert L Davis 17.08.2013 23:32

Худший совет на свете. Это очень опасный совет, и его следует удалить.

HLGEM 14.01.2014 02:44

@RobertLDavis, кто сказал, что я вернулся? ;-)

Simon_Weaver 25.02.2014 03:51

Вот преувеличение, чтобы продемонстрировать, что происходит и почему периодическое сжатие абсолютно критично: запись A изменяется 1 миллион раз, прежде чем будет выполнено резервное копирование. Что в журнале? 999 999 единиц данных, которые не имеют отношения к делу. Если журналы никогда не сокращаются, вы никогда не узнаете, каковы истинные эксплуатационные расходы базы данных. Кроме того, скорее всего, вы тратите ценные ресурсы на SAN. Усадка - это хороший уход, который позволяет вам оставаться в контакте с окружающей средой. Покажите мне человека, который думает, что вы никогда не должны уменьшаться в размерах, и я покажу вам человека, игнорирующего свое окружение.

Newclique 10.02.2015 22:37

это вполне приемлемо для любой базы данных разработки / тестирования, которая в 90% случаев должна работать с БД.

JGilmartin 16.01.2018 16:03

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

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

Johnno Nolan 07.02.2009 01:35

Я иногда (не очень часто) видел, как SQL Server не мог присоединить базу данных обратно к базе данных, когда файл журнала был удален. Это оставляет вам бесполезный файл MDF. Есть несколько возможностей, которые могут вызвать проблему. На ум приходят транзакции, ожидающие отката.

mrdenny 09.02.2009 00:39

Я согласен с этой тактикой, но ее следует зарезервировать для случаев, когда журнал взорвался из-за какого-то непредвиденного и / или чрезвычайного события. Если вы устраиваете такую ​​работу каждую неделю, вы делаете это очень и очень неправильно.

Aaron Bertrand 17.08.2013 19:06

Да, это только что с нами случилось. Мы хотели избавиться от 20 ГБ файла журнала, так как только что сделали резервную копию данных перед перемещением базы данных. MSSQL ни в коем случае не позволит нам повторно подключить новую базу данных без огромного файла журнала.

George M Reinstate Monica 03.01.2020 02:38

Сначала проверьте модель восстановления базы данных. По умолчанию SQL Server Express Edition создает базу данных для простого восстановления. модель (если не ошибаюсь).

Журнал резервного копирования DatabaseName с Truncate_Only:

DBCC ShrinkFile(yourLogical_LogFileName, 50)

SP_helpfile предоставит вам имя логического файла журнала.

Ссылаться на:

Восстановление из полного журнала транзакций в базе данных SQL Server

Если ваша база данных находится в модели полного восстановления и вы не делаете резервную копию TL, измените ее на SIMPLE.

Так я очищаю файлы журналов в своих ящиках для разработчиков. Производственные среды со всеми связанными стратегиями резервного копирования и т. д. Оставляю администраторам баз данных :-)

Joon 13.08.2009 12:30

TRUNCATE_ONLY больше не является опцией в текущих версиях SQL Server и не рекомендуется для версий, которые его поддерживают (см. Ответ Рэйчел).

Aaron Bertrand 17.08.2013 19:08

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

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

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

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

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

Посмотрите сообщения в блоге Пола Рэндала по этой самой теме, плохой совет.

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

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

+1 За то, что был первым, кто упомянул, что это может быть не самой хорошей идеей! OP указывает тестовую базу данных, но это стоит сделать в более общем случае.

Martin Smith 03.01.2011 17:04

Надо было добавить - Если удалить журнал передачи - Обновить резюме!

ripvlan 11.03.2016 20:50
  1. Резервная БД
  2. Отключить БД
  3. Переименовать файл журнала
  4. Прикрепите БД (при подключении удалите переименованный .ldf (файл журнала). Выберите его и удалите, нажав кнопку «Удалить»)
  5. Новый файл журнала будет создан заново
  6. Удалить переименованный файл журнала.

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

Попробуй это:

USE DatabaseName

GO

DBCC SHRINKFILE( TransactionLogName, 1)

BACKUP LOG DatabaseName WITH TRUNCATE_ONLY

DBCC SHRINKFILE( TransactionLogName, 1)

GO 

TRUNCATE_ONLY больше не является опцией в текущих версиях SQL Server и не рекомендуется для версий, которые его поддерживают (см. Ответ Рэйчел).

Aaron Bertrand 17.08.2013 19:10

У меня работает с использованием MSSQL Server 2005 Standard edition

bksi 21.01.2014 22:19

Журнал транзакций БД Уменьшить до минимального размера:

  1. Резервное копирование: журнал транзакций
  2. Сжать файлы: журнал транзакций
  3. Резервное копирование: журнал транзакций
  4. Сжать файлы: журнал транзакций

Провел тесты на нескольких БД: эта последовательность работает.

Обычно это сжимается до 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 и не рекомендуется для версий, которые его поддерживают (см. Ответ Рэйчел).

Aaron Bertrand 17.08.2013 19:13
  1. Сделайте резервную копию файла MDB.
  2. Остановить службы SQL
  3. Переименуйте файл журнала
  4. Запустить сервис

(Система создаст новый файл журнала.)

Удалите или переместите переименованный файл журнала.

-- 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)

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

спасибо, я не собирался терять на это много времени и ваш ответ был моим лучшим :)

Omid-RH 07.10.2015 10:22

Этот подход устанавливает для типа восстановления значение «ПОЛНЫЙ», даже если раньше тип восстановления был другим.

Vil 27.07.2017 16:39

Сработало как по волшебству! Обратите внимание, что имя файла журнала на самом деле является его логическим именем (которое можно найти в db-> properties-> files)

Bizhan 15.03.2018 02:52

Я бы включил в этот сценарий предложение BACKUP DATABASE, чтобы никто не забыл об этой части. Я говорю это, потому что несколько лет назад я сжал базу данных на диске, где слишком мало свободного места. В процессе сжатия файлы становились больше, и возникала ошибка Out of Space. Результат: я потерял базу данных. К счастью, база данных журналов потеряла терпимость.

Cesar 29.06.2019 23:01

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

Rui Lima 19.06.2020 18:45

Большинство ответов здесь предполагают, что вам на самом деле не нужен файл журнала транзакций, однако, если ваша база данных использует модель восстановления 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% по умолчанию.

Aaron Bertrand 17.08.2013 23:22

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

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

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

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

 

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 года назад ... так что поместите эту задачу в календарь обслуживания.

Другие вопросы по теме