Bagikan melalui


MSSQLSERVER_19407

Berlaku untuk: SQL Server

Detail

Atribut Nilai
Nama Produk SQL Server
ID Peristiwa 19407
Sumber Kejadian MSSQLSERVER
Komponen SQLEngine
Nama Simbolis HADR_AG_LEASE_EXPIRED
Teks Pesan Sewa antara grup ketersediaan '%.*ls' dan Kluster Failover Windows Server telah kedaluwarsa. Masalah konektivitas terjadi antara instans SQL Server dan Windows Server Failover Cluster. Untuk menentukan apakah grup ketersediaan melakukan failover dengan benar, periksa sumber daya grup ketersediaan yang terkait di Windows Server Failover Cluster.

Penjelasan

Kesalahan 19407 timbul di log kesalahan SQL Server ketika komunikasi antara SQL Server dan Windows Server Failover Cluster putus. Biasanya terjadi tindakan korektif - failover ke simpul AlwaysOn yang lain.

Sewa adalah mekanisme komunikasi berbasis waktu yang terjadi antara SQL Server dan proses Windows Server Failover Cluster (WSFC), khususnya proses RHS.EXE. Kedua proses saling berkomunikasi secara berkala untuk memastikan proses lain berjalan dan merespons. Komunikasi ini terjadi menggunakan objek Peristiwa Windows dan memastikan bahwa failover sumber daya AG tidak terjadi tanpa sepengetahuan WSFC. Jika salah satu proses tidak merespons komunikasi sewa berdasarkan periode sewa yang telah ditentukan, terjadi habis waktu sewa. Untuk informasi terperinci, lihat Mekanika dan panduan batas waktu sewa, kluster, dan pemeriksaan kesehatan untuk grup ketersediaan AlwaysOn. Lihat juga Cara Kerjanya: Batas Waktu Sewa AlwaysOn SQL Server

Penyebab

Karena Peristiwa Windows adalah objek sinkronisasi ringan, ada sejumlah kecil faktor eksternal yang memengaruhinya secara negatif. Masalah umum yang dapat menyebabkan batas waktu sewa melibatkan masalah di seluruh sistem. Berikut adalah daftar kemungkinan yang dapat menyebabkan kedaluwarsa sewa dan menyebabkan hidupkan ulang atau failover:

  • Penggunaan CPU tinggi pada sistem (mendekati 100%).

  • Kondisi di luar memori - memori virtual yang rendah dan/atau salah satu proses sedang di-page out.

  • WSFC akan offline karena kehilangan kuorum. Untuk memecahkan masalah kehilangan kuorum, lihat Mengonfigurasi dan mengelola kuorum, dan Pemulihan Bencana WSFC melalui Kuorum Paksa (SQL Server).

  • Pembatasan VM memengaruhi performa dan menyebabkan kedaluwarsa sewa.

  • Proses SQL Server tidak merespons saat menghasilkan cadangan memori besar. Untuk informasi selengkapnya tentang pembuatan cadangan tumpukan, lihat Dampak pembuatan cadangan. Pembuatan cadangan tumpukan dapat terjadi karena beberapa alasan berikut:

    • Penjadwal nonyielding
    • Batas waktu kait
    • Penjadwal yang di-deadlock
    • Kebuntuan yang belum teratasi

Tindakan pengguna

Memecahkan masalah CPU tinggi

  1. Buka Pengelola Tugas.

  2. Buka tab Performa dan lihat apakah CPU mendekati atau pada pemanfaatan 100%.

  3. Masuk ke tab Proses dan urutkan proses menurut kolom CPU dalam urutan menurut, dengan memilih pada kolom CPU .

  4. Identifikasi proses yang menggunakan sebagian besar CPU, dan kerjakan pemahaman dan penyelesaian alasannya menyebabkan CPU tinggi.

  5. Jika prosesnya adalah SQL Server, lihat Memecahkan masalah penggunaan CPU tinggi di SQL Server.

  6. Anda dapat menggunakan skrip PowerShell berikut untuk memeriksa pemanfaatan CPU pada sistem.

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

Pemecahan masalah memori rendah

Jika ada kemunculan memori virtual atau fisik rendah pada sistem, proses SQL Server atau layanan host sumber daya kluster (RHS.exe) dapat di-page out. Jika proses di-page out ke disk, proses tidak dijalankan secara aktif, dan batas waktu sewa mungkin tercapai oleh memori waktu yang tersedia dan byte virtual proses di-paged kembali ke memori fisik. Memori virtual yang rendah dapat disebabkan oleh aplikasi, driver, atau OS yang mengonsumsi seluruh memori pada sistem. Gunakan metode berikut untuk memecahkan masalah ini:

  1. Periksa log peristiwa Aplikasi atau Sistem untuk kesalahan seperti Your system is low on virtual memory. Anda bahkan mungkin melihat kesalahan ini ditampilkan di layar jika Anda masuk ke server.

  2. Buka Pengelola tugas, pilih Performa -> Memori untuk memeriksa apakah hampir 100% persen memori sedang digunakan. Gunakan tab Detail untuk mengidentifikasi aplikasi apa pun yang mungkin merupakan konsumen memori terbesar.

  3. Anda dapat menggunakan Monitor Performa dan memantau penghitung ini dari waktu ke waktu:

    • Process\Working Set - untuk memeriksa penggunaan memori proses individual
    • Memory\Available MBytes - untuk memeriksa penggunaan memori secara keseluruhan pada sistem

    Anda dapat menggunakan skrip PowerShell berikut untuk mengidentifikasi penggunaan memori keseluruhan di semua proses dan memori yang tersedia pada sistem. Jika Anda ingin mendapatkan masing-masing proses penggunaan memori, ubah "\Process(_Total)\Working Set" menjadi "\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. Jika Anda mengidentifikasi aplikasi tertentu yang mengonsumsi memori dalam jumlah besar, pertimbangkan untuk menghentikan atau memindahkan aplikasi tersebut pada sistem lain atau mengontrol penggunaan memorinya.

  5. Jika SQL Server mengkonsumsi memori dalam jumlah besar, Anda mungkin mempertimbangkan untuk menggunakan sp_configure 'max server memory' untuk menurunkan penggunaan memorinya.

Pengumpulan data Monitor Performa untuk CPU, memori, dan disk

Skrip PowerShell ini memfasilitasi pengumpulan data monitor performa (PerfMon) sehubungan dengan CPU, memori, dan disk. Skrip dirancang agar fleksibel, memungkinkan penyesuaian untuk instans default dan bernama 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

Mengurangi atau menghindari cadangan memori besar dari SQL Server atau proses kluster

Dalam beberapa kasus, proses SQL Server mungkin mengalami pengecualian, pernyataan, masalah penjadwal, dan sebagainya. Dalam kasus tersebut, SQL Server memicu SQLDumper.exe proses secara default, untuk menghasilkan minidump dengan memori tidak langsung. Namun, jika pembuatan cadangan tersebut membutuhkan waktu lama, proses SQL Server berhenti merespons, yang mungkin memicu batas waktu sewa. Penyebab umum untuk cadangan memori memakan waktu lama meliputi:

  • penggunaan memori besar berdasarkan proses
  • subsistem I/O tempat pencadangan ditulis lambat
  • pengaturan default diubah dari cadangan mini menjadi cadangan yang difilter atau penuh

Untuk menghindari batas waktu sewa, gunakan langkah-langkah berikut pada sistem AG:

  • Meningkatkan batas waktu sesi, misalnya, 120 detik untuk semua replika
  • Mengubah failover otomatis semua replika menjadi failover manual
  • Tingkatkan LeaseTimeout menjadi 60.000 md (60 detik) dan ubah HealthCheckTimeout menjadi 90.000 md (90 detik)

Untuk informasi selengkapnya, lihat Menggunakan alat Sqldumper.exe untuk menghasilkan file cadangan di SQL Server.

Periksa konfigurasi komputer virtual (VM) untuk provisi berlebih

Jika Anda menggunakan komputer virtual, pastikan Anda tidak melakukan provisi berlebih atau mengatasi CPU dan sumber daya memori. Provisi CPU atau memori yang berlebihan dapat menyebabkan OS tamu kehabisan sumber daya dan menunjukkan masalah yang sama yang dijelaskan sebelumnya - CPU tinggi dan memori rendah. Sering kali jika Anda melihat hal-hal di dalam OS tamu, menjelaskan mengapa Anda kehabisan sumber daya komputasi sulit, karena hal-hal terjadi di luar komputer virtual itu sendiri. Mengatasi sumber daya dapat menyebabkan penghentian sementara pemrosesan, yang kemungkinan menyebabkan batas waktu sewa. Untuk informasi selengkapnya tentang cara mengatasi overcommitting, lihat Pemecahan masalah performa komputer virtual ESX/ESXi (2001003) dan Virtualisasi – Mengatasi memori dan cara mendeteksinya dalam VM.

Periksa migrasi atau pencadangan komputer virtual (VM)

Hyper-V, VMware, dan solusi VM lainnya menawarkan kemampuan untuk memindahkan VM antara komputer host (Hyper-V Live Migration dan VMware vMotion). Dalam kebanyakan kasus, teknologi ini menyediakan migrasi yang hampir seketika. Namun, jika ada penyempitan jaringan atau komputer host, migrasi ini dapat diperpanjang, yang menyebabkan VM berada dalam status ditangguhkan dan tidak beroperasi. Ini dapat menyebabkan kedaluwarsa batas waktu sewa antara SQL Server dan proses kluster. Atasi masalah dengan migrasi VM terlebih dahulu sebelum Anda mengatasi masalah batas waktu sewa.

Solusi pencadangan komputer virtual juga dapat menyebabkan waktu henti untuk VM. Jika cadangan VM diambil di OS host, atau pemeliharaan serupa dilakukan di komputer host yang membutuhkan waktu lama, mereka dapat menyebabkan masalah batas waktu sewa. Alasannya adalah bahwa saat jam berdetak, proses SQL Server dan kluster tidak dapat berkomunikasi satu sama lain pada VM yang ditangguhkan. Atasi keterlambatan yang disebabkan oleh pencadangan VM atau pemeliharaan lainnya terlebih dahulu, sebelum Anda memeriksa masalah batas waktu sewa.