SQL Server

SQL Server Üzerinde Error Loglar ile Çalışmak

SQL Server’da sistemin nasıl çalıştığını kontrol etmek için bakacağımız belkide ilk yer SQL Server Error Log’larıdır. SQL Server ve Agent Error Log’ları sayesinde sistemde herhangi bir ciddi problem olup olmadığını kontrol etmemiz mümkündür.

Bugünkü yazımda SQL Server Error Log’ların sayısının nasıl arttırılacağını, yeni bir error log dosyasının nasıl create edilebileceğini, kısacası SQL Server’da Error Log’lar ile çalışırken hangi best practice’leri uygulamamız gerektiğinden bahsedeceğim.

Bu makalemde şu ana başlıklar üzerinde duracağız.

·         SQL Server’da Error Log’lar ile Çalışmak

o   Database Engine Error Log’ları

§  Database Engine Error Log’ları Hakkında Genel Bilgilendirme

§  Database Engine Error Log Recycle’ı Elle Tetiklemek (master.sys.sp_cycle_errorlog)

§  Database Engine Error Log’larının Sayısını Arttırmak

§  Database Engine Error Log’ları Okumak İçin Özelleştirilmiş Log Arama SP’si

§  Başarılı Backup İşlemi Log’larının Error Log’a Yazılmasını Engellemek

o   SQL Server Agent Error Log’ları

§  SQL Server Agent Error Log’ları Hakkında Genel Bilgilendirme

§  SQL Server Egent Error Log Recycle’ı Elle Tetiklemek (msdb.sys.sp_cycle_agent_errorlog)

o   Error Log Recycle İşlemini SQL Job ile Tetiklemek

SQL Server ve Agent Error Log’lar eğer değişiklik yapılmadıysa şu tarz bir folder’da bulunur.

C:Program FilesMicrosoft SQL ServerMSSQL10.S10ENTMSSQLLog

Bu folder’da bulunan ERRORLOG isimli dosyalar Database Engine’in Error Log’ları, SQLAGENT şeklinde başlayan dosyalar ise SQL Server Agent’ın Error Log’larıdır.

Database Engine Error Log’ları

SQL Server Database Engine için default olarak 1 adet aktif (ERRORLOG) ve 6 adet arşiv (ERRORLOG.1’den ERRORLOG.6’ya kadar olan dosyalar) olmak üzere 7 adet error log dosyası bulunmaktadır. Her SQL Server servisi restart olduğunda aktif olan log ERRORLOG.1 haline dönüşür ve ondan sonraki error log’lar da bir sıra kayar. Ve sondaki error log’da silinir. (Bu işleme recycle denilmektedir.)

Recycle işlemini şu şekilde gösterebiliriz.

image001

Recycle işleminin servis restart’ı ile olduğunu söylemiştik. Bu işlemi elle tetiklemekte mümkündür. Bir sonraki bölümde bu işlemin nasıl yapılabileceğine değiniyor olacağım.

Database Engine Error Log Recycle’ı Elle Tetiklemek (master.sys.sp_cycle_errorlog)

SQL Server Database Engine servisi restart olduğunda yeni bir error log dosyası oluşur ve en sondaki error log dosyası silinir demiştik. Bu işleme de Recycle dendiğini belirtmiştik. Detayları bir önceki bölümde inceleyebilirsiniz.

SQL Server servisinin uzun süre ayakta olduğu ya da bir hatadan dolayı çok fazla error basıldığı durumda aktif ErrorLog dosyası şişmeye başlar ve büyük bir boyuta erişir. Böyle bir durumda bu errorlog dosyasının içeriğine bakmak oldukça güç hale gelir.

İşte böyle bir durumda 0’dan yeni bir error log dosyası oluşturmak için servisi restart etmektense recycle işlemini elle tetiklememiz mümkündür.

Aşağıdaki SP execute edildiğinde aktif olan errorlog dosyası ERRORLOG.1 haline dönüşecek ve yeni bir error log dosyası 0’dan oluşturulacaktır.

EXEC master.sys.sp_cycle_errorlog;

Database Engine Error Log’larının Sayısını Arttırmak

Bir önceki bölümde anlattığım gibi servis restart olduğunda ya da recycle işlemi elle tetiklendiği zaman yeni bir error log dosyası oluşturulur ve en sondaki error log dosyasıda silinir. Yani default olarak 1 aktif 6 da arşiv olmak üzere 7 error log dosyasına izin verilir.

Error Log’lar sistemi analiz etmek için etkin yöntemlerden biri olduğu için eski error log dosyalarının hemen silinmesini istemeyebiliriz. Bu durumda saklanacak error log dosyası parametresini değiştirmemiz gerekir.

Bu değişikliği Management Studio üzerinden şu şekilde yapabiliriz.

Management >> SQL Server Logs yazısına sağ tıklayıp configure ekranını açıyoruz.

image002

Gelen ekranda kaç adet error log’un arşiv olarak saklanmasını istediğimizi belirtip OK’e basıyoruz.

image003

Database Engine Error Log’ları Okumak İçin Özelleştirilmiş Log Arama SP’si

SQL Server Log’larını okurken filter özelliği kullanabilmekteyiz. Ama bu filter özelliği sadece like yani “içinde geçen” şeklinde çalışmaktadır. Ve ne yazık ki “not likeyani “içinde geçmeyen” şeklinde bir filter verememekteyiz. Peki ne zaman ihtiyacımız olur not like aramasına. Örneğin başarılı backup işlemleri loglandığında ve çok sık aralıklarla TLog backup’ı aldığımızda log dosyası çok fazla sayıda backup bilgisi ile dolmaktadır. Ve biz bu backup loglarını exclude ederek raporu görüntülemek isteyebiliriz.

İşte bu amaçla yazmış olduğum SP’yi anlattığım makaleme buradan erişebilirsiniz.

Başarılı Backup İşlemi Log’larının Error Log’a Yazılmasını Engellemek

SQL Server da başarılı olan her backup işlemi bildiğiniz gibi SQL Server Log’a yazılmaktadır. TLog backup kullanımınız var ise ve çok sıklıkla backup alıyorsanız SQL Server Log a çok fazla sayıda kayıt yazılacaktır ve bu da log’un okunmasını zorlaştıracaktır. Şu linkten erişebileceğiniz makalemde başarılı backup işlemlerinin SQL Server Log’a yazılmasını nasıl engelleyeceğimizi görebilirsiniz.

 

SQL Server Agent Error Log’ları

SQL Server Agent Error Log’ları da Database Engine Error Log’ların da olduğu gibi servis restart olduğunda recycle olur. Tabi burada bahsettiğimiz servis database engine servisi değil SQL Server Agent servisidir.

Bir diğer farklılık ise Database Engine log’ları default olarak 1+6 log file’dan oluşmakta ve bu rakamda değişiklik yapılabilmekteyken SQL Agent Error Log’ları 1+9 log file’dan oluşmakta ve bu rakamlarda değişiklik yapılamamaktadır. Aktif olan SQL Agent Error Log’un dosya adı SQLAGENT.OUT, arşiv olan log file’ların adları ise SQLAGENT.x şeklindedir.

SQL Server Agent Error Log Recycle’ı Elle Tetiklemek (master.sys.sp_cycle_agent_errorlog)

SQL Server Agent Error Log recycle işlemini hem SSMS’ten hem de TSQL ile yapmamız mümkündür.

Management Studio’dan recycle işlemini yapmak için SQL Server Agent >> Error Logs yazısına sağ tıklayıp açılan ekrandan Recycle yazısını tıklamamız gerekir.

image004

Aynı işlemi TSQL ile şu şekilde yapabiliriz.

EXEC msdb.dbo.sp_cycle_agent_errorlog;

 

Error Log Recycle İşlemini SQL Job ile Tetiklemek

Error Log’ları servisler restart olduğunda recycle olur aynı zamanda elle tetiklememizde mümkündür diye belirtmiştik.

Şimdi bu işlemi otomatize etmek için bir SQL Server Job hazırlayacağız ve her ayın başında çalışan bu job vasıtasıyla hem database engine hem SQL Server Agent log’larını otomatik olarak recycle edeceğiz.

Bu şekilde otomatik olarak error log’ların boyutlarını kontrol altında tutmuş olacağız.

Bahsi geçen Job’ın script’ine aşağıda erişebilirsiniz.

USE [msdb]

GO

BEGIN TRANSACTION

DECLARE @ReturnCode INT

SELECT @ReturnCode = 0

IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N’Database Maintenance’ AND category_class=1)

BEGIN

EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N’JOB’, @type=N’LOCAL’, @name=N’Database Maintenance’

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

 

END

 

DECLARE @jobId BINARY(16)

EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N’Error Log Recycle,

            @enabled=1,

            @notify_level_eventlog=0,

            @notify_level_email=0,

            @notify_level_netsend=0,

            @notify_level_page=0,

            @delete_level=0,

            @description=N’No description available.’,

            @category_name=N’Database Maintenance’,

            @owner_login_name=N’sa, @job_id = @jobId OUTPUT

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

 

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N’Database Engine Log Recycle,

            @step_id=1,

            @cmdexec_success_code=0,

            @on_success_action=3,

            @on_success_step_id=0,

            @on_fail_action=2,

            @on_fail_step_id=0,

            @retry_attempts=0,

            @retry_interval=0,

            @os_run_priority=0, @subsystem=N’TSQL’,

            @command=N’EXEC master.sys.sp_cycle_errorlog;’,

            @database_name=N’master,

            @flags=0

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

 

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N’SQL Server Agent Log Recycle,

            @step_id=2,

            @cmdexec_success_code=0,

            @on_success_action=1,

            @on_success_step_id=0,

            @on_fail_action=2,

            @on_fail_step_id=0,

            @retry_attempts=0,

            @retry_interval=0,

            @os_run_priority=0, @subsystem=N’TSQL’,

            @command=N’EXEC msdb.dbo.sp_cycle_agent_errorlog;’,

            @database_name=N’msdb,

            @flags=0

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N’Every Month,

            @enabled=1,

            @freq_type=16,

            @freq_interval=1,

            @freq_subday_type=1,

            @freq_subday_interval=0,

            @freq_relative_interval=0,

            @freq_recurrence_factor=1,

            @active_start_date=20110419,

            @active_end_date=99991231,

            @active_start_time=0,

            @active_end_time=235959,

            @schedule_uid=N’f631ead7-612f-4536-bd65-15aa1f75179a’

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)’

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

COMMIT TRANSACTION

GOTO EndSave

QuitWithRollback:

    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION

EndSave:

 

GO

 

 

SQL Server’da sistemin nasıl çalıştığını kontrol etmek için Error Log’ların analizi oldukça fazla kullanılan yöntemlerden biridir. Bu yüzden best practice’lere göre ayarlanmış SQL Server ve Agent Error Log kullanımı ileride oluşabilecek sıkıntıların önüne geçmek için çok önemlidir.

İlgili Makaleler

Bir yanıt yazın

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

Başa dön tuşu