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
atauTcpTestSucceeded : 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'