Yedeği Alınmamış Veritabanlarının Mail ile Bildirilmesi

Yedekleme işlemi tüm veritabanı sistemlerinde kritik bir rol oynamaktadır. Yedeği alınmamış bir sistemin yaşayacağı olası bir sorun, sistemin tamamen çökmesine ya da ciddi oranda veri kaybına yol açabilir. Bu nedenle yedekleme işleminin düzenli olarak gerçekleştirilmesi gerekir. Yedekleme işlemlerini otomatik olarak gerçekleştirmek için Maintenance Plan kullanabilirsiniz.

 

Konuyla ilgili olarak Maintenance Plan Kullanarak Full Backup Almak , Maintenance Plan Kullanarak Differential Backup Almak , Maintenance Plan Kullanarak Log Backup Almak isimli makaleleri okuyabilirsiniz. Yedeklerin herhangi bir sebepten dolayı alınamaması halinde, sistemin sizi uyarmasını isteyebilirsiniz. Belirlemeniz gereken şey, yedeğin alınmama süresi hangi değere ulaştığında sistemin sizi uyaracağı bilgisi. Aynı şekilde, sistemin bu bilgileri ne kadar sıklıkla kontrol edip size geri bildirim yapmasını istediğinizi de belirlemeniz gerekiyor.

Bildirimleri mail ile yapmak için Database Mail konfigürasyonunun yapılmış olması gerekir. Bu işlemi gerçekleştirmek için Database Mail Konfigurasyonu isimli makaleyi okuyabilirsiniz. Son alınan yedekleri kontrol edip, belirli bir süreden beridir alınmayan veritabanlarının mail olarak gönderilmesi için aşağıdaki gibi bir job oluşturabiliriz. Bu örnekte 1 haftadır Full yedek alınmayan ya da 6 saattir Log yedek alınmayan veritabanlarının bildirimi yapılacaktır. Önce SQL Server Agent altında Jobs seçeneğini sağ tıklayarak New Job seçeneğini tıklayalım.

Yeni oluşturacağımız job’ın adını yazalım. Sonrasında Steps kısmını seçelim. 

Steps kısmında New seçeneğini tıklayarak yeni job adımı belirleyelim.

Job adımının adını yazalım. Yapacağımız işlem T-SQL tipinde. Command alanına aşağıdaki ifadeyi yazıp OK butonuna basalım. Buradaki Script, önce veritabanlarının son yedekleme tarihlerini geçici bir tabloya atmaktadır. Geçici tablodan yapacağı sorguda belirtilen sürede yedekleri alınmayan veritabanlarını belirleyip sp_send_dbmail Procedure’ü ile ilgili kişilere mail atmaktadır.

IF EXISTS 
(
SELECT d.name AS VeritabaniAdi,
	   d.recovery_model_desc AS RecoveryModel,
	   MAX(b.backup_start_date) AS SonFullBackup,
	   MAX(b2.backup_start_date) AS SonLogBackup
FROM master.sys.databases d
LEFT JOIN msdb.dbo.backupset b ON b.database_name=d.name AND b.type='D' AND (b.is_copy_only=0 OR b.user_name='NT AUTHORITY\SYSTEM') 
LEFT JOIN msdb.dbo.backupset b2 ON b2.database_name=d.name AND b2.type='L'
GROUP BY d.name,d.recovery_model_desc
)
BEGIN

SELECT d.name AS VeritabaniAdi,
	   d.recovery_model_desc AS RecoveryModel ,
	   MAX(b.backup_start_date) AS SonFullBackup,
	   MAX(b2.backup_start_date) AS SonLogBackup
INTO #tempbackup
FROM master.sys.databases d
LEFT JOIN msdb.dbo.backupset b ON b.database_name=d.name AND b.type='D' AND (b.is_copy_only=0 OR b.user_name='NT AUTHORITY\SYSTEM') 
LEFT JOIN msdb.dbo.backupset b2 ON b2.database_name=d.name AND b2.type='L'
GROUP BY d.name,d.recovery_model_desc

DECLARE @tableHTML  NVARCHAR(MAX) ;  
  
SET @tableHTML =  
    N'<H1>Yedeği Alınmayan Veritabanları</H1>' +  
    N'<table border="1">' +  
    N'<tr><th>Veritabanı Adı</th><th>Recovery Model</th><th>Son Full Yedek</th><th>Son Log Yedek</th>' +  
    N'<th>Açıklama</th></tr>' +  
    CAST ( (  SELECT 	   
       td=[VeritabaniAdi],''
      ,td=[RecoveryModel],''
      ,td=COALESCE(CONVERT(DATETIME,[SonFullBackup],13),''),''
	  ,td=COALESCE(CONVERT(DATETIME,[SonLogBackup],13),''),''
	  ,td=Aciklama,''
FROM
(SELECT [VeritabaniAdi]
      , [RecoveryModel]
      , [SonFullBackup]
	  , [SonLogBackup]
	  ,'Full Yedek 1 Haftadan Uzun Bir Süredir Alınmamaktadır' AS Aciklama
 FROM #tempbackup
 WHERE RecoveryModel='SIMPLE' AND ISNULL(SonFullBackup,'1900-01-01') < GETDATE()-7

 UNION ALL

 SELECT [VeritabaniAdi]
      ,[RecoveryModel]
      ,[SonFullBackup]
	  ,[SonLogBackup]
	  ,CASE
	   WHEN (ISNULL(SonFullBackup,'1900-01-01') < GETDATE()-7 AND DATEDIFF(HOUR,ISNULL(SonLogBackup,'1900-01-01'),GETDATE())<6)
	        THEN 'Full Yedek 1 Haftadan Uzun Bir Süredir Alınmamaktadır'
	   WHEN (ISNULL(SonFullBackup,'1900-01-01') > GETDATE()-7 AND DATEDIFF(HOUR,ISNULL(SonLogBackup,'1900-01-01'),GETDATE())>6)
	        THEN 'Log Yedek 6 Saatten Uzun Bir Süredir Alınmamaktadır'
	   WHEN (ISNULL(SonFullBackup,'1900-01-01') < GETDATE()-7 AND DATEDIFF(HOUR,ISNULL(SonLogBackup,'1900-01-01'),GETDATE())>6)
	        THEN 'Hem Full Yedek 1 Haftadan Uzun Bir Süredir Alınmamaktadır, Hem Log Yedek 6 Saatten Uzun Bir Süredir Alınmamaktadır' END
 FROM [#tempbackup]
 WHERE RecoveryModel='FULL' AND 
 (ISNULL(SonFullBackup,'1900-01-01') < GETDATE()-7 OR DATEDIFF(HOUR,ISNULL(SonLogBackup,'1900-01-01'),GETDATE())>6)
 ) A
 ORDER BY VeritabaniAdi
              FOR XML PATH('tr'), TYPE   
    ) AS NVARCHAR(MAX) ) +  
    N'</table>' ;  
  
EXEC msdb.dbo.sp_send_dbmail 
    @recipients='abc@gmail.com', 
    @profile_name= DenemeProfile,
    @subject = 'Yedeği Alınmayan Veritabanları',  
    @body = @tableHTML,  
    @body_format = 'HTML' ; 

DROP TABLE #tempbackup

END

Job’ın çalışma periyodunu belirlemek için Schedules sekmesini tıklayalım. New seçeneği ile yeni bir zaman planlaması oluşturalım. Schedule Type kısmına Recurring diyerek tekrar eden zamanlamayı oluşturalım. Günlük olarak düzenli çalışması için Daily seçeneğini, her 2 saatte bir çalışması için Occurs Every 2 Hours seçeneğini seçelim. OK butonuna basarak işlemi bitirelim. New Jobs seçeneğine geri döndüğünde tekrar OK butonuna basarak job tanımlama işlemini bitiriyoruz.

Bir cevap yazın

Your email address will not be published. Required fields are marked *.

*
*

Lütfen captcha kodunu giriniz *

Lütfen Resimdeki Kodu Boşluğa Giriniz.
You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>