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.