doodle-on-web

自分で調べたことや、仕事の中で質問されたことなどをまとめています。

Zabbix-AgentによるSQLServerのLogspace使用率監視について

 

Zabbix-AgentによるSQLServerのLogspace使用率監視について

 

ZabbixODBC接続がなぜかうまくいかず、UserParamataer調査含めとても苦労したので、同じように苦労されている方の助けになれば幸いです。

 ZabbixODBCが解決したので、それは別記事にしました。

 

+ 実現したいこと 目標

- Logspaceの容量をZabbixで監視し、閾値でメールを飛ばす。

- (そのうちやる)閾値でバックアップへ移動させる。


+ 環境


- Zabbix Server
OS:CentOS
Zabbix:3.2
Zabbix-Agent:3.2

- SQLServer
OS:WindowsServer2012
DB:SQLServer2012


ZabbixAgentのUserParameterに以下の値を設定している。

UserParameter=MSSQL.LogSpace[*],"C:\Program Files (x86)\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\SQLCMD.EXE" -S 【サーバー名】 -U 【ユーザ名】 -P 【パスワード】 -h -1 -W -Q "set nocount on CREATE TABLE #log (DbName varchar(256),Size float,Used float,Status int) INSERT INTO #log EXEC ('DBCC SQLPERF(LOGSPACE)WITH NO_INFOMSGS') SELECT log.Used FROM #log log where log.DbName = '$1' DROP TABLE #log"

 

書式:
UserParameter=<key(Zabbixでキーにする値)[引数]>,<command(ZabbixAgentが実行するコマンド>

<key[*]>=
MSSQL.LogSpace[*]
<command>=
"C:\Program Files (x86)\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\SQLCMD.EXE" -S 【サーバー名】 -U 【ユーザ名】 -P 【パスワード】 -h -1 -W -Q "set nocount on CREATE TABLE #log (DbName varchar(256),Size float,Used float,Status int) INSERT INTO #log EXEC ('DBCC SQLPERF(LOGSPACE)WITH NO_INFOMSGS') SELECT log.Used FROM #log log where log.DbName = '$1' DROP TABLE #log"

 

※今回のコマンドはSQLCMDを使用するため、SQLCMD.EXEの場所をフルパスで指定してある。
※ZabbixAgentの環境変数として登録してあればフルパスは不要かもしれない。

 

SQLCMDの引数
-S : サーバー名
-U : ログインユーザ名
-P : ログインパスワード
-h : -1 でヘッダー非表示
-W : 出力結果の余白削除
-Q : 実行するクエリを記載

 

実行するSQLの説明
SET NOCOUNT ON
 出力結果に(1件処理しました。)というような情報を非表示してくれる。
 Zabbixにて取得する際にこれを入れないと数値として受け取れない。

 

CREATE TABLE #log (DbName varchar(256),Size float,Used float,Status int)
 DBCCの結果が素直にSelectすることができないため、一時テーブルを作成し、そこへ格納する必要がある。

 

INSERT INTO #log EXEC ('DBCC SQLPERF(LOGSPACE)WITH NO_INFOMSGS')
 作成した一時テーブルにDBCCの結果を格納している。
 DBCC SQLPERF(LOGSPACE)
  LOGSPACEの値を取得するSQL
 WITH NO_INFOMSGS:
  出力結果にDBCCのメッセージを出力しないようにするオプション
  これがないとZabbixに余計な文字列が入ってしまう。

 

SELECT log.Used FROM #log log where log.DbName = '$1'
 ここでやっと対象のLOGSPASEの値をSELECT可能。
 $1:引数をこれで利用できる。

 

DROP TABLE #log
 一時テーブルなのでドロップは不要なのかもしれないが、念のためドロップしている。