18 Temmuz 2019 Perşembe

There is insufficient system memory in resource pool 'internal' to run this query.

"There is insufficient system memory in resource pool 'internal' to run this query." ilgili hatayı alıyorsanız SQL Server'ın kullandığı memory miktarının yetersiz kaldığı anlamına gelmektedir.
  • Bunun için çalışan sorguların optimize edilmesi.
  • SQL Server'ın aktif kullandığı memory değerlerinin değiştirilmesi

  • Yada sunucunuzdaki RAM'i arttırmanız gerekmektedir.

16 Temmuz 2019 Salı

FILESTREAM DATA NEDİR?

Uygulamanızda unstructured yani yapısal olmayan veriler kullanılıyorsa bunların daha kolay yönetilmesi ve performanslı olması için SQL Server 2008 ile gelen bir özelliktir. SQL Server'da insanların aklına genelde veri denildiği zaman ilk gelen şey metin'ler olmaktadır. Fakat şunu unutmamak gerekir ki veri dediğimiz şey sadece klavyeden tuşlayarak girdiğimiz şeyler değil. Özellikle günümüzü düşünürsek resim, video, doküman gibi şeyleri de veritabanı dosyaları içerisinde saklamak isteyebiliriz. Bu noktada FileStream bizim işimizi kolaylaştıracak özelliklerden biri. FileStream ile dosyaları yapısal ve yapısal olmayan veriler arasında transactional bütünlüğü bozmadan kullanmamıza olanak verecektir.

Peki 2008 den önce bu tarz dataları SQL Server'da tutamıyor muyduk?  Varbinary data tipi aslında bu tarz objeleri veritabanı objelerinin içerisinde saklayabilmek için var. SQL Server'da FileStream özelliğini aktif etmeden de Varbinary data tipini kullanarak bu tarz nesneleri saklayabilirsiniz ki zaten SQL Server default kurulumda Bu özellik disable durumda gelmektedir. Eğer siz kullanacaksınız bunu aktif etmeniz gerekir. İşin aslında güzel yanı Microsft'un Filestream özelliği için yeni bir data tipi geliştirmek yerine mevcutta zaten olan varbinary data tipini kullanarak fakat bu data tipi üzerinde farklı bir çalışma yapısı geliştirerek FileStream özelliğini kurgulamıştır.

Peki ne durumda bu özelliği aktif edip kullanmamız gerekir?

  • Microsoft, Paul Randal ve bu alandaki diğer gurular depolamak istediğiniz dosyaların boyutu eğer 1 mb 'dan fazlaysa bu durumda bunu veritabanı dosyalarında saklamak yerine FileStream özelliğinin kullanılması gerektiği söylenmektedir.
  • Saklanacak olan dosyalarda okuma performansını arttırmak için.
  • Veritabanı dosyalarında öngürülemeyen ve çok hızlı büyümelerin önüne geçmek için kullanılabilinecek bir özelliktir. Bu büyümeler data file dışında olacağı için .mdf, .ndf gibi veritabanı dosyalarının yönetimi kolaylaşacaktır.
Filesystem hangi konularda Filestream yerini tutamaz.

Filesystem ile kurumunuzun bütün belgelerini klasörler içerisinde düzenli olarak ve üstelik veritabanınız şişmeden saklayabilirsiniz. Bu anlamda harika bir yöntem. Fakat depolama ve performans anlamında oldukça tatminkar bir çözüm olsada yol biraz ileride ikiye ayrılıyor ve bir seçim yapmanız gerekiyor. Yukarıda da bahsettiğim gibi ilişkisel veritabanın özelliklerinden olan transaction yapısını belgeler üzerinde de kullanmak isterseniz yada point in time ile nokta atışı belli bir zaman dönmek isterseniz belgeler ne olacak. Çünkü Filesytem kullandığınızda burada Transaction log'larnız olmayacak. Haliyle dosyalarınız için COMMIT yada ROLLBACK de YOK.

Backup durumunu ele alırsak hem veritabanızın hemde FileSystem'in ayrı ayrı backup'larını almak zorundasınız ki Filesystem ile point in time olarak restore edebilmeniz çok da mümkün değil. Dosyalarınız veritabanın da tuttuğunuz zaman sadece SQL Backup'ı ile yedeklemek mümkün. Tabi bu durum her ne kadar kulağa çok hoş gelsede veritabanı boyutu arttığı için Backup ve restore süresi uzayacaktır.

Nihai olarak ihtiyaçlarınız ve beklentileriniz doğrultusunda doğru kullanım değişecektir. Mevcut durum ve beklentilerin uçtan uca değerlendirilerek en optimum seçenek tercih edilmelidir.














11 Temmuz 2019 Perşembe

SQL Server AlwayOn Nedir ?

Microsoft'un SQL Server'ın 2012 ile birlikte duyurduğu daha önceden kullanılan Log Shipping ve Mirroring'e alternatif olacak günümüzde büyük sistemlerin beklentilerini karşılayabilecek modernize edilmiş ve geliştirilmiş bir high availability and disaster recovery çözümüdür.

AlwaysOn konu başlığını, çalışma yapısı olarak iki başlığa kırabiliriz.

  • AlwaysOn Failover Clustering Instance
  • AlwaysOn Availability Groups

AlwaysOn Failover Clustering Instance

Aslında başlıktan da anlaşıldığı üzere Instance seviyesinde bir HA sunduğu anlaşılmaktadır. Bu teknolojide cluster içerisinde bulunan tüm node'lar shared storage erişebilmelidir. Aşağıdaki resimde de tek cluster içerisinde bulunan iki farklı node'un shared disk üzerinde çlaıştığını gösteren topolojide de AlwaysOn Failover Clustering Instance'ın çalışma yapısını özetler niteliktedir.



AlwaysOn FCI SQL Server Standart ve Enterprise Edition olmak üzere her ikisinde de desteklenmektedir. Fakat standart edition'u kullanılıyorsa cluster içerisinde sadece iki node kullanımına izin verilmektedir.

AlwaysOn Availability Groups

Alwayson AG için shared disk ihtiyaç bulunmamaktadır. FCI Instance seviyesinde bir HA sağlarken AG belirlenen database'ler için bunu sağlar. Aslında bu noktada FCI'ya göre daha esnek davranabilirsiniz. Instance içerisinde bulunan fakat HA&DR dahil olmasına gerek olmayan veritabanlarını bu yöntemle dışarıda bırakabilirsiniz.

FCI'da node'lar aktif/aktif olarak çalışmadığı için bütün yük primary tarafta olur. Fakat AG kullanacaksınız Backup ve read işlemler secondry üzerinden ilertleterek primary taraftaki yükü azaltabilme imkanı sağlar.

Fakat unutulamaması gerekir ki Bu yöntem db seviyesinde bir HA çözümü sunduğu için Instance seviyesindeki objeleri manuel olarak Secondary tarafa taşınması gerekmektedir.(örn  job, login,linked server...)








































26 Şubat 2019 Salı

SQL Server'da LOGON Trigger Nedir? Ne işe Yarar?

Logon Trigger'lar SQL Server de güvenlik ve kontrol amaçlı kullanılabilen objelerdir. Eğer SQL Server Instance'a bağlananlar üzerinde kısıtlar uygulamak isterseniz tam olarak ihtiyacınızı Logon trigger ile karşılayabilirsiniz.

Şimdi bu konunun demosunu küçük bir senorya ile inceleyelim.

Örneğin kullanıcılarınızın veritabanına dışarıdan bilinmeyen bir bilgisayardan bağlanmasını engellemek istiyorsunuz. Yani sadece şirket bilgisayarından login olmasına izin vereceksiniz. Bu durumda kullanıcılarınız SQL Server login ile sysadmin(Full Yetki) yetkisine sahip olsa bile başka bir bilgisayardan bağlanma izni olmayacak. 

Bunun için öncelikle küçük bir hazırlık çalışması yapmanız gerekecek. Şirket bilgisayarların isimlerini SQL Server'da bir tablo oluşturarak tutmanız gerekir. Ben aşağıdaki örnekte HostName adında bir tablo oluşturarak bilgisayar isimlerini burada tuttum.

Logon Trigger'ı prod ortamına almadan önce kesinlikle test ortamınızda denemenizi tavsiye ediyorum. Kodda gözden kaçan bir mantık hatası olursa bütün kullanıcıların SQL Server'la olan bağlantısını kesersiniz. Tabi bu durumu aşmanın da yolları mevcut ama genede sonradan uğraşmamak adına dikkat etmekte fayda var.

Fakat bu kurgulanan senaryo çok sağlıklı değil. Çünkü her bilgisayar değişimi olduğunda ilgili tabloya tanımlama yapılması gerekmektedir. Ayrıca kişi başka bir bilgisayarın adını tabloda olan kayıtlardan biriyle eşleşecek şekilde değiştirirse de SQL Server'a erişim sağlama ihtimalide var. Daha güvenli ve jenerik bir yapı kurulması faydalı olacaktır. 

Faydalı olması dileklerimle...



create TRIGGER pcName
ON ALL SERVER WITH EXECUTE AS 'sa'

FOR LOGON

AS

BEGIN

       if  exists (select * from server_b.dbo.HostName
       where name = (SELECT HOST_NAME()))

       ----Oluşturduğum HostName tablosunda eğer girilmeye çalışan bilgisayar ismi yoksa trigger tetiklenip rollback blogunun içerisine girecek ve kullanıcı bağlantı hatası almış olacak.
       begin

              COMMIT

       end

       else

              ROLLBACK

END



-- Triggeri silmek için bu kodu kullanabilirsiniz.
--DROP TRIGGER [triggerAdi] ON ALL SERVER