Должен быть способ удалить данные в SQL Server без перегрузки журнала - PullRequest
5 голосов
/ 19 сентября 2009

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

Я пытался зацикливаться, удалять куски и вызывать shrinkfile в журнале после каждой итерации. SQL Server просто игнорирует команду shrinkfile. То же самое сделал с журналом резервного копирования (затем удалил файл резервной копии). То же самое - журнал просто продолжает расти. Модель восстановления базы данных, на которой я пытаюсь это сделать, проста - я думал, что это будет проще, но это не так.

Ответы [ 3 ]

14 голосов
/ 21 сентября 2009

Делайте удаление в чанках, но вместо того, чтобы пытаться сжать журнал между разами, делайте резервные копии журналов между чанками (то есть, если вы находитесь в полном восстановлении)

Проблема в том, что журнал полон и, следовательно, должен расти. Если он заполнен, попытка уменьшить его бесполезна, в журнале нет свободного места для выпуска в ОС. Вместо этого вам нужно сделать пространство внутри файла доступным для повторного использования.

Поскольку БД находится в простом восстановлении, запустите удаление в чанках с помощью команды CHECKPOINT между каждым чанком. Вы не можете делать резервные копии журналов в Простом восстановлении

Вот пример кода, который удаляет без заполнения журнала (в простом восстановлении). НЕ оборачивайте это в пользовательскую транзакцию. Это полностью лишает смысла удаление в пакетах, поскольку журнал не может быть очищен, пока не будет зафиксирована вся транзакция.

(SQL 2005 и выше. Для SQL 2000 удалите TOP и используйте SET ROWCOUNT)

DECLARE @Done BIT
SET @Done = 0
WHILE @Done = 0
  BEGIN
    DELETE TOP (20000) -- reduce if log still growing
      FROM SomeTable WHERE SomeColumn = SomeValue 
    IF @@ROWCOUNT = 0 
      SET @Done = 1
    CHECKPOINT -- marks log space reusable in simple recovery
  END

Чтобы понять управление журналами, взгляните на эту статью - http://www.sqlservercentral.com/articles/64582/

4 голосов
/ 19 сентября 2009

Один прием, который я использовал, зависит от размера данных, которые я храню, от объема, который я удаляю:

  1. выбрать все «данные для хранения» в другую таблицу (только для временной хранение)

  2. обрезать исходную таблицу

  3. вставить все данные из таблицы временного хранения обратно в исходный

Хорошо работает, если сумма, которую вы держите, меньше, чем та, которую вы удаляете.

Аналогичный вариант, если все файлы базы данных находятся на одном диске (данные и журналы), а данные, подлежащие удалению, составляют примерно половину данных, - экспортировать «данные для хранения» в отдельный файл используйте утилиту командной строки bcp, затем обрежьте и снова вставьте файл данных с помощью bcp.

Я видел, как администраторы баз данных переводили базу данных в автономный режим, создавали резервные копии журналов, отключали журналирование и делали это таким образом, но это доставляет массу хлопот. : -)

0 голосов
/ 19 сентября 2009

Если для параметра восстановления установлено значение «Полный», вы можете попробовать сделать резервную копию журнала транзакций, чтобы очистить журнал непосредственно перед удалением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...