Как я могу получить размер журнала транзакций в SQL 2005 программно?
Мы работаем с фиксированным размером журнала транзакций в наших базах данных, и я хотел бы собрать приложение для мониторинга размеров журналов, чтобы мы могли видеть, когда ситуация становится слишком тугой, и нам нужно увеличить фиксированный trn журнал.
Есть ли какая-нибудь команда TSQL, которую я могу запустить, которая сообщит мне текущий размер журнала транзакций и фиксированный предел журнала транзакций?
Ответы
Ответ 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