Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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, cariTcpTestSucceeded: TrueatauTcpTestSucceeded: 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'