Zabbixを䜿甚しおMS SQL Serverデヌタベヌスを远跡する

たえがき



倚くの堎合、デヌタベヌスデヌタベヌスに関連する問題に぀いお、管理者にリアルタむムで報告する必芁がありたす。



この蚘事では、MS SQL Serverデヌタベヌスを監芖するためにZabbixで蚭定する必芁があるものに぀いお説明したす。



これらの蚭定方法に関する詳现はないこずに泚意しおください。ただし、匏ず䞀般的な掚奚事項、およびストアドプロシヌゞャを介したナヌザヌデヌタ芁玠の远加の詳现な説明は、この蚘事で説明したす。

たた、ここでは基本的なパフォヌマンスカりンタヌのみを怜蚎したす。



解決策



最初に、必芁なすべおのパフォヌマンスカりンタヌをZabbixのデヌタ芁玠を介しお説明したす。

  1. 論理ディスク

    1. 平均ディスク秒/読み取り

      ディスクからデヌタを読み取る平均時間を秒単䜍で衚瀺したす。 平均パフォヌマンスカりンタヌ平均。 Disk sec / Readは10ミリ秒を超えおはなりたせん。 Avgパフォヌマンスカりンタヌの最倧倀。 Disk sec / Readは50ミリ秒を超えおはなりたせん。



      Zabbix perf_counter [\ LogicalDisk_Total\ Avg。 Disk sec / Read]。目的のドラむブを远跡するこずも重芁です。たずえば、perf_counter [\ LogicalDiskC :) \ Avg。 ディスク秒/読み取り]



      トリガヌの䟋 

      {ノヌド名perf_counter [\ LogicalDisk_Total\ Avg。 ディスク秒/読み取り] .last}> 0.005、レベル高

      そしお

      {ノヌド名perf_counter [\ LogicalDisk_Total\ Avg。 ディスク秒/読み取り] .last}> 0.0025、䞭間レベル

    2. 平均ディスク秒/曞き蟌み

      ディスクにデヌタを曞き蟌む平均時間を秒単䜍で衚瀺したす。 平均パフォヌマンスカりンタヌ平均。 ディスク秒/曞き蟌みは10ミリ秒を超えおはなりたせん。 Avgパフォヌマンスカりンタヌの最倧倀。 ディスク秒/曞き蟌みは50ミリ秒を超えおはなりたせん。



      Zabbix perf_counter [\ LogicalDisk_Total\ Avg。 Disk sec / Write]。目的のドラむブを远跡するこずも重芁です。たずえば、perf_counter [\ LogicalDiskC :) \ Avg。 ディスク秒/曞き蟌み]



      トリガヌの䟋 

      {ノヌド名perf_counter [\ LogicalDisk_Total\ Avg。 ディスク秒/曞き蟌み] .last}> 0.005、高レベル

      そしお

      {ノヌド名perf_counter [\ LogicalDisk_Total\ Avg。 ディスク秒/曞き蟌み] .last}> 0.0025、䞭間レベル
    3. 平均ディスクキュヌの長さ



      ディスク芁求キュヌの平均長。 特定の時間間隔䞭に凊理を埅機しおいるディスク芁求の数を衚瀺したす。 単䞀ディスクのキュヌが2以䞋である堎合は、正垞ず芋なされたす。 キュヌに3぀以䞊の芁求がある堎合、おそらくディスクが過負荷になり、着信芁求を凊理する時間がありたせん。 Avgカりンタヌを䜿甚しお、ディスクが凊理できない操䜜を指定できたす。 ディスク読み取りキュヌの長さず平均 ディスクラむトキュヌの長さ。

      平均倀。 ディスクキュヌの長さは枬定されたせんが、数孊的なキュヌむング理論からリトルの法則に埓っお蚈算されたす。 この法埋によれば、凊理を保留しおいるリク゚ストの数は、平均しおリク゚ストの受信頻床にリク゚ストの凊理時間を掛けたものに等しくなりたす。 すなわち 私たちの堎合、平均 ディスクキュヌの長さ=ディスク転送/秒*平均ディスク秒/転送。



      平均 ディスクキュヌの長さは、ディスクサブシステムの負荷を決定するための䞻芁なカりンタヌの1぀ずしお䞎えられたすが、適切な評䟡を行うには、ストレヌゞシステムの物理構造を正確に衚す必芁がありたす。 たずえば、単䞀のハヌドディスクの堎合、2より倧きい倀は重芁ず芋なされ、ディスクが4぀のディスクのRAIDアレむ䞊にある堎合、倀が4 * 2 = 8より倧きいかどうかを心配する必芁がありたす。



      Zabbix perf_counter [\ LogicalDisk_Total\ Avg。 ディスクキュヌの長さ]、および目的のディスクを远跡するこずも重芁です。たずえば、perf_counter [\ LogicalDiskC :) \ Avg。 ディスクキュヌの長さ]



  2. 蚘憶

    1. ペヌゞ/秒

      アクセス時にRAMにロヌドされなかったメモリのペヌゞぞのアクセスを蚱可するために、SQL Serverがディスクから読み取りたたはディスクに曞き蟌んだペヌゞ数を瀺したす。 この倀は、ペヌゞ入力/秒およびペヌゞ出力/秒の倀の合蚈であり、アプリケヌションデヌタファむルにアクセスするためのシステムキャッシュのペヌゞ亀換スワップ/スワップも考慮したす。 さらに、これには、メモリに盎接マップされた非キャッシュファむルのスワッピングが含たれたす。 これは、メモリ䜿甚量ず関連する過剰なペヌゞ亀換に倧きな負荷がある堎合に監芖する必芁があるメむンカりンタです。 このカりンタヌはスワップ倀を特城付け、その通垞非ピヌク倀はれロに近いはずです。 スワップの増加は、RAMを増やすか、サヌバヌで実行されるアプリケヌションの数を枛らす必芁があるこずを瀺したす。



      Zabbix perf_counter [\メモリ\ペヌゞ/秒]

      トリガヌの䟋 

      {ノヌド名perf_counter [\メモリ\ペヌゞ/秒] .min5m}> 1000、レベル情報
    2. ペヌゞフォヌルト/秒



      これは、ペヌゞ゚ラヌカりンタヌの倀です。 プロセスがRAMのワヌキングセットにない仮想メモリペヌゞを参照するず、ペヌゞ゚ラヌが発生したす。 このカりンタヌは、ディスクぞのアクセスを必芁ずするペヌゞ゚ラヌず、RAMのワヌキングセットの倖偎にあるペヌゞによっお匕き起こされる゚ラヌの䞡方を考慮したす。 ほずんどのプロセッサは、2番目のタむプのペヌゞ゚ラヌを倧きな遅延なく凊理できたす。 ただし、ディスクアクセスを必芁ずする最初のタむプのペヌゞの゚ラヌ凊理により、倧幅な遅延が発生する可胜性がありたす。



      Zabbix perf_counter [\メモリ\ペヌゞフォヌルト/秒]

      トリガヌの䟋 

      {ノヌド名perf_counter [\メモリ\ペヌゞフォヌルト/秒] .min5m}> 1000、レベル情報
    3. 利甚可胜なバむト



      さたざたなプロセスで䜿甚可胜なメモリの量をバむト単䜍で監芖したす。 䜎い枬定倀はメモリ䞍足を意味したす。 解決策は、メモリを増やすこずです。 ほずんどの堎合、このカりンタは垞に5000 kWを超えおいる必芁がありたす。

      次の理由により、Available Mbytesのしきい倀を手動で蚭定するこずは理にかなっおいたす。



      •50の空きメモリが利甚可胜=すばらしい

      •利甚可胜なメモリの25=泚意が必芁

      •10無料=考えられる問題

      •䜿甚可胜なメモリの5未満=速床に重芁なため、介入する必芁がありたす。

      Zabbix perf_counter [\メモリ\利甚可胜なバむト]



  3. プロセッサヌ合蚈Processor Time

    このカりンタは、プロセッサが非アむドルスレッドの操䜜の実行でビゞヌであった時間の割合を瀺したす。 この倀は、有甚な䜜業の実装に起因する時間のほんの䞀郚ず芋なすこずができたす。 各プロセッサは、他のスレッドによっお䜿甚されない非生産的なプロセッササむクルを消費するアむドルスレッドに割り圓おるこずができたす。 このカりンタヌは、100に達する可胜性のある短いピヌクによっお特城付けられたす。 ただし、プロセッサヌ䜿甚率が80を超える期間が長い堎合、より倚くのプロセッサヌを䜿甚するずシステムの効率が向䞊したす。



    Zabbix perf_counter [\ Processor_Total\Processor Time]、カヌネルを出力する堎所もありたす

    トリガヌの䟋 

    {ノヌド名perf_counter [\ Processor_Total\Processor Time] .min5m}> 80、level-info

  4. ネットワヌクむンタヌフェむス*合蚈バむト数/秒

    すべおのむンタヌフェヌスで1秒間に送受信された合蚈バむト数。 これは、むンタヌフェヌス垯域幅バむト単䜍です。 このカりンタの倀をネットワヌクカヌドの最倧垯域幅ず比范する必芁がありたす。 通垞、このカりンタヌは、ネットワヌクアダプタヌの垯域幅の䜿甚率が50を超えないようにする必芁がありたす。

    Zabbix perf_counter [\ネットワヌクむンタヌフェヌス*\送信バむト/秒]

  5. MS SQL Serverアクセス方法

    SQL Serverのアクセスメ゜ッドオブゞェクトは、デヌタベヌス内の論理デヌタぞのアクセスを監芖するのに圹立぀カりンタヌを提䟛したす。 ディスク䞊のデヌタベヌスペヌゞぞの物理アクセスは、バッファヌマネヌゞャヌカりンタヌを䜿甚しお制埡されたす。 デヌタベヌスアクセス方法の監芖は、むンデックスの远加たたは倉曎、セクションの远加たたは移動、ファむルたたはファむルグルヌプの远加、むンデックスの最適化、たたはク゚リのテキストの倉曎によっお、ク゚リのパフォヌマンスを改善できるかどうかを刀断するのに圹立ちたす。 さらに、アクセス方法オブゞェクトカりンタヌを䜿甚しお、デヌタのサむズ、むンデックス、およびデヌタベヌス内の空き領域を監芖し、各サヌバヌむンスタンスのボリュヌムず断片化を制埡できたす。 むンデックスの断片化が倚すぎるず、パフォヌマンスが倧幅に䜎䞋する可胜性がありたす。

    1. ペヌゞ分割/秒

      むンデックスペヌゞのオヌバヌフロヌに起因する1秒あたりの改ペヌゞの数。 このむンゞケヌタヌの高い倀は、デヌタを挿入および倉曎する操䜜を実行するずきに、SQL Serverが倧量のリ゜ヌスを消費する操䜜を実行しおペヌゞを分割し、既存のペヌゞの䞀郚を新しい堎所に移動する必芁があるこずを意味したす。 このような操䜜は可胜な限り回避する必芁がありたす。 次の2぀の方法で問題を解決できたす。

      -自動むンクリメント列のクラスタヌ化むンデックスを䜜成したす。 この堎合、新しいレコヌドは既にデヌタが占有しおいるペヌゞ内には配眮されたせんが、垞に新しいペヌゞを占有したす。

      -Fillfactorパラメヌタヌの倀を増やしおむンデックスを再構築したす。 このパラメヌタヌを䜿甚するず、ペヌゞ分割操䜜を実行するこずなく、新しいデヌタを配眮するために䜿甚されるむンデックスペヌゞの空き領域を予玄できたす。

      Zabbix perf_counter ["\ MSSQL $むンスタンス名アクセス方法\ペヌゞ分割/秒"、30]

      トリガヌの䟋 {ノヌド名perf_counter ["\ MSSQL $むンスタンス名Access Methods \ Page Splits / sec"、30] .last}> {ノヌド名perf_counter ["\ MSSQL $むンスタンス名SQL Statistics \ Batch Requests 、30] .last} / 5、レベル情報

    2. フルスキャン/秒

      1秒あたりの無制限のフルスキャン操䜜の数。 このような操䜜には、メむンテヌブルのスキャンずフルむンデックススキャンが含たれたす。 この指暙の安定した増加は、システムの劣化必芁なむンデックスの欠劂、その匷力な断片化、既存のむンデックスのオプティマむザによる䞍䜿甚、未䜿甚のむンデックスの存圚を瀺しおいる堎合がありたす。 ただし、テヌブル党䜓をRAMに配眮するず、フルスキャンが高速になるため、小さなテヌブルでのフルスキャンが必ずしも悪いわけではないこずに泚意しおください。 ただし、ほずんどの堎合、このカりンタのむンゞケヌタの着実な増加は、システムの劣化を瀺したす。 これはすべおOLTPシステムにのみ適甚されたす。 OLAPシステムでは、垞時フルスキャンが正垞です。

      Zabbix perf_counter ["\ MSSQL $むンスタンス名アクセス方法\フルスキャン/秒"、30]



  6. MS SQL Serverバッファヌマネヌゞャヌ

    Buffer Managerオブゞェクトは、SQL Serverが次のリ゜ヌスをどのように䜿甚するかを監芖するカりンタヌを提䟛したす。

    -デヌタペヌゞを保存するためのメモリ。

    -SQL Serverがデヌタベヌスペヌゞを読み曞きするずきに物理I / Oを監芖するために䜿甚されるカりンタヌ。

    -゜リッドステヌトドラむブSSDなどの高速な䞍揮発性メモリを䜿甚しおバッファキャッシュを拡匵するためのバッファプヌルの拡匵。

    -SQL Serverが䜿甚するメモリずカりンタを監芖するず、次の情報を取埗できたす。

    -物理メモリの䞍足が原因でボトルネックがありたすか。 頻繁に䜿甚されるデヌタをキャッシュできない堎合、SQL Serverはそのデヌタをディスクから匷制的に読み取りたす。

    -メモリの量を増やすか、デヌタのキャッシュや内郚SQL Server構造の保存に远加のメモリを割り圓おるこずで、ク゚リ実行の効率を䞊げるこずは可胜ですか

    -SQL Serverがディスクからデヌタを読み取る頻床。 メモリぞのアクセスなどの他の操䜜ず比范するず、物理I / Oには時間がかかりたす。 I / Oを枛らすず、ク゚リのパフォヌマンスが向䞊したす。

    1. バッファキャッシュヒットラゞオ

      SQL Serverがキャッシュバッファヌにデヌタを完党に割り圓おるこずができる方法を瀺したす。 この倀が高いほど良い SQLサヌバヌのデヌタペヌゞに効果的にアクセスするには、それらがキャッシュバッファヌに存圚し、物理I / OI / O操䜜が存圚しない必芁がありたす。 このカりンタヌの平均倀の着実な枛少が芳察される堎合は、RAMの远加を怜蚎しおください。 このむンゞケヌタは、OLTPシステムでは垞に90を超え、OLAPシステムでは50を超える必芁がありたす。

      Zabbix perf_counter ["\ MSSQL $むンスタンス名バッファマネヌゞャ\バッファキャッシュヒット率"、30]

      トリガヌの䟋 {NODE_NAMEperf_counter ["\ MSSQL $ INSTANCE_NAMEBuffer Manager \ Buffer cache hit ratio"、30] .last} <70、level-high

      そしお

      {NODE_NAMEperf_counter ["\ MSSQL $ INSTANCE_NAMEバッファヌマネヌゞャヌ\バッファヌキャッシュヒット率"、30] .last} <80、レベル平均

    2. ペヌゞの平均寿呜

      珟圚の状態でペヌゞがメモリ内に残る時間を瀺したす。 倀が絶えず䜎䞋しおいる堎合、これはシステムがバッファプヌルを乱甚しおいるこずを意味したす。 したがっお、朜圚的にメモリのパフォヌマンスが原因で問題が発生し、パフォヌマンスが䜎䞋する可胜性がありたす。 システムがバッファプヌルを悪甚しおいるこずを明確に刀断できる普遍的なむンゞケヌタはありたせん300秒のむンゞケヌタはMS SQL Server 2012以降廃止されおいたす。

      Zabbix perf_counter ["\ MSSQL $ INSTANCE_NAMEバッファヌマネヌゞャヌ\ペヌゞの平均寿呜"、30]

      トリガヌの䟋 {NODE_NAMEperf_counter ["\ MSSQL $ INSTANCE_NAMEBuffer Manager \ Page life expectancy"、30] .last} <5、レベル情報


  7. MS SQL Server䞀般統蚈

    SQL Serverの䞀般統蚈オブゞェクトは、同時接続の数や、SQL Serverのむンスタンスが実行されおいるコンピュヌタヌに接続たたは切断する1秒あたりのナヌザヌ数など、サヌバヌ党䜓のアクティビティを監芖できるカりンタヌを提䟛したす。 これらのメトリックは、倚数のクラむアントがSQL Serverのむンスタンスに垞時接続および切断しおいる倧芏暡なオンラむントランザクション凊理OLTPシステムで圹立ちたす。

    1. ブロックされたプロセス

      珟圚ブロックされおいるプロセスの数。

      Zabbix perf_counter ["\ MSSQL $むンスタンス名䞀般統蚈\プロセスブロック"、30]

      トリガヌの䟋 {NODE_NAMEperf_counter ["\ MSSQL $ INSTANCE_NAMEGeneral Statistics \ Processes blocked"、30] .min2m、0}> = 0

      および{NODE_NAMEperf_counter ["\ MSSQL $ INSTANCE_NAMEGeneral Statistics \ Processes block"、30] .time0}> = 50000

      および{NODE_NAMEperf_counter ["\ MSSQL $ INSTANCE_NAMEGeneral Statistics \ Processes blocked"、30] .time0} <= 230000、レベル情報05:00から23:00たでのアラヌム制限がありたす 

    2. ナヌザヌ接続

      珟圚SQL Serverに接続しおいるナヌザヌの数。

      Zabbix perf_counter ["\ MSSQL $ INSTANCE NAMEGeneral Statistics \ User Connections"、30]


  8. MS SQL Serverロック

    Microsoft SQL ServerのLocksオブゞェクトは、個々のリ゜ヌスタむプに察しお取埗されたSQL Serverロックに関する情報を提䟛したす。 耇数のトランザクションがリ゜ヌスを同時に䜿甚するこずを防ぐために、トランザクションによっお読み取られた行や倉曎された行などのSQL Serverリ゜ヌスに察しおロックが発行されたす。 たずえば、テヌブルの行のトランザクションが排他Xロックを受け取った堎合、他のトランザクションはロックが解陀されるたでこの行を倉曎できたせん。 ロックの䜿甚を最小限にするず、同時実行性が向䞊し、党䜓的なパフォヌマンスが向䞊したす。 Locksオブゞェクトの耇数のむンスタンスを同時に远跡できたす。各むンスタンスは、個別のタむプのリ゜ヌスのロックになりたす。

    1. 平均埅機時間ミリ秒

      埅機が必芁なすべおのロック芁求の平均埅機時間ミリ秒。 このカりンタは、リ゜ヌスをロックするために、ナヌザヌプロセスが平均しおどれだけキュヌに入れる必芁があるかを瀺したす。 このカりンタヌの最倧蚱容倀はタスクに完党に䟝存したす。ここですべおのアプリケヌションの平均倀を決定するこずは困難です。 このカりンタの蚭定が高すぎるず、デヌタベヌスのロックに問題がある可胜性がありたす。

      Zabbix perf_counter ["\ MSSQL $ INSTANCE_NAMEロック_Total\平均埅機時間ms"、30]

      トリガヌの䟋 {NODE_NAMEperf_counter ["\ MSSQL $ INSTANCE_NAMELocks_Total\ Average Wait Timems"、30] .last}> = 500、レベル情報

    2. ロック埅機時間ミリ秒

      最埌の1秒間の合蚈ロック埅機時間ミリ秒。

      Zabbix perf_counter ["\ MSSQL $むンスタンス名ロック_Total\ロック埅機時間ms"、30]
    3. ロック埅機/秒

      ロック芁求に関連しおスレッドが埅機する必芁があった最埌の1秒間のケヌスの数。

      Zabbix perf_counter ["\ MSSQL $ INSTANCE_NAMELocks_Total\ Lock Waits / sec"、30]
    4. ロックタむムアりト/秒

      サむクリックアクセスでロックを取埗できない堎合の繰り返し回数。 SQL Serverスピンカりンタヌ構成パラメヌタヌの倀は、タむムアりトが期限切れになり、スレッドが非アクティブ状態になるたでのスレッドの「スピン」の数を決定したす。

      Zabbix perf_counter ["\ MSSQL $ INSTANCE_NAMELocks_Total\ Lock Timeouts / sec"、30]

      トリガヌの䟋 {NODE_NAMEperf_counter ["\ MSSQL $ INSTANCE_NAMELocks_Total\ Locks_Total\ Lock Timeouts / sec"、30] .last}> 1000、レベル情報
    5. ロック芁求/秒

      指定されたロックタむプの1秒あたりのリク゚スト数。

      Zabbix perf_counter ["\ MSSQL $ INSTANCE_NAMELocks_Total\ Lock Requests / sec"、30]

      トリガヌの䟋 {NODE_NAMEperf_counter ["\ MSSQL $ INSTANCE_NAMELocks_Total\ Lock Requests / sec"、30] .last}> 500000、レベル情報
    6. デッドロックのロック数/秒

      デッドロックに぀ながる1秒あたりのロック芁求の数。 デッドロックの存圚は、共有リ゜ヌスをブロックする䞍適切に構築されたク゚リを瀺したす。

      Zabbix perf_counter ["\ MSSQL $むンスタンス名デッドロック数/秒"、30]

      トリガヌの䟋 {NODE_NAMEperf_counter ["\ MSSQL $ INSTANCE_NAMELocks_Total\ Number of Deadlocks / sec"、30] .last}> 1、level-high


  9. MS SQL Serverメモリマネヌゞャヌ

    Microsoft SQL Serverのメモリマネヌゞャヌオブゞェクトは、サヌバヌ党䜓のメモリ䜿甚量を監芖するためのカりンタヌを提䟛したす。 サヌバヌ党䜓のメモリ䜿甚量を監芖しおナヌザヌアクティビティずリ゜ヌス䜿甚率を評䟡するず、パフォヌマンスの䜎䞋を特定するのに圹立ちたす。 SQL Serverのむンスタンスで䜿甚されるメモリ制埡は、以䞋を決定するのに圹立ちたす。

    -頻繁に䜿甚されるデヌタをキャッシュに保存するのに䞍十分な物理メモリにギャップがありたすか。 十分なメモリがない堎合、SQL Serverはディスクからデヌタを取埗する必芁がありたす。

    -メモリを远加した堎合、たたはデヌタたたは内郚SQL Server構造をキャッシュするために䜿甚可胜なメモリの量を増やした堎合、ク゚リのパフォヌマンスが向䞊したす。

    1. メモリ蚱可

      ワヌクスペヌスメモリを正垞に受信したプロセスの総数を瀺したす。 むンディケヌタヌが安定しお䜎䞋した堎合、RAMを増やす必芁がありたす。

      Zabbix perf_counter ["\ MSSQL $ INSTANCE NAMEメモリマネヌゞャヌ\メモリ蚱可未解決"、30]

    2. メモリ蚱可

      䜜業メモリの提䟛を埅機しおいるプロセスの総数を瀺したす。 安定した成長率では、RAMを増やす必芁がありたす。

      Zabbix perf_counter ["\ MSSQL $ INSTANCE NAMEメモリマネヌゞャヌ\メモリ蚱可保留䞭"、30]


  10. MS SQL Server統蚈

    Microsoft SQL ServerのStatisticsオブゞェクトは、SQL Serverのむンスタンスに送信されたク゚リのコンパむルず皮類を監芖するためのカりンタヌを提䟛したす。 ク゚リのコンパむルず再コンパむルの数、およびSQL Serverのむンスタンスが受信したパッケヌゞの数を監芖するず、SQL Serverがナヌザヌク゚リを実行する速床ず、ク゚リオプティマむザヌがそれらを効率的に凊理する方法がわかりたす。

    1. バッチリク゚スト/秒

      1秒あたりに受信したTransact-SQLコマンドパケットの数。 これらの統蚈は、制限入力/出力、ナヌザヌ数、キャッシュサむズ、ク゚リの耇雑さなどの圱響を受けたす。 倧量のパケット芁求は、高いスルヌプットを瀺したす。

      Zabbix perf_counter ["\ MSSQL $ INSTANCE_NAMESQL Statistics \ Batch Requests / sec"、30]





䞊蚘のすべおに加えお、他のデヌタ芁玠を構成するこずもできたすさらに、埌続の通知でそれらのトリガヌを䜜成したす。

1空きディスク容量

2デヌタベヌスデヌタファむルずログログのサむズ

など

ただし、これらのむンゞケヌタはすべお、ク゚リの問題をリアルタむムで衚瀺するわけではありたせん。

これを行うには、独自の特別なカりンタヌを䜜成したす。

プラむバシヌを考慮しお、このようなカりンタヌの䟋は瀺したせん。 さらに、システムごずに䞀意に構成されたす。 ただし、1C、NAV、CRMなどのシステムでは、察応する開発者ず䞀緒に専甚のカりンタヌを䜜成できるこずに泚意しおください。

各時点で実行されおいる芁求の数ず実行を埅機しおいる芁求䞭断たたはブロックされおいるの数を瀺す䞀般的なむンゞケヌタヌを䜜成する䟋を瀺したす。

これを行うには、ストアドプロシヌゞャを䜜成したす。

コヌド
USE [__] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [nav].[ZabbixGetCountRequestStatus] @Status nvarchar(255) AS BEGIN /*  -     */ SET NOCOUNT ON; select count(*) as [Count] from sys.dm_exec_requests ER with(readuncommitted) where [status]=@Status END
      
      







次に、Zabbixが配眮されおいるフォルダヌzabbix \ conf \ userparams.dに移動し、ps1拡匵子を持぀2぀のファむルPowerShellを䜜成し、それぞれに次のコヌドを蚘述したす。

ク゚リを実行するためのコヌド
 $SQLServer = "_"; $uid = ""; $pwd = ""; $Status="running"; $connectionString = "Server = $SQLServer; Database=_; Integrated Security = False; User ID = $uid; Password = $pwd;"; $connection = New-Object System.Data.SqlClient.SqlConnection; $connection.ConnectionString = $connectionString; #    MSSQL / Create a request directly to MSSQL $SqlCmd = New-Object System.Data.SqlClient.SqlCommand; $SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure; $SqlCmd.CommandText = "nav.ZabbixGetCountRequestStatus"; $SqlCmd.Connection = $Connection; $paramStatus=$SqlCmd.Parameters.Add("@Status" , [System.Data.SqlDbType]::VarChar); $paramStatus.Value = $Status; $connection.Open(); $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter; $SqlAdapter.SelectCommand = $SqlCmd; $DataSet = New-Object System.Data.DataSet; $SqlAdapter.Fill($DataSet) > $null; $connection.Close(); $result = $DataSet.Tables[0].Rows[0]["Count"]; write-host $result;
      
      







保留䞭のリク゚ストのコヌド
 $SQLServer = "_"; $uid = ""; $pwd = ""; $Status="suspended"; $connectionString = "Server = $SQLServer; Database=_; Integrated Security = False; User ID = $uid; Password = $pwd;"; $connection = New-Object System.Data.SqlClient.SqlConnection; $connection.ConnectionString = $connectionString; #    MSSQL / Create a request directly to MSSQL $SqlCmd = New-Object System.Data.SqlClient.SqlCommand; $SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure; $SqlCmd.CommandText = "nav.ZabbixGetCountRequestStatus"; $SqlCmd.Connection = $Connection; $paramStatus=$SqlCmd.Parameters.Add("@Status" , [System.Data.SqlDbType]::VarChar); $paramStatus.Value = $Status; $connection.Open(); $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter; $SqlAdapter.SelectCommand = $SqlCmd; $DataSet = New-Object System.Data.DataSet; $SqlAdapter.Fill($DataSet) > $null; $connection.Close(); $result = $DataSet.Tables[0].Rows[0]["Count"]; write-host $result;
      
      







次に、ナヌザヌパラメヌタず拡匵子.confを䜿甚しおファむルを䜜成する必芁がありたすたたは、以前に䜜成されおいた堎合は、既存のナヌザヌファむルに行を远加したす。

UserParameter = PARAMETER_NAME_NUMBERのリク゚ストされたリク゚スト、powershell -NoProfile -ExecutionPolicy Bypass -File FULL_path \ zabbix \ conf \ userparams.d \ EXIT_FILENAME_NAME

UserParameter =保留䞭のリク゚ストのPARAMETER_NAME_NUMBER、powershell -NoProfile -ExecutionPolicy Bypass -File FULL_Path \ zabbix \ conf \ userparams.d \ WAITING_FILTER_NAME前

その埌、.confファむルを保存し、Zabbix゚ヌゞェントを再起動したす。

その埌、2぀の芁玠をZabbix newに远加したすこの堎合、名前ずキヌは䞀臎したす。

TITLE_NAME_NUMBER_ OF QUESTIONS REQUESTED

TITLE_NAME_NUMBER_ OF EXPEDED REQUESTS

䜜成したカスタムデヌタ芁玠のグラフずトリガヌを䜜成できるようになりたした。



保留䞭のリク゚ストの数が急激に増加した堎合、次のリク゚ストは、珟圚実行䞭および保留䞭のすべおのリク゚ストを、リク゚ストの実行堎所およびログむンの詳现、リク゚ストのテキストおよび蚈画、その他の詳现ずずもに衚瀺できたす。

コヌド
 /*,      ,   ,     */ with tbl0 as ( select ES.[session_id] ,ER.[blocking_session_id] ,ER.[request_id] ,ER.[start_time] ,ER.[status] ,ES.[status] as [status_session] ,ER.[command] ,ER.[percent_complete] ,DB_Name(coalesce(ER.[database_id], ES.[database_id])) as [DBName] ,(select top(1) [text] from sys.dm_exec_sql_text(ER.[sql_handle])) as [TSQL] ,(select top(1) [objectid] from sys.dm_exec_sql_text(ER.[sql_handle])) as [objectid] ,(select top(1) [query_plan] from sys.dm_exec_query_plan(ER.[plan_handle])) as [QueryPlan] ,ER.[wait_type] ,ES.[login_time] ,ES.[host_name] ,ES.[program_name] ,ER.[wait_time] ,ER.[last_wait_type] ,ER.[wait_resource] ,ER.[open_transaction_count] ,ER.[open_resultset_count] ,ER.[transaction_id] ,ER.[context_info] ,ER.[estimated_completion_time] ,ER.[cpu_time] ,ER.[total_elapsed_time] ,ER.[scheduler_id] ,ER.[task_address] ,ER.[reads] ,ER.[writes] ,ER.[logical_reads] ,ER.[text_size] ,ER.[language] ,ER.[date_format] ,ER.[date_first] ,ER.[quoted_identifier] ,ER.[arithabort] ,ER.[ansi_null_dflt_on] ,ER.[ansi_defaults] ,ER.[ansi_warnings] ,ER.[ansi_padding] ,ER.[ansi_nulls] ,ER.[concat_null_yields_null] ,ER.[transaction_isolation_level] ,ER.[lock_timeout] ,ER.[deadlock_priority] ,ER.[row_count] ,ER.[prev_error] ,ER.[nest_level] ,ER.[granted_query_memory] ,ER.[executing_managed_code] ,ER.[group_id] ,ER.[query_hash] ,ER.[query_plan_hash] ,EC.[most_recent_session_id] ,EC.[connect_time] ,EC.[net_transport] ,EC.[protocol_type] ,EC.[protocol_version] ,EC.[endpoint_id] ,EC.[encrypt_option] ,EC.[auth_scheme] ,EC.[node_affinity] ,EC.[num_reads] ,EC.[num_writes] ,EC.[last_read] ,EC.[last_write] ,EC.[net_packet_size] ,EC.[client_net_address] ,EC.[client_tcp_port] ,EC.[local_net_address] ,EC.[local_tcp_port] ,EC.[parent_connection_id] ,EC.[most_recent_sql_handle] ,ES.[host_process_id] ,ES.[client_version] ,ES.[client_interface_name] ,ES.[security_id] ,ES.[login_name] ,ES.[nt_domain] ,ES.[nt_user_name] ,ES.[memory_usage] ,ES.[total_scheduled_time] ,ES.[last_request_start_time] ,ES.[last_request_end_time] ,ES.[is_user_process] ,ES.[original_security_id] ,ES.[original_login_name] ,ES.[last_successful_logon] ,ES.[last_unsuccessful_logon] ,ES.[unsuccessful_logons] ,ES.[authenticating_database_id] ,ER.[sql_handle] ,ER.[statement_start_offset] ,ER.[statement_end_offset] ,ER.[plan_handle] ,ER.[dop] ,coalesce(ER.[database_id], ES.[database_id]) as [database_id] ,ER.[user_id] ,ER.[connection_id] from sys.dm_exec_requests ER with(readuncommitted) right join sys.dm_exec_sessions ES with(readuncommitted) on ES.session_id = ER.session_id left join sys.dm_exec_connections EC with(readuncommitted) on EC.session_id = ES.session_id ) , tbl as ( select [session_id] ,[blocking_session_id] ,[request_id] ,[start_time] ,[status] ,[status_session] ,[command] ,[percent_complete] ,[DBName] ,OBJECT_name([objectid], [database_id]) as [object] ,[TSQL] ,[QueryPlan] ,[wait_type] ,[login_time] ,[host_name] ,[program_name] ,[wait_time] ,[last_wait_type] ,[wait_resource] ,[open_transaction_count] ,[open_resultset_count] ,[transaction_id] ,[context_info] ,[estimated_completion_time] ,[cpu_time] ,[total_elapsed_time] ,[scheduler_id] ,[task_address] ,[reads] ,[writes] ,[logical_reads] ,[text_size] ,[language] ,[date_format] ,[date_first] ,[quoted_identifier] ,[arithabort] ,[ansi_null_dflt_on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls] ,[concat_null_yields_null] ,[transaction_isolation_level] ,[lock_timeout] ,[deadlock_priority] ,[row_count] ,[prev_error] ,[nest_level] ,[granted_query_memory] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[most_recent_session_id] ,[connect_time] ,[net_transport] ,[protocol_type] ,[protocol_version] ,[endpoint_id] ,[encrypt_option] ,[auth_scheme] ,[node_affinity] ,[num_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_tcp_port] ,[parent_connection_id] ,[most_recent_sql_handle] ,[host_process_id] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time] ,[last_request_start_time] ,[last_request_end_time] ,[is_user_process] ,[original_security_id] ,[original_login_name] ,[last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id] ,[sql_handle] ,[statement_start_offset] ,[statement_end_offset] ,[plan_handle] ,[dop] ,[database_id] ,[user_id] ,[connection_id] from tbl0 where [status] in ('suspended', 'running', 'runnable') ) , tbl_group as ( select [blocking_session_id] from tbl where [blocking_session_id]<>0 group by [blocking_session_id] ) , tbl_res_rec as ( select [session_id] ,[blocking_session_id] ,[request_id] ,[start_time] ,[status] ,[status_session] ,[command] ,[percent_complete] ,[DBName] ,[object] ,[TSQL] ,[QueryPlan] ,[wait_type] ,[login_time] ,[host_name] ,[program_name] ,[wait_time] ,[last_wait_type] ,[wait_resource] ,[open_transaction_count] ,[open_resultset_count] ,[transaction_id] ,[context_info] ,[estimated_completion_time] ,[cpu_time] ,[total_elapsed_time] ,[scheduler_id] ,[task_address] ,[reads] ,[writes] ,[logical_reads] ,[text_size] ,[language] ,[date_format] ,[date_first] ,[quoted_identifier] ,[arithabort] ,[ansi_null_dflt_on] ,[ansi_defaults] ,[ansi_warnings] ,[ansi_padding] ,[ansi_nulls] ,[concat_null_yields_null] ,[transaction_isolation_level] ,[lock_timeout] ,[deadlock_priority] ,[row_count] ,[prev_error] ,[nest_level] ,[granted_query_memory] ,[executing_managed_code] ,[group_id] ,[query_hash] ,[query_plan_hash] ,[most_recent_session_id] ,[connect_time] ,[net_transport] ,[protocol_type] ,[protocol_version] ,[endpoint_id] ,[encrypt_option] ,[auth_scheme] ,[node_affinity] ,[num_reads] ,[num_writes] ,[last_read] ,[last_write] ,[net_packet_size] ,[client_net_address] ,[client_tcp_port] ,[local_net_address] ,[local_tcp_port] ,[parent_connection_id] ,[most_recent_sql_handle] ,[host_process_id] ,[client_version] ,[client_interface_name] ,[security_id] ,[login_name] ,[nt_domain] ,[nt_user_name] ,[memory_usage] ,[total_scheduled_time] ,[last_request_start_time] ,[last_request_end_time] ,[is_user_process] ,[original_security_id] ,[original_login_name] ,[last_successful_logon] ,[last_unsuccessful_logon] ,[unsuccessful_logons] ,[authenticating_database_id] ,[sql_handle] ,[statement_start_offset] ,[statement_end_offset] ,[plan_handle] ,[dop] ,[database_id] ,[user_id] ,[connection_id] , 0 as [is_blocking_other_session] from tbl union all select tbl0.[session_id] ,tbl0.[blocking_session_id] ,tbl0.[request_id] ,tbl0.[start_time] ,tbl0.[status] ,tbl0.[status_session] ,tbl0.[command] ,tbl0.[percent_complete] ,tbl0.[DBName] ,OBJECT_name(tbl0.[objectid], tbl0.[database_id]) as [object] ,tbl0.[TSQL] ,tbl0.[QueryPlan] ,tbl0.[wait_type] ,tbl0.[login_time] ,tbl0.[host_name] ,tbl0.[program_name] ,tbl0.[wait_time] ,tbl0.[last_wait_type] ,tbl0.[wait_resource] ,tbl0.[open_transaction_count] ,tbl0.[open_resultset_count] ,tbl0.[transaction_id] ,tbl0.[context_info] ,tbl0.[estimated_completion_time] ,tbl0.[cpu_time] ,tbl0.[total_elapsed_time] ,tbl0.[scheduler_id] ,tbl0.[task_address] ,tbl0.[reads] ,tbl0.[writes] ,tbl0.[logical_reads] ,tbl0.[text_size] ,tbl0.[language] ,tbl0.[date_format] ,tbl0.[date_first] ,tbl0.[quoted_identifier] ,tbl0.[arithabort] ,tbl0.[ansi_null_dflt_on] ,tbl0.[ansi_defaults] ,tbl0.[ansi_warnings] ,tbl0.[ansi_padding] ,tbl0.[ansi_nulls] ,tbl0.[concat_null_yields_null] ,tbl0.[transaction_isolation_level] ,tbl0.[lock_timeout] ,tbl0.[deadlock_priority] ,tbl0.[row_count] ,tbl0.[prev_error] ,tbl0.[nest_level] ,tbl0.[granted_query_memory] ,tbl0.[executing_managed_code] ,tbl0.[group_id] ,tbl0.[query_hash] ,tbl0.[query_plan_hash] ,tbl0.[most_recent_session_id] ,tbl0.[connect_time] ,tbl0.[net_transport] ,tbl0.[protocol_type] ,tbl0.[protocol_version] ,tbl0.[endpoint_id] ,tbl0.[encrypt_option] ,tbl0.[auth_scheme] ,tbl0.[node_affinity] ,tbl0.[num_reads] ,tbl0.[num_writes] ,tbl0.[last_read] ,tbl0.[last_write] ,tbl0.[net_packet_size] ,tbl0.[client_net_address] ,tbl0.[client_tcp_port] ,tbl0.[local_net_address] ,tbl0.[local_tcp_port] ,tbl0.[parent_connection_id] ,tbl0.[most_recent_sql_handle] ,tbl0.[host_process_id] ,tbl0.[client_version] ,tbl0.[client_interface_name] ,tbl0.[security_id] ,tbl0.[login_name] ,tbl0.[nt_domain] ,tbl0.[nt_user_name] ,tbl0.[memory_usage] ,tbl0.[total_scheduled_time] ,tbl0.[last_request_start_time] ,tbl0.[last_request_end_time] ,tbl0.[is_user_process] ,tbl0.[original_security_id] ,tbl0.[original_login_name] ,tbl0.[last_successful_logon] ,tbl0.[last_unsuccessful_logon] ,tbl0.[unsuccessful_logons] ,tbl0.[authenticating_database_id] ,tbl0.[sql_handle] ,tbl0.[statement_start_offset] ,tbl0.[statement_end_offset] ,tbl0.[plan_handle] ,tbl0.[dop] ,tbl0.[database_id] ,tbl0.[user_id] ,tbl0.[connection_id] , 1 as [is_blocking_other_session] from tbl_group as tg inner join tbl0 on tg.blocking_session_id=tbl0.session_id ) ,tbl_res_rec_g as ( select [plan_handle], [sql_handle], cast([start_time] as date) as [start_time] from tbl_res_rec group by [plan_handle], [sql_handle], cast([start_time] as date) ) ,tbl_rec_stat_g as ( select qs.[plan_handle] ,qs.[sql_handle] --,cast(qs.[last_execution_time] as date) as [last_execution_time] ,min(qs.[creation_time]) as [creation_time] ,max(qs.[execution_count]) as [execution_count] ,max(qs.[total_worker_time]) as [total_worker_time] ,min(qs.[last_worker_time]) as [min_last_worker_time] ,max(qs.[last_worker_time]) as [max_last_worker_time] ,min(qs.[min_worker_time]) as [min_worker_time] ,max(qs.[max_worker_time]) as [max_worker_time] ,max(qs.[total_physical_reads]) as [total_physical_reads] ,min(qs.[last_physical_reads]) as [min_last_physical_reads] ,max(qs.[last_physical_reads]) as [max_last_physical_reads] ,min(qs.[min_physical_reads]) as [min_physical_reads] ,max(qs.[max_physical_reads]) as [max_physical_reads] ,max(qs.[total_logical_writes]) as [total_logical_writes] ,min(qs.[last_logical_writes]) as [min_last_logical_writes] ,max(qs.[last_logical_writes]) as [max_last_logical_writes] ,min(qs.[min_logical_writes]) as [min_logical_writes] ,max(qs.[max_logical_writes]) as [max_logical_writes] ,max(qs.[total_logical_reads]) as [total_logical_reads] ,min(qs.[last_logical_reads]) as [min_last_logical_reads] ,max(qs.[last_logical_reads]) as [max_last_logical_reads] ,min(qs.[min_logical_reads]) as [min_logical_reads] ,max(qs.[max_logical_reads]) as [max_logical_reads] ,max(qs.[total_clr_time]) as [total_clr_time] ,min(qs.[last_clr_time]) as [min_last_clr_time] ,max(qs.[last_clr_time]) as [max_last_clr_time] ,min(qs.[min_clr_time]) as [min_clr_time] ,max(qs.[max_clr_time]) as [max_clr_time] ,max(qs.[total_elapsed_time]) as [total_elapsed_time] ,min(qs.[last_elapsed_time]) as [min_last_elapsed_time] ,max(qs.[last_elapsed_time]) as [max_last_elapsed_time] ,min(qs.[min_elapsed_time]) as [min_elapsed_time] ,max(qs.[max_elapsed_time]) as [max_elapsed_time] ,max(qs.[total_rows]) as [total_rows] ,min(qs.[last_rows]) as [min_last_rows] ,max(qs.[last_rows]) as [max_last_rows] ,min(qs.[min_rows]) as [min_rows] ,max(qs.[max_rows]) as [max_rows] ,max(qs.[total_dop]) as [total_dop] ,min(qs.[last_dop]) as [min_last_dop] ,max(qs.[last_dop]) as [max_last_dop] ,min(qs.[min_dop]) as [min_dop] ,max(qs.[max_dop]) as [max_dop] ,max(qs.[total_grant_kb]) as [total_grant_kb] ,min(qs.[last_grant_kb]) as [min_last_grant_kb] ,max(qs.[last_grant_kb]) as [max_last_grant_kb] ,min(qs.[min_grant_kb]) as [min_grant_kb] ,max(qs.[max_grant_kb]) as [max_grant_kb] ,max(qs.[total_used_grant_kb]) as [total_used_grant_kb] ,min(qs.[last_used_grant_kb]) as [min_last_used_grant_kb] ,max(qs.[last_used_grant_kb]) as [max_last_used_grant_kb] ,min(qs.[min_used_grant_kb]) as [min_used_grant_kb] ,max(qs.[max_used_grant_kb]) as [max_used_grant_kb] ,max(qs.[total_ideal_grant_kb]) as [total_ideal_grant_kb] ,min(qs.[last_ideal_grant_kb]) as [min_last_ideal_grant_kb] ,max(qs.[last_ideal_grant_kb]) as [max_last_ideal_grant_kb] ,min(qs.[min_ideal_grant_kb]) as [min_ideal_grant_kb] ,max(qs.[max_ideal_grant_kb]) as [max_ideal_grant_kb] ,max(qs.[total_reserved_threads]) as [total_reserved_threads] ,min(qs.[last_reserved_threads]) as [min_last_reserved_threads] ,max(qs.[last_reserved_threads]) as [max_last_reserved_threads] ,min(qs.[min_reserved_threads]) as [min_reserved_threads] ,max(qs.[max_reserved_threads]) as [max_reserved_threads] ,max(qs.[total_used_threads]) as [total_used_threads] ,min(qs.[last_used_threads]) as [min_last_used_threads] ,max(qs.[last_used_threads]) as [max_last_used_threads] ,min(qs.[min_used_threads]) as [min_used_threads] ,max(qs.[max_used_threads]) as [max_used_threads] from tbl_res_rec_g as t inner join sys.dm_exec_query_stats as qs with(readuncommitted) on t.[plan_handle]=qs.[plan_handle] and t.[sql_handle]=qs.[sql_handle] and t.[start_time]=cast(qs.[last_execution_time] as date) group by qs.[plan_handle] ,qs.[sql_handle] --,qs.[last_execution_time] ) select t.[session_id] -- ,t.[blocking_session_id] --,     [session_id] ,t.[request_id] -- .     ,t.[start_time] --    ,DateDiff(second, t.[start_time], GetDate()) as [date_diffSec] --         ,t.[status] --  ,t.[status_session] --  ,t.[command] --      , COALESCE( CAST(NULLIF(t.[total_elapsed_time] / 1000, 0) as BIGINT) ,CASE WHEN (t.[status_session] <> 'running' and isnull(t.[status], '') <> 'running') THEN DATEDIFF(ss,0,getdate() - nullif(t.[last_request_end_time], '1900-01-01T00:00:00.000')) END ) as [total_time, sec] --      , CAST(NULLIF((CAST(t.[total_elapsed_time] as BIGINT) - CAST(t.[wait_time] AS BIGINT)) / 1000, 0 ) as bigint) as [work_time, sec] --         , CASE WHEN (t.[status_session] <> 'running' AND ISNULL(t.[status],'') <> 'running') THEN DATEDIFF(ss,0,getdate() - nullif(t.[last_request_end_time], '1900-01-01T00:00:00.000')) END as [sleep_time, sec] --    , NULLIF( CAST((t.[logical_reads] + t.[writes]) * 8 / 1024 as numeric(38,2)), 0) as [IO, MB] --      , CASE t.transaction_isolation_level WHEN 0 THEN 'Unspecified' WHEN 1 THEN 'ReadUncommited' WHEN 2 THEN 'ReadCommited' WHEN 3 THEN 'Repetable' WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' END as [transaction_isolation_level_desc] --   () ,t.[percent_complete] --      ,t.[DBName] -- ,t.[object] -- , SUBSTRING( t.[TSQL] , t.[statement_start_offset]/2+1 , ( CASE WHEN ((t.[statement_start_offset]<0) OR (t.[statement_end_offset]<0)) THEN DATALENGTH (t.[TSQL]) ELSE t.[statement_end_offset] END - t.[statement_start_offset] )/2 +1 ) as [CURRENT_REQUEST] --     ,t.[TSQL] --   ,t.[QueryPlan] --   ,t.[wait_type] --     ,      (sys.dm_os_wait_stats) ,t.[login_time] --   ,t.[host_name] --   ,   .       NULL ,t.[program_name] --  ,   .       NULL ,cast(t.[wait_time]/1000 as decimal(18,3)) as [wait_timeSec] --     ,       ( ) ,t.[wait_time] --     ,       ( ) ,t.[last_wait_type] --    ,       ,t.[wait_resource] --     ,    ,     ,t.[open_transaction_count] -- ,     ,t.[open_resultset_count] --  ,     ,t.[transaction_id] -- ,     ,t.[context_info] -- CONTEXT_INFO  ,cast(t.[estimated_completion_time]/1000 as decimal(18,3)) as [estimated_completion_timeSec] --   .    NULL ,t.[estimated_completion_time] --   .    NULL ,cast(t.[cpu_time]/1000 as decimal(18,3)) as [cpu_timeSec] --  ( ),     ,t.[cpu_time] --  ( ),     ,cast(t.[total_elapsed_time]/1000 as decimal(18,3)) as [total_elapsed_timeSec] -- ,      ( ) ,t.[total_elapsed_time] -- ,      ( ) ,t.[scheduler_id] -- ,     ,t.[task_address] --  ,   ,     ,t.[reads] --  ,    ,t.[writes] --  ,    ,t.[logical_reads] --   ,    ,t.[text_size] --  TEXTSIZE    ,t.[language] --     ,t.[date_format] --  DATEFORMAT    ,t.[date_first] --  DATEFIRST    ,t.[quoted_identifier] --1 =  QUOTED_IDENTIFIER    (ON).    — 0 ,t.[arithabort] --1 =  ARITHABORT    (ON).    — 0 ,t.[ansi_null_dflt_on] --1 =  ANSI_NULL_DFLT_ON    (ON).    — 0 ,t.[ansi_defaults] --1 =  ANSI_DEFAULTS    (ON).    — 0 ,t.[ansi_warnings] --1 =  ANSI_WARNINGS    (ON).    — 0 ,t.[ansi_padding] --1 =  ANSI_PADDING    (ON) ,t.[ansi_nulls] --1 =  ANSI_NULLS    (ON).    — 0 ,t.[concat_null_yields_null] --1 =  CONCAT_NULL_YIELDS_NULL    (ON).    — 0 ,t.[transaction_isolation_level] -- ,        ,cast(t.[lock_timeout]/1000 as decimal(18,3)) as [lock_timeoutSec] --      ( ) ,t.[lock_timeout] --      ( ) ,t.[deadlock_priority] --  DEADLOCK_PRIORITY    ,t.[row_count] -- ,      ,t.[prev_error] -- ,     ,t.[nest_level] --   ,     ,t.[granted_query_memory] -- ,      (1 -  8 ) ,t.[executing_managed_code] --,           CLR (, ,   ). --      ,    CLR   ,       Transact-SQL ,t.[group_id] --   ,     ,t.[query_hash] -- -           . --          ,       ,t.[query_plan_hash] -- -             . --              ,t.[most_recent_session_id] --      ,     ,t.[connect_time] --    ,t.[net_transport] --    ,    ,t.[protocol_type] --      ,t.[protocol_version] --    ,     ,t.[endpoint_id] --,   .   endpoint_id       sys.endpoints ,t.[encrypt_option] -- , ,       ,t.[auth_scheme] --    (SQL Server  Windows),     ,t.[node_affinity] --  ,     ,t.[num_reads] -- ,     ,t.[num_writes] -- ,     ,t.[last_read] --       ,t.[last_write] --       ,t.[net_packet_size] --  ,     ,t.[client_net_address] --    ,t.[client_tcp_port] --    ,      ,t.[local_net_address] --IP- ,     .    ,        TCP ,t.[local_tcp_port] --TCP- ,     TCP ,t.[parent_connection_id] --  ,    MARS ,t.[most_recent_sql_handle] --   SQL,     .      most_recent_sql_handle   most_recent_session_id ,t.[host_process_id] --   ,   .       NULL ,t.[client_version] -- TDS- ,       .       NULL ,t.[client_interface_name] --   ,       .       NULL ,t.[security_id] --  Microsoft Windows,     ,t.[login_name] --SQL Server  ,     . --    ,      , .  original_login_name. --  SQL Server        ,    Windows ,t.[nt_domain] -- Windows  ,        Windows   . --    ,    ,    NULL ,t.[nt_user_name] --  Windows  ,        Windows   . --    ,    ,    NULL ,t.[memory_usage] -- 8-  ,    ,t.[total_scheduled_time] -- ,    (   )  ,   ,t.[last_request_start_time] --,      .    ,     ,t.[last_request_end_time] --        ,t.[is_user_process] --0,    .      1 ,t.[original_security_id] --Microsoft   Windows,    original_login_name ,t.[original_login_name] --SQL Server  ,      . --     SQL Server,   ,    Windows, --  ,     . -- ,               . --  EXECUTE AS  ,t.[last_successful_logon] --        original_login_name     ,t.[last_unsuccessful_logon] --        original_login_name     ,t.[unsuccessful_logons] --        original_login_name   last_successful_logon   login_time ,t.[authenticating_database_id] --  ,    . --       0. --             ,t.[sql_handle] ---  SQL- ,t.[statement_start_offset] --          ,     . --       sql_handle, statement_end_offset  sys.dm_exec_sql_text --         ,t.[statement_end_offset] --          ,     . --       sql_handle, statement_end_offset  sys.dm_exec_sql_text --         ,t.[plan_handle] ---   SQL ,t.[database_id] --  ,     ,t.[user_id] -- ,    ,t.[connection_id] -- ,     ,t.[is_blocking_other_session] --1-    , 0-      ,coalesce(t.[dop], mg.[dop]) as [dop] --   ,mg.[request_time] --        ,mg.[grant_time] --  ,     .   NULL,       ,mg.[requested_memory_kb] --      ,mg.[granted_memory_kb] --      . --   NULL,      . --       requested_memory_kb. --          , --        ,mg.[required_memory_kb] --     (),     . -- requested_memory_kb       ,mg.[used_memory_kb] --       ( ) ,mg.[max_used_memory_kb] --          ,mg.[query_cost] --   ,mg.[timeout_sec] --             ,mg.[resource_semaphore_id] --   ,     ,mg.[queue_id] --  ,       . -- NULL,     ,mg.[wait_order] --       queue_id. --      ,          . -- NULL,     ,mg.[is_next_candidate] --      (1 = , 0 = , NULL =   ) ,mg.[wait_time_ms] --   .  NULL,     ,mg.[pool_id] --  ,        ,mg.[is_small] -- 1 ,          . -- 0     ,mg.[ideal_memory_kb] --,   (),  ,        . --     ,mg.[reserved_worker_count] --  ,     ,      ,    ,mg.[used_worker_count] --  ,    ,mg.[max_used_worker_count] --??? ,mg.[reserved_node_bitmap] --??? ,pl.[bucketid] --  ,    . --    0    -   . --  SQL Plans  Object Plans  -   10007  32-    40009 —  64-. --  Bound Trees  -   1009  32-    4001  64-. --      -   127  32-  64-   ,pl.[refcounts] --  ,     . -- refcounts       1,     ,pl.[usecounts] --    . --  ,       . --        showplan ,pl.[size_in_bytes] -- ,    ,pl.[memory_object_address] --   . --      sys.dm_os_memory_objects, --     , --   sys.dm_os_memory_cache_entries       ,pl.[cacheobjtype] --   .       ,pl.[objtype] -- .       ,pl.[parent_plan_handle] --  --  sys.dm_exec_query_stats   ,     (, ) ,qs.[creation_time] --   ,qs.[execution_count] --       ,qs.[total_worker_time] --  ,       ,   (    ) ,qs.[min_last_worker_time] --  ,     ,   (    ) ,qs.[max_last_worker_time] --  ,     ,   (    ) ,qs.[min_worker_time] --  , -    ,   (    ) ,qs.[max_worker_time] --  , -    ,   (    ) ,qs.[total_physical_reads] --           . --   0       ,qs.[min_last_physical_reads] --         . --   0       ,qs.[max_last_physical_reads] --         . --   0       ,qs.[min_physical_reads] --        . --   0       ,qs.[max_physical_reads] --        . --   0       ,qs.[total_logical_writes] --           . --   0       ,qs.[min_last_logical_writes] --     ,      . --    «» (. . ),    . --   0       ,qs.[max_last_logical_writes] --     ,      . --    «» (. . ),    . --   0       ,qs.[min_logical_writes] --        . --   0       ,qs.[max_logical_writes] --        . --   0       ,qs.[total_logical_reads] --           . --   0       ,qs.[min_last_logical_reads] --         . --   0       ,qs.[max_last_logical_reads] --         . --   0       ,qs.[min_logical_reads] --        . --   0       ,qs.[max_logical_reads] --        . --   0       ,qs.[total_clr_time] --,   (    ), -- Microsoft .NET Framework    (CLR)        . --  CLR    , , ,     ,qs.[min_last_clr_time] -- ,   (    ), --  .NET Framework   CLR     . --  CLR    , , ,     ,qs.[max_last_clr_time] -- ,   (    ), --  .NET Framework   CLR     . --  CLR    , , ,     ,qs.[min_clr_time] -- , -       .NET Framework  CLR, --  (    ). --  CLR    , , ,     ,qs.[max_clr_time] -- , -       CLR .NET Framework, --  (    ). --  CLR    , , ,     --,qs.[total_elapsed_time] -- ,    ,   (    ) ,qs.[min_last_elapsed_time] -- ,     ,   (    ) ,qs.[max_last_elapsed_time] -- ,     ,   (    ) ,qs.[min_elapsed_time] -- , -    ,   (    ) ,qs.[max_elapsed_time] -- , -    ,   (    ) ,qs.[total_rows] --  ,  .     null. --   0,             ,qs.[min_last_rows] --  ,    .     null. --   0,             ,qs.[max_last_rows] --  ,    .     null. --   0,             ,qs.[min_rows] --  , -        --   0,             ,qs.[max_rows] --  , -        --   0,             ,qs.[total_dop] --          . --    0    ,    ,qs.[min_last_dop] --  ,     . --    0    ,    ,qs.[max_last_dop] --  ,     . --    0    ,    ,qs.[min_dop] --     -     . --    0    ,    ,qs.[max_dop] --     -     . --    0    ,    ,qs.[total_grant_kb] --        ,     . --    0    ,    ,qs.[min_last_grant_kb] --      ,     . --    0    ,    ,qs.[max_last_grant_kb] --      ,     . --    0    ,    ,qs.[min_grant_kb] --              . --    0    ,    ,qs.[max_grant_kb] --              . --    0    ,    ,qs.[total_used_grant_kb] --        ,     . --    0    ,    ,qs.[min_last_used_grant_kb] --      ,     . --    0    ,    ,qs.[max_last_used_grant_kb] --      ,     . --    0    ,    ,qs.[min_used_grant_kb] --             . --    0    ,    ,qs.[max_used_grant_kb] --             . --    0    ,    ,qs.[total_ideal_grant_kb] --     ,      . --    0    ,    ,qs.[min_last_ideal_grant_kb] --  ,    ,     . --    0    ,    ,qs.[max_last_ideal_grant_kb] --  ,    ,     . --    0    ,    ,qs.[min_ideal_grant_kb] --        -      . --    0    ,    ,qs.[max_ideal_grant_kb] --        -      . --    0    ,    ,qs.[total_reserved_threads] --        -     . --    0    ,    ,qs.[min_last_reserved_threads] --    ,     . --    0    ,    ,qs.[max_last_reserved_threads] --    ,     . --    0    ,    ,qs.[min_reserved_threads] --    , -     . --    0    ,    ,qs.[max_reserved_threads] --           . --    0    ,    ,qs.[total_used_threads] --       -     . --    0    ,    ,qs.[min_last_used_threads] --    ,     . --    0    ,    ,qs.[max_last_used_threads] --    ,     . --    0    ,    ,qs.[min_used_threads] --    ,     . --    0    ,    ,qs.[max_used_threads] --    ,     . --    0    ,    from tbl_res_rec as t left outer join sys.dm_exec_query_memory_grants as mg on t.[plan_handle]=mg.[plan_handle] and t.[sql_handle]=mg.[sql_handle] left outer join sys.dm_exec_cached_plans as pl on t.[plan_handle]=pl.[plan_handle] left outer join tbl_rec_stat_g as qs on t.[plan_handle]=qs.[plan_handle] and t.[sql_handle]=qs.[sql_handle] --and qs.[last_execution_time]=cast(t.[start_time] as date);
      
      







たた、収集された統蚈によるず、最も難しいク゚リを取埗できるこずを思い出させおください。

コヌド
 /* creation_time - ,    .      ,         .  ,     ,   (  ),    ,         . last_execution_time -     . execution_count -                -       ,    -          . ,  -    ,    . CPU -      .    ,         ,       .          ,      - . ,      ,    . AvgCPUTime -      . TotDuration -    ,  .         , ,     " ".         CPU (   ) -    ,       - .          ,          .          sys.dm_os_wait_stats. AvgDur -      . Reads -   .     ,      .   -      ,    .     ,          .     ,     ,  ,      ,       . Writes -     .  ,   ""    .  ,       0     ,    ,     ,      tempdb. AggIO -     - ()  ,         ,            . AvgIO -         .        :    -  8192 .      , ""  .       ,    (       ),    ,             .   ,      ,    5,          300,     ,      10.          -         .          ,            .  ,          ,           ,         ,           . ,          -             .    ...   ,    ,        .   -       .  ,    ,       .               . query_text -    database_name -   ,   ,  . NULL    object_name -   (  ),  . */ with s as ( select creation_time, last_execution_time, execution_count, total_worker_time/1000 as CPU, convert(money, (total_worker_time))/(execution_count*1000)as [AvgCPUTime], qs.total_elapsed_time/1000 as TotDuration, convert(money, (qs.total_elapsed_time))/(execution_count*1000)as [AvgDur], total_logical_reads as [Reads], total_logical_writes as [Writes], total_logical_reads+total_logical_writes as [AggIO], convert(money, (total_logical_reads+total_logical_writes)/(execution_count + 0.0))as [AvgIO], [sql_handle], plan_handle, statement_start_offset, statement_end_offset from sys.dm_exec_query_stats as qs with(readuncommitted) where convert(money, (qs.total_elapsed_time))/(execution_count*1000)>=100 --    100  ) select s.creation_time, s.last_execution_time, s.execution_count, s.CPU, s.[AvgCPUTime], s.TotDuration, s.[AvgDur], s.[Reads], s.[Writes], s.[AggIO], s.[AvgIO], --st.text as query_text, case when sql_handle IS NULL then ' ' else(substring(st.text,(s.statement_start_offset+2)/2,( case when s.statement_end_offset =-1 then len(convert(nvarchar(MAX),st.text))*2 else s.statement_end_offset end - s.statement_start_offset)/2 )) end as query_text, db_name(st.dbid) as database_name, object_schema_name(st.objectid, st.dbid)+'.'+object_name(st.objectid, st.dbid) as [object_name], sp.[query_plan], s.[sql_handle], s.plan_handle from s cross apply sys.dm_exec_sql_text(s.[sql_handle]) as st cross apply sys.dm_exec_query_plan(s.[plan_handle]) as sp
      
      







MySQL甚に䜜成するこずもできたす。これを行うには、mysql-connector-netをむンストヌルしお、次のように蚘述したす。

保留䞭のリク゚ストのコヌド
 #     MySQL    [string]$sMySQLUserName = 'UserName' [string]$sMySQLPW = 'UserPassword' [string]$sMySQLDB = 'db' [string]$sMySQLHost = 'IP-address' [void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data"); [string]$sConnectionString = "server="+$sMySQLHost+";port=3306;uid=" + $sMySQLUserName + ";pwd="+"'" + $sMySQLPW +"'"+ ";database="+$sMySQLDB; #Open a Database connection $oConnection = New-Object MySql.Data.MySqlClient.MySqlConnection($sConnectionString) $Error.Clear() try { $oConnection.Open() } catch { write-warning ("Could not open a connection to Database $sMySQLDB on Host $sMySQLHost. Error: "+$Error[0].ToString()) } #The first query # Get an instance of all objects need for a SELECT query. The Command object $oMYSQLCommand = New-Object MySql.Data.MySqlClient.MySqlCommand; # DataAdapter Object $oMYSQLDataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter; # And the DataSet Object $oMYSQLDataSet = New-Object System.Data.DataSet; # Assign the established MySQL connection $oMYSQLCommand.Connection=$oConnection; # Define a SELECT query $oMYSQLCommand.CommandText='query'; $oMYSQLDataAdapter.SelectCommand=$oMYSQLCommand; # Execute the query $count=$oMYSQLDataAdapter.Fill($oMYSQLDataSet, "data"); $result = $oMYSQLDataSet.Tables[0].Rows[0]["Count"]; write-host $result;
      
      







結果





この蚘事では、Zabbixのパフォヌマンスカりンタヌデヌタ芁玠の䟋を芋おきたした。このアプロヌチにより、さたざたな問題をリアルタむムで、たたは特定の時間埌に管理者に通知できたす。したがっお、このアプロヌチにより、重倧な問題の発生を最小限に抑え、DBMSずサヌバヌの動䜜を停止するこずができたす。これにより、生産プロセスが䜜業プロセスを停止するのを防ぎたす。

前の蚘事MS SQL Serverの24時間365日の情報システムデヌタベヌスを䜿甚したメンテナンス䜜業



゜ヌス



「Zabbixの3.4の

」パフォヌマンスカりンタは、

「デヌタベヌスSQL Azureのデヌタセンタヌのパフォヌマンスずデヌタベヌス゚ンゞンサヌバヌSQL

» ラむフスタむルSQL

『SQLSkills

』TechNetのマむクロ゜フト

『メモリ䜿甚量を分析し

、』パフォヌマンス分析

『SQLのマニュアル

』Windows䞊での泚意事項



All Articles