Перш ніж негайно позначити як дублікат , я прочитав «Майк Уолш», чому журнал транзакцій постійно росте чи не вистачає місця? , але я не думаю, що це дало відповідь на мою ситуацію. Я переглянув десяток подібних запитань, але відповідні здебільшого просто сказав "дублікат" і вказав на запитання Майка.
Докладніше: У мене є маса баз даних ~ 500 Мб на SQL Server 2008 R2, всі в режимі ПРОСТОГО відновлення (не мій вибір), нічних повних резервних копій, з ~ 200 МБ файлів даних та ~ 300 МБ файлів журналу. Журнал не зростає до 300 МБ відразу, а досить повільно протягом декількох місяців. Немає жодних відкритих транзакцій, принаймні відповідно до sp_who2 та монітора активності. Якщо я клацніть правою кнопкою миші на базі даних та виберіть властивості, це скаже мені, що немає ~ 50 Мб безкоштовно. Не повинен весь журнал бути вільним після резервного копіювання? Чи в режимі SIMPLE журнал не повинен бути вільним, якщо немає відкритої транзакції?
log_reuse_wait_desc
з sys.databases
сказаного говорить "НІЧОГО", який, грунтуючись на вищезазначеному запитанні та відповіді, говорить, що не слід чекати нічого, щоб повторно використовувати простір.
Якщо я роблю 'DBCC SHRINKFILE', файл журналу скорочується до 1 МБ, тому він готовий повернути пробіл. Я можу налаштувати щось, що скорочує журнали щотижня, і не дає можливості вийти з-під контролю, але я збентежений, чому SQL Server змусив би мене це зробити.
Я можу зрозуміти, чи була якась божевільна транзакція, для якої потрібно було 300 Мб, щоб записати її, але ми не робимо нічого екстремального, просто базовий OLTP. З запитання / відповіді Майка:
Проста модель відновлення - Отже, з вищенаведеним вступом найпростіше спочатку поговорити про просту модель відновлення. У цій моделі ви говорите на SQL Server - я добре з вами, використовуючи файл журналу транзакцій для аварійного завершення та відновлення відновлення (у вас дійсно немає вибору там. Знайдіть властивості ACID, і це має мати сенс швидко), але як тільки ви ні більше потрібен для цілі відновлення / відновлення відновлення, продовжуйте і повторно використовуйте файл журналу.
SQL Server слухає цей запит у простому відновленні, і він зберігає лише інформацію, необхідну для відновлення / відновлення відновлення. Після того, як SQL Server впевнений, що він може відновитись, оскільки дані загартовані у файл даних (більш-менш), загартовані дані більше не потрібні в журналі та позначаються для усікання - це означає, що він повторно використовується.
Постійно кажуть, що простір журналу потрібно повторно використовувати, але при цьому повільному зростанні протягом місяців, здається, це не так.
Що я пропускаю? Чи щось заважає SQL Server розпізнавати дані як «загартовані» та звільняти журнал?
(редагувати) Звіт після дій - AKA трохи знань небезпечно
Дізнавшись, що це "популярне питання", мені здалося, що я зобов'язаний пояснити те, що сталося 7 місяців тому, і що я навчився сподіватися врятувати інших людей деяке горе.
По-перше, доступний простір, який ви бачите в SSMS при перегляді властивостей бази даних, - це простір, наявний у файлі даних. Ви можете переглянути це, виконавши наступне в базі даних, і ви знайдете доступний простір, про який повідомляє SSMS, - це різниця між FileSizeMB і UsedSpaceMB:
SELECT
DB.name,
MF.physical_name,
MF.type_desc AS FileType,
MF.size * 8 / 1024 AS FileSizeMB,
fileproperty(MF.name, 'SpaceUsed') * 8/ 1024 AS UsedSpaceMB,
mf.name LogicalName
FROM
sys.master_files MF
JOIN sys.databases DB ON DB.database_id = MF.database_id
WHERE DB.name = 'yourdatabasename'
Це підтвердило, що за звичайних обставин ми використовували дуже мало простору журналу (20 Мб або менше), але це призводить до другого пункту ...
По-друге, моє сприйняття вирощування колод було повільним з часом. Однак насправді журнали швидко зростали вночі, коли хлопець, відповідальний за застосування патчів для цієї сторонньої програми, застосовував патчі. Патч робився як одна транзакція, тому залежно від патчу для даних 200 Мб потрібно було 300 МБ журналу. Ключовим моментом у відстеженні цього запиту став запит від Аарона Бертран за адресою https://sqlblog.org/2007/01/11/reviewing-autogrow-events-from-the-default-trace
DECLARE @path NVARCHAR(260);
SELECT
@path = REVERSE(SUBSTRING(REVERSE([path]),
CHARINDEX('\', REVERSE([path])), 260)) + N'log.trc'
FROM sys.traces
WHERE is_default = 1;
SELECT
DatabaseName,
[FileName],
SPID,
Duration,
StartTime,
EndTime,
FileType = CASE EventClass
WHEN 92 THEN 'Data'
WHEN 93 THEN 'Log'
END
FROM sys.fn_trace_gettable(@path, DEFAULT)
WHERE
EventClass IN (92,93)
ORDER BY
StartTime DESC;
Це показало, що журнал росте певними вечорами, коли клієнт не використовував базу даних. Це призвело до розмови з хлопцем, що застосовує патчі та відповідь на таємницю.
Ще раз дякую людям, які надали допомогу, щоб отримати відповідь.