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


577

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



3
У студії Management повинна бути команда: "Клацніть, щоб зменшити журнал", і ви закінчите.
френч

Відповіді:


749

Зменшення файлу журналу дійсно має бути зарезервоване для сценаріїв, коли він зіткнувся з несподіваним зростанням, який ви не очікуєте, що це повториться. Якщо файл журналу знову зросте до того ж розміру, тимчасовим зменшенням його не дуже багато. Тепер, залежно від цілей відновлення вашої бази даних, це ті дії, які ви повинні вжити.

Спочатку візьміть повну резервну копію

Ніколи не вносити жодних змін у вашу базу даних, не гарантуючи, що ви можете відновити її, якщо щось піде не так.

Якщо ви переймаєтесь тимчасовим відновленням

(І під час відновлення, я маю на увазі, що ви дбаєте про можливість відновити все, крім повного або диференціального резервного копіювання.)

Імовірно, ваша база даних знаходиться в FULLрежимі відновлення. Якщо ні, то переконайтесь, що це:

ALTER DATABASE testdb SET RECOVERY FULL;

Навіть якщо ви робите регулярні повні резервні копії, файл журналу буде рости і рости, поки ви не виконаєте резервну копію журналу - це для вашого захисту, щоб не зайве їсти на своєму диску. Ви повинні виконувати ці резервні копії журналу досить часто, відповідно до цілей відновлення. Наприклад, якщо у вас є ділове правило, яке стверджує, що ви можете дозволити собі втратити не більше 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\має бути на іншій машині, яка представляє інший базовий пристрій зберігання даних. Резервне копіювання їх на одній машині (або на іншій машині, яка використовує ті самі базові диски, або інший VM, який знаходиться на тому ж фізичному хості), вам не дуже допоможе, оскільки якщо машина підірветься, ви втратили свою базу даних та його резервного копіювання. Залежно від вашої мережевої інфраструктури, можливо, має сенс створювати резервні копії на локальному рівні, а потім переносити їх в інше місце поза кадром; в будь-якому випадку ви хочете якнайшвидше їх зняти з первинної машини бази даних.

Тепер, коли у вас запущені регулярні резервні копії журналу, слід доцільно зменшити файл журналу до чогось більш розумного, ніж те, що він дотепер вибухнув. Це не означає повторне 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 між CHECKPOINTs.

Далі слід переконатися, що цей приріст журналу був справді обумовлений ненормальною подією (скажімо, щорічною весняною чисткою чи перебудовою ваших найбільших показників), а не завдяки звичайному, щоденному використанню. Якщо ви зменшите файл журналу до смішно невеликого розміру, а 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, яка не повинна була публікуватися .

Повідомлення в блозі Пола Рандала, в якому пояснюється, чому важливо обслуговування t-log і чому також не слід зменшувати файли даних .

У Майка Уолша є чудова відповідь, яка охоплює також деякі з цих аспектів, включаючи причини, через які ви не зможете негайно зменшити файл журналу .


5
Поточне відновлення - не єдина причина використовувати повну модель відновлення. Основна причина - запобігання втрати даних. Ваш потенціал до втрати даних - це довжина між резервними копіями. Якщо ви робите лише щоденне резервне копіювання, ваш потенціал до втрати даних становить 24 години. Якщо потім додавати резервні копії журналу кожні півгодини, ваш потенціал до втрати даних стає 30 хвилин. Крім того, для резервного копіювання журналу потрібно виконати будь-яке відновлення частин (наприклад, щоб відновити після пошкодження).
Роберт Л Девіс

9
Окрім цього, це найбільш повна і правильна відповідь, наведена на цій сторінці.
Роберт Л Девіс

11
Я також хотів би додати, що очищення журналу здійснюється резервним копіюванням журналу (в повному обсязі або відновлення в об'ємному режимі) або контрольної точки (у простому відновлення). Однак, якщо ви потрапили в ситуацію, коли потрібно скоротити файл журналу, цього недостатньо. Вам потрібно змусити поточний активний VLF повернутися до початку файлу журналу. Ви можете застосувати це в SQL 2008 і новіших версіях, видавши дві резервні копії журналу або контрольні точки "назад до спини". Перший очищає його, а другий циклично повертається до початку файлу.
Роберт Л Девіс

2
@Doug_Ivison, оскільки в будь-який момент записи журналів можуть бути очищені. Що було б дозволити вам зробити резервну копію журналу, який є неповним? При простому відновленні журнал реально використовується лише для відшкодування зворотних транзакцій. Після того, як транзакція була здійснена або повернута назад, наступної секунди її можна буде піти з журналу.
Аарон Бертран

3
@zinczinc Добре, дякую за відгук. Проблема, яку я бачу в тому, щоб поставити відповідь спочатку та пояснення пізніше, полягає в тому, що вони ніколи не прочитають важливих частин. Лекція, з якою я заглушую читача, насправді набагато важливіша, ніж відповідь наприкінці, і IMHO фон, який я надаю, є досить важливим для прийняття цих виборів. Але ей, якщо ви хочете надіслати однорядну відповідь, оскільки ви вважаєте, що це краще для ОП, будь ласка, не соромтесь використовувати цю частину моєї відповіді, щоб зробити кращу, з якої ми всі можемо дізнатися.
Аарон Бертран

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

Ви можете спершу створити резервну копію.


дякую Maimonides, це від док., тому я б сказав, що це найкраще: P тим більше, що мене не вигадали :)
Rui Lima

1
після цього я розмір журналу трохи не змінився. я щось зробив не так?
chester89

1
Цей підхід встановлює тип відновлення на "ПОВНИЙ", навіть якщо тип відновлення був чимось іншим
Vil

1
Працювало як магія! Зауважте, що ім'я файлу журналу насправді є його логічним ім'ям (яке можна знайти у db-> Properties-> files)
Bizhan

2
Я б включив у цей сценарій пункт BACKUP DATABASE, тому цю частину ніхто не забуде. Я говорю це, тому що кілька років тому я стискав базу даних на диску, де у неї занадто мало вільного місця. У процесі скорочення файлів було все більше, і помилка Out of Space була кинута. Результат: я втратив базу даних. На щастя, це база даних журналів, яка втратила толерантність.
Сезар

185

ВІДХОДЖЕННЯ: Будь ласка, читайте коментарі уважно нижче, і я припускаю, що ви вже прочитали прийняту відповідь. Як я вже говорив майже 5 років тому:

якщо у когось є якісь коментарі для додання ситуацій, коли це НЕ є адекватним або оптимальним рішенням, будь ласка, прокоментуйте його нижче


  • Клацніть правою кнопкою миші на ім'я бази даних.

  • Виберіть Завдання → Зменшити → База даних

  • Тоді натисніть OK!

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

Я був насправді дуже здивований, що це спрацювало! Зазвичай я раніше використовував DBCC, але я просто спробував це, і він нічого не скоротився, тому я спробував GUI (2005), і він спрацював чудово - звільнивши 17 Гб за 10 секунд

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

-

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


50
У режимі повного відновлення це може не спрацювати, тому вам доведеться спочатку створити резервну копію журналу або змінити на Просте відновлення, а потім зменшити файл.
onupdatecascade

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

26
Вибачте. Але ця відповідь просто НЕ могла бути БОЛЬШЕ неправильною. Скорочуючи базу даних, ви РОЗШИРУВАЄТЕ файл журналу транзакцій. Кожен раз, коли ви переміщуватимете дані в базі даних SQL Server, вам знадобиться ведення журналу - роздуття файлу журналу. Щоб зменшити розмір журналу, або встановіть БД на просте відновлення АБО (якщо вам потрібні / потрібні ввійшли дані - і ви майже завжди це робите у виробництві), створіть резервну копію журналу. Детальніше у цих простих, безкоштовних відео: sqlservervideos.com/video/logging-essentials sqlservervideos.com/video/sql2528-log-files
Майкл К. Кемпбелл

30
Нічого собі, кудо за отримання відповіді 1300+ за цю відповідь, але це дійсно жахлива порада.
Аарон Бертран

8
Ось перебільшення, щоб продемонструвати, що відбувається і чому зменшення періодично є абсолютно критичним: Запис А змінюється в 1 мільйон разів, перш ніж зробити резервну копію. Що в журналі? 999 999 фрагментів даних, які не мають значення. Якщо журнали ніколи не скорочуються, ви ніколи не дізнаєтеся, що таке справжня операційна витрата бази даних. Крім того, ви, найімовірніше, підключили цінні ресурси до SAN. Усадка - це гарне обслуговування та підтримує зв’язок із оточенням. Покажіть мені когось, хто думає, що ви ніколи не повинні зменшуватися, і я покажу вам, хто ігнорує їхнє оточення.
Newclique

54

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

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

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

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

 

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 використовується. У цьому випадку спробуйте виконати це кілька разів поспіль або знайдіть спосіб зменшити активність у базі даних.


30

Ось простий і дуже неелегантний та потенційно небезпечний спосіб.

  1. Резервне копіювання БД
  2. Від'єднати БД
  3. Перейменувати файл журналу
  4. Вкладіть БД
  5. Буде відтворено новий файл журналу
  6. Видалити перейменований файл журналу.

Я здогадуюсь, що ви не робите резервного копіювання журналу. (Який обрізає журнал). Моя порада - змінити модель відновлення з повної на просту . Це запобіжить здуття колоди.


15
З повагою видалення / перейменування / відтворення / заміна журналу - дуже погана ідея. Усадка має бути менш ризикованою, плюс це зробити досить просто.
onupdatecascade

12
+1 - Неелегантний чи ні, цей метод кілька разів виводив мене з гарячої води з журналами баз даних, які заповнили весь диск, таким чином, що навіть команда скорочення не може працювати.
Шауль Бехр

3
Чи не існує ризику незафіксованих транзакцій у журналі?
Пол

Це також може бути добре для менших БД, але якщо у вас є 3 або 4 ТБ БД, це може бути не найкращим рішенням.
Жак

Це здається нормальним, якщо ви довго розробляли систему та завантажували / видаляли тисячі записів протягом періоду розробки. Тоді, коли ви хочете використовувати цю базу даних для розгортання в реальному часі, дані тестування / розробки, які були зареєстровані, є зайвими, і тому не має значення, чи втрачено її, ні?
JsonStatham

28

Якщо ви не використовуєте журнали транзакцій для відновлення (тобто ви коли-небудь робите повне резервне копіювання), ви можете встановити режим відновлення на "Простий", і журнал транзакцій дуже скоро скоротиться і ніколи не заповнюватиметься знову.

Якщо ви використовуєте SQL 7 або 2000, ви можете ввімкнути "усічення журналу контрольної точки" на вкладці параметрів бази даних. Це має той же ефект.

Це не рекомендується у виробничих середовищах, очевидно, оскільки ви не зможете відновитись до певного часу.


1
Настроювання режиму відновлення просто не призведе до магічного зменшення журналу транзакцій.
Аарон Бертран

@Aaron Не сам, ні. Я припускав, що ОП буде використовувати їх тестову базу даних, і тому "журнал транзакцій дуже скоротиться", але ви вірні в тому, що це більше побічний ефект: режим простого відновлення, ймовірно, змусить вас закінчитися скороченим журнал транзакцій незабаром
Джонатан

" Simple... і більше ніколи не заповнюйся" - неправда. Я бачив, як це сталося (за останні 48 годин) у базі даних, де для моделі відновлення було встановлено "ПРОСТО". Зростання файлів журналу було встановлено на "обмежене", і ми займалися цим величезною діяльністю ... Я розумію, що це була незвична ситуація. (У нашій ситуації, де у нас було достатньо місця на диску, ми збільшили розмір файлу лог-файлів і встановили ріст файлу лог-файлу на "необмежений" ... що, до речі, - інтерфейсна помилка - з'являється після зміни як "обмежений" "з максимальним розміром 2097152 МБ.)
Doug_Ivison

2
@Doug_Ivison Так, журнал транзакцій матиме в ньому відкриті транзакції, але вони будуть видалені у простому режимі, як тільки відбудеться контрольна точка. Ця відповідь призначена лише як швидкий "мій розробка / тестовий ящик має великий журнал транзакцій, і я хочу, щоб він пройшов, тому мені не потрібно переживати про це занадто часто", а не коли-небудь збирався брати участь у виробництві навколишнє середовище. Повторне повторення: не робіть цього на виробництві .
Джонатан

1
Це все правда, і я розумію, що це був швидкий підхід лише для розвитку. Чому я прокоментував: поки це не сталося зі мною, я насправді думав, що просту модель відновлення НІКОЛИ не можна заповнити ... і я думаю, що мені знадобилося більше часу, щоб розібратися / вирішити, в той час як я зрозумів, що незвично великі транзакції можуть це зробити.
Doug_Ivison

9

Ця методика, яку рекомендує Джон, не рекомендується, оскільки немає гарантії, що база даних буде додана без файлу журналу. Змініть базу даних з повної на просту, примусьте контрольно-пропускний пункт і зачекайте кілька хвилин. SQL Server очистить журнал, який ви можете потім зменшити за допомогою DBCC SHRINKFILE.


... але я це робив десятки разів без проблем. можливо, ви могли б пояснити, чому DB може не повторно приєднатися.
Джонно Нолан

Мені припало (не дуже часто), коли SQL Server не зміг приєднати базу даних до бази даних, коли файл журналу був видалений. Це дозволить вам залишити непотрібний файл MDF. Є кілька можливостей, які можуть викликати проблему. Очікування, що очікують відкат, приходять до тями.
mrdenny

4
Я погоджуюся з цією тактикою, але вона повинна бути зарезервована для випадків, коли журнал підірвався через якусь непередбачену та / або надзвичайну подію. Якщо ви налаштовуєте роботу, щоб це робити кожен тиждень, ви робите це дуже, дуже неправильно.
Аарон Бертран

2
Дуже, дуже справжній Аарон.
mrdenny

Так, саме з нами це сталося. Ми хотіли вирвати 20G файлів журналу, оскільки ми просто створили резервну копію даних перед переміщенням бази даних. Ні в якому разі MSSQL не дозволить нам знову приєднати нову базу даних без гумогенного файлу журналу.
Джордж М Відновити Моніку

9

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

3
Я згоден з вашою відповіддю, за винятком , 1)частини. Проблема полягає в тому, що якщо зменшити його до 1 МБ, події зростання, що призводять до нормального розміру журналу, будуть досить дорогими, і їх буде багато, якщо швидкість зростання залишиться за замовчуванням 10%.
Аарон Бертран

9

Журнал транзакцій SQL Server необхідно належним чином підтримувати, щоб запобігти його небажаному зростанню. Це означає, що достатньо часто виконується резервне копіювання журналу транзакцій. Цього не роблячи, ви ризикуєте заповнити журнал транзакцій і почати рости.

Окрім відповідей на це питання, рекомендую прочитати та зрозуміти загальні міфи журналу транзакцій. Ці показання можуть допомогти зрозуміти журнал транзакцій та визначити, які методи використовувати для його очищення:

З 10 найважливіших міфів журналу транзакцій SQL Server :

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

Однією з найбільш великих операційних інтенсивних операцій у SQL Server є подія автоматичного зростання журналу онлайн-журналів транзакцій. Якщо не робити резервного копіювання журналу транзакцій досить часто, онлайн-журнал транзакцій стане повноцінним і йому доведеться рости. Розмір зростання за замовчуванням - 10%. Чим зайнятіша база даних, тим швидше буде рости інтернет-журнал транзакцій, якщо не буде створено резервного копіювання журналу транзакцій. Створення резервної копії журналу транзакцій на SQL Server не блокує онлайн-журнал транзакцій, але відбувається подія автоматичного зростання. Він може блокувати всю активність в онлайн-журналі транзакцій

З міфів журналу транзакцій :

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

ПОМИЛКОВИЙ. Зростання колоди дуже дороге, тому що новий шматок повинен бути нульовим. Вся активність запису припиняється в цій базі даних до завершення нулю, і якщо запис на диску повільний або розмір автоматичного зростання великий, ця пауза може бути величезною, і користувачі помітять. Це одна з причин, чому ви хочете уникнути зростання. Якщо ви скоротите журнал, він знову зросте, і ви просто витрачаєте дискові операції на непотрібну гру скорочення і зростання


5

Спочатку перевірте модель відновлення бази даних. За замовчуванням SQL Server Express Edition створює базу даних для простої моделі відновлення (якщо я не помиляюся).

Ім'я журналу резервного копіювання журналу Truncate_Only:

DBCC ShrinkFile(yourLogical_LogFileName, 50)

SP_helpfile дасть вам логічне ім'я файлу журналу.

Звертатися до:

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

Якщо ваша база даних є в повній моделі відновлення, і якщо ви не приймаєте резервну копію TL, змініть її на SIMPLE.


Ось так я очищаю файли журналів на своїх скриньках для розробників. Надані середовища з усіма пов'язаними стратегіями резервного копіювання тощо. Я залишаю DBA :-)
Joon

TRUNCATE_ONLYбільше не є опцією в поточних версіях SQL Server, і не рекомендується для версій, які підтримують його (див . відповідь Рейчел ).
Аарон Бертран

5

Використовуйте DBCC ShrinkFile ({logicalLogName}, TRUNCATEONLY)команду. Якщо це тестова база даних, і ви намагаєтесь заощадити / повернути простір, це допоможе.

Пам'ятайте, що, якщо журнали TX мають такий собі мінімальний / стаціонарний розмір, до якого вони виростуть. Залежно від вашої моделі відновлення, ви, можливо, не зможете зменшити журнал - якщо це FULL і ви не видаєте резервні копії журналу TX, журнал не може бути скорочений - він зростатиме назавжди. Якщо вам не потрібні резервні копії журналу TX, переключіть модель відновлення на Simple .

І пам’ятайте, ніколи ні за яких обставин не видаляйте файл журналу (LDF)! У вас, швидше за все, буде моментальна корупція бази даних. Приготовлено! Готово! Втрачені дані! Якщо залишити "непоправленим", головний файл MDF може назавжди пошкодитися.

Ніколи не видаляйте журнал транзакцій - ви втратите дані! Частина ваших даних знаходиться в журналі TX (незалежно від моделі відновлення) ... якщо ви вилучите та "перейменуйте" файл журналу TX, який ефективно видаляє частину вашої бази даних.

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

Перегляньте публікації в блозі Пола Рандала на цю саму тему, погані поради .

Також взагалі не використовуйте файл скорочення у файлах MDF, оскільки це може сильно фрагментувати ваші дані. Перегляньте його розділ поганих порад для отримання додаткової інформації ("Чому не слід скорочувати файли даних")

Перегляньте веб-сайт Павла - він висвітлює ці самі запитання. Минулого місяця він розглядав багато цих питань у своїй серії " Міф за день ".


+1 Будучи першою відповіддю, яка зазначила, що це може бути не дуже хорошою ідеєю! ОП визначає базу даних тестів, але це важливо зробити для більш загального випадку.
Мартін Сміт

Я мав би додати - Якщо ви видалите журнал TX - Оновіть резюме!
ripvlan

4

Щоб скоротити файл журналу:

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

Щоб зменшити файл журналу:

  • Журнал резервного копіювання [DBName] з No_Log
  • Скорочення бази даних:

    Використання Enterprise Manager: - Клацніть правою кнопкою миші на базі даних, Усі завдання, Зменшити базу даних, Файли, Виберіть файл журналу, Добре.

    Використання T-SQL: - Стислий файл Dbcc ([Log_Logical_Name])

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


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

4

На мій досвід, на більшості серверів SQL немає резервної копії журналу транзакцій. Повне резервне копіювання або диференціальне резервне копіювання є звичайною практикою, але резервне копіювання журналу транзакцій дійсно рідко. Таким чином, файл журналу транзакцій зростає назавжди (поки диск не заповниться). У цьому випадку модель відновлення повинна бути встановлена ​​на " просту ". Не забудьте також змінити системні бази даних "модель" та "tempdb".

Резервне копіювання бази даних "tempdb" не має сенсу, тому модель відновлення цього db завжди повинна бути "простою".


Якщо просто встановити базу даних, це не зменшить файл журналу в будь-якому стані, в якому він перебуває. Це просто допоможе запобігти подальшому зростанню (але все-таки це могло б).
Аарон Бертран

4
  1. Візьміть резервну копію файлу MDB.
  2. Зупиніть послуги SQL
  3. Перейменуйте файл журналу
  4. Запустіть послугу

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

Видаліть або перемістіть перейменований файл журналу.


3

Це сталося зі мною, де файл журналу бази даних склав 28 ГБ.

Що ви можете зробити, щоб зменшити це? Фактично, файли журналів - це ті файлові дані, які зберігає SQL-сервер, коли транзакція відбулася. Для транзакції для обробки SQL сервер виділяє сторінки для тих же. Але після завершення транзакції вони не будуть звільнені раптово, сподіваючись, що транзакція може відбутися як та сама. Це займає простір.

Крок 1: Спочатку запустіть цю команду в контрольній точці запиту бази даних

Крок 2: Клацніть правою кнопкою миші на базі даних Завдання> Резервне копіювання Виберіть тип резервного копіювання як Журнал транзакцій Додати адресу призначення та ім'я файлу, щоб зберегти дані резервного копіювання (.bak)

Повторіть цей крок ще раз і в цей час введіть інше ім’я файлу

введіть тут опис зображення

Крок 3: Тепер перейдіть до бази даних Клацніть правою кнопкою миші на базі даних

Завдання> Зменшення> Файли Виберіть Тип файлу як дію Зменшення журналу як звільнення невикористаного простору

введіть тут опис зображення

Крок 4:

Перевіряйте свій файл журналу зазвичай у SQL 2014

C: \ програмні файли \ Microsoft SQL Server \ MSSQL12.MSSQL2014EXPRESS \ MSSQL \ DATA

У моєму випадку його скорочено з 28 ГБ до 1 МБ


2

Спробуйте це:

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
bksi

2

База даних → клацніть правою кнопкою миші Властивості → файл → додайте інший файл журналу з іншим ім’ям і встановіть шлях таким же, як і старий файл журналу з іншим ім’ям файлу.

База даних автоматично вибирає щойно створений файл журналу.


1
  1. Резервне копіювання БД
  2. Від'єднати БД
  3. Перейменувати файл журналу
  4. Приєднайте БД (додаючи видалити перейменований .ldf (файл журналу). Виберіть його та видаліть, натиснувши кнопку Видалити)
  5. Буде відтворено новий файл журналу
  6. Видалити перейменований файл журналу.

Це спрацює, але пропонується спершу зробити резервну копію вашої бази даних.


1

Деякі з інших відповідей для мене не спрацювали: не вдалося створити контрольну точку, поки db був в Інтернеті, оскільки журнал транзакцій був повний (наскільки іронічно). Однак, встановивши базу даних на аварійний режим, я зміг скоротити файл журналу:

alter database <database_name> set emergency;
use <database_name>;
checkpoint;
checkpoint;
alter database <database_name> set online;
dbcc shrinkfile(<database_name>_log, 200);

0

Приклад:

DBCC SQLPERF(LOGSPACE)

BACKUP LOG Comapny WITH TRUNCATE_ONLY

DBCC SHRINKFILE (Company_log, 500)

DBCC SQLPERF(LOGSPACE)

TRUNCATE_ONLYбільше не є опцією в поточних версіях SQL Server, і не рекомендується для версій, які підтримують його (див . відповідь Рейчел ).
Аарон Бертран

Питання не тематичне для переповнення стека, як визначено у довідковому центрі . Не відповідайте на такі запитання; натомість слід позначити їх для уваги, і вони будуть закриті або перенесені належним чином.
Toby Speight

0

Трохи оновлена ​​відповідь для MSSQL 2017 та за допомогою студії управління SQL-сервером. Я йшов переважно з цих інструкцій https://www.sqlshack.com/sql-server-transaction-log-backup-truncate-and-shrink-operations/

У мене нещодавнє резервне копіювання db, тому я створив резервну копію журналу транзакцій. Тоді я знов підкріпив її для гарної міри. Нарешті я скоротив файл журналу і перейшов від 20G до 7MB, набагато більше відповідно до розміру моїх даних. Я не думаю, що журнали транзакцій ніколи не створювали резервні копії з моменту встановлення 2 років тому.


-1

Журнал транзакцій БД скорочується до мінімального розміру :

  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

1
TRUNCATE_ONLYбільше не є опцією в поточних версіях SQL Server, і не рекомендується для версій, які підтримують його (див . відповідь Рейчел ).
Аарон Бертран
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.