Bagikan melalui


MSSQLSERVER_35250

Berlaku untuk: SQL Server

Detail

Atribut Nilai
Nama Produk SQL Server
ID Peristiwa 35250
Sumber Kejadian MSSQLSERVER
Komponen SQLEngine
Nama Simbolis HADR_PRIMARYNOTACTIVE
Teks Pesan Koneksi ke replika utama tidak aktif. Perintah tidak dapat diproses.

Penjelasan

Pesan ini terjadi saat mencoba menggabungkan database sekunder ke grup ketersediaan AlwaysOn. Ketidakmampuan untuk menyambungkan ke titik akhir biasanya dapat menyebabkan kesalahan ini.

Tindakan Pengguna

Opsi 1: Jalankan langkah-langkah langsung dalam buku catatan melalui Azure Data Studio

Pelajari cara menginstal Azure Data Studio

Opsi 2: Ikuti langkah secara manual**

Catatan

Semua langkah berikut harus dijalankan pada replika Utama dan replika Sekunder yang bermasalah.

1. Pastikan titik akhir dibuat dan dimulai.

  • Jalankan kueri berikut untuk menemukan titik akhir

    SELECT
      tep.name as EndPointName,
      sp.name As CreatedBy,
      tep.type_desc,
      tep.state_desc,
      tep.port
    FROM
      sys.tcp_endpoints tep
    INNER JOIN sys.server_principals sp ON tep.principal_id = sp.principal_id
    WHERE tep.type = 4
    

    Peringatan

    Berhati-hatilah saat menjalankan perintah berikutnya karena dapat menyebabkan waktu henti sesaat untuk replika.

  • Anda dapat menggunakan perintah ini untuk memulai ulang titik akhir yang Anda temukan

    ALTER ENDPOINT hadr_endpoint STATE = STOPPED
    ALTER ENDPOINT hadr_endpoint STATE = STARTED
    

2. Periksa apakah Anda dapat tersambung ke titik akhir

  • Gunakan telnet atau Test-NetConnection untuk memvalidasi konektivitas. Jika Titik Akhir mendengarkan dan koneksi berhasil, maka telnet akan menampilkan layar kosong dengan kursor berkedip. Jika tidak, Anda akan menerima kesalahan koneksi dari telnet. Untuk keluar dari sambungan telnet yang berhasil, tekan CTRL+]. Jika Anda menggunakan Test-NetConnection , cari TcpTestSucceeded : True atau TcpTestSucceeded : False.

    telnet ServerName <port_number>
    telnet IP_Address <port_number>
    
    Test-NetConnection -ComputerName <ServerName> -Port <port_number>
    Test-NetConnection -ComputerName <IP_address> -Port <port_number>
    

Masalah DNS:

  • Jika telnet/Test-NetConnection berhasil ke alamat IP tetapi gagal ke ServerName, kemungkinan ada masalah resolusi DNS atau nama. Lihat Memeriksa masalah resolusi nama

Beberapa proses mendengarkan pada port yang sama

  • Jika koneksi telnet/Test-NetConnection berfungsi menggunakan ServerName tetapi gagal menggunakan alamat IP, maka mungkin ada lebih dari satu titik akhir yang ditentukan pada server tersebut (mungkin instans SQL lain) yang dikonfigurasi untuk mendengarkan port tersebut. Meskipun status titik akhir pada instans yang dimaksud menunjukkan "DIMULAI" instans lain mungkin benar-benar memiliki pengikatan port dan mencegah instans yang benar mendengarkan dan membuat koneksi TCP. Untuk menemukan proses pemilik port 5022 misalnya, jalankan perintah ini:

    $port = "5022"
    Get-Process -Id (Get-NetTCPConnection -LocalPort $port).OwningProcess |Select-Object Name, ProductVersion, Path, Id
    

Titik akhir yang diblokir (firewall, anti-virus)

  • Jika telnet atau Test-NetConnection gagal tersambung, cari Perangkat lunak Firewall dan/atau Anti-virus yang mungkin memblokir port titik akhir yang dimaksud. Periksa pengaturan firewall untuk melihat apakah memungkinkan komunikasi port titik akhir antara instans server yang menghosting replika utama dan replika sekunder (port 5022 secara default). Jika Anda menjalankan SQL Server di Azure VM, selain itu Anda harus memastikan Network Security Group (NSG) memungkinkan lalu lintas ke port titik akhir. Periksa pengaturan firewall (dan NSG, untuk Azure VM) untuk melihat apakah memungkinkan komunikasi port titik akhir antara instans server yang menghosting replika utama dan replika sekunder (port 5022 secara default)

    Jalankan skrip PowerShell berikut untuk memeriksa aturan lalu lintas masuk yang dinonaktifkan

    Get-NetFirewallRule -Action Block -Enabled True -Direction Inbound |Format-Table
    
  • Ambil output netstat atau Get-NetTCPConnection dan verifikasi statusnya adalah LISTENING atau ESTABLISHED pada IP:Port untuk titik akhir yang ditentukan

    netstat -a
    
    Get-NetTCPConnection -LocalPort <port_number>
    
  • Anda juga dapat menemukan proses pemilik port: jalankan perintah seperti ini (misalnya menggunakan port 5022)

    $port = "5022"
    Get-Process -Id (Get-NetTCPConnection -LocalPort $port).OwningProcess |Select-Object Name, ProductVersion, Path, Id
    

3. Periksa kesalahan dalam sistem

  • Anda bisa mengkueri sys.dm_hadr_availability_replica_states untuk last_connect_error_number yang dapat membantu Anda mendiagnosis masalah gabungan. Bergantung pada replika mana yang mengalami kesulitan berkomunikasi, Anda dapat mengkueri replika utama dan sekunder:

    select
      r.replica_server_name,
      r.endpoint_url,
      rs.connected_state_desc,
      rs.last_connect_error_description,
      rs.last_connect_error_number,
      rs.last_connect_error_timestamp
    from
      sys.dm_hadr_availability_replica_states rs
      join sys.availability_replicas r on rs.replica_id = r.replica_id
    where
      rs.is_local = 1
    

    Jika sekunder tidak dapat berkomunikasi dengan server DNS, misalnya, atau jika endpoint_url replika dikonfigurasi dengan salah saat membuat grup ketersediaan, Anda mungkin mendapatkan hasil berikut dalam last_connect_error_description:

    DNS Lookup failed with error '11001(No such host is known)'

4. Pastikan titik akhir dikonfigurasi untuk IP/port yang benar tempat AG didefinisikan

  • Jalankan kueri berikut pada Primer lalu setiap replika Sekunder yang gagal tersambung. Ini akan membantu Anda menemukan URL dan port titik akhir

    select endpoint_url from sys.availability_replicas
    
  • Jalankan kueri berikut untuk menemukan titik akhir dan port

    SELECT
      tep.name as EndPointName,
      sp.name As CreatedBy,
      tep.type_desc,
      tep.state_desc,
      tep.port
    FROM
      sys.tcp_endpoints tep
      INNER JOIN sys.server_principals sp ON tep.principal_id = sp.principal_id
    WHERE
      tep.type = 4
    
  • Bandingkan endpoint_url dan port dari setiap kueri dan pastikan port dari endpoint_url cocok dengan port yang ditentukan untuk titik akhir pada setiap replika masing-masing

    Catatan

    Jika Anda menggunakan alamat IP tertentu untuk titik akhir untuk mendengarkan, versus default "dengarkan semua", maka Anda mungkin harus menentukan URL yang menggunakan alamat IP tertentu daripada FQDN.

5. Periksa apakah akun layanan jaringan memiliki izin CONNECT ke titik akhir

  • Jalankan kueri berikut untuk mencantumkan akun yang memiliki izin sambungkan ke titik akhir pada server yang dimaksud, dan untuk memperlihatkan izin yang ditetapkan ke setiap titik akhir yang relevan.

    SELECT 
      perm.class_desc,
      prin.name,
      perm.permission_name,
      perm.state_desc,
      prin.type_desc as PrincipalType,
      prin.is_disabled
    FROM sys.server_permissions perm
      LEFT JOIN sys.server_principals prin ON perm.grantee_principal_id = prin.principal_id
      LEFT JOIN sys.tcp_endpoints tep ON perm.major_id = tep.endpoint_id
    WHERE 
      perm.class_desc = 'ENDPOINT'
      AND perm.permission_name = 'CONNECT'
      AND tep.type = 4;
    
    SELECT 
      ep.name, 
      sp.state,
      CONVERT(nvarchar(38), suser_name(sp.grantor_principal_id)) AS grantor,
      sp.TYPE AS permission,
      CONVERT(nvarchar(46),suser_name(sp.grantee_principal_id)) AS grantee
    FROM sys.server_permissions SP 
      INNER JOIN sys.endpoints ep  ON sp.major_id = ep.endpoint_id
    AND EP.type = 4
    ORDER BY Permission,grantor, grantee;   
    

6. Periksa masalah resolusi nama

  • Validasi resolusi DNS dengan menggunakan nslookup atau Resolve-DnsName pada alamat IP dan nama:

    nslookup <IP_Address>
    nslookup <ServerName>
    
    Resolve-DnsName  -Name <ServerName>
    Resolve-DnsName  -Name <IP_address>
    
  • Apakah nama diselesaikan ke alamat IP yang benar? Apakah alamat IP diselesaikan ke nama yang benar?

  • Periksa entri file HOSTS lokal pada setiap simpul yang mungkin menunjuk ke server yang salah. Dari Prompt Perintah cetak file HOSTS menggunakan ini:

    type C:\WINDOWS\system32\drivers\etc\hosts
    
    Get-Content 'C:\WINDOWS\system32\drivers\etc\hosts'
    
  • Periksa apakah ada Alias Server untuk Digunakan oleh Klien yang ditentukan pada replika

7. Pastikan SQL Server Anda menjalankan build terbaru (sebaiknya build terbaru)

  • Perbarui versi SQL Server untuk melindungi dari masalah seperti KB3213703.

Untuk informasi selengkapnya, lihat Membuat Grup Ketersediaan Gagal Dengan Kesalahan 35250 'Gagal bergabung dengan database'