doodle-on-web

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

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

スポンサーリンク

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

 

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

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

 

www.doodle-office.work

 

 

実現したいこと 目標

  • 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 ServerClient SDKODBCXToolsBinnSQLCMD.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 ServerClient SDKODBCXToolsBinnSQLCMD.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

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

 

以上

 

ちなみに、Logspace使用率の監視であれば、こちらのテンプレートを適用していただくと、割と簡単アイテムの取得が可能です。

 

www.doodle-office.work