Как я могу предотвратить бесконечный рост журнала транзакций при удалении большого количества строк? - PullRequest
1 голос
/ 06 ноября 2019

Я использую цикл для удаления многих строк в чанках.

WHILE EXISTS (SELECT 1 FROM dbo.Table WHERE LogTime < CAST('2018-11-05' AS 
  DATE))
  BEGIN
    BEGIN TRANSACTION T1
        DELETE TOP (1000) FROM dbo.Table 
        WHERE LogTime < CAST('2018-11-05' AS date);
    COMMIT;
END

Я ожидаю, что каждый цикл цикла Loop - это одна транзакция, которая заканчивается на "COMMIT" и, следовательно, что журнал транзакций очищается послекаждый цикл цикла.

К сожалению, это не так. В какой-то момент спустя примерно 15 минут запрос завершается сбоем из-за «журнала транзакций заполнен»Затем начинается откат, который выполняет откат не только последнего цикла цикла, но и всего запроса, включая все остальные циклы цикла.

1 Ответ

0 голосов
/ 07 ноября 2019

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

...