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

Kesalahan ini terjadi ketika Anda mencoba menggabungkan database sekunder ke grup ketersediaan AlwaysOn tetapi tidak dapat tersambung ke titik akhir.

Tindakan pengguna

Catatan

Jalankan semua langkah berikut 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 AS tep
         INNER JOIN sys.server_principals AS 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.

  • Gunakan 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, telnet menampilkan layar kosong dengan kursor berkedip. Jika tidak, Anda 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 atau 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 telnet atau Test-NetConnection bekerja menggunakan ServerName, tetapi gagal menggunakan alamat IP, maka mungkin ada lebih dari satu titik akhir yang ditentukan pada server tersebut (instans SQL lain mungkin) yang dikonfigurasi untuk mendengarkan port tersebut. Meskipun status titik akhir pada instans yang dimaksud menunjukkan STARTED, 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 firewall dan perangkat lunak antivirus 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, Anda juga perlu memastikan Network Security Group (NSG) memungkinkan lalu lintas ke port titik akhir. Periksa firewall dan pengaturan 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 dapat mengkueri sys.dm_hadr_availability_replica_states DMV untuk last_connect_error_number yang mungkin membantu Anda mendiagnosis masalah gabungan. Bergantung pada replika mana yang mengalami masalah 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 AS rs
     INNER JOIN sys.availability_replicas AS r
         ON rs.replica_id = r.replica_id
WHERE rs.is_local = 1;

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

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

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

Jalankan kueri berikut pada replika utama lalu pada setiap replika sekunder yang gagal tersambung. Kueri ini 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 AS tep
      INNER JOIN sys.server_principals AS sp
          ON tep.principal_id = sp.principal_id
WHERE tep.type = 4;

Bandingkan endpoint_url dan port dari setiap kueri. Pastikan port dari endpoint_url cocok dengan port yang Anda tentukan untuk titik akhir pada setiap replika masing-masing.

Catatan

Jika Anda menggunakan alamat IP tertentu untuk titik akhir untuk didengarkan, alih-alih default listen all, Anda mungkin perlu 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 AS perm
      LEFT OUTER JOIN sys.server_principals AS prin
          ON perm.grantee_principal_id = prin.principal_id
      LEFT OUTER JOIN sys.tcp_endpoints AS 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 AS SP
      INNER JOIN sys.endpoints AS 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 baris perintah, cetak file HOSTS dengan menggunakan perintah ini:

type C:\WINDOWS\system32\drivers\etc\hosts
Get-Content 'C:\WINDOWS\system32\drivers\etc\hosts'

Periksa apakah ada Buat atau hapus alias server untuk digunakan oleh klien yang ditentukan pada replika

7. Pastikan SQL Server Anda menjalankan build terbaru

Periksa 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'