Вопрос

У меня есть веб -сервер с SQL 2008, работающий на смоделированном DB SQL 2005, и у меня есть локальный DB SQL 2005 для тестирования.

Это заставляет меня использовать сценарии для резервного копирования/восстановления данных для тестирования, поскольку резервные копии сервера 2008 года не восстанавливаются на сервере 2005 года.

Когда я запускаю этот SQL -запрос, чтобы уменьшить размер таблицы на моем производственном веб -SQL Server (2008)

 DELETE FROM TickersDay
 WHERE (DATEDIFF(day, TickersDay.[date], GETDATE()) >= 8)
 GO

Я получаю это сообщение:

 Msg 9002, Level 17, State 4, Line 3
 The transaction log for database 'VTNET' is full. To find out why space in the log
 cannot be reused, see the log_reuse_wait_desc column in sys.databases

Это возникает, когда я публикую сценарии также время от времени.

Когда я запускаю эту команду SQL, я получаю следующий результат:

 SELECT [name], recovery_model_desc, log_reuse_wait_desc
 FROM sys.databases

РЕЗУЛЬТАТ:

 [name]      recovery_model_desc       log_reuse_wait_desc

 VTNET  SIMPLE                     ACTIVE_TRANSACTION

Вот мои вопросы и проблемы:

  1. Я понял .. У меня есть оператор транзакции, которому нужна команда отката

<if @@ trancount> 0 Деневая обратная связь> .. Но у меня есть 100 хранимых процедур, так что прежде чем я это сделаю ....

  1. А пока ... Как я могу искоренить эту проблему ?? Я попытался сократить и попытался сделать резервную копию БД ...

  2. Как вы можете видеть, это в простом режиме ... Я не имею никакого представления, как резервное копирование файла только для журнала ... (не нашел, как это сделать) ...

Это было полезно?

Решение

Вы можете обойти эту проблему, просто получив SQL НЕТ Чтобы обработать всю таблицу, используя индекс только в даты, необходимые для удаления. Перефразировать это, чтобы быть удобным для индекса

DELETE FROM TickersDay
WHERE TickersDay.[date] <= DATEADD(day, -8, GETDATE())
GO

Если вы запускаете это достаточно часто (по крайней мере, ежедневно), то он должен обрабатывать только 1/9 или менее через индекс в Tickersday ([Date]) вместо того, чтобы проходить всю таблицу, если вы используете устаревшие на поле.

Если это все еще вызывает это:

Журнал транзакций для базы данных 'vtnet' заполнен

Вам действительно нужно увеличить размер журнала, потому что я подозреваю, что он не настроен на аутогроу и недостаточно велик для этой операции. Либо это, либо начните смотреть на падение удалений (опять же, если у вас есть индекс на дату, поэтому это эффективно нацелен на только 100 рядов), например,

DELETE TOP (100) FROM TickersDay
WHERE TickersDay.[date] <= DATEADD(day, -8, GETDATE())
GO

Вы можете либо зацикнуть его (@@ rowcount> 0), либо просто запланировать его чаще в качестве удаляющего фона.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top