Recent comments

None


İçerik Ara











Yasal Uyarı
Bu sitede sunulan tüm bilgi ve dökümanlar Turgay Sahtiyan tarafından yazılmaktadır. Yazıların kaynak göstermek şartıyla kullanılması serbesttir.

© Copyright 2009-2013
Takvim
<<  Haziran 2017  >>
PaSaÇaPeCuCuPa
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789
Keywords

Bugün sizlere Glenn Berry ve Brent Ozar tarafından yazılmış 2 ayrı health check script bloğundan bahsedeceğim. Bu scriptler ile instance ve database’lerinizi best practice’ler ışığında hızlı bir şekilde health check’ten geçirebilir ve alınması gereken aksiyonları belirleyebilirsiniz.

[more]

Glenn Berry’s SQL Server 2008 Diagnostic Information Queries

Glenn Berry tarafından yazılan bu script bloğu ile sunucu ve database’ler için bir bakışta öğrenilmek istenen bilgileri sorgulayabilirsiniz. Sorgulardan bazıları SQL Server 2008 R2+SP1 gerektirmekte. Query’lerin bir çoğu SQL Server 2012’de de çalışmakta. Ama gene de SQL Server 2012 versiyonunu da aşağıdaki linkten erişebilirsiniz.

http://sqlserverperformance.wordpress.com/2011/12/28/sql-server-2008-diagnostic-information-queries-december-2011/

Brent Ozar’s SQL Server Takeover Script

Brent Ozar tarafından yazılan bu script bloğuyla da aynen Glenn Berry’nin yazdığı scriptler gibi sunucu ve database’ler için health check yapabilirsiniz. En büyük farkı ise tek bir SP’yi çalıştırarak sonucu liste halinde alabilirsiniz. Bu şekilde zamandan tasarruf yapabilirsiniz. Tabii şunu unutmamak lazım; scriptlerin tamamı tek bir seferde çalıştırıldığı için özellikle çok fazla database ve object içeren server’larda tamamlanması biraz zaman alabilir.

http://www.brentozar.com/blitz/

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Küresel çapta faaliyet gösteren, en büyük SQL Server topluluğu SQL Pass’ın (Professional Association for SQL Server) Türkiye Şubesi olarak çalışmaya başlayan SQL Server Öncüleri, Ankara'daki tanıtım toplantısına sizleri de davet ediyor.

SQL Server ve etrafındaki teknolojilere odaklanan, Türkiye’de BT sektöründe konu hakkında çalışanlar arası etkileşimi arttırma hedefinde olan SQL Server Öncüleri 21 Ekim’de İstanbul’da gerçekleştirdiği lansmanın ardından ikinci etkinliğini 1 Şubat’ta Microsoft Ankara ofisinde gerçekleştiriyor.

SQL Server konusunda çalışan BT çalışanlarının ve yazılım geliştiricilerinin hedeflendiği teknik içerikli SQL Server Öncüleri Ankara Lansmanı etkinliğinde sizleri de aramızda görmekten mutluluk duyarız.

Ajanda detayları ve kayıt linki için;

http://www.sqlserveronculeri.com/3/Notice/299/sql-server-onculeri-istanbul

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Bugün sizlere Robert Pearl ve Glenn Berry tarafından yazılmış bir script paylaşacağım. Bu script ile son SQL Server restart’ından beri kullanılan CPU’nun veritabanlarına göre detaylandırılmış raporunu alacağız.

[more]

Script sys.dm_exec_query_stats DMV’si üzerinden çalışıyor. Bildiğiniz gibi bu DMV, sunucu üzerinde çalıştırılan bütün sorguların çalışma istatistiklerini (CPU,IO kullanım vs.) tutar.

SQL Server son restart’ından itibaren kullanılan CPU’nun raporunu alacağımızı söylemiştim. Çünkü bildiğiniz gibi DMV’ler SQL Server restart’ında sıfırlanmakta.

Script şu şekilde;

WITH DB_CPU_Stats
AS
(SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName], SUM(total_worker_time) AS [CPU_Time_Ms]
 FROM sys.dm_exec_query_stats AS qs
 CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID] 
              FROM sys.dm_exec_plan_attributes(qs.plan_handle)
              WHERE attribute = N'dbid') AS F_DB
 GROUP BY DatabaseID)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num],
       DatabaseName, [CPU_Time_Ms]/1000 as [CPU_Time_Sec], 
       CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPUPercent]
FROM DB_CPU_Stats
WHERE DatabaseID > 4 -- system databases
AND DatabaseID <> 32767 -- ResourceDB
ORDER BY row_num OPTION (RECOMPILE);

 

Benim instance’ımda çıkan sonuç ise şu şekilde;

image

Raporu bize verdiği sonuç şu; Son SQL Server restart’ından itibaren CPU üzerinde geçirilen zamanın ne kadarı hangi DB tarafından geçirilmiş ve bu zamanların toplama oranı nedir?

Yukarıdaki resim için konuşursak; CPU üzerinde geçirilen zamanın %68’i ilk sıradaki DB için geçirilmiş.

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server’da 900 byte’ı geçen varchar kolonlar üzerine Index tanımlaması yapılabilmektedir. Fakat böyle bir index’e 900 byte’dan daha büyük bir kayıt insert’i ya da update’i yapıldığında hata alınacaktır. Bu yüzden Index Key toplamı 900 byte’dan büyük olan Index create etmemeye özen göstermekte fayda vardır.

[more]

Normal şartlarda char gibi sabit boyutlu bir key ya da key’ler üzerine tanımlanan index 900 byte’ı geçiyorsa tanımlama esnasında hata alır.

create table tbl_Char900Byte(a char(400), b char(400), c char(400))
GO
create clustered index IX_1 on tbl_Char900Byte(a,b,c)
GO

 

Msg 1944, Level 16, State 1, Line 1
Index 'IX_1' was not created. This index has a key length of at least 1200 bytes. The maximum permissible key length is 900 bytes.

Aynı index varchar gibi değişken boyutlu key’ler üzerine tanımlanırsa sadece uyarı verilerek index create edilecektir.

create table tbl_VarChar900Byte(a varchar(400), b varchar(400), c varchar(400))
GO
create clustered index IX_1 on tbl_VarChar900Byte(a,b,c)
GO

 

Warning! The maximum key length is 900 bytes. The index 'IX_1' has maximum length of 1200 bytes. For some combination of large values, the insert/update operation will fail.

 

Giriş bölümünde de belirttiğim üzere SQL Server böyle bir index’in oluşturulmasına izin vermesine rağmen bu şekilde index’ler create etmemeye özen göstermeliyiz. Çünkü bu index’ler üzerine yapılacak 900 byte’dan büyük insert-update işlemleri hata alacaktır.

insert into tbl_VarChar900Byte(a,b,c)
	values (REPLICATE('A',400),REPLICATE('B',400),REPLICATE('C',400))

 

Msg 1946, Level 16, State 3, Line 1
Operation failed. The index entry of length 1200 bytes for the index 'IX_1' exceeds the maximum length of 900 bytes.

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


14.12.2011 tarihinde gerçekleştirmiş olduğum SQL Server 2012 ile Gelen Yeni Özellikler başlıklı webcast’imin videosuna ve diğer dosyalarına aşağıda erişebilirsiniz.

[more]

Scriptler

Video

 

Sunum

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server 2012 ile SQL Server Audit tarafında bazı geliştirmeler yapılmış durumda. Bu makalemde bu yenilikleri detaylı olarak inceliyor olacağız.

[more]

Sürüm Değişikliği

Bildiğiniz gibi SQL Server 2008 ile beraber gelen SQL Server Audit özelliği sadece enterprise edition’da desteklenmekteydi. SQL Server 2012’de bu konuda bazı değişiklikler yapılmış durumda.

Artık Server Level Auditing işlemleri bütün sürümlerde desteklenmekte. Database Level Auditing tarafında ise bir değişiklik yapılmadı ve sadece Enterprise edition’da desteklenmekte.

User-Defined Audit

SQL Server 2012 ile beraber audit loglarına kullanıcı bazlı olarak log atabilme özelliği geliyor. sp_audit_write sistem prosedürü vasıtasıyla kendi prosedürlerimiz sonucu oluşan logları audit loglarına yazdırabilir ve audit loglarını izlerken bu logları da görüntüleyebiliriz.

Şimdi bu işlemi bir örnek ile detaylandıralım.

--Yeni bir audit nesnesi tanımlıyoruz.
USE [master]
GO
CREATE SERVER AUDIT [Audit1]
TO FILE 
(	FILEPATH = N'D:\audit'
	,MAXSIZE = 0 MB
	,MAX_ROLLOVER_FILES = 2147483647
	,RESERVE_DISK_SPACE = OFF
)
WITH
(	QUEUE_DELAY = 1000
	,ON_FAILURE = CONTINUE
)
GO

--Audit nesnesini enable ediyoruz
Alter Server AUDIT [Audit1] WITH (STATE=ON)

--Yeni bir Server Audit Specifications oluşturuyoruz
--Audit Action Type olarak USER_DEFINED_AUDIT_GROUP seçeneğini ekliyoruz.
--SQL Server 2012 ile beraber gelen bu seçenek UserDefined Audit yapmak için kullanılmakta.
CREATE SERVER AUDIT SPECIFICATION [sas1]
FOR SERVER AUDIT [Audit1]
ADD (USER_DEFINED_AUDIT_GROUP)
GO

--Server Audit Specifications nesnesini enable ediyoruz
ALTER Server AUDIT SPECIFICATION [sas1] WITH (STATE=ON)

--Şimdi SQL Server Audit log'una manuel olarak bir log yazıyoruz.
--Örneğin aşağıdaki kod Audit log'una bir ekranın açıldığını loglamakta. 
EXEC sp_audit_write @user_defined_event_id =  27
            , @succeeded =  1 
            , @user_defined_information = N'Monitoring Tool''una erişim' ;

 

Yazdığımız bu log kaydını audit nesnesinin log viewer’ından izleyebiliriz.

1(1)

Filtreleme

SQL Server 2012 ile beraber Audit tarafında gelen en büyük yeniliklerden biri de oluşturulacak olan log kayıtlarında filtreleme özelliği. Örneğin bir tablo üzerinde kullanıcılar tarafından yapılan delete işlemlerini log’lamak istiyorum. Fakat programın kullandığı login’in loglanmasını istemiyorum. Çünkü benim izlemek istediğim program değil diğer kullanıcıların yaptığı delete işlemleri.

İşte bu aşamada Audit nesnesinde filtering özelliğini kullanarak sadece istediğim user’ların yaptığı işlemlerin loglanmasını sağlayabilirim.

Tabi burada şu şekilde bir parantez açmak istiyorum. Audit nesnesinde filtering kullanıldığında log hala daha oluşmaya devam eder ama filtering özelliğine uyuyorsa log dosyasına yazılır.

Şimdi şu şekilde bir örnek yapalım. Aşağıdaki şekilde oluşturulan audit nesnesi sadece principal_id’si 259 olan user’ının yaptığı işlemleri loglayacaktır.

USE [master]
GO
CREATE SERVER AUDIT [Audit2]
TO FILE 
(	FILEPATH = N'D:\audit'
	,MAXSIZE = 0 MB
	,MAX_ROLLOVER_FILES = 2147483647
	,RESERVE_DISK_SPACE = OFF
)
WITH
(	QUEUE_DELAY = 1000
	,ON_FAILURE = CONTINUE
)
WHERE ([server_principals_id]=(259))

 

Bunun haricinde SQL Server 2012 Audit’de FAIL_OPERATION ve MAX_FILES özelliklerinde de bazı yenilikler yapılmış durumda. Bu yeniliklerin detayına da şu linkten erişebilirsiniz.

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server 2012 ile gelen yenilikler ve iyileştirmeler üzerine incelemelerimize devam ediyoruz. Bugünkü konumuz Management Studio üzerinden restore işlemi yaparken kullandığımız ara yüzde yapılan iyileştirmeler ve geliştirmeler.

[more]

Microsoft’un açıkladığına göre bu iyileştirmelerin bir çoğu müşterilerden gelen istekler doğrultusunda gerçekleştirilmiş. Aslında çok büyük geliştirmeler söz konusu değil fakat restore ekranı çok sık kullanılan bir ekran olduğu için geliştirmeler oldukça faydalı olmuş.

Sözü fazla uzatmadan yapılan iyileştirme ve geliştirmelere bakalım.

1

1. Restore dosyasını seçtiğimiz anda ilgili backup’lar otomatik olarak seçilmekte. Çok büyük bir özellik olarak gözükmese bile her restore işleminde bunları seçiyor olmak bize zaman kaybettirmekteydi.

2. Restore edilecek database’in adı backup dosyasından okunup default olarak otomatikman yazılmakta. Ayrıca Restore to kısmında default olarak yazan “the last backup taken” yazısının yanına en son alınan backup’ın tarihi de eklenmiş durumda.

3. Restore ekranında yapılan belki de en büyük geliştirme zaman bazlı restore işlemleri için kullanabileceğimiz Görsel Zaman Çizelgesi ekranı.

2

Bu ekran vasıtasıyla backup’ların ne zaman alındığını görsel bir zaman çizelgesi üzerinde görebiliyoruz. Ayrıca zaman bazlı bir seçim yaptığımızda seçtiğimiz tarihin görsel olarak hangi alana denk geldiğini görerek hangi backup’ların restore edileceğini rahatça görebiliyoruz.

4. Files bölümünde ise oldukça faydalı olacağını düşündüğüm bir geliştirme yapılmış.

3

Relocate all files to folder kısmında restore edilecek database’in data ve log dosyalarının nereye yerleştirileceğini seçebiliyoruz. Daha önce bu işlemi dosya dosya yapabiliyorduk. 1’den fazla örneğin 8 tane data dosyası içeren database’de klasör değişikliğini her bir dosya için ayrı ayrı yapmamız gerekiyordu. Bu yeni özellik vasıtasıyla artık çok daha hızlı bir şekilde bu değişiklikleri yapabileceğiz.

5. Options bölümünde ilk göze çarpan, ekranı daha kullanışlı hale getirebilmek için yapılan düzenlemeler. Bunun haricinde Restore’den önce Tail-Log backup alınmasını istiyorsak bunu seçebiliyoruz.

4

6. Bir diğer güzel geliştirme ise Restore işleminden önce bağlı kullanıcıların disconnect edilmesi. Bunu sağlamak için database, restore’dan önce otomatik olarak single user mode’a alınmaktadır.

SSMS Restore ekranında yapılan iyileştirmeler ve geliştirmeler bu şekilde. Daha önce söylediğim gibi bu geliştirmeler çok büyük geliştirmeler değil. Fakat restore ekranı çok sık kullandığımız bir ekran olduğu bu geliştirmelerin işlerimizi hızlandıracağı aşikar.

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Bir yılı daha geride bıraktık. Geride bıraktığımız 2011 yılı turgaysahtiyan.com açısından nasıl geçti?

image

2011 yılında turgaysahtiyan.com üzerinden 154 post yayınlamışım. Bu sayı neredeyse 2 günde 1 post yazdığım anlamına gelmekte. Tabi bu rakamın içinde diğer community’lerde yayınladığım makaleler yok. Onları da katınca 2011 yılında toplamda 200’ün üzerinde yazı yayınladığımı söyleyebilirim ki bu rakam inanılmaz bir rakam değil mi? :)

image

2011 yılında turgaysahtiyan.com 75.000 farklı kişi tarafından toplamda 103.000 kez ziyaret edilmiş. Kişi başına sayfa ziyareti 1,74 olarak gerçekleşmiş. Toplam sayfa ziyaretine bakacak olursak 2011 yılı boyunca turgaysahtiyan.com’da toplamda 180.000 sayfa görüntülenmiş.

image

Yıl içinde aylık bazda ziyaret sayısı açısından sürekli bir artış gözükmekte. En fazla ziyaretçi sayısına ulaşıldığı ay ise 11.504 ziyaret ile Aralık ayı.

image

Dünyanın hemen hemen her yerinden turgaysahtiya.com’a erişim sağlanmış. Toplam 116 değişik ülkeden ziyaretçi çeken turgaysahtiyan.com tabii ki en fazla ziyaretçiyi 87.000 adet ile Türkiye’den çekmiş.

image

Rakamlara baktığımda 2011 yılının gerçekten beklediğim ve hedeflediğim gibi geçtiğini söyleyebilirim.

2012 yılında hedefleri daha da ileriye götürerek 200.000 ziyaretçi sayısına ulaşmayı hedefliyorum. Ne dersiniz? :)

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan