SQL Server sys.databases log_reuse_wait вопрос
Я исследовал быстрый рост журнала транзакций SQL Server 2005, когда обнаружил, что журналы транзакций будут корректно усекаться только в том случае, если для столбца sys.databases "log_reuse_wait" установлено значение 0, что означает, что ничто не мешает журналу транзакций повторно использовать существующее пространство.,
Однажды, когда я намеревался сделать резервную копию / усечь файл журнала, я обнаружил, что в этом столбце есть 4, или ACTIVE_TRANSACTION происходит в базе данных tempdb. Затем я проверил все открытые транзакции, используя DBCC OPENTRAN('tempdb') и столбец open_tran из sysprocesses. В результате я не смог найти активных транзакций нигде в системе.
Точны ли настройки в столбце log_reuse_wait? Происходят ли транзакции, которые невозможно обнаружить с помощью методов, описанных выше? Я что-то упускаю из виду?
7 ответов
Я до сих пор не знаю, почему я видел ACTIVE_TRANSACTION в столбце sys.databases log_reuse_wait_desc - когда не было запущенных транзакций, но мой последующий опыт показывает, что столбец log_reuse_wait для базы данных tempdb изменяется по причинам, которые не очень понятны, и для мои цели не очень актуальны. Кроме того, я обнаружил, что запуск DBCC OPENTRAN или кода "select open_tran from sysprocess" намного менее информативен, чем использование приведенных ниже операторов при поиске информации о транзакции:
select * from sys.dm_tran_active_transactions
select * from sys.dm_tran_session_transactions
select * from sys.dm_tran_locks
Здесь есть объяснения, как работает log_reuse_wait_desc:
Нам также необходимо понять, как работает механизм отчетности log_reuse_wait_desc. Это дает причину, по которой усечение журнала не могло произойти при последней попытке усечения журнала. Это может сбивать с толку - например, если вы видите ACTIVE_BACKUP_OR_RESTORE и знаете, что не выполняется операция резервного копирования или восстановления, это просто означает, что она выполнялась при последней попытке усечения журнала.
Так что в вашем случае сейчас нет ACTIVE TRANSACTION, но это было, когда в прошлый раз была предпринята попытка усечения журнала.
Есть несколько ссылок на дополнительные инструменты / ссылки, которые вы можете использовать, чтобы помочь устранить эту проблему по ссылке Ссылки для этого видео:
Управление файлами журналов SQL Server 2005 и 2008
Тем не менее, информация в log_reuse_wait должна быть точной. Скорее всего, вы только что потерпели неудачную или осиротевшую транзакцию, которую не смогли обнаружить.
Мой ответ из файла журнала для базы данных полон:
Как только вы делаете полную резервную копию базы данных, а база данных не использует модель простого восстановления, SQL Server сохраняет полную запись всех транзакций, когда-либо выполненных с базой данных. Это происходит так, что в случае катастрофического сбоя, когда вы теряете файл данных, вы можете восстановить его до точки сбоя, сделав резервную копию журнала и, после восстановления старой резервной копии данных, восстановите журнал, чтобы воспроизвести потерянный файл. сделки.
Чтобы предотвратить это, вы должны создать резервную копию журнала транзакций. Или вы можете разорвать цепь в текущей точке, используя TRUNCATE_ONLY
или же NO_LOG
Варианты BACKUP LOG.
Если вам не нужна эта функция, установите модель восстановления на Simple.
Данные, вероятно, точны. Что вам нужно сделать, это иметь регулярное резервное копирование журнала транзакций. Вопреки другим советам, вам НЕ следует использовать опцию NO_TRUNCATE в 2005 году, поскольку она очищает журнал совершенных транзакций, но не создает их резервные копии.
То, что вы должны сделать, - это выполнить резервное копирование журналов с использованием оператора BACKUP LOG с параметром NO_TRUNCATE. Вы должны также применять регулярные журналы транзакций в течение дня. Это должно помочь сохранить размер достаточно управляемым.
У меня была такая же проблема, когда база данных показывалась дляlog_reuse_wait_desc
и тем не менее просмотр в sys.dm_tran_active_transactions показал транзакции, как иsp_whoisactive
илиDBCC OPENTRAN()
. В базе данных осталось 300 МБ свободного места, а диск был заполнен, поскольку размер журнала увеличился до максимального размера (больше не мог расти).
Это были базы данных для разработчиков, и я видел много сообщений в Интернете (например, этот), но реальных исправлений не было, поэтому я решил попробовать кое-что, но все это не решило проблему.
- Установите модель восстановления
- Отключил базу данных, а затем снова включил ее.
- Отключил всю службу SQL, а затем снова включил ее.
- Установите базу данных на
RESTRICTED_USER
режим, остановил агент SQL и уничтожил все транзакции
Даже после всего, что он все еще сказалACTIVE_TRANSACTION
. В конце концов я сделал
USE [InsEx]
GO
DBCC SHRINKFILE (N'DEV_log' , 0, TRUNCATEONLY)
GO
(Это то же самое, что выполнить сжатие графического интерфейса -> «Освободить неиспользуемое пространство»). Это исправило ситуацию. Внезапно журнал стал на 99% бесплатным, иNOTHING
.
Кажется, это отражает то, что сказал @agdk26 о ценностиlog_resuse_wait_desc
произошло, когда произошло последнее усечение журнала, но мне это не объясняет, почему для модели восстановления установлено значениеSimple
не обрезал журнал (как я видел это много раз в прошлом).
Хм, сложно. Может ли быть так, что сам вопрос к sys.databases вызывает ACTIVE_TRANSACTION? В этом случае, однако, он должен быть в MASTER, а не в TEMPDB.