SQL Server Maintenance/Bakım İşlemleri(OLA HALLENGREN)

17 Kas by NURULLAH ÇAKIR

SQL Server Maintenance/Bakım İşlemleri(OLA HALLENGREN)

OLA HALLENGREN’in bakım script’ini çok başarılı ve pratik buluyorum. Bu yüzden başkalarına tavsiye etmekte bir zarar görmüyorum. Bu makalede OLA’nın bakım işlemleri için anlattığı script’inin nerden indirilebileceği ve kurulumunu anlatacağım.

 

Aşağıdaki linkteki MaintenanceSolution.sql dosyasını indirerek instance’ınız üzerinde script’i çalıştırıp oluşan job’ları schedule etmelisiniz. Ben DatabaseIntegrityCheck(bütün veritabanlarında dbcc checkdb çalıştırır) ve IndexOptimize(belirli kriterlere göre intance’taki bütün veritabanlarındaki index’leri rebuild ya da reorganize yapar)’ı kullanıyorum. Backup için profesyonel bir backup yazılımı kullanmanızı öneririm.

 http://www.veritabani.gen.tr/wp-content/uploads/2016/11/MaintenanceSolution.zip

 

Aşağıda ekranda sol tarafta görünen SQL Server Agent’ın altındaki Job Activity Monitor’e sağ tıklayarak View Job Activity demelisiniz. Hemen sağ tarafta hangi job’ların oluştuğunu görebilirsiniz. Ben Database Backup için oluşturduğu job’ları kullanmadığım için silmeyi tercih ediyorum.

 

 

Diğer job’lar içinse,

DatabaseIntegrityCheck – SYSTEM DATABASES – FULL job’ını her gün çalışacak şekilde aşağıdaki gibi konfigure ediyorum. Konfigure etmek için ilgili job’a sağ tıklayarak properties demelisiniz. Daha sonra schedule tab’ına gelip new demelisiniz. Karşınıza aşağıdaki gibi bir ekran gelir.

Name kısmında schedule’ınıza bir isim vermelisiniz. Ben günlük çalışacağı için daily ismini verdim. Schedule type Recurring kalmalı. Occurs kısmından Daily’i seçmelisiniz.  Occurs once at kısmından da bu job’ın her gün saat kaçta çalışacağını ayarlıyorsunuz. Ok diyerek job’ı schedule etmiş oluyoruz.

DatabaseIntegrityCheck – USER DATABASES – FULL job’ını haftada bir çalışacak şekilde schedule ediyorum. Çünkü veritabanlarım büyük. Hergün DBCC CHECKDB çalıştırsam bile zaten yetişmeyecektir. Sizin veritabanlarınız küçükse siz bu job’ı da her gün çalışacak şekilde set edebilirsiniz.

 

Haftada bir çalışacak şekilde schedule etmek için yukardaki ekrandan Occurs kısmından weekly’i seçmelisiniz.

 

INDEX OPTIMIZE – USER DATABASES job’ınıda haftada bir çalışacak şekilde schedule ediyorum.

 

Script’i oluşturduğunuzda master veritabanının altında CommandExecute, DatabaseBackup, DatabaseIntegrityCheck ve IndexOptimize stored procedure’lerinin oluştuğunu göreceksiniz.

 

 

Bu stored procedure’lere sağ tıklayarak ilgili parametlerini set edebilirsiniz.

 

Backup’ları bu script yardımıyla almanızı önermiyorum. Bu yüzden DatabaseBackup isimli stored procedure’ü silebilirsiniz.

 

DatabaseIntegritCheck isimli stored procedure üzerinde bir değişiklik yapmanıza gerek yok.

 

IndexOptimize isimli stored procedure’e sağ tıklayark Modify diyoruz ve aşağıdaki gibi fill factor’ü 90 olarak set ediyoruz ve F5’e basarak sp’yi güncelliyoruz.

 

@PageCountLevel parametresinin değerini arttırarak küçük index’ler için bu işlemi es geçebilirsiniz ama bence gerek yok. Küçük index’lerin rebuild işlemi zaten kısa sürer.

 

@FragmentationLevel1 ve @FragmentationLevel2 parametreleri hangi index’in reorganize hangi index’in rebuild olacağını belirlemek için kullanılıyor. Bizim örneğimizde 5 ve 30 değerleri verilmiş. Bu şu anlama geliyor. Fragmentation oranı 5 ile 30 arasındaysa reorganize yap,30’dan büyükse rebuild işlemini gerçekleştir.

 

@UpdateStatistics parametresini ALL olarak set ederseniz index ve kolon’a ait istatistikleri günceller. Bu şekilde kullanmanızı ya da burayı null bırakarak,

 

@OnlyModifiedStatistics’i ‘Y’ olarak set etmenizi öneririm. Bu şekilde sadece en son update sonrası bir değişiklik olmuşsa ilgili istatistiği güncelleyecektir.

 

 

Yine master veritabanın altında CommandLog isminde bir tabloda, job’larda yapılan bakım işlemlerinin doğru çalışıp çalışmadığı ile ilgili logları tutuyor.

Loading

5 Comments

  1. Merhaba,Bilgi ve paylaşım için teşekkürler emeğine sağlık.Fakat dosyaya ulaşmıyorum aktif midir? Değilse yeniden paylaşabilir misin?

  2. Merhaba Hocam,
    Bu ve buna benzer bir kaçtane denedim. Düzenleme yaptığını yazıyor. Ama düşüp düşmediğine bakmak için fragmante yüzdesini gösteren komutları çalıştırdığımda yine aynı fragmante değerini veriyor. Nerde yanlış yapıyorum acaba?
    fragmante değeri için bu komutları kullanıyorum.:
    SELECT
    OBJECT_NAME(object_id) AS tabloadi
    ,dbo.index_name(object_id, index_id) AS indexadi
    ,avg_fragmentation_in_percent
    FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL)
    WHERE avg_fragmentation_in_percent > 20
    AND index_type_desc IN(‘CLUSTERED INDEX’, ‘NONCLUSTERED INDEX’)
    ORDER BY avg_fragmentation_in_percent DESC

    1. Index boyutu küçükse fragmante oranı değişmeyebilir. Index boyutu küçükse dikkate almamak lazım.

      Birde aşağıdaki script’i deneyin. page count 1000’den küçükse dikkate almıyor.

      select ‘[‘+SCHEMA_NAME(t.schema_id)+’].[‘+OBJECT_NAME(i.object_id)+’]’ ‘table_name’, i.object_id, i.name, i.index_id,
      index_type_desc, i.fill_factor,alloc_unit_type_desc, avg_fragmentation_in_percent, ips.page_count*8 /1024 as Used_MB,
      i.is_unique | i.is_unique_constraint AS IsUnique
      from sys.dm_db_index_physical_stats(DB_ID(),null,null,null,null) ips
      INNER JOIN sys.indexes i ON i.object_id = ips.object_id and i.index_id = ips.index_id
      INNER JOIN sys.tables t ON i.object_id =t.object_id
      WHERE i.index_id>0 and OBJECTPROPERTY(i.object_id ,’IsMSShipped’) = 0 and avg_fragmentation_in_percent > 5 and ips.page_count > 1000
      order by avg_fragmentation_in_percent desc

Bir yanıt yazın

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