web-dev-qa-db-ja.com

SQL 2005でトランザクションログのサイズをプログラムで取得するにはどうすればよいですか?

データベースで固定トランザクションログサイズを使用しています。アプリケーションをまとめてログサイズを監視し、状況が厳しすぎて固定trnログを拡張する必要がある場合を確認したいと思います。

トランザクションログの現在のサイズとトランザクションログの固定制限を通知する実行可能なTSQLコマンドはありますか?

21
Adam Ness

あなたのコードを使用しましたが、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           
31
Myles Yamada

簡単なグーグル検索はこれを明らかにしました:

DBCC SQLPERF ( LOGSPACE )

トランザクションログで自動拡張を使用しないのはなぜですか?これはより信頼できる解決策のようです。

20
Eric Z Beard

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'
13
Martin Brown

これは私の頭の上にあるので、あなたは数学を再確認したいかもしれません...

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!

7
Tom H

固定サイズのトランザクションログに固執する必要がある場合は、妥当なサイズに設定し、ある程度のマージンを確保してから、次の2つのいずれかを実行することをお勧めします。

  • ポイント・イン・タイム・リカバリーが必要ない場合は、データベース・リカバリー・モードをSIMPLEに設定してください。簡単に言うと、トランザクションログでスペースを「自己リサイクル」できるようになります。

OR

  • リカバリモードをフルに保つ必要がある場合は、トランザクションログのバックアップを実行するジョブをスケジュールします。これにより、トランザクションログのスペースが解放され、必要に応じてポイントインタイムリカバリを実行できます。

また、おそらく次の記事が役立つかもしれません: SQL Serverデータベースのトランザクションログが予期せず大きくなるのを防ぐ方法

1
Diego

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
1
James