共用方式為


MSSQLSERVER_19407

適用於:SQL Server

詳細資料

屬性
產品名稱 SQL Server
事件識別碼 19407
事件來源 MSSQLSERVER
元件 SQLEngine
符號名稱 HADR_AG_LEASE_EXPIRED
訊息文字 可用性群組 『%.*ls』 與 Windows Server 故障轉移叢集之間的租用已過期。 SQL Server 執行個體與 Windows Server 容錯移轉叢集之間發生連線問題。 若要判斷可用性群組是否正確容錯移轉,請檢查 Windows Server 容錯移轉叢集中的對應可用性群組資源。

說明

當 SQL Server 與 Windows Server 容錯移轉叢集之間失去通訊時,SQL Server 錯誤記錄檔中會出現錯誤 19407。 通常會有更正動作 - 容錯移轉至另一個 AlwaysOn 節點。

租用是 SQL Server 與 Windows Server 容錯移轉叢集 (WSFC) 程序 (特別是 RHS.EXE 程序) 之間進行通訊機制,以時間為基礎。 這兩個程序會定期彼此通訊,以確保另一個程序正在執行和回應。 此通訊會使用 Windows 事件對象 進行,並確保不需要知道 WSFC,就不會發生 AG 資源的故障轉移。 如果其中一個程序未根據預先定義的租用期間回應租用通訊,則會發生租用逾時。 如需詳細資訊,請參閱 AlwaysOn 可用性群組的租用、叢集和健康情況檢查逾時機制和指導方針。 另請參閱 運作方式:SQL Server AlwaysOn 租用逾時

原因

由於 Windows 事件是輕量同步處理物件,因此影響它們的外部因素相對較少。 可能導致租用逾時的典型問題涉及整個系統的問題。 以下是可能導致租用到期並導致重新啟動或故障轉移的可能性清單:

使用者動作

針對高 CPU 問題進行疑難解答

  1. 開啟 [工作管理員]。

  2. 移至 [效能] 索引標籤,查看 CPU 是否接近或達到 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) 進程可能會分頁顯示。如果進程分頁到磁碟,它不會主動執行,而且租用逾時可能會到達可用記憶體的時間,而進程虛擬位元組則會分頁回實體記憶體。 低虛擬記憶體可能是因為應用程式、驅動程式或操作系統耗用系統上的整個記憶體所造成。 使用下列方法來針對此問題進行疑難解答:

  1. 檢查應用程式或系統事件記錄檔中的錯誤,例如 Your system is low on virtual memory。 如果您登入伺服器,甚至可能會在畫面上看到此錯誤。

  2. 開啟 [工作管理員],選取 [效能 -> 記憶體] 以檢查是否耗用接近 100% 的記憶體。 使用 [詳細數據] 索引標籤來識別可能為最大記憶體取用者的任何應用程式。

  3. 您也可以使用 效能監視器 並監視這些計數器一段時間:

    • Process\Working Set - 檢查個別進程記憶體使用量
    • 記憶體\可用的 MBytes - 檢查系統上的整體記憶體使用量

    您可以使用下列 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 停機。 如果在主機 OS 進行 VM 備份,或在需要很長時間的主機機器上執行任何類似的維護,可能會導致租用逾時問題。 原因是當時鐘刻度時,SQL Server 和叢集進程無法在暫停的 VM 上彼此通訊。 在您檢查租用逾時問題之前,請先解決 VM 備份或其他維護所造成的任何延遲。