Mssql Server AG Failover Sonrasında Veritabanı Reverting Modun Takip Edilmesi

Bu makalede Alwayson yapısında Failover işlemi sonrasında Reverting modun da olan veritabanının belirli bir süreden sonra veritabanının Reverting modunda çıktığını mail ile bildiren bir job oluşturacağız.

İlk olarak veritabanı neden Reverting moduna girer buna değinelim. Alwayson yapılarında herhangi bir Failover işleminde veritabanımız Çok büyük ve aşırı derece transaction alan bir veritabanı ise failover işleminden sonra secondary sunucusuna failover olduktan sonra yeni primary sunucusunda ilgili veritabanındaki tüm ldf dosyasındaki log kayıtları data file’a(mdf/ndf) yazılma işlemi gerçekleşmektedir. Bu süre boyunca veritabanı reverting modunda kalmaktadır. İki sunucuda veritabanı data file’da bulunan veriler eşit boyuta geldikten sonra veritabanı Reverting modundan çıkmaktadır.

Basitleştirilmiş REDO işlemi akışı:

  1. Önceki PRIMARY’deki son LSN (Log Sequence Number) tespit edilir.
  2. Yeni PRIMARY’deki REDO thread’i başlatılır:
  • LDF’den log kayıtları okunur.
  • Page’lere fiziksel yazım yapılır.
  • REDO queue boyutu azaltılır.

Tüm kayıtlar yazılınca database “SYNCHRONIZED” veya “SYNCHRONIZING”olur.

Aşağıdaki komut sayesinde yeni primary ortamda oluşturulacak sql agent job’ımız. Job’ın schedule bilgisi ayarlanarak belirli aralıklarla veritabanının reverting modundan çıkıp çıkmadığı yazılmaktadır.

declare @durum varchar(50)
set @durum = (
select 
--DB_NAME(database_id) as DatabaseName
--,
synchronization_state_desc
--,database_state_desc
from sys.dm_hadr_database_replica_states
where is_local=1 and is_primary_replica=0
and DB_NAME(database_id)='X_DB_NAME')

If @durum NOT IN('SYNCHRONIZING ','SYNCHRONIZED')

exec msdb.dbo.sp_send_dbmail  
@profile_name = 'AlwaysOnLagProfile',
@recipients = 'veritabaniyonetimi@jandarma.gov.tr',
@Subject = 'Database Açılmadı!!!, 
@body = 'Database Henüz Açılmadı' , 
@body_format = 'HTML'

Yukarıdaki scriptte yapılması gereken veritabanı ve mail hesabının eklenmesi gerekmektedir.

Birden fazla veritabanı üzerinde bu işlemin yapılması isteniyorsa aşağıdaki script yardımıyla yapılabilir.

DECLARE @MailBody NVARCHAR(MAX);
DECLARE @TableRows NVARCHAR(MAX) = '';

-- Senkron olmayanları HTML tablosu satırı olarak birleştiriyoruz
SELECT @TableRows = @TableRows + 
    '<tr>' +
    '<td>' + DB_NAME(database_id) + '</td>' +
    '<td style="color:red;">' + synchronization_state_desc + '</td>' +
	'<td>' + @@SERVERNAME+ '</td>' +
    '</tr>'
FROM sys.dm_hadr_database_replica_states
WHERE DB_NAME(database_id) IN ('DB_1','DB_2','DB_3')
 AND synchronization_state_desc  NOT IN ('SYNCHRONIZED','SYNCHRONIZING ')
  AND is_local = 1; -- Sadece bu sunucudaki durumu kontrol et

-- Eğer senkron olmayan DB varsa mail at
IF LEN(@TableRows) > 0
BEGIN
    SET @MailBody = '<html><body>' +
                    '<h3>Kritik: Veritabanı Senkronizasyon Hatası</h3>' +
                    '<table border="1" cellpadding="5" cellspacing="0">' +
                    '<tr style="background-color:#f2f2f2;"><th>Veritabanı</th><th>Durum</th><th>SERVER NAME</th></tr>' +
                    @TableRows +               
                    '</table></body></html>';

    EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'AlwaysOnLagProfile23',--Profile name
        @recipients = 'veritabaniyonetimi@xxxx.gov.tr',
        @subject = 'ACİL: AlwaysOn Senkronizasyon Sorunu!',
        @body = @MailBody,
        @body_format = 'HTML';
  DECLARE @sql NVARCHAR(MAX) = '';
  -- SECONDARY SUNUCUSU DATABASELER NOT SYNCHRONIZING OLDUĞUNDA RESUME KOMUTUNUN ÇALIŞTIRILMASI
SELECT @sql +=
'ALTER DATABASE [' + db_name(database_id) + '] SET HADR RESUME;
'
FROM sys.dm_hadr_database_replica_states
WHERE is_suspended = 1
AND is_local = 1;

EXEC sp_executesql @sql;
END

Yukarıdaki komutun 10 saniyede bir çalışmasında sroun yoktur.

Başka makalede görüşmek dileğiyle..

“Ey insan! Seni yaratan, şekillendirip ölçülü yapan, dilediği bir biçimde seni oluşturan cömert Rabbine karşı seni ne aldattı?” (İnfitar-6-8)

Author: Yunus YÜCEL

Bir yanıt yazın

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