Mirroring Üzerinde Troubleshooting

Published on 26 December 2013 by in Mirroring / Okunma: 1,935

0

Mirroring yapısı kurgulanırken veya instance üzerinde daha önceden varolan bir mirroring partner’ının tekrardan görevi devralması esnasında alınan çok spesifik bir hata vardır. Bu hata aşağıdaki gibidir;

The server network address “TCP://[server][domain address]:5022″ can not be reached or does not exist. Check the network address name and that the ports for the local and remote endpoints are operational. (Microsoft SQL Server, Error: 1418)

 

 

 

 

 

 

Error 1418, bize genel hatları ile problemin TCP kaynaklı olduğunu belirtmektedir. Fakat herzaman bu hata mesajı sadece port bazlı erişim problemlerinde ortaya çıkmaz. Bu yüzden troubleshooting yaparak problemin kaynağına inmemiz gerekir. İzlenmesi gereken adımlar aşağıdaki gibidir;

İlk olarak Windows Firewall’un SQL Server Port’unu block’lamadığından emin olmak gerekmektedir. Bunun için SQL Server’ınızın hangi TCP Portunu kullandığını bilmeniz gerekmektedir. Bunun iki yolu mevcuttur. İster GUI yardımı ile ister T-SQL kullanarak registry’yi okuyarak yapmak mümkündür.

SQL Server Configuration Manager ile Port’u Listelemek

1) SQL Server Configuration Manager‘a girilerek SQL Server Network Configuration‘a geçilir ve Protocols for Instanceİsmi ‘ne girilir.

 

 

 

 

 

 

 

 

2) Sağ bölümde ki TCP/IP‘nin Properties‘ine girilir.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T-SQL ile Portu Listelemek

SET NOCOUNT ON

DECLARE @PortNumber  VARCHAR(20)
DECLARE @RegistryKey VARCHAR(100)

IF CHARINDEX('\', @@SERVERNAME, 0) <> 0
 BEGIN
  SET @RegistryKey = 'SOFTWARE\MICROSOFT\Microsoft SQL Server\' + @@SERVICENAME + '\MSSQLServer\Supersocketnetlib\TCP'
 END
ELSE
 BEGIN
  SET @RegistryKey = 'SOFTWARE\MICROSOFT\MSSQLServer\MSSQLServer\Supersocketnetlib\TCP'
 END

EXEC master..xp_regread @rootkey='HKEY_LOCAL_MACHINE'
                      , @RegistryKey = @RegistryKey
					  , @value_name = 'Tcpport'
					  , @value = @PortNumber OUTPUT

SELECT 'Server Name: [' + @@SERVERNAME + '] - Port Number: [' + CONVERT(VARCHAR(10), @PortNumber) + ']' AS [Server - Port]

 

TCP Portumuzu öğrendikten sonra instance’ımızın kullandığı bu port’un Windows Firewall’da allow alıp almadığını kontrol etmemiz gerekmektedir. Kontrolü Windows Firewall’a geçerek yapabiliriz. Eğer Port’umuz için bir allow policy yaratılmamışsa bunu Windows Firewall’dan veya aşağıdaki gibi netsh tool’unu kullanarak ekleyebiliriz.

netsh firewall set portopening protocol = TCP port = 1433 name = SQLPort mode = ENABLE scope = SUBNET profile = CURRENT

 

Firewall’da port’umuza izi verdikten sonra SQL Server Service Account’larının kontrolünü yapmamız gerekmektedir. Mirroring kullanılabilmesi için service account’larının partner’lar arası Endpoint’ler aracılığı ile konuşabilmesi için connect yetkisinin olması gerekir. Bu kontrolü aşağıdaki gibi yapabiliriz;

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 , sys.endpoints EP
   WHERE SP.major_id = EP.endpoint_id
   ORDER BY Permission,grantor, grantee; 
GO

 

Eğer connect yetkisi Endpoint üzerinde yoksa aşağıdaki gibi yetkilendirme yapabiliriz;

USE master
GO

GRANT CONNECT ON ENDPOINT::Mirror TO MyUser;
GO

 

Connect yetkisinin atandığından emin olduktan sonra bütün instance’ların birbirleri arasında hem SQL Server instance portu hem de mirroring portu ile NETBIOS ismi ve IP bilgileri ile haberleşebildiklerinin kontolünün yapılması gerekmektedir. Bunun için ping, tracert kullanılabilir. Bağlantı kontrolünün yapılmasından sonra endpoint’lerin kontrol edilmesi gerekecektir. İlk olarak Endpoint’lerin yaratılmış olduğundan emin olmalıyız. Bunun için instance’lar da sys.database_mirroring_endpoints ile kontrol gerçekleştirilmelidir;

SELECT * FROM sys.database_mirroring_endpoints

 

Endpoint’ler üzerinde dikkat edilmesi gereken encryption’larının aynı olması ve state’lerinin started olduğudur. Eğer started konumda değillerse aşağıdaki gibi started konumuna getirilmelidir;

ALTER ENDPOINT Principal 
STATE = STARTED 
AS TCP (LISTENER_PORT = 5022)
FOR database_mirroring (ROLE = ALL);
GO

 

Bir diğer case ise endpoint’lerin yaratılamamış veya hatalı yaratılmış olmasıdır. Endpoint’lerin yaratılıp started konumuna çekilmesi için aşağıdaki kod kullanılabilir;

CREATE ENDPOINT [Principal] 
	STATE=STARTED
	AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
	FOR DATA_MIRRORING (ROLE = PARTNER, AUTHENTICATION = WINDOWS NEGOTIATE
, ENCRYPTION = REQUIRED ALGORITHM RC4)
GO

CREATE ENDPOINT [Mirror] 
	STATE=STARTED
	AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
	FOR DATA_MIRRORING (ROLE = PARTNER, AUTHENTICATION = WINDOWS NEGOTIATE
, ENCRYPTION = REQUIRED ALGORITHM RC4)
GO

CREATE ENDPOINT [Witness] 
	STATE=STARTED
	AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
	FOR DATA_MIRRORING (ROLE = WITNESS, AUTHENTICATION = WINDOWS NEGOTIATE
, ENCRYPTION = REQUIRED ALGORITHM RC4)
GO

 

Bu yazımda mirroring üzerinde nasıl troubleshooting yapabileceğimizi genel hatları ile anlatmaya çalıştım. Mirroring üzerinde troubleshooting ile alakalı bir sonraki makalemde birden fazla senaryo üzerinde daha detaylı olarak hata ayıklayarak mirroring problemleri ile karşılaşıldığında ne şekilde adımların izlenmesi gerektiği üzerinde duracağız.

 

Leave a Reply