Я не експерт SQL, і мені нагадують про той факт, щоразу, коли мені потрібно щось робити за рамки основ. У мене є тестова база даних, яка не має великих розмірів, але журнал транзакцій безумовно є. Як очистити журнал транзакцій?
Я не експерт SQL, і мені нагадують про той факт, щоразу, коли мені потрібно щось робити за рамки основ. У мене є тестова база даних, яка не має великих розмірів, але журнал транзакцій безумовно є. Як очистити журнал транзакцій?
Відповіді:
Зменшення файлу журналу дійсно має бути зарезервоване для сценаріїв, коли він зіткнувся з несподіваним зростанням, який ви не очікуєте, що це повториться. Якщо файл журналу знову зросте до того ж розміру, тимчасовим зменшенням його не дуже багато. Тепер, залежно від цілей відновлення вашої бази даних, це ті дії, які ви повинні вжити.
Ніколи не вносити жодних змін у вашу базу даних, не гарантуючи, що ви можете відновити її, якщо щось піде не так.
(І під час відновлення, я маю на увазі, що ви дбаєте про можливість відновити все, крім повного або диференціального резервного копіювання.)
Імовірно, ваша база даних знаходиться в 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 між CHECKPOINT
s.
Далі слід переконатися, що цей приріст журналу був справді обумовлений ненормальною подією (скажімо, щорічною весняною чисткою чи перебудовою ваших найбільших показників), а не завдяки звичайному, щоденному використанню. Якщо ви зменшите файл журналу до смішно невеликого розміру, а 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 МБ і т. д. і т. д. - і на повільному вводу / виводу, повірте, ви дійсно помітите цю криву).
Будь ласка, не зупиняйтесь тут; хоча велика частина порад щодо скорочення файлів журналів по суті є поганою і навіть потенційно згубною, є деякі люди, які більше дбають про цілісність даних, ніж звільнення місця на диску.
Повідомлення в блозі Пола Рандала, в якому пояснюється, чому важливо обслуговування t-log і чому також не слід зменшувати файли даних .
-- 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)
Ви можете спершу створити резервну копію.
ВІДХОДЖЕННЯ: Будь ласка, читайте коментарі уважно нижче, і я припускаю, що ви вже прочитали прийняту відповідь. Як я вже говорив майже 5 років тому:
якщо у когось є якісь коментарі для додання ситуацій, коли це НЕ є адекватним або оптимальним рішенням, будь ласка, прокоментуйте його нижче
Клацніть правою кнопкою миші на ім'я бази даних.
Виберіть Завдання → Зменшити → База даних
Тоді натисніть OK!
Зазвичай я відкриваю каталог провідника Windows, що містить файли баз даних, тому я можу відразу побачити ефект.
Я був насправді дуже здивований, що це спрацювало! Зазвичай я раніше використовував DBCC, але я просто спробував це, і він нічого не скоротився, тому я спробував GUI (2005), і він спрацював чудово - звільнивши 17 Гб за 10 секунд
У режимі повного відновлення це може не спрацювати, тому вам доведеться спочатку створити резервну копію журналу або змінити на Просте відновлення, а потім зменшити файл. [дякую @onupdatecascade за це]
-
PS: Я ціную те, що дехто прокоментував небезпеку цього, але в моєму оточенні у мене не виникло жодних проблем із цим, особливо тому, що я завжди роблю повне резервне копіювання. Тому, будь ласка, врахуйте, що таке ваше середовище, і як це впливає на стратегію резервного копіювання та безпеку роботи, перш ніж продовжувати. Все, що я робив, - це вказувати людям на особливості, які надає Microsoft!
Нижче представлений сценарій для зменшення журналу транзакцій, але я напевно рекомендую створити резервну копію журналу транзакцій, перш ніж скорочувати його.
Якщо ви просто скоротите файл, ви втратите тону даних, які можуть стати рятівником у випадку катастрофи. Журнал транзакцій містить багато корисних даних, які можна прочитати за допомогою стороннього зчитувача журналу транзакцій (його можна читати вручну, але з великими зусиллями).
Журнал транзакцій також є необхідним, коли настає момент відновлення часу, тому не просто кидайте його, а переконайтеся, що ви заздалегідь створили його резервну копію.
Ось кілька публікацій, де люди використовували дані, що зберігаються в журналі транзакцій, для відновлення:
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 використовується. У цьому випадку спробуйте виконати це кілька разів поспіль або знайдіть спосіб зменшити активність у базі даних.
Ось простий і дуже неелегантний та потенційно небезпечний спосіб.
Я здогадуюсь, що ви не робите резервного копіювання журналу. (Який обрізає журнал). Моя порада - змінити модель відновлення з повної на просту . Це запобіжить здуття колоди.
Якщо ви не використовуєте журнали транзакцій для відновлення (тобто ви коли-небудь робите повне резервне копіювання), ви можете встановити режим відновлення на "Простий", і журнал транзакцій дуже скоро скоротиться і ніколи не заповнюватиметься знову.
Якщо ви використовуєте SQL 7 або 2000, ви можете ввімкнути "усічення журналу контрольної точки" на вкладці параметрів бази даних. Це має той же ефект.
Це не рекомендується у виробничих середовищах, очевидно, оскільки ви не зможете відновитись до певного часу.
Simple
... і більше ніколи не заповнюйся" - неправда. Я бачив, як це сталося (за останні 48 годин) у базі даних, де для моделі відновлення було встановлено "ПРОСТО". Зростання файлів журналу було встановлено на "обмежене", і ми займалися цим величезною діяльністю ... Я розумію, що це була незвична ситуація. (У нашій ситуації, де у нас було достатньо місця на диску, ми збільшили розмір файлу лог-файлів і встановили ріст файлу лог-файлу на "необмежений" ... що, до речі, - інтерфейсна помилка - з'являється після зміни як "обмежений" "з максимальним розміром 2097152 МБ.)
Ця методика, яку рекомендує Джон, не рекомендується, оскільки немає гарантії, що база даних буде додана без файлу журналу. Змініть базу даних з повної на просту, примусьте контрольно-пропускний пункт і зачекайте кілька хвилин. SQL Server очистить журнал, який ви можете потім зменшити за допомогою DBCC SHRINKFILE.
Більшість відповідей на сьогоднішній день передбачають, що вам фактично не потрібен файл журналу транзакцій, однак якщо у вашій базі даних використовується FULL
модель відновлення, і ви хочете зберегти резервні копії у випадку, якщо вам потрібно відновити базу даних, тоді не вкорочуйте та не видаляйте файл журналу так, як пропонує багато з цих відповідей.
Усунення файлу журналу (шляхом обрізання, відкидання, стирання тощо) призведе до розриву ланцюга резервного копіювання, і не дозволить вам відновитись до будь-якого моменту часу з моменту останньої резервної копії журналу повного, диференціального або транзакції до наступної повної або робиться диференціальне резервне копіювання.
Ми рекомендуємо ніколи не використовувати 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)
, 1)
частини. Проблема полягає в тому, що якщо зменшити його до 1 МБ, події зростання, що призводять до нормального розміру журналу, будуть досить дорогими, і їх буде багато, якщо швидкість зростання залишиться за замовчуванням 10%.
Журнал транзакцій SQL Server необхідно належним чином підтримувати, щоб запобігти його небажаному зростанню. Це означає, що достатньо часто виконується резервне копіювання журналу транзакцій. Цього не роблячи, ви ризикуєте заповнити журнал транзакцій і почати рости.
Окрім відповідей на це питання, рекомендую прочитати та зрозуміти загальні міфи журналу транзакцій. Ці показання можуть допомогти зрозуміти журнал транзакцій та визначити, які методи використовувати для його очищення:
З 10 найважливіших міфів журналу транзакцій SQL Server :
Міф: Мій SQL сервер занадто зайнятий. Я не хочу робити резервні копії журналу транзакцій SQL Server
Однією з найбільш великих операційних інтенсивних операцій у SQL Server є подія автоматичного зростання журналу онлайн-журналів транзакцій. Якщо не робити резервного копіювання журналу транзакцій досить часто, онлайн-журнал транзакцій стане повноцінним і йому доведеться рости. Розмір зростання за замовчуванням - 10%. Чим зайнятіша база даних, тим швидше буде рости інтернет-журнал транзакцій, якщо не буде створено резервного копіювання журналу транзакцій. Створення резервної копії журналу транзакцій на SQL Server не блокує онлайн-журнал транзакцій, але відбувається подія автоматичного зростання. Він може блокувати всю активність в онлайн-журналі транзакцій
Міф: Регулярне скорочення журналу - це хороша практика технічного обслуговування
ПОМИЛКОВИЙ. Зростання колоди дуже дороге, тому що новий шматок повинен бути нульовим. Вся активність запису припиняється в цій базі даних до завершення нулю, і якщо запис на диску повільний або розмір автоматичного зростання великий, ця пауза може бути величезною, і користувачі помітять. Це одна з причин, чому ви хочете уникнути зростання. Якщо ви скоротите журнал, він знову зросте, і ви просто витрачаєте дискові операції на непотрібну гру скорочення і зростання
Спочатку перевірте модель відновлення бази даних. За замовчуванням SQL Server Express Edition створює базу даних для простої моделі відновлення (якщо я не помиляюся).
Ім'я журналу резервного копіювання журналу Truncate_Only:
DBCC ShrinkFile(yourLogical_LogFileName, 50)
SP_helpfile дасть вам логічне ім'я файлу журналу.
Звертатися до:
Відновлення з повного журналу транзакцій у базі даних SQL Server
Якщо ваша база даних є в повній моделі відновлення, і якщо ви не приймаєте резервну копію TL, змініть її на SIMPLE.
TRUNCATE_ONLY
більше не є опцією в поточних версіях SQL Server, і не рекомендується для версій, які підтримують його (див . відповідь Рейчел ).
Використовуйте DBCC ShrinkFile ({logicalLogName}, TRUNCATEONLY)
команду. Якщо це тестова база даних, і ви намагаєтесь заощадити / повернути простір, це допоможе.
Пам'ятайте, що, якщо журнали TX мають такий собі мінімальний / стаціонарний розмір, до якого вони виростуть. Залежно від вашої моделі відновлення, ви, можливо, не зможете зменшити журнал - якщо це FULL і ви не видаєте резервні копії журналу TX, журнал не може бути скорочений - він зростатиме назавжди. Якщо вам не потрібні резервні копії журналу TX, переключіть модель відновлення на Simple .
І пам’ятайте, ніколи ні за яких обставин не видаляйте файл журналу (LDF)! У вас, швидше за все, буде моментальна корупція бази даних. Приготовлено! Готово! Втрачені дані! Якщо залишити "непоправленим", головний файл MDF може назавжди пошкодитися.
Ніколи не видаляйте журнал транзакцій - ви втратите дані! Частина ваших даних знаходиться в журналі TX (незалежно від моделі відновлення) ... якщо ви вилучите та "перейменуйте" файл журналу TX, який ефективно видаляє частину вашої бази даних.
Для тих, хто видалив журнал TX, ви можете запустити кілька команд checkdb і виправити пошкодження, перш ніж втратити більше даних.
Перегляньте публікації в блозі Пола Рандала на цю саму тему, погані поради .
Також взагалі не використовуйте файл скорочення у файлах MDF, оскільки це може сильно фрагментувати ваші дані. Перегляньте його розділ поганих порад для отримання додаткової інформації ("Чому не слід скорочувати файли даних")
Перегляньте веб-сайт Павла - він висвітлює ці самі запитання. Минулого місяця він розглядав багато цих питань у своїй серії " Міф за день ".
Щоб скоротити файл журналу:
Щоб зменшити файл журналу:
Скорочення бази даних:
Використання Enterprise Manager: - Клацніть правою кнопкою миші на базі даних, Усі завдання, Зменшити базу даних, Файли, Виберіть файл журналу, Добре.
Використання T-SQL: - Стислий файл Dbcc ([Log_Logical_Name])
Ви можете знайти логічне ім'я файлу журналу, запустивши sp_helpdb або переглянувши властивості бази даних у Enterprise Manager.
На мій досвід, на більшості серверів SQL немає резервної копії журналу транзакцій. Повне резервне копіювання або диференціальне резервне копіювання є звичайною практикою, але резервне копіювання журналу транзакцій дійсно рідко. Таким чином, файл журналу транзакцій зростає назавжди (поки диск не заповниться). У цьому випадку модель відновлення повинна бути встановлена на " просту ". Не забудьте також змінити системні бази даних "модель" та "tempdb".
Резервне копіювання бази даних "tempdb" не має сенсу, тому модель відновлення цього db завжди повинна бути "простою".
Це сталося зі мною, де файл журналу бази даних склав 28 ГБ.
Що ви можете зробити, щоб зменшити це? Фактично, файли журналів - це ті файлові дані, які зберігає SQL-сервер, коли транзакція відбулася. Для транзакції для обробки SQL сервер виділяє сторінки для тих же. Але після завершення транзакції вони не будуть звільнені раптово, сподіваючись, що транзакція може відбутися як та сама. Це займає простір.
Крок 1: Спочатку запустіть цю команду в контрольній точці запиту бази даних
Крок 2: Клацніть правою кнопкою миші на базі даних Завдання> Резервне копіювання Виберіть тип резервного копіювання як Журнал транзакцій Додати адресу призначення та ім'я файлу, щоб зберегти дані резервного копіювання (.bak)
Повторіть цей крок ще раз і в цей час введіть інше ім’я файлу
Крок 3: Тепер перейдіть до бази даних Клацніть правою кнопкою миші на базі даних
Завдання> Зменшення> Файли Виберіть Тип файлу як дію Зменшення журналу як звільнення невикористаного простору
Крок 4:
Перевіряйте свій файл журналу зазвичай у SQL 2014
C: \ програмні файли \ Microsoft SQL Server \ MSSQL12.MSSQL2014EXPRESS \ MSSQL \ DATA
У моєму випадку його скорочено з 28 ГБ до 1 МБ
Спробуйте це:
USE DatabaseName
GO
DBCC SHRINKFILE( TransactionLogName, 1)
BACKUP LOG DatabaseName WITH TRUNCATE_ONLY
DBCC SHRINKFILE( TransactionLogName, 1)
GO
TRUNCATE_ONLY
більше не є опцією в поточних версіях SQL Server, і не рекомендується для версій, які підтримують його (див . відповідь Рейчел ).
База даних → клацніть правою кнопкою миші Властивості → файл → додайте інший файл журналу з іншим ім’ям і встановіть шлях таким же, як і старий файл журналу з іншим ім’ям файлу.
База даних автоматично вибирає щойно створений файл журналу.
Це спрацює, але пропонується спершу зробити резервну копію вашої бази даних.
Деякі з інших відповідей для мене не спрацювали: не вдалося створити контрольну точку, поки db був в Інтернеті, оскільки журнал транзакцій був повний (наскільки іронічно). Однак, встановивши базу даних на аварійний режим, я зміг скоротити файл журналу:
alter database <database_name> set emergency;
use <database_name>;
checkpoint;
checkpoint;
alter database <database_name> set online;
dbcc shrinkfile(<database_name>_log, 200);
DBCC SQLPERF(LOGSPACE)
BACKUP LOG Comapny WITH TRUNCATE_ONLY
DBCC SHRINKFILE (Company_log, 500)
DBCC SQLPERF(LOGSPACE)
TRUNCATE_ONLY
більше не є опцією в поточних версіях SQL Server, і не рекомендується для версій, які підтримують його (див . відповідь Рейчел ).
Трохи оновлена відповідь для MSSQL 2017 та за допомогою студії управління SQL-сервером. Я йшов переважно з цих інструкцій https://www.sqlshack.com/sql-server-transaction-log-backup-truncate-and-shrink-operations/
У мене нещодавнє резервне копіювання db, тому я створив резервну копію журналу транзакцій. Тоді я знов підкріпив її для гарної міри. Нарешті я скоротив файл журналу і перейшов від 20G до 7MB, набагато більше відповідно до розміру моїх даних. Я не думаю, що журнали транзакцій ніколи не створювали резервні копії з моменту встановлення 2 років тому.
Журнал транзакцій БД скорочується до мінімального розміру :
Я зробив тести на декілька число БД: ця послідовність працює .
Зазвичай він скорочується до 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, і не рекомендується для версій, які підтримують його (див . відповідь Рейчел ).