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 

7 Eylül 2018 Cuma

SQL Server Partial Backup Nedir

SQL Server' da 2005 ile gelen bu özellik büyük veritabanı sistemlerinde backup alma süresini kısaltmak için kullanılmaktadır. En kısa ifade ile bunu kullanmadaki amacınız SQL Server içerisinde read only data dosyanız varsa ve bu file'in backup işlemine dahil olmasını istemiyorsanız kullanabileceğiniz bir özellik.

Çalışma mantığı açısından aynı full backup gibi çalışırken tek farkı full backup bütün daya dosylarını bak dosyasına dahil ederken Partial Backup read only dışında kalan bütün dosyları bak dosyası içine yazar.

Sytanx'ı aşağıdaki gibidir:

BACKUP DATABASE AdventureWorks READ_WRITE_FILEGROUPS
TO DISK = N'f:\AdventureWorks.bak' WITH COMPRESSION




4 Eylül 2018 Salı

OLE DB provider "SQLNCLI11" for linked server "" returned message "Query timeout expired". HATASI

OLE DB provider "SQLNCLI11" for linked server "" returned message "Query timeout expired" hatasını alıyorsanız SQL Server tarafından kullanılan linked server'in query timeout süresi çalışan işlem için yeterli olmadığı anlamına gelmektedir.

Bu sorunu aşmak için 2 farklı yol mevcut bir tanesi işlemin çalıştığı sunucu üzerinde insatance seviyesinde timeout süresini uzatabilir yada kullanılan linked server'ın query timeout değerini değiştirebilirsiniz.

Instance seviyesinde süreyi uzatmak için:

sp_configure 'remote query timeout',100 -- saniye cinsinden
go
reconfigure


Linked Server üzerinden değiştirmek için ise kullanılan linked Server'a sağ tıklayarak properties'ne geldikten sonra açılan pencerede sol tarafta Server Options geldikten sonra query timeout değerini yeterli olacak bir değere getirdikten sonra bu hatayı aşmış olacaksınız.


5 Haziran 2017 Pazartesi

Sistem Databas'leri olmadan SQL Server'ı Başlatma ve Sistem Db'lerini Kurtarma



SQL Server'ın çalışır durumda olması için sistem db dosyalarının zarar görmemiş, çalışır durumda olması gerekir. Peki bu dosyaları bir şekilde kaybettiysek ne olur? Bu durumda SQL Server database engine başlatamazsınız. SQL Server'ı çalışırı duruma getirebilmek için sistem db dosyalarını Rebuil etme olarak bilinen bir yöntemi kullanarak sistem db dosyalarını yeniden oluşturacağız. Bunun için SQL Server Setup'ına ihtiyacımız var. (Doğru versiyonu kullandığınızdan emin olun.)

Adımlar:

  • CMD'yi yönetici olarak çalıştırın.
  • Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=instance_Adı /SQLSYSADMINACCOUNTS=kullanıcıAdi /SAPWD= sifre
    • Yukarıdaki kodu setup'un içinde bulunduğu disk dizinine gelerek yapıştırın. Instance'ın adı ve domanin'de admin yetkisine sahip kullanıcı bilgilerini yazın ve bekleyin.
İşlem tamamlandıktan sonra tanımlı olan klasör içerisinde tüm sistem db dosyaları tanımlanmış olacaktır. Fakat dikkat edilmesi gereken nokta SQL kullanıcıları, job gibi sistem db'leri içerisinde saklanan meta dataların bu durumda hepsini kaybetmiş olacaksınız. Sistemi çalışır duruma geldikten sonra back-up'lardan tekrardan bunları da kurtarabilir yada benzer olduğunu düşündüğünüz farklı bir database varsa servisleri durdurarak file'ları kopyalayabilirsiniz. Konu ile ilgili yakında küçük bir demo da paylaşacağım. Faydalı olması dileğiyle.




23 Mayıs 2017 Salı

SQL SERVER'da Login failed for user '' Hatası



Login failed for user '' hatasının alıyorsanız aşağıda bahsedilen maddeleri adım adım kontrol ederseniz sorunu çözmüş olacaksınız.


  1. Girmeye çalıştığınız login üzerine gelip sağ tıklayarak Propertis'i tıkladıktan sonra açılan pencerenin sol bölümündeki listeden Status'u tıklayarak buradan GRANT ve ENABLED seçeneklerinin işaretli olduğundan emin olun.
  2. SQL Server Instance'a sağ tıklayarak buradan properties'e gelerek sol taraftan security'i seçin.Bu ekran da Sql server and windows authentication mode'un seçilidiği olduğundan emin olun. Fakat bu işlemin aktif olması için SQL Server servislerini restartlamanız gerekmektedir. Bunun içinde Instance'a tekrardan sağ tıklayarak restart diyebilirsiniz.
  3. Bağlanmaya çalıştığınız Login bilgilerinin doğruluğunu kontrol edin gerekirse şifresini değiştirerek tekrardan deneyin.
Umarım faydalı olmuştur. 









18 Mayıs 2017 Perşembe

Exception deserializing the package SSIS Hatası


SSIS de paketi çalıştırdığınız da Exception deserializing the package hatası alıyorsanız. Denemeniz gereken ilk yöntem paket'in ismini değiştirmek. Paket isimlerinde ( [ ] ) köşeli parantez kullanmaktan kaçının. Bundan dolayı paket derlenirken hata alınmaktadır. Sadece harfler ve Türkçe karakter kullanmaya özen gösterin. Eğer sorununuz devam etmesi durumunda aşağıdaki adımları izleyin.
  1. Data Tools dan çıkın.
  2. TaskManagerden kontrol ederek tamamen kapandığından emin olun. Eğer DTSDebugHost isimli çalışan işlemler görüyorsanız bunları da sonlandırın.
  3. Projenizin klasörüne gelerek buradan ISPAC dosyasını bularak silin.
  4. Ardından Data tool'u açın ve proje'ye sağ tıklayarak rebuil'i seçin ve tekrardan projenin build edilmesini bekleyin. 
   Bu adımlardan sonra sorun ortadan kalkacaktır. Umarım faydalı olmuştur.

27 Nisan 2017 Perşembe

SQL Server da Tabloların Şemasını Değiştirme



SQL Server da nadirde olsa tabloların şemasının değiştirme durumu ile karşılaşılabiliniyor. Bunun aslında çok basit bir T-SQL kodu bulunmakta.

Alter Schema HedefSema Transfer KaynakSema.TabloAd;

Eğer bir şema içerisindeki bütün tabloları farklı bir şemaya aktarmak istiyorsanız SQL Server'ın system Sp'leri içinde bulunan Sp_MsForEachTable bütün kullanıcı tabloların içinde dönerek işlem yapmanızı sağlar. Bu kodun kullanımı ise aşağıdaki gibidir.

exec SP_MsForEachTable  'Alter Schema HedefSchema Transfer ?'

SP_MsForEachTable Sp'nin kullanımı sonucunda db de bulunan bütün kullanıcı tabloların şemaları transfer Hedef olarak belirlediğiniz şemaya aktarılacaktır.