2008-10-13 3 views
18

우리는 데이터베이스에서 고정 트랜잭션 로그 크기로 작업하고 있으며 로그 크기를 모니터링하는 응용 프로그램을 함께 사용하여 상황이 너무 어려워지고 고정 trn 로그를 늘려야 할 때를 볼 수 있습니다. .프로그래밍 방식으로 SQL 2005에서 트랜잭션 로그의 크기를 가져 오는 방법은 무엇입니까?

실행할 수있는 TSQL 명령이 있습니까? 트랜잭션 로그의 현재 크기와 트랜잭션 로그의 고정 된 제한을 알려줍니다.

답변

27

귀하의 코드를 사용했지만 int로 변환하는 중 오류가 발생했습니다. "메시지 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   
18

빠른 구글 검색이 밝혀 : 왜 당신이 트랜잭션 로그에 자동 증가를 사용하지 않는

DBCC SQLPERF (LOGSPACE) 

? 이것이보다 안정적인 해결책이 될 것 같습니다.

+1

내가 선택한 것은 아닙니다.DBA는 정적으로 크기가 조정 된 트랜잭션 로그가 더 효율적이라고 말합니다. –

+1

나는 엄격한 DBA보다 SQL 개발자가 많지만 로그 파일의 크기가 정확하지 않고 너무 자주 성장해야만 성능에 영향을 주어야합니다. 성장의 실제 행위는 약간의 성과를 먹는다. 그러나 자동 증가는 대체로 예기치 않은 비상 사태를위한 것이어야한다. –

+2

DBCC SQLPERF는 서버에 대한 추가 사용 권한이 필요합니다. 따라서 sys.database 파일 응답과 함께갔습니다. DBCC SQLPerf는 동시에 모든 데이터베이스를 제공하는 이점이 있습니다 ... –

6

이 내 머리 위로 떨어져, 그래서 당신이 수학을 다시 한 번 확인 할 수 있습니다 ...

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 

해당 시스템보기에서 얻을 수있는 것을 더는 성장의 증가로이 로그가 자동 증가로 설정되었는지 여부와 특정 양 또는 백분율만큼 증가하도록 설정되었는지 여부를 지정합니다.

HTH!

1

당신이 정말로 고정 된 크기의 트랜잭션 로그에 충실해야하는 경우, 좀 여유를 허용하는 적당한 크기로 설정하는 것이 좋습니다 다음 다음 두 가지 중 하나를 수행 것 :

  • 설정 데이터베이스를 특정 시점 복구가 필요하지 않은 경우 복구 모드를 SIMPLE로 변경하십시오. 간단히 말해서 트랜잭션 로그가 공간을 "자체 재활용"할 수 있습니다.

또는

  • 당신이 FULL로 복구 모드를 유지해야하는 경우

    는 트랜잭션 로그의 백업을 수행하는 작업을 예약합니다. 이렇게하면 트랜잭션 로그의 여유 공간이 생기며 필요한 경우 특정 시점 복구를 수행 할 수 있습니다.

또한 다음 기사가 유용 할 수도 있습니다. How to stop the transaction log of a SQL Server database from growing unexpectedly.

13

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' 
0
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 
관련 문제