次の方法で共有


MSSQL Standard Edition RVER_19407

適用対象:SQL Server

詳細

属性 Value
製品名 SQL Server
イベント ID 19407
イベント ソース MSSQLSERVER
コンポーネント SQLEngine
シンボル名 HADR_AG_LEA Standard Edition_EXPIRED
メッセージ テキスト 可用性グループ '%.*ls' と Windows Server フェールオーバー クラスターの間のリースの有効期限が切れています。 SQL Server のインスタンスと Windows Server フェールオーバー クラスターの間で接続の問題が発生しました。 可用性グループが正常にフェールオーバーされているかどうかを確認するには、Windows Server フェールオーバー クラスター内の対応する可用性グループ リソースを確認します。

説明

SQL Server と Windows Server フェールオーバー クラスター間の通信が失われると、SQL Server エラー ログでエラー 19407 が発生します。 通常、修正アクションが発生します。別の Always On ノードへのフェールオーバーです。

リースは、SQL Server と Windows Server フェールオーバー クラスター (WSFC) プロセス (特に RHS.EXE プロセス) の間で行われる時間ベースの通信メカニズムです。 2 つのプロセスは、他のプロセスが実行され、応答していることを確認するために、定期的に相互に通信します。 この通信は Windows イベント オブジェクト を使用して行われ、WSFC の知識がなくても AG リソースのフェールオーバーが発生しないようにします。 定義済みのリース期間に基づいて、いずれかのプロセスがリース通信に応答しない場合、リース タイムアウトが発生します。 詳細については、「Always On 可用性グループのリース、クラスター、正常性チェックタイムアウトのメカニズムとガイドライン」を参照してください。 「しくみ: SQL Server AlwaysOn のリース タイムアウト」も参照してください

原因

Windows イベントは軽量の同期オブジェクトであるため、それらに悪影響を与える外部要因の数は比較的少なくなります。 リース タイムアウトにつながる可能性がある一般的な問題には、システム全体の問題が含まれます。 リースの有効期限が切れ、再起動またはフェールオーバーが発生する可能性のある可能性の一覧を次に示します。

  • システムでの CPU 使用率が高い (100% に近い)。

  • メモリ不足の状態 - 仮想メモリが少ない、またはいずれかのプロセスがページアウトされています。

  • クォーラム損失が原因で WSFC がオフラインになる。 クォーラム損失の問題をトラブルシューティングするには、クォーラムの構成と管理、および強制クォーラムによる WSFC ディザスター リカバリー (SQL Server) に関するページを参照してください

  • パフォーマンスに 影響を与え、リースの有効期限が発生する VM の調整。

  • 大きなメモリ ダンプの生成中に SQL Server プロセスが応答しません。 スタック・ダンプ生成の詳細については、ダンプ生成の影響を参照してください。 スタック ダンプの生成は、次のいくつかの理由で発生する可能性があります。

    • 非提供スケジューラ
    • ラッチ タイムアウト
    • デッドロックが発生したスケジューラ
    • 未解決のデッドロック

ユーザー アクション

CPU 使用率の高い問題のトラブルシューティング

  1. [タスク マネージャー] を開きます。

  2. [パフォーマンス] タブに移動し、CPU の使用率が 100% に近いか、100% に近いかを確認します。

  3. [プロセス] タブに移動し、[CPU] 列を選択して、CPU 列でプロセスを降順に並べ替えます。

  4. ほとんどの CPU を使用するプロセスを特定し、CPU が高くなる原因を理解して解決します。

  5. プロセスが SQL Server の場合は、SQL Server での CPU 使用率の高い問題のトラブルシューティングを参照してください

  6. 次の PowerShell スクリプトを使用して、システムの CPU 使用率をチェックできます。

    Get-Counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 5 -MaxSamples 30 |
        Select-Object -ExpandProperty CounterSamples | Select-Object TimeStamp, Path, CookedValue
    

メモリ不足の問題のトラブルシューティング

システムで仮想メモリまたは物理メモリが不足している場合は、SQL Server またはクラスター リソース ホスト サービス (RHS.exe) プロセスがページ アウトされる可能性があります。プロセスがディスクにページングされると、アクティブに実行されません。また、メモリが使用可能な時間までにリース タイムアウトに達し、プロセスの仮想バイトが物理メモリにページングバックされる可能性があります。 仮想メモリの不足は、アプリケーション、ドライバー、または OS がシステム上のメモリ全体を消費することが原因で発生する可能性があります。 この問題をトラブルシューティングするには、次の方法を使用します。

  1. アプリケーションまたはシステム イベント ログで、次のような Your system is low on virtual memoryエラーを確認します。 サーバーにサインインしている場合は、このエラーが画面に表示される場合もあります。

  2. タスク マネージャーを開き、メモリの 100% 近くが消費されている場合にチェックするパフォーマンス -> メモリを選択します。 [詳細] タブを使用して、最大のメモリ コンシューマーである可能性があるアプリケーションを特定します。

  3. また、パフォーマンス モニターを使用して、時間の経過と同時にこれらのカウンターを監視することもできます。

    • Process\Working Set - 個々のプロセスのメモリ使用量をチェックする
    • Memory\Available MB (メガバイト)ytes - システムでの全体的なメモリ使用量をチェックするため

    次の PowerShell スクリプトを使用して、すべてのプロセス全体のメモリ使用量とシステム上の使用可能なメモリを特定できます。 個々のプロセスのメモリ使用量を取得する場合は、次 "\Process(_Total)\Working Set" のように変更します "\Process(*)\Working Set"

    $serverName = $env:COMPUTERNAME
    $Counters = @(
      ("\\$serverName" + "\Process(_Total)\Working Set") , ("\\$serverName" + "\Memory\Available Bytes")
    )
    
    Get-Counter -Counter $Counters -MaxSamples 30 | ForEach-Object {
        $_.CounterSamples | ForEach-Object {
            [pscustomobject]@{
                TimeStamp = $_.TimeStamp
                Path      = $_.Path
                Value_MB  = ([Math]::Round($_.CookedValue, 3)) / 1024 / 1024
            }
            Start-Sleep -s 5
        }
    }
    
  4. 大量のメモリを消費している特定のアプリケーションを特定する場合は、それらのアプリケーションを別のシステムで停止または移動するか、メモリ使用量を制御することを検討してください。

  5. SQL Server が大量のメモリを消費している場合は、メモリ使用量を減らすために使用 sp_configure 'max server memory' することを検討してください。

CPU、メモリ、ディスクのデータ収集をパフォーマンス モニターする

この PowerShell スクリプトは、CPU、メモリ、ディスクに関するパフォーマンス モニター (PerfMon) データの収集を容易にします。 スクリプトは柔軟に設計されており、SQL Server の既定のインスタンスと名前付きインスタンスの両方をカスタマイズできます。

#Replace with your instance name if need to collect PerfMon data for named instance
$InstanceName = 'MSSQLSERVER'

# Replace with your desired location
$Location = "D:\PerfMonLogs"

# Function to create performance counter log
function Create-PerfCounterLog {
    param
    (
        [string]$InstanceName,
        [string]$Location
    )
    $counters = @(
        '\Memory\*',
        '\PhysicalDisk(*)\*',
        '\LogicalDisk(*)\*',
        '\Server\*',
        '\System\*',
        '\Process(*)\*',
        '\Processor(*)\*',
        '\SQLServer:Databases(*)\*',
        '"\SQLServer:Buffer Manager\*"',
        '"\SQLServer:SQL Statistics\*"',
        '"\SQLServer:Transactions\*"',
        '"\SQLServer:Database Mirroring\*"',
        '"\SQLServer:Latches\*"',
        '"\SQLServer:General Statistics\*"',
        '"\SQLServer:Availability Replica(*)\*"',
        '"\SQLServer:Plan Cache(*)\*"'
    )
    if ($InstanceName -eq 'MSSQLSERVER') {
        # This is for the default SQL Server instance
        $logmanCommand = "logman create counter MS_perf_log -f bin -c $counters"

    }
    else {
        # This is for a named SQL Server instance
        $InstanceName = "MSSQL`$$InstanceName"
        $counters = $counters -replace 'SQLServer', $InstanceName
        $logmanCommand = "logman create counter MS_perf_log -f bin -c $counters"

    }

    $Location = $Location + '\MS_perf_log.blg'
    $logmanCommand += " -si 00:00:01 -max 500 -o $Location"

    Start-Process -FilePath "cmd.exe" -ArgumentList "/c $logmanCommand" -Verb RunAs -Wait

}

# Function to start the collector
function Start-PerfCounterLog {
    Start-Process -FilePath "cmd.exe" -ArgumentList "/c logman start MS_perf_log" -Verb RunAs -Wait
}

# Function to stop and delete the collector
function Stop-Delete-PerfCounterLog {
    Start-Process -FilePath "cmd.exe" -ArgumentList "/c logman stop MS_perf_log" -Verb RunAs -Wait
    Start-Process -FilePath "cmd.exe" -ArgumentList "/c logman delete MS_perf_log" -Verb RunAs -Wait
}

# Create folder if not exists - update the file path as per your environment
$folderPath = $Location
if (-not (Test-Path $folderPath)) {
    New-Item -Path $folderPath -ItemType Directory
}

# Create performance counter log
Create-PerfCounterLog -InstanceName $InstanceName -Location $Location

# Start the collector
Start-PerfCounterLog

# If the event has occurred again and captured, then stop the collector
# Uncomment below line when you want to stop and delete the collector
# Stop-Delete-PerfCounterLog

SQL Server またはクラスター プロセスの大きなメモリ ダンプを削減または回避する

場合によっては、SQL Server プロセスで例外、アサート、スケジューラの問題などが発生することがあります。 このような場合、SQL Server は既定でプロセスを SQLDumper.exe トリガーし、間接的なメモリを持つミニダンプを生成します。 ただし、そのダンプの生成に時間がかかる場合は、SQL Server プロセスの応答が停止し、リース タイムアウトがトリガーされる可能性があります。 メモリ ダンプに時間がかかる一般的な原因は次のとおりです。

  • プロセスによる大きなメモリ使用量
  • ダンプが書き込まれる I/O サブシステムの速度が遅い
  • 既定の設定がミニ ダンプからフィルター処理または完全ダンプに変更されました

リース タイムアウトを回避するには、AG システムで次の手順を使用します。

  • セッション タイムアウトを増やす (たとえば、すべてのレプリカで 120 秒)
  • すべてのレプリカの自動フェールオーバーを手動フェールオーバーに変更する
  • LeaseTimeout を 60,000 ミリ秒 (60 秒) に増やし、HealthCheckTimeout を 90,000 ミリ秒 (90 秒) に変更します。

詳細については、「Sqldumper.exe ツールを使用して SQL Server でダンプ ファイルを生成する」を参照してください

仮想マシン (VM) の構成でオーバープロビジョニングを確認する

仮想マシンを使用している場合は、CPU とメモリ リソースをオーバープロビジョニングまたはオーバーコミットしていないことを確認します。 CPU またはメモリをオーバープロビジョニングすると、ゲスト OS がリソースを使い果たされ、前述の同じ問題 (CPU 使用率が高く、メモリが少ない) が表示される可能性があります。 多くの場合、ゲスト OS 内でコンテンツを表示している場合、コンピューティング リソースが不足している理由を説明するのは困難です。これは、仮想マシン自体の外部で発生しているためです。 リソースをオーバーコミットすると、処理が一時的に停止し、リース タイムアウトが発生する可能性があります。 オーバーコミットに対処する方法の詳細については、「 ESX/ESXi 仮想マシンのパフォーマンスに関する問題のトラブルシューティング (2001003)仮想化 - メモリのオーバーコミット」および VM 内でそれを検出する方法を参照してください。

仮想マシン (VM) の移行またはバックアップを確認する

Hyper-V、VMware、およびその他の VM ソリューションは、ホスト マシン間で VM を移動する機能を提供します (Hyper-V ライブ マイグレーションと VMware vMotion)。 ほとんどの場合、これらのテクノロジは、ほぼ瞬時の移行を提供します。 ただし、ネットワークまたはホスト マシンのボトルネックがある場合は、これらの移行が長引く可能性があるため、VM が中断状態になり、運用不能状態になる可能性があります。 これにより、SQL Server とクラスター プロセスの間でリース タイムアウトの有効期限が切れる可能性があります。 リース タイムアウトの問題に対処する前に、まず VM 移行に関する問題を解決してください。

仮想マシンバックアップ ソリューションは、VM のダウンタイムを引き起こす可能性もあります。 VM のバックアップがホスト OS で実行されている場合、または同様のメインテナントがホスト コンピューターで実行され、時間がかかる場合は、リース タイムアウトの問題が発生する可能性があります。 その理由は、クロックが刻まれている間、SQL Server プロセスとクラスター プロセスが中断された VM 上で相互に通信できないためです。 リース タイムアウトの問題を調べる前に、まず VM バックアップまたはその他のメインテナントによって発生する遅延に対処します。