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
<<  Ekim 2017  >>
PaSaÇaPeCuCuPa
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
Keywords

SQL Server 2008 ile beraber Database Mirroring’e Auto Page Repair özelliği eklendi. Bu özellik ile beraber partner’ler (Mirroring yapılan sunucular birbirinin partner’idir) bozuk(corrupted) olan data page’leri birbirlerinden otomatik olarak recover etmeye çalışmaktadır. Herhangi bir page’i okuyamayan partner sunucu diğer sunucudan bu page’in düzgün olan halini istemekte, ve bu istek başarıyla sonuçlanırsa düzgün olan page corrupted yani bozuk olan page ile replace edilmektedir.

[more]

Auto Page Repair Yapılabilecek Page Tipleri

Auto Page Repair ile aşağıdaki page tipleri recover edilemez.

  • File header page (page ID 0).
  • Page 9 (the database boot page).
  • Allocation pages: Global Allocation Map (GAM) pages, Shared Global Allocation Map (SGAM) pages, and Page Free Space (PFS) pages.

Bunun haricinde kalan page’ler Auto Page Repair ile partner’ler arasında otomatik olarak recover edilebilmektedir.

Auto Page Repair İşlem Adımları

Auto Page Repair işlemi aşağıdaki adımlardan oluşmaktadır.

  1. Principal database üzerinde bir data page’de okuma hatası gerçekleştiğinde, bu page’in ID bilgileri ve error mesajı suspect_pages table’ına yazılır. Daha sonra principal server bu page’in bir kopyasını secondary yani mirror sunucudan ister.Bu isteğin içinde page ID ve LSN bilgisi bulunur. Bu istekle beraber ilgili page restore pending statu’sunu çekilir ve bu sayede auto page repair süresi boyunca ilgili page’e erişimler engellenir. Eğer page’e bir istek gelirse 829 (restore pending) hata mesajı döndürülür.
  2. İstek mirror server’a eriştiğinde , mirror server ilgili page’e erişmeye çalışır. Eğer page’e erişimde bir sorun olmazsa mirror server ilgili page’i principal server’a gönderir. Eğer erişimde sıkıntı çıkarsa mirror server principal server’a hata mesajı döndürür.
  3. Principal server page’i alır ve işlemeye başlar. Yani mirror server’dan aldığı page’i kendi üstünde bulunan corrupted (bozuk) page ile replace eder.
  4. Auto page Repair işlemi tamamlandığında daha önce 1 no’lu adımda suspect_pages table’ına alınan ilgili page’in kaydı bu table’dan kaldırılır ve page erişime açılır.

Yapılan Auto Page Repair İşlemlerini Monitor Etmek

Auto Page Repair işleminin otomatik olarak gerçekleştiğini söyledik. Peki ne zaman hangi page auto repair oldu nasıl kontrol edebiliriz.

Bunun için SQL Server 2008 ile beraber yeni bir DMV gelmiş durumda.

image

sys.dm_db_mirroring_auto_page_repair DMV’si ile geçmişe dönük olarak gerçekleşmiş Auto Page Repair işlemleri sorgulanabilir.

Bu DMV her bir Auto Page Repair işlemi bir sonuç döndürür. Her bir database için maksimum 100 adet kayıt saklanır. Bu rakama ulaşıldığında yeni gelen kayıt eski kayıtlardan birinin üzerine yazılır.

Sorgu sonucunda gelen bilgilere bakacak olursak;

  • database_id = Repair işleminin yapıldığı page’in bulunduğu database’in ID’si
  • file_id = Page’in bulunduğu file’in ID’si
  • page_id = Page’in ID’si
  • error_type = Principal server’ın hatalı olan page üzerinde aldığı hata
  • page_status = Repair işleminin şu an için bulunduğu status
  • modification_time = Status’ta yapılan en son değişikliğin zamanı

 

Bugünkü yazımda Mirroring yapısına 2008 ile beraber eklenen Auto Page Repair işleminin ne olduğu, ne şekilde çalıştığı ve nasıl monitor edilebileceği üzerinde durduk. High Avaibility açısından önemli bir çözüm olan DB Mirroring’e eklenen bu güzel özelliği mirror sunucularınızda periyodik olarak monitor etmenizin gerekliliğini vurgulayarak yazımı noktalıyorum.

 

İ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


İş kritik uygulamalar konusunda çalışan veri platformu mimarları için düzenleyeceğimiz seminer serisinin ilkini “İş Kritik Uygulamalar için Performans” konusuyla gerçekleştiriyoruz.
İş kritik uygulamaların performansı kurumların arzu ettikleri hizmet seviyelerini müşteri ve iş ortaklarına sağlayabilmeleri açısından yüksek önem taşır. Bu seminerde özellikle iş kritik uygulamalarınızın üzerinde çalıştığı SQL Server veritabanlarının izlenmesi ve performans iyileştirmesi konularına yer verilecektir.
Seminer Microsoft SQL Server geliştirme ekibinde de çalışmış, konusunda 15 yılı aşkın tecrübesi bulunan Ramesh Meyyappan tarafından İngilizce verilecektir.
Saygılarımızla,
Microsoft Türkiye

Tarih
28 Mart 2011 Pazartesi
Saat
09.00 - 16.15
Yer
Microsoft İstanbul Ofisi

Kayıt olmak için;

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032476099&Culture=TR-TR

image

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 üzerinde çalıştığım bir konudan bahsetmek istiyorum. Sunucularımdan birinde bir login windows authentication olarak bağlantı kurmasına rağmen, SQL Server Login’leri kontrol ettiğimde bu login’i göremedim.

[more]

Belli ki bir windows grubundan bu yetkiyi almaktaydı. Yani bu login bir windows grubunun içinde ve bu windows grubuda SQL Server Login’leri içerisinde yetkilendirilmiş.

Peki ama hangi Windows Grubu içinde yer almakta bu login?

SQL Server Login listenizde çok fazla windows grubu var ise tek tek bu grup’ların içine bakmak işkence olacaktır. Oysa aşağıdaki kod ile ilgili login’in hangi gruptan yetkiyi aldığını sorgulamamız mümkün.

exec xp_logininfo 'DomainName\LoginName'

 

image

Gördüğünüz gibi ilgili login BUILTIN\Administrators’tan bu yetkiyi almakta ve ayrıca bu grupta SQL Server’da sysAdmin olarak yetkilendirilmiş.

 

İ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 login’lerine eklemiş olduğunuz bir Active Directory kullanıcı grubu var. Peki bu kullanıcı grubu hangi kullanıcıları kapsamakta.

Ya da soruyu daha detaylandırırsak; Active Directory’de yada local makinada olan bir kullanıcı grubunun üyelerine T-SQL ile bakabilir miyiz?

Cevabımız evet.

[more]

Aşağıdaki kod ile bir Active Directory grubuna dahil olan kullanıcıları sorgulamamız mümkün.

exec xp_logininfo 'DomainName\GroupName','members'

 

Bu şekilde Domain Admin arkadaşlara hiç gitmeden kendi işimizi gene kendimiz görmüş oluyoruz Smile

Script i kullanırken dikkat etmemiz tek nokta, sorgulamak istediğimiz grubun SQL Server Login’ler içerisinde tanımlanmış olma zorunluluğu. Eğer tanımlı değilse sorgu sonucu boş dönecektir.

 

İ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


ms1

Sizi 11 Mart 2011 Cuma günü İstanbul Kongre Merkezi’nde gerçekleştireceğimiz Microsoft Türkiye Bilişim Zirvesi ile farklı bir deneyime davet ediyoruz. Konuk konuşmacımız Prof. Dr. Ulrich Walter’ın araştırmacı astronot olarak yaşadığı uzay deneyimini aktaracak ve  “Vizyondan Misyona” adlı konuşmasında hem bu farklı deneyimi hem de bu başarıya ulaşmak için gösterdiği özverili çalışmasını bizlerle paylaşacaktır.

İş ortaklarımızın farklı alanlardaki çözüm uygulamalarının ve  müşterilerimizin başarı hikâyelerinin de sunulacağı etkinliğimizde; Geleceğin Çalışma Dünyası, Web Platformu, Dinamik Veri Platformu, İş Kritik Uygulamaları, Uygulama Platformu ve Bulut Bilişim gibi farklı konu başlıkları altında toplam 11 paralel sunum yer alacaktır.

Tüm gün sürecek etkinliğin yorgunluğunu Tolga Çevik'in Komedi Dükkanı’nında atabilirsiniz. Komedi Dükkanı’nın kapısını açacak davetiyenizi almanız için yapmanız gereken tek şey; etkinliğimizi, sunularımızı, bizleri değerlendirmenizdir.

Teknolojinin getirdiği yenilikler ile işinize katacağımız değerleri sizlerle paylaşmak üzere, sizi de aramızda görmekten mutluluk duyarız.

Saygılarımızla,
Microsoft Türkiye

Kayıt olmak için

https://msevents.microsoft.com/cui/EventDetail.aspx?culture=tr-TR&EventID=1032474048&IO=l1KCS%2fdGn2P%2fFbGk97ziug%3d%3d

Ajanda

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 2000 Desktop (MSDE) sürümünde TCP/IP ya da Named Pipes’ı enable etmek için aşağıdaki adımları kullanabilirsiniz.

[more]

  1. Start / Run kısmını açalım.
  2. Gelen ekranda svrnetcn yazıp OK’e basalım.

    msde
  3. İstediğimiz protokelleri seçip Enable tuşuna basıyoruz.
  4. Daha sonra OK’e basıp bu ekranı kapatıyoruz.
  5. Son olarak değişikliklerin geçerli olabilmesi için DB Engine Service’ini restart ediyoruz.

 

İ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 2011 Denali ile beraber gelen en büyük yenilik gruplarından biri yeni High Availability and Disaster Recovery seçenekleri. Bu yeni seçenekler ile beraber daha yüksek erişebilirlik sunulabilecek ayrıca daha güvenilir disaster recovery çözümleri kullanılabilecektir. Ayrıca yeni gelen bu özellik grubuna Always On’da denilmektedir.

[more]

Hali hazırda SQL Server’ın sunduğu High Availability and Disaster Recovery çözümleri aşağıdaki gibidir.

  • Failover Cluster Instance
  • Database Mirroring
  • Log Shipping

Bu çözümler bir çok işimizi çözmekle beraber sektörde daha iyi bir high availability beklentisi vardı. Microsoft’ta Denali’de sunduğu HADR çözümleri ile bu istekleri karşılamış gibi gözüküyor.

HADR ile gelen çözümleri şu anki klasik mirroring yapısının iyileştirilmesi gibi düşünebiliriz. Şimdi isterseniz HADR ile beraber neler geliyor madde madde bakalım.

HADR Altyapısı

HADR kullanmak için hepinizin tahmin edebileceği gibi birden fazla node gerekmekte. Bu node’lar üzerinde Windows Server Failover Cluster (WSFC) kurulu olmalı.

SQL Server tipi olarak cluster kurulum yapma zorunluluğu yok. Standalone SQL Server kurulumları ile de HADR kullanılabilmekte.

Multi-Database Failover

Şu anki mirror yapısı tek bir database seviyesinde tanımlanmakta. Mirror yapılan bu database’de bir sıkıntı oluştuğunda mirror database’den çalışmalara devam edilebilmekte.

Yani burada tek bir database’in failover yapmasından bahsediyoruz.

HADR ile gelen Availability Groups ile database grupları tanımlayabilir ve bu grubun içinde 1 database fail etse dahi grubun tamamını diğer sunucudan çalışır hale getirebileceğiz. Yani grup’un tamamı failover edebilecek.

Böyle bir ihtiyacın neden olabileceği üzerine konuşalım. Örneğin bir ticari program yaptınız ve müşteri bilgilerini bir database’de, satış bilgilerini de bir başka database’de tutuyorsunuz. Satış bilgilerini tuttuğunuz database’de de bazı SP’ler var ve bu SP’ler müşteri DB’sine giderek müşteri bilgilerini getirmekte. Böyle bir yapıda SP’lerin hata vermemesi için 2 DB’nin de aynı sunucu üzerinde bulunması gerekmekte. İşte böyle bir durumda örneğin müşteri DB’si fail edip diğer server’a giderken satış DB’si eski server’da kalmaya devam ederse bahsettiğimiz bu SP’ler hata verip çalışmayacaktır. İşte HADR ile beraber gelen Availability Groups seçeneği ile bu 2 DB’yi aynı grubun içine koyuyoruz ve bu 2 DB’den hangisi fail ederse etsin 2 sini birden mirror sunucudan kullanmaya başlıyoruz.

Şu anki CTP1 sürümündede Availability Groups içinde sadece 2 server bulundurulabilmekte.

Multiple Secondaries

Klasik mirroring çözümünde bir tane secondary yani mirror database bulundurabiliyorduk. HADR ile beraber gelen özelliklerden biri olan Multiple Secondaries yani birden fazla secondary bulundurabilme özelliği ile daha yüksek bir High Availability çözümü sağlamış olacağız.

Active Secondaries for Reporting

Belkide HADR ile beraber gelen en önemli özelliklerden biride secondary database’leri rapor amacı ile kullanabilmek. Bildiğiniz gibi şu anki klasik mirroring çözümünde mirror database’ler herhangi bir şekilde erişebilir durumda değildi  ve atıl olarak kalmaktaydı. Gerçi synonym ve snapshot ile bazı çözümler sunulmuş olmasına rağmen pek istediğimiz gibi çalışmamaktaydı.

HADR ile beraber artık secondary sunucularımızı kullanabilir yapıdayız. Bu durumda primary sunucuyu OLTP işlemleri için, synchronous yada asynchronous olarak beslenen secondary database’ide reporting amacı ile kullanarak ana server’daki yükü bölmemiz mümkün.

hadr

Bu arada CTP1’de sadece asynchronous mode desteklenmektedir.

Fast Client Connection Redirection

Gene klasik mirror yapısında primary database’den secondary database’e geçiş yapıldıktan sonra webconfig bilgilerimizi yeni sunucuya göre ayarlamamız gerekmekteydi. HADR ile beraber sağlanan virtual network name vasıtasıyla sunucular arasında database geçiş yaptıktan sonra herhangi bir connection string değişikliği yapmamız gerekmemekte. Bu yapıyı failover cluster sistemindeki virtual network name ile aynı şekilde düşünebilirsiniz.

Backup on Secondary Server

Backup’lama işlemi primary sunucudan yapılabileceği gibi secondary sunucudan da yapılabilir. Backup’ları secondary sunucudan alarak backup load’ını primary sunucunuzda kaldırabilirsiniz.

Primary’den alınan backup secondary için kullanılabilir, aynı şekilde secondary sunucudan alınan backup’ın da primary sunucu için kullanılması mümkündür.

AlwaysOn Dashboard

Bu kadar gelen yeni özellikle beraber bu özellikleri monitor etmek amacıyla yeni bir dashboard oluşturulmuş durumda. Tek bir ekrandan yeni HADR seçeneklerini monitor etmemiz mümkün.

 

Denali ile gelen/gelmesi planlanan yeni HADR özellikler bu şekilde. Daha sonraki yazılarımda bu özelliklerin teknik detaylarınada inmeye çalışacağım.

 

İ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


Teched

Tech-Ed Middle East Microsoft'u bilişim dünyası ile buluşturan en kapsamlı, teknik içerikli etkinliktir. Bu etkinlikte Microsoft ürünleri, teknolojileri, çözüm ve servisleri ile ilgili pek çok oturum gerçekleştirilmektedir. Bu sayede katılımcılar bugün karşılaştıkları sorunları çözme ve yarının innovasyonları için hazırlanma fırsatı bulacaklardır.

TECH-ED MIDDLE EAST 2011'de benim için ne var?

  • Microsoft ürün ve teknolojilerinin yol haritasını ana oturumda Microsoft yöneticilerinden dinleme imkanı
  • Microsoft ve endüstri uzmanlarından 200 teknik oturum
  • Teknolojiyi lab çalışmaları ile deneme imkanı
  • Ask The Experts köşesinde konunun uzmanlarına soru sorma imkanı
  • Technical Learning Centre'da ürün demoları izleme fırsatı
  • Tech·Ed Expo'da endüstri çözümleri hakkında bilgi edinme imkanı

 

Daha detaylı bilgiye aşağıdaki web adresinden erişebilirsiniz.

http://www.teched.ae/

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 Login’i drop ettiğimizde bu login’e bağlı olan user’lar DB altında tanımla kalmaya devam etmektedir. Bugün paylaşacağım script ile bir Login’i tamamen silmemiz mümkün.

[more]

SP şu şekilde;

CREATE PROC [dbo].[DropLogin] @LoginName varchar(15)
AS    

declare @strx varchar(max)=''

--Yeni Session açılmasın diye login'i disable yap
select @strx = 'use master; if exists(select * from sys.sql_logins where name = '''+@LoginName+''') ALTER LOGIN ['+@LoginName+'] DISABLE; '

--Login'in bütün session'larını kill et
select @strx = @strx + 'kill ' + cast(spid as varchar(10)) + '; '
from sys.sysprocesses where loginame = ''+@LoginName+''

--Login'i drop et
select @strx =@strx+' use master; if exists(select * from sys.sql_logins where name = '''+@LoginName+''') DROP LOGIN ['+@LoginName+']; '

--DB'lerde bulunan user'ları drop et
select @strx=@strx+'use ' + name + '; if exists(select * from sys.database_principals where name = '''+@LoginName+''') DROP USER ['+@LoginName+'] ' 
from sys.databases

exec (@strx)

 

Kullanımı ise şu şekilde;

exec dbo.DropLogin 'DenemeLogin' 

 

İ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’da Data ve Log page’lerin nasıl organize edildiği ile ilgili bazı bilgiler oldukça kafa karıştırmakta. Bugün bu konu ile ilişkili olarak Dirty Page–Buffer Cache–Checkpoint–Commit Tran kavramlarının ne anlama geldiklerine bakıyor olacağız.

[more]

Bir update işleminin transactional olarak gerçekleştirildiğini düşünelim. Örneğin kodumuz şu şekilde olsun.

update Kisiler set Ad=’Turgay’ where ID=3

Begin tran ile bir transaction açıyoruz ve daha sonrada update işlemini gerçekleştiriyoruz. Buraya kadar yaptığımız işlemler Log dosyamıza yazılmış durumda. Ayrıca update işlemi ile beraber ID=3 nolu kayıtı içeren data page buffer cache’e yani memory’e alındı ve bu kayıdın ad bilgisi Turgay yapıldı. Ve şu an da data page’imiz dirty page durumda. Yani buffer cache’de bulunan bu data page, disk te bulunan data page’den farklı, dolayısıyla dirty durumda.

Bu aşamadan sonra commit tran diyerek transaction’ı commit ediyoruz ve bu bilgimizde log dosyasına yazılıyor. Artık transaction’ımız committed durumda. Ama hala data page’in son hali buffer cache’de bulunmakta, diskte bulunan data page eski halde.

Bu aşamada ise Checkpoint gönderiyoruz ve buffer cache’de bulunan dirty page’leri disk’e yazdırıyoruz. Yani checkpoint’in yaptığı işlem; memory de bulunan dirty page’leri disk’e yazmak.

Son olarak şu bilgiyi de vermek istiyorum. Bir dirty data page’in checkpoint vasıtasıyla disk’e yazılması için commit edilmiş durumda olması şart değil. Commit edilmiş transaction’ların ilişkili olduğu dirty data page’lerde checkpoint ile disk’e yazılabilir.

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


Bildiğiniz gibi her tabloda Cluster Index bulundurmak önerilen bir durumdur. Bir de tablo bir Identity kolona sahipse diğer kolonlar üzerinden bir Cluster Index çıkarmak için hiç kasmadan bu Identity kolon için Primary Key tanımlaması yapabiliriz.

Bugün sizlerle paylaşacağım script’in amacı bütün database’lerdeki table’ları sorgulayıp, cluster index’i olmayan ama identity kolona sahip tabloları bulmak ve bu tablolar için primary key create script’i oluşturmak.

[more]

Script’te dikkati çeken kısımları açıklamak gerekirse;

objectproperty(t.object_id,''TableHasClustIndex'')=0
Cluster Index’i olmayan Table’lar

objectproperty(t.object_id,''TableHasIdentity'')=1
Identity Kolona sahip Table’lar

objectproperty(t.object_id,''TableHasPrimaryKey'')=0
Primary Key’i Olmayan Table’lar

Script ise şu şekilde;

create table #tmp1 (DBName sysName, object_id int, SchemaName sysName, TableName sysName, TableRowCount int, NonClusterIndexCount int
	,IdentityColumn sysName, PrimaryKeyCreateScript varchar(max))

exec sp_msforeachdb '
use ?;
insert #tmp1
Select *
	,
''
use ?; 
ALTER TABLE [''+SchemaName+''].[''+TableName+''] ADD  CONSTRAINT [PK_''+TableName+''_''+IdentityColumn+''] PRIMARY KEY CLUSTERED 
(
	[''+IdentityColumn+''] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = ON, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
'' as PrimaryKeyCreateScript
from (
select DB_NAME() as DBName,t.object_id,schema_name(t.schema_id) as SchemaName,t.name as TableName
    ,(select sum(row_count) from sys.dm_db_partition_stats where object_id=t.object_id and index_id in (0,1)) as TableRowCount 
    ,(Select count(1) from sys.indexes i where i.object_id=t.object_id and index_id>1) as NonClusterIndexCount
	,(Select name from sys.columns c where c.object_id=t.object_id and is_identity=1) as IdentityColumn		
from sys.tables t
where objectproperty(t.object_id,''TableHasClustIndex'')=0
	and objectproperty(t.object_id,''TableHasIdentity'')=1
	and objectproperty(t.object_id,''TableHasPrimaryKey'')=0
) tbl1	
'

select * from #tmp1 
where DBName not in ('master','model','msdb','tempdb')
order by DBName

drop table #tmp1

 

İ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


3 Şubat Perşembe günü yapmış olduğum webcast’te kullandığım powerpoint dosyasını ve scriptleri sizinle paylaşmak istiyorum.

İlerleyen günlerde webcast’i video formatında da paylaşıyor olacağım.

[more]

PowerPoint Dosyası

http://www.turgaysahtiyan.com/file.axd?file=2011%2f01%2fWebcast_2011_Denali.pptx

Sunumda Kullanılan Scriptler

--Contained Database
--Contained Database Özelliğinin Enable Edilmesi
sp_configure 'show advanced options', 1 ;
GO
RECONFIGURE ;
GO
sp_configure 'contained database authentication', 1;
GO
RECONFIGURE ;
GO
sp_configure 'show advanced options', 0 ;
GO
RECONFIGURE ;
GO

--Contained Olmayan Bir DB’ye Contained Hale Dönüştürme
USE [master]
GO
ALTER DATABASE [SampleDB1] SET CONTAINMENT = PARTIAL
GO

--Contained Database User Oluşturma
USE [SampleDB1]
GO
CREATE USER [CDBUser1] WITH PASSWORD=N'Abc12345'
GO

----------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------

--Ad-hoc Query Paging Option

--2011 Denali'den önce
SELECT * FROM (
SELECT *
    ,ROW_NUMBER() OVER (ORDER BY soh.SalesOrderID) AS 'RowNumber'
FROM Sales.SalesOrderHeader soh
) Tbl1
WHERE RowNumber>100 and RowNumber<=150

--2011 Denali
SELECT *
FROM Sales.SalesOrderHeader soh
ORDER BY soh.SalesOrderID ASC
	OFFSET 100 ROWS
	FETCH NEXT 50 ROWS ONLY;

--Bunu SP yapalım

CREATE PROCEDURE dbo.spGetSales
(
    @PageNumber int = 1,
    @RowCountInPage int = 50
)
AS
BEGIN
	SELECT *
	FROM Sales.SalesOrderHeader soh
	ORDER BY soh.SalesOrderID ASC
		OFFSET (@PageNumber-1)*@RowCountInPage ROWS
		FETCH NEXT @RowCountInPage ROWS ONLY;
END

--SP yi çağıralım.
--Her sayfada 50 kayıt var, 3. sayfayı almak istiyorum.
exec dbo.spGetSales 3,50

--SP Drop
DROP PROCEDURE dbo.spGetSales

----------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------

--Sequence Objects

--Sequence Object'i oluşturalım
CREATE SEQUENCE SeqSalesID
    AS int
    START WITH 1
    INCREMENT BY 1 ;
GO

--Internet satışlarını tuttuğumuz tablo
CREATE TABLE InternetSales
(
    SalesID int PRIMARY KEY CLUSTERED 
        DEFAULT (NEXT VALUE FOR SeqSalesID),
    SalesDate date NOT NULL DEFAULT (getdate()),
    SalesAmount float NOT NULL
) ;
GO

--perakende satışları tuttuğumuz tablo
CREATE TABLE RetailerSales
(
    SalesID int PRIMARY KEY CLUSTERED 
        DEFAULT (NEXT VALUE FOR SeqSalesID),
    SalesDate date NOT NULL DEFAULT (getdate()),
    SalesAmount float NOT NULL
) ;
GO

--Satış yapalım
INSERT InternetSales (SalesDate, SalesAmount) 
    VALUES (GETDATE(), 150) ;
INSERT InternetSales (SalesDate, SalesAmount) 
    VALUES (GETDATE(), 350) ;
INSERT RetailerSales (SalesDate, SalesAmount) 
    VALUES (GETDATE(), 350) ;
INSERT InternetSales (SalesDate, SalesAmount) 
    VALUES (GETDATE(), 350) ;
INSERT RetailerSales (SalesDate, SalesAmount) 
    VALUES (GETDATE(), 550) ;


-- UNION ALL ile sorgu çekelim ve otomatik artan sayıya bakalım.
SELECT SalesID, SalesDate, SalesAmount FROM InternetSales
UNION ALL
SELECT SalesID, SalesDate, SalesAmount FROM RetailerSales
ORDER BY SalesID ;
GO

--Oluşturduğumuz objeleri drop edelim
DROP Table InternetSales
DROP Table RetailerSales
DROP SEQUENCE SeqSalesID



--Tekrarlayan Sequence Örneği
CREATE SEQUENCE CountBy10
   AS tinyint
    START WITH 1
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 10
    CYCLE ;
GO

SELECT NEXT VALUE FOR CountBy10 AS ID, Name FROM sys.objects ;
GO

DROP SEQUENCE CountBy10
GO

--Sequence'i Resetlemek
ALTER SEQUENCE Samples.IDLabel
RESTART WITH 1 ;

----------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------

--WITH RESULT SETS option
--Önce bir SP create edelim.
create procedure dbo.getPersonContacts @Title varchar(5)
AS
  select Title,FirstName,MiddleName,LastName 
  from Person.contact
  where Title = @Title

--Daha sonra klasik yöntemle SP’yi çağıralım.
exec dbo.getPersonContacts 'Mr.'

--Yapmak istediğim dönen result set’in kolon adlarını ve data type’larını değiştirmek. 
--Bunun için aşağıdaki syntax’ı kullanabilirim.

exec dbo.getPersonContacts 'Mr.'
WITH RESULT SETS
(
	(
		[myTitle] varchar(5) not null,
		[myFirstName] varchar(50) not null,
		[myMiddleName] varchar(50) null,
		[myLastName] varchar(50) not null
	)
)

--SP drop
drop procedure dbo.getPersonContacts 

----------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------

-- User-Defined Server Roles
USE [master]
GO
--Server Role'ü create et.
CREATE SERVER ROLE [myServerRole] AUTHORIZATION [sa]
GO
--DBUser login'ini bu role'e dahil et
ALTER SERVER ROLE [myServerRole] ADD MEMBER [DBUser1]
GO
--Server Side Permission
GRANT ALTER ANY DATABASE TO [myServerRole]
GO
--Server Side Permission
GRANT CREATE ANY DATABASE TO [myServerRole]
GO
--Server Side Permission
GRANT VIEW ANY DATABASE TO [myServerRole]
GO
--Server Side Permission
GRANT VIEW ANY DEFINITION TO [myServerRole]
GO

--Server Role'u drop edelim
ALTER SERVER ROLE [myServerRole] DROP MEMBER [DBUser1]
GO
DROP SERVER ROLE [myServerRole]
GO
----------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------

 

İ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


ObjectProperty ile ilgili database’deki bir objenin bazı özelliklerini sorgulayabiliriz. Örneğin hangi tablolarımda Cluster Index var gibi bir soruya sys.indexes’i join’lemeden objectproperty’i kullanarak ulaşmak mümkün.

Bugünkü yazımda objectproperty kullanarak 4 adet faydalı script yazacağız.

[more]

1. Clustered ya da NonClustered Index İçeren Tablolar

select * from sys.tables
where objectproperty(object_id,'TableHasIndex')=1

2. Clustered Index İçeren Tablolar

select * from sys.tables
where objectproperty(object_id,'TableHasClustIndex')=1

3. NonClustered Index İçeren Tablolar

select * from sys.tables
where objectproperty(object_id,'TableHasNonclustIndex')=1

4. Identity Kolon İçeren Tablolar

select * from sys.tables
where objectproperty(object_id,'TableHasIdentity')=1

Eşitliklerde 1 yerine 0 kullanarak tam tersi sonucu almak mümkün. Örn. Clustered Index İçermeyen Tablolar gibi.

 

İ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


03 Şubat Perşembe yani bugün yapacağım webcast’in duyurusunu yapmak istiyorum.

SQL Server 2011 Code Named Denali ile Gelen Yeni Özellikler başlıklı webcast’im 03.02.2011 tarihinde 21:00-22:00 saatleri arasında gerçekleşecek.

Aşağıdaki url’i kullanarak vereceğim bu webcast’e katılabilirsiniz.

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032475394&Culture=TR-TR

Ajandamız şu şekilde olacak;

  • Kurulumda Gelen Yenilikler
  • Yönetimsel Yenilikler
  • HADR – High Availability and Disaster Recovery
    • Contained Databases
    • Startup Options
  • Programsal Yenilikler
    • Ad-hoc Query Paging Option
    • Sequence Objects
    • Code Snippets
    • WITH RESULT SETS option
    • 3 Yeni Data Type (CircularString, CompoundCurve, CurvePolygon)
  • Güvenlik Yenilikleri
    • User-Defined Server Roles
  • Soru - Cevap

Vaktiniz varsa katılmanızı kesinlikle tavsiye ederim.

 

İ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


Microsoft yeni SQL Server sürümü 2011 Denali CTP1 için books online’ı yayınladı.

Aşağıdaki url’den ilgili exe’yi indirebilirsiniz.

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a94fd771-9e65-4afa-9c5f-03344c48133f

Detaylar aşağıdaki gibi

  • Setup and upgrade instructions.
  • Information about new features and backward compatibility.
  • Conceptual descriptions of the technologies and features in SQL Server.
  • Procedural topics describing how to use the various features in SQL Server.
  • Tutorials that guide you through common tasks.
  • Reference documentation for the graphical tools, command prompt utilities, programming languages, and application programming interfaces (APIs) that are supported by SQL Server.
  • Descriptions of the sample databases and applications that are available with SQL Server.

İ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


Bildiğiniz gibi yazdığımız SP,View,Function gibi object’lerde Index seçimini Query Optimizer’a bırakmayıp kendimiz Force ederek istediğimiz bir Index’i kullandırtabiliriz. Fakat Best practice olarak bu yöntem önerilmez. Çünkü Force edilen Index’i kaldırma gibi bir durum oluşursa bu index’in force edildiği script’ler hata verecektir. Ayrıca ilk force edildiği anda belki ilgili index ilgili script’e uyuşmaktaydı, ama daha sonra bu index’te yapılacak bir değişiklik artık query’e tam olarak uyuşmayacak ve performans sıkıntısı doğuracaktır.

Bugün sizin ile paylaşacağım script ile hangi object’lerde Index Force’un kullanıldığını sorgulayacağız.

[more]

İlk olarak Index Force’un Syntax’ına 1-2 örnek vererek bakalım.

--Parantez ile kullanabiliriz
Select * 
from Sales.SalesOrderHeader WITH (INDEX (IX_SalesOrderHeader_CustomerID))
where SalesOrderID=43659

--Eşittir ile kullanabiliriz
Select * 
from Sales.SalesOrderHeader WITH (INDEX=IX_SalesOrderHeader_CustomerID)
where SalesOrderID=43659

--Index'in ID'si ile kullanabiliriz.
Select * 
from Sales.SalesOrderHeader WITH (INDEX=5)
where SalesOrderID=43659

 

Şimdi Index Force kullanılmış Script’leri (SP,View,Function vs.) sorgulayacak script’e bakalım.

create table #tmp1 (DBName sysname,object_id int, name sysname, type varchar(3), type_desc varchar(50), OriginalText varchar(max), text varchar(max))

exec sp_msforeachdb 'use ?;
insert #tmp1
select ''?'' as DBName,sm.object_id,o.name,o.type,o.type_desc
      ,definition as OriginalText 
      ,replace(replace(replace(replace(replace(replace(replace(definition,'' index'',''(INDEX''),'' INDEX'',''(INDEX''),'' '',''''),''CHARINDEX'',''''),''PATINDEX'',''''),''charindex'',''''),''patindex'','''') as text
from sys.sql_modules sm
left join sys.objects o on o.object_id=sm.object_id
where o.type in (''AF'',''FN'',''P'',''IF'',''FS'',''FT'',''PC'',''RF'',''TA'',''TF'',''TR'',''V'',''X'') '
 
select * 
from #tmp1 t
where t.text like '%(Index(%' or t.text like '%(Index=%' 
order by t.name
 
drop table #tmp1

 

Sorgu sonucunda içinde Index Force kullanılmış object’lere erişmiş olacağız.

 

İ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


Bildiğiniz gibi SQL Server’ın response vermediği durumlarda troubleshooting amacıyla DAC ile bağlantı kurulabilir. Daha önce bu konuyla ilgili bir yazı yazmıştım.

Bugünkü yazımda aktif bir DAC connection’ı olup olmadığınının script ile nasıl sorgulanacağını göreceğiz.

[more]

Aynı anda bir tane DAC connection’ı kurulabilir. Dolayısıyla bir DAC connection kurmadan önce hali hazırda kurulmuş bir DAC connection’ı var mı diye bakmamız gerekebilir.

Aşağıdaki script ile Server üzerinde bir DAC connection kurulmuş mu diye sorgulayabiliriz.

SELECT es.session_id  
FROM sys.tcp_endpoints ep 
JOIN sys. dm_exec_sessions as es ON ep.endpoint_id = es.endpoint_id 
WHERE ep.name='Dedicated Admin Connection'

Eğer bir DAC connection varsa sorgu bu connection’ın session id’sini verecektir.

Eğer herhangi bir aktif DAC connection’ı yoksa sorgu sonucu boş gelecektir.

 

İ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


Bir önceki yazımda SQL Server 2011 “Denali” gelen çok önemli özelliklerden biri olan Contained Database mantığından bahsetmiştim. Bugünkü yazımda ise Database Engine’den izole bir Contained Database user’ı nasıl create edebileceğimizi ve kullanabileceğimizi görüyor olacağız.

[more]

Contained Database’in ne olduğunu tekrar hatırlatmak gerekirse; Contained Database  database’in tanımlanması için gerekli olan bütün metadata bilgilerini ve database özelliklerini kendi üzerinde tutar. Bu tarz database’lerde login’ler database engine level’ında authenticate olmazlar. User bilgileri istenirse şifresi ile birlikte database içerisinde saklanır. Bu şekilde database engine’den izole edilmiş olan database, server’lar arasında çok rahat bir şekilde taşınır ve ekstra yapılacak işlem sayısı çok aza indirilir.

Contained Database User Oluşturma

Contained Database’lerde user create etme ekranında diğer database’lerden farklı olarak “SQL User with password” seçeneği bulunmaktadır. Bu seçenek vasıtasıyla database engine’den bağımsız ve authentication’ı database’in yapacağı bir user create etmiş oluruz.

image_15

Aynı işlemi T-SQL ile şu şekilde yapabiliriz.

USE [SampleDB1]
GO
CREATE USER [CDBUser1] WITH PASSWORD=N'Abc12345'
GO

 

Contained Database User ile Connection Kurma

Contained Database User’lar database engine seviyesinde değil database seviyesinde tanımlanırlar dedik. Yani bu user’lar sadece tanımlandıkları database’e bağlantı kurabilirler. Dolayısıyla SSMS ile bağlantı kurarken Connect To Database kısmında ilgili database’in seçilmesi gerekmektedir yoksa bağlantı kurulamaz. Aşağıdaki resimlerde connection’ın nasıl kurabileceğini görebilirsiniz.

image_16

image_17

Bugünkü yazımızda database engine’den bağımsız bir contained database user’ın nasıl oluşturulabileceğini gördük. Tekrar not düşmek gerekirse bu database’i başka bir server’a taşıdığınızda herhangi bir user create’i yapmadan direk bu user’la bağlanabilmeniz mümkün.

 

İ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