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

Как я могу получить размер журнала транзакций в SQL 2005 программно?

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

Есть ли какая-нибудь команда TSQL, которую я могу запустить, которая сообщит мне текущий размер журнала транзакций и фиксированный предел журнала транзакций?

4b9b3361

Ответ 1

Я использовал ваш код, но произошла ошибка преобразования в int. "Msg 8115, уровень 16, состояние 2, строка 1 Ошибка арифметического переполнения, преобразующая выражение в тип данных int". Поэтому везде, где есть "* 8", я изменил его на * 8.0, и код работает отлично.

SELECT (size * 8.0)/1024.0 AS size_in_mb
     , CASE
  WHEN max_size                                 = -1 
  THEN 9999999                  -- Unlimited growth, so handle this how you want
  ELSE (max_size * 8.0)/1024.0                  END AS max_size_in_mb
  FROM YOURDBNAMEHERE.sys.database_files
 WHERE data_space_id                            = 0           

Ответ 2

Быстрый поиск в Google показал следующее:

DBCC SQLPERF ( LOGSPACE )

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

Ответ 3

Использование sys.database_files дает только размер файла журнала, а не размер журнала в нем. Это не так много, если ваш файл имеет фиксированный размер. DBCC SQLPERF (LOGSPACE) - немного старая школа, но работает хорошо, если вам нужно поддерживать более старые версии SQL Server.

Вместо этого вы можете использовать таблицу dm_os_performance_counters следующим образом:

SELECT
    RTRIM(instance_name) [database], 
    cntr_value log_size_kb
FROM 
    sys.dm_os_performance_counters 
WHERE 
    object_name = 'SQLServer:Databases'
    AND counter_name = 'Log File(s) Used Size (KB)'
    AND instance_name <> '_Total'

Ответ 4

Это не работает, поэтому вы можете дважды проверить математику...

SELECT
     (size * 8)/1024.0 AS size_in_mb,
     CASE
        WHEN max_size = -1 THEN 9999999   -- Unlimited growth, so handle this how you want
        ELSE (max_size * 8)/1024.0
     END AS max_size_in_mb
FROM
     MyDB.sys.database_files
WHERE
     data_space_id = 0   -- Log file

Более того, вы можете получить доступ к этому системному представлению, например, приращение роста, независимо от того, установлен ли журнал для автозапуска или нет ли он для увеличения на определенную сумму или на процент.

НТН!

Ответ 5

Если вам действительно нужно придерживаться журнала транзакций фиксированного размера, я бы предложил установить его на разумный размер, допустив некоторый запас, а затем сделать одно из следующих двух:

  • Установите режим восстановления базы данных на SIMPLE, если вам не нужно время восстановления по времени. Говоря простыми словами, он позволит журналу транзакций "самостоятельно перерабатывать" пространство.

ИЛИ

  • Если вы должны сохранить режим восстановления FULL, заплатите задание, которое выполняет резервное копирование журнала транзакций. Это освободит место в журнале транзакций, а также позволит вам при необходимости выполнить восстановление по времени.

Кроме того, возможно, вы можете найти следующую статью полезной: Как остановить журнал транзакций базы данных SQL Server неожиданно.

Ответ 6

Для SQL 2008 и более поздних версий FILEPROPERTY также предоставляет объем пространства, используемый в файле, и намного менее сложный, чем все остальные ответы:

select [Name], physical_name [Path], CAST(size AS BIGINT)*8192 [TotalBytes], CAST(FILEPROPERTY(name,'SpaceUsed') AS BIGINT)*8192 [UsedBytes], (case when max_size<0 then -1 else CAST(max_size AS BIGINT)*8192 end) [MaxBytes]
from sys.database_files