SQL Server Availability Group Veritabanları Senkronizasyon Durumları
Bazen Always ON kullandığınız sunuculardan birini restart etmeniz gerekebilir.
2 sunucunuz olduğunu ve sunucunuzun birinde 10 tane availability group’unuz olduğunu düşünelim. Restart etmeden önce bütün AG’leri diğer sunucuya failover etmeniz gerekir. “SQL Server Availability Group Failover İşlemi” isimli makalemde failover işlemini nasıl gerçekleştireceğinizi bulabilirsiniz. Ama veritabanlarının senkronizasyon durumlarını kontrol etmeden failover işlemini gerçekleştirmemelisiniz.
SQL Server üzerinde aşağıdaki gibi herhangi bir Availability Group’un senkronizasyon durumunu görebilirsiniz.
Dolayısıyla normal şartlar altında yukardaki gibi sunucu üzerindeki tüm Availability Group’ların sağlık durumlarına tek tek bakmanız gerekir. Bu işlem bir süre sonra sıkıcı hale gelebilir. Ve bu durumu kontrol etmek için bir script işinizi bir hayli kolaylaştıracaktır.
Aşağıdaki script yardımıyla SQL Server üzerinde bulunan AG’lerdeki veritabanlarını ve bu veritabanlarının senkronizasyon durumlarını bulabilirsiniz. Fakat bu script sadece mevcut sunucudaki primary ve secondary availability group’lara bakar. Kesin sonuç almak için bu script’i hem primary node’da hem de secondary node’da çalıştırmalısınız.
Eğer her ikisinde de bir problem yoksa failover’ı gerçekleştirebilirsiniz.
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