Подтвердить что ты не робот

Журнал транзакций для базы данных заполнен. Чтобы узнать, почему пространство в журнале нельзя использовать повторно, см. Столбец log_reuse_wait_desc в sys.databases

Я получаю следующую ошибку, пока пытаюсь удалить записи 355447 в одном запросе на удаление.

Журнал транзакций для базы данных заполнен. Чтобы узнать, почему пространство в журнале нельзя использовать повторно, см. Столбец log_reuse_wait_desc в sys.databases

Я попробовал foll. решение, но все же удалить оператор, бросающий ту же ошибку.

DBCC SHRINKFILE(DBname_Log, 2)
BACKUP LOG gis_sync WITH TRUNCATE_ONLY
DBCC SHRINKFILE(DBname_Log, 2)

Пожалуйста, помогите мне решить.... Благодаря

4b9b3361

Ответ 1

Как сказал Дэмиен, вы должны выяснить причину, почему ваш журнал растет. Отметьте эту должность для объяснения: Повторное использование журнала транзакций Подождите

Удаление многих записей потребует значительного пространства журналов, поэтому, если вы не можете сделать больше места для файла журнала, вам, возможно, придется удалить эти строки несколькими меньшими шагами. Если вы используете "полное" восстановление, вам нужно будет сделать резервную копию журнала после каждого шага.

С одной стороны, BACKUP LOG... WITH TRUNCATE_ONLY - это вообще очень плохая идея. Если вы находитесь в режиме полного восстановления, это приведет к поломке цепочки резервных копий и не позволит вам выполнить восстановление в определенный момент времени. Если вам не нужна восстанавливаемость по времени, используйте вместо этого параметр восстановления "простой". В противном случае возьмите резервную копию журнала и сохраните его вместе с другими файлами резервных копий.

DBCC SHRINKFILE в файле журнала никоим образом не помогает для базы данных, которую вы сокращаете. Вы можете использовать его, чтобы освободить место для других БД на диске, но он не освободит место для текущей базы данных, поскольку он может удалить только пространство, которое можно использовать повторно. Это означает, что любое пространство, освобожденное им, могло быть использовано для вашей транзакции в любом случае.

Ответ 2

В стороне, это всегда хорошая практика (и, возможно, решение для этого типа проблемы) для удаления большого количества строк с помощью пакетов:

WHILE EXISTS (SELECT 1 
              FROM   YourTable 
              WHERE  <yourCondition>) 
  DELETE TOP(10000) FROM YourTable 
  WHERE  <yourCondition>

Ответ 3

У меня также была та же проблема. Я пришел к выводу, что Это исключение возникает, когда на диске, где находится файл базы данных, есть полный. Чтобы решить эту проблему, я просто увеличиваю размер диск.