Registered Server ile Birden Fazla Instance Üzerinde Aynı Script’i Çalıştırmak

19 Eki by NURULLAH ÇAKIR

Registered Server ile Birden Fazla Instance Üzerinde Aynı Script’i Çalıştırmak

Bazen tek bir script’in birden fazla Instance üzerinde çalıştırılması gerekebilir. Bunun için her instance’a tek tek bağlanmak bir çözümdür fakat Registered Server ile bu işi tek tıkta yapmak mümkündür.

 

Şimdi adım adım Registered Server nasıl oluşturulur ve bir script birden fazla instance üzerinde tek seferde nasıl çalıştırılır görelim.

 

Öncelikle SSMS üzerinde aşağıdaki gibi View’den Registered Servers’a tıklıyoruz.

 

 

Daha sonra aşağıdaki gibi Local Server Group üzerinden New Server Group’a tıklıyoruz.

 

 

Karşımıza çıkan ekranda, Group name kısmına oluşturacağımız server group için bir isim veriyoruz. Ben örnek olarak böyle bir şey yazdım. Sizde herhangi bir şey yazabilirsiniz. Group description kısmına da anlaşılır birşeyler yazabilirsiniz.

 

 

Daha sonra aşağıdaki gibi oluşturduğumuz server group’a sağ tıklayarak New Server Registration diyoruz.

 

 

 

Daha sonra Server name kısmına  aşağıdaki ekranda görüldüğü gibi bağlanacağımız instance’ın ismini yazıyoruz ve authentication kısmında da gerekli seçimi yapıyoruz. “SQL Server Kurulumu” isimli makalemde Authentication tiplerine değinmiştim.

Script’imi tek seferde çalıştırmak istediğim tüm sunucuları bu gruba yukardaki şekilde ekliyorum ve aşağıdaki şekilde new query diyerek script’imi tek seferde çalıştırmış oluyorum.

 

 

Örneğin Always On çalışan 2 sunucum var. 1 tanesi primary ve diğeri de secondary. Sunuculardan birini restart etmem gerekiyor. Restart etmeden önce restart edeceğim sunucudaki tüm ag(availability group)’leri diğer sunucuya failover etmek gerekiyor. “SQL Server Availability Group Failover İşlemi” isimli makalemde bu işlemi anlattım. Fakat failover etmeden önce bu iki sunucudaki tüm ag’lerin senkronizasyon durumlarını görmem gerekiyor. Bu işlemin kısa yolunu da “SQL Server Availability Group Veritabanları Senkronizasyon Durumları” isimli makalemde anlattım. Bu iki makaleyi de okursanız şu anda yapacağımız işlem kafanızda daha net oturacaktır. “SQL Server Availability Group Veritabanları Senkronizasyon Durumları” isimli makalemde aşağıdaki script’i kullandım.

SELECT
AG.name AS [AvailabilityGroupName],
dbcs.database_name AS [DatabaseName],
  CASE
	WHEN dbrs.synchronization_state =0 THEN 'Not synchronizing'
	WHEN dbrs.synchronization_state =1 THEN 'Synchronizing'
	WHEN dbrs.synchronization_state =2 THEN 'Synchronized'
	WHEN dbrs.synchronization_state =3 THEN 'Reverting'
	WHEN dbrs.synchronization_state =4 THEN 'Initializing'
  END AS AGState,
  ar.failover_mode_desc,
  ar.availability_mode_desc,
ISNULL(dbrs.is_suspended, 0) AS [IsSuspended]
FROM master.sys.availability_groups AS AG
LEFT OUTER JOIN master.sys.dm_hadr_availability_group_states as agstates
	ON AG.group_id = agstates.group_id
INNER JOIN master.sys.availability_replicas AS AR
	ON AG.group_id = AR.group_id
INNER JOIN master.sys.dm_hadr_availability_replica_states AS arstates
	ON AR.replica_id = arstates.replica_id AND arstates.is_local = 1
INNER JOIN master.sys.dm_hadr_database_replica_cluster_states AS dbcs
	ON arstates.replica_id = dbcs.replica_id
LEFT OUTER JOIN master.sys.dm_hadr_database_replica_states AS dbrs
	ON dbcs.replica_id = dbrs.replica_id AND dbcs.group_database_id = dbrs.group_database_id
	where dbcs.is_database_joined=1
ORDER BY AG.name ASC, dbcs.database_name

Bu script bir instance’taki tüm veritabanlarının senkronizasyon durumlarını veriyor. Peki 2 sunucumda toplamda 10 instance’ım olsa ve her birinin aktif ve pasifinde teker teker bu script’i çalıştırmam gerekse registered server nasıl olurdu?

 

Yukardaki script’i registered server ile çalıştırdığınız da karşınıza uzun bir ekran gelebilir. Script’i biraz modifiye ederek sadece sorun varsa sorunlu veritabanlarını getir deyip işimi kolaylaştırabiliriz. Aşağıda synchronized olmayan veya failover mode’u otomatik olmayan veya availability mode’u senkron olmayan veritabanlarının listesini veriyor. Eğer sonuç gelmiyorsa failover işlemine hazırsınız demektir.

SELECT
AG.name AS [AvailabilityGroupName],
dbcs.database_name AS [DatabaseName],
  CASE
	WHEN dbrs.synchronization_state =0 THEN 'Not synchronizing'
	WHEN dbrs.synchronization_state =1 THEN 'Synchronizing'
	WHEN dbrs.synchronization_state =2 THEN 'Synchronized'
	WHEN dbrs.synchronization_state =3 THEN 'Reverting'
	WHEN dbrs.synchronization_state =4 THEN 'Initializing'
  END AS AGState,
  ar.failover_mode_desc,
  ar.availability_mode_desc,
ISNULL(dbrs.is_suspended, 0) AS [IsSuspended]
FROM master.sys.availability_groups AS AG
LEFT OUTER JOIN master.sys.dm_hadr_availability_group_states as agstates
	ON AG.group_id = agstates.group_id
INNER JOIN master.sys.availability_replicas AS AR
	ON AG.group_id = AR.group_id
INNER JOIN master.sys.dm_hadr_availability_replica_states AS arstates
	ON AR.replica_id = arstates.replica_id AND arstates.is_local = 1
INNER JOIN master.sys.dm_hadr_database_replica_cluster_states AS dbcs
	ON arstates.replica_id = dbcs.replica_id
LEFT OUTER JOIN master.sys.dm_hadr_database_replica_states AS dbrs
	ON dbcs.replica_id = dbrs.replica_id AND dbcs.group_database_id = dbrs.group_database_id
	where (dbcs.is_database_joined=1) and (ar.failover_mode_desc<>'AUTOMATIC' or ar.availability_mode_desc<>'SYNCHRONOUS_COMMIT' or 
	dbrs.synchronization_state<>2)
ORDER BY AG.name ASC, dbcs.database_name

 

Loading

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir