Вот мой сценарий: у нас есть база данных, назовем ее Logging, с таблицей, в которой хранятся записи из Log4Net (через MSMQ). Режим восстановления базы данных установлен на Простой: нас не интересуют журналы транзакций - они могут быть перенесены.
У нас есть задание, которое использует данные из sp_spaceused, чтобы определить, достигли ли мы определенного порогового размера. Если порог превышен, мы определяем, сколько строк необходимо удалить, чтобы уменьшить размер до x процентов от этого порога. (Кстати, я использую exec sp_spaceused MyLogTable
, TRUE
, чтобы получить количество строк и приблизительное приближение к их среднему размеру, хотя я не уверен, что это лучший способ сделать это. Но это уже другая проблема. )
Затем я пытаюсь удалить фрагменты (скажем, 5000 за раз), зациклив вызов sproc, который в основном делает следующее:
DELETE TOP (@RowsToDelete) FROM [dbo].[MyLogTable]
пока я не удалю то, что нужно удалить.
Вот проблема: если мне нужно удалить много строк, файл журнала транзакций заполняется. Я могу смотреть, как он растет, бегая
dbcc sqlperf (logspace)
Что меня озадачивает, так это то, что при сбое задания ВСЕ удаленные строки откатываются. Другими словами, похоже, что все фрагменты (каким-то образом) обертываются неявной транзакцией.
Я пробовал явно отключить неявные транзакции, заключив каждый оператор DELETE в BEGIN и COMMIT TRAN, но безрезультатно: либо все удаленные фрагменты выполняются успешно, либо вообще не выполняются.
Я знаю, что простой ответ: сделайте свой файл журнала достаточно большим, чтобы обрабатывать максимально возможное количество записей, которые вы когда-либо удаляете, но все же, почему это рассматривается как одна транзакция?
Извините, если я пропустил что-то простое, но я просмотрел много сообщений о росте файла журнала, режимах восстановления и т. Д., И я не могу этого понять.
Еще одна вещь: после сбоя задания файл журнала остается заполненным на 95–100 процентов в течение некоторого времени, прежде чем он снова упадет. Однако, если я убегу
checkpoint
dbcc dropcleanbuffers
он сразу же снижается до уровня использования примерно до 5 процентов.
TIA.