Журнал SQL и АКТИВНЫЕ СДЕЛКИ - PullRequest
0 голосов
/ 13 января 2011

У меня есть веб-сервер с SQL 2008, на котором выполняется имитация базы данных SQL 2005, и у меня есть локальная база данных 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. Я понял .. У меня есть оператор транзакции, которому требуется команда отката

0 Откат> .. но у меня есть 100 хранимых процедур, поэтому, прежде чем я это сделаю ....

  1. В МЕАНТИМУ ... как я могу устранить эту проблему ?? Я попытался сжаться, и я попытался сделать резервную копию Db ...

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

1 Ответ

1 голос
/ 13 января 2011

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

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

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

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

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

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

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

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

...