Recent comments

İç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-2011
Takvim
<<  May 2012  >>
MoTuWeThFrSaSu
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
Keywords

SQL Server’da bulunan Auto Growth (Otomatik Büyüme) özelliği sayesinde veritabanı dosyaları dolduğunda sistem tarafından otomatik olarak büyütülmektedir. Bu büyüme oransal ya da boyutsal olarak daha önceden belirlenebilir. Aynı zamanda dosyaların en fazla hangi boyuta kadar büyüyebileceği de ayarlanabilir.

More...

turgay sahtiyan , 14. February 2012, 08:00

SQL Server page’lerdeki hataları ve bu hatalardan kaynaklı tamamlanamayan I/O işlemlerini loglamak için Page Verify özelliğini kullanılmaktadır. Page Verify özelliği None, TornPageDetection ve Checsum değerlerini alabilmektedir. Bu yazımda bu seçeneklerin neler olduklarını ve best practice olarak hangi seçeneğin seçilmesi gerektiğini inceliyor olacağız.

More...

SQL Server 2011 Denali ile gelen yeni DMV’lerden biri sys.dm_os_volume_stats DMV’si. Bu DMV ile data ve log file’larının bulunduğu sürücülerin toplam alan, boş alan gibi bilgilerinin öğrenilmesi mümkün.

More...

SQL Server’da bulunan Auto Growth (Otomatik Büyüme) özelliği sayesinde veritabanı dosyaları dolduğunda sistem tarafından otomatik olarak büyütülmektedir. Bu büyüme oransal ya da boyutsal olarak daha önceden belirlenebilir. Aynı zamanda dosyaların en fazla hangi boyuta kadar büyüyebileceği de ayarlanabilir.

Auto Growth işlemi diskte yeni bir alan allocate edilmesinden dolayı kaynak tüketimi fazla olan bir operasyondur. Büyümenin boyutlarına göre bazı durumlarda bu büyüme işlemi 1-5 saniye arasında sürebilir. Büyüme tamamlanana kadar da ilgili dosyaya gelen okuma ve yazma istekleri bekletilecek bu da performans sıkıntısı olarak dönecektir.

More...

SQL Server Magazine’in Ocak 2011 sayısında Paul Randal’ın üzerinde durduğu, bir database’i aynı server üzerinde yeni bir lokasyona taşımanın güvenli yolu yöntemini, bu yazıyı okuduğumdan beri ben de sıklıkla kullanmaktayım. Bugün size bu yöntemin adımlarını gösteriyor olacağım.

More...

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...

SQL Server 2011 “Denali” ile gelen çok güzel özelliklerden biride Contained Database mantığı. Contained Database ile database engine’den izole edilmiş bir database oluşturabilir ve instance’lar arasında sıkıntısız bir şekilde taşıma işlemi gerçekleştirebiliriz.

More...

Bildiğiniz gibi Autogrowth özelliği aktif olan DB’lerde ihtiyaç olduğunda diskten yeni bir alan allocate edilir ve mdf-ndf dosya boyutunda bir artış olur. Allocate edilen bu alandan SQL Server gerekli gördüğü yeri reserved eder ve bu alandan da kullanılmayan alan olabilir.

Yani toparlayacak olursak File Allocation- Reserved Size – Unused size olmak üzere 3 farklı boyuttan bahsetmemiz mümkündür. File boyutu olarak 10 GB yer kaplayan bir DB aslında bu 10 GB’ın belkide sadece 3 GB ını rezerve etmiştir ve bu 3GB ın da 1 GB’ı belkide unused dır. Dolayısıyla diskten gereksiz bir kullanım söz konusudur ve bu durum analiz edilerek shrink vasıtasıyla DB nin boyutunun düşürülmesi çözümüne gidebilir.

Bugünkü yazımda bir server da bulunan bütün DB’lerin File Allocation- Reserved Size – Unused size bilgilerini sorgulayabileceğimiz script üzerinde duracağız.

More...

Bu sıralar suspect duruma düşmüş DB’lerin nasıl kurtarılabileceği üzerine oldukça fazla soru görmekteyim. Bu konu üzerine Paul Randal’ın yazdığı aşağıdaki yazıyı paylaşmak istiyorum.

Not olarak şunu düşmek istiyorum ki, eğer bir database suspect durumdaysa sakın detach etmeyin, yoksa bir daha attach etme şansınız olmayabilir.

http://sqlskills.com/blogs/paul/post/TechEd-Demo-Creating-detaching-re-attaching-and-fixing-a-suspect-database.aspx

 

İyi çalışmalar

Turgay Sahtiyan

Dünkü makalemde IO DMV lerine giriş yapmış ve sys.dm_io_virtual_file_stats DMV si ile disk response time ları nasıl monitor edebileceğimizi görmüştük. Bugün ise pending yani bekleme statüsünde olan IO isteklerini anlık olarak nasıl sorgulayabileceğimizi görüyor olacağız.

More...

SQL Server performance analizi yaparken ilk kontrol edilmesi gereken noktalardan biride disk response time lardır. Disk Response Time, SQL Server isteğine disk’in ne kadar gecikmeli olarak cevap verdiğini gösteren bir ifadedir. SQL Server açısından best practise olarak read response değerinin 10ms nin altında olması arzu edilen bir durumdur.

Bugünkü konumuz olan sys.dm_io_virtual_file_stats DMV si ile DB lerin I/O istatistiklerinin ve response time larının nasıl inceleneceğini görüyor olacağız.

More...

SQL Server ın bazı özellikleri database seviyesindedir. Bu özelliklerden bazıları Edition özellikleridir ve başka bir editionda kullanılamaz. Örneğin partitioning özelliği Enterprise ve Developer Edition’larda kullanılabilir ve eğer bu özelliği içeren bir database başka bir edition’daki server’a taşınırsa bu özellik kullanılamaz hale gelecektir.

Bugünkü yazımda X bir database’in bu özelliklerden herhangi birini kullanıp kullanmadığını sys.dm_db_persisted_sku_features DMV’si ile nasıl sorgulanacağına bakıyor olacağız.

More...

Bu makalemde sizlere küçük batch size’lı DML komutları çalıştırılmasını anlatacağım.

Örneğin bir tablomuz var ve 1 milyon kayıt içeriyor, bunun tamamını delete veya update etmemiz durumunda çok gereksiz bir transaction log üretimi yapılır. Delete için truncate kullanabiliriz fakat bununda loglanmayacağı gerçeğini unutmamak lazım. Bunun için kayıtların tamamını silmek yerine belirli miktarlarda bir kaç kere delete çalıştırabiliriz.

More...

SQL Server DBA olarak ana görevlerimizden biride veritabanlarımızın periyodik olarak mantıksal ve fiziksel bütünlüklerini kontrol etmektir. Bugünkü yazımda CHECKDB, CHECKALLOC ve CHECKTABLE DBCC komutlarını kullanarak bu kontrollerin nasıl yapılacağını işliyor olacağız.

CHECKDB en kapsamlı check işlemidir ve CHECKALLOC,CHECKTABLE komutlarının yaptığı kontrolleri de içermektedir. Dolayısıyla sisteminizde CHECKDB çalıştırdıysanız ayriyeten CHECKALLOC ve CHECKTABLE çalıştırmanıza gerek yoktur.

More...

SQL Server da mdf,ndf ve ldf olmak üzere 3 çeşit file tipi bulunmaktadır. MDF file lar primary file ları ifade iderken, NDF DB lerdeki secondary file ları ifade etmektedir. Log file larının uzandıları ise LDF dir. Her ne kadar bu extensionların kullanılması önerilsede SQL Server extension kontrolu yapmamaktadır. Yani proddata.turgay diye bir primary datanız olabilir.

Bugünkü yazımda bu file ların özelliklerini kontrol edebileceğiniz bir sistem fonksiyonundan, FILEPROPERTY den bahsediyor olacağım. Bu fonksiyon ile bir DB nin file ının Readonly olup olmadığını, Log mu data file ımı olup olmadığını ve ne kadar dolu olduğunu sorgulayabilirsiniz.

More...

SQL Server da Mirroring yapılan server lar arasında otomatik olarak heartbeat kontrolu bulunmaktadır. Principal server belirli aralıklarla mirroring server ı ping eder ve eğer cevap alamazsa bununla alakalı hata mesajı döndürür.

Otomatik olarak yapılacak bu heartbeat kontrolü için default bir frequency değeri vardır. Bu değer default olarak 10 sn dir ve principal server 10 sn de bir mirroring server a ping yaparak ayakta olup olmadığını kontrol eder.

Çok yoğun transaction alan DB lerde 10 sn lik bu değer yetmemekte ve Event Viewer a aşağıdaki TimeOut hatası düşmektedir.

The mirroring connection to "TCP://ServerName.DomainName:5022" has timed out for database "DBName" after 10 seconds without a response. Check the service and network connections.

Yapılması gereken işlem default 10 sn olan Partner Timeout değerini arttırmaktır.

Aşağıdaki script MyDB veritabanı için Partner Timeout değerini 60 sn ye set eder.

ALTER DATABASE MyDB SET PARTNER TIMEOUT 40

 

İyi çalışmalar

Turgay Sahtiyan

SQL Server 2008 de Snapshot kullanımını konu alan bu video da şu ana başlıklar dikkate alınmıştır.

  • Snapshot nedir?
  • Hangi amaçla kullanılabilir?
  • Nasıl çalışır?
  • Dikkat edilmesi gereken noktalar
  • Örnekler

Snapshot create kodu;

CREATE DATABASE AdventureWorks_dbss ON
( NAME = AdventureWorks_Data, FILENAME = 'd:\Snapshot\AdventureWorks_data.ss' )
AS SNAPSHOT OF AdventureWorks;
GO


Snapshot tan DB restore kodu

restore database AdventureWorks from database_snapshot='AdventureWorks_dbss'

 

İyi seyirler

SQL Server 2008 de Snapshot Kullanımı from Turgay Sahtiyan on Vimeo.

Bu yazımda bir database in collation ın nasıl değiştirileceğini anlatıyor olacağım. Bu işleme başlamadan önce ilk olarak genel hatlarıyla collation nedir diye bakalım.

Collation, SQL Server da character set anlamına gelmektedir. Eşitliklerde, order işleminde, büyük küçük harf ayrımında karakterlerin hangi mantıkta kullanılacağını belirler.

Örneğin genelde Türkçe database lerde kullanılan TURKISH_CI_AS collation ında ki CI ifadesi Case Insensitive(Büyük küçük harf ayrımı olmasın) anlamına gelmektedir.

Collation ın ne şekilde bir fark oluşturduğunu görmek için aşağıdaki örneklere bakalım.

if upper('filiz') = 'FİLİZ' collate Turkish_CI_AS select 'eşit' else select 'eşit deðil'
if upper('filiz') = 'FILIZ' collate Turkish_CI_AS select 'eşit' else select 'eşit deðil'
if upper('filiz') = 'FİLİZ' collate SQL_Latin1_General_CP1_CI_AS select 'eşit' else select 'eşit değil'
if upper('filiz') = 'FILIZ' collate SQL_Latin1_General_CP1_CI_AS select 'eşit' else select 'eşit değil'

 

Gördüğünüz gibi Türkçe de I ve i birbirinden farklı 2 karakter iken ingilizce de bu 2 karakter birbirinin aynısıdır.

SQL Server da 3 level da collation verilebilmektedir.

  • Server Collation
  • Database Collation
  • Column Collation
  • Expression Collation

Server ın collation ın ne olduğuna bakmak için aşağıdaki script i kullanabilirsiniz.

SELECT SERVERPROPERTY('collation')

 

Yada SSMS üzerinden Server>>Properties ekranından bakabilirsiniz.

image

Database collation ınlarına sys.databases system table ından bakabilirsiniz.

select collation_name,* from sys.databases

 

Yada SSMS üzerinden Database>>Properties ekranından bakabilirsiniz.

image

Bu ön bilgilerden sonra şimdi DB collation nasıl değiştirelir konumuza geri dönelim.

İlk olarak şunu sorgulamak gerekiyor. Bir DB nin collation ınını niye değiştirmek zorunda olalım.

Örneğin Server collation ını Turkish_CI_AS olsun, bununla beraber TempDB collation ınada Turkish_CI_AS olduğunu düşünelim. İşlem yapmak istediğimiz DB de SQL_Latin1_General_CP1254_CI_AS olsun.

Bu DB üzerinde TempDB kullanacak herhangi bir sorgu çalıştırdığımızda (Where clause, order vb) script aşağıdaki hatayı verecektir.

Select *
from dbo.Table1 t1, dbo.Table2 t2
where t1.Column1 = t2.Column2

 

Msg 468, Level 16, State 9, Procedure ET_Update_Corporate_Customer_Limits, Line 41
Cannot resolve the collation conflict between "Turkish_CI_AS" and "SQL_Latin1_General_CP1254_CI_AS" in the equal to operation.

Where clause collation key i kullanarak bu hatayı aşmak mümkün.

Select *
from dbo.Table1 t1, dbo.Table2 t2
where t1.Column1 COLLATE TURKISH_CI_AS = t2.Column2 COLLATE TURKISH_CI_AS

 

Ama böyle bir kullanım bütün query lerde değişiklik yapmak gerektiğinden pek kullanışlıu değildir. Ayrıca bu kullanımda table scan yapıldığından dolayı performans olarakta tavsiye edilmez.

Dolayısıyla bizim ihtiyacımız olan DB nin collation ını değiştirmektir.

Eğer column bazında collation kullanılmadıysa aşağıdaki script i uygulamanız collation ı değiştirmek için yeterlidir.

ALTER DATABASE SampleDB COLLATE TURKISH_CI_AS

 

Lakin eğer column collation kullanıldıysa iş biraz daha karmaşık hale gelmektedir. Yapılması gereken adımlar sırayla aşağıdaki gibidir.

  1. Constraint leri drop et
  2. Index leri drop et
  3. DB nin collation ını değiştir.
  4. Column collation ları değiştir. Alter column
  5. Index leri create et
  6. Constraint leri create et.

Şimdi bu işlemleri hızlıca nasıl yaparız bunu görüyor olacağız.

1.Constraint Drop

Constraint leri drop etmeden önce daha sonra create edebilmek için sistemde ki constraint lerin create scriptleri generate etmemiz gerekiyor.

Bunun için daha önce yazmış olduğum Constraint ler için DROP ve CREATE DDL Scriptleri Generate Etme makalesinde ki SP yi kullanacağız.

Bu SP yi kullanarak aşağıdaki script aracılığıyla constrate create scriptlerini generate ediyoruz.

Use SampleDB
GO
create table #CreateScripts (ID INT , Constraint_Type VARCHAR(100), SQL VARCHAR(8000), Column_Name SYSNAME DEFAULT '')

declare @TableName sysname
declare curs cursor for
select name from sys.objects where type='U'
open curs
fetch next from curs into @TableName
while (@@fetch_status = 0)
begin
  insert #CreateScripts 
     EXEC usp_Create_Table_DDLs @sTable_Name = @TableName, @Create_Table_Ind = 0, @PK_Ind = 1, @FK_Ind = 1, @Check_Ind = 1, @Default_Ind = 1 
fetch next from curs into @TableName
end
close curs
deallocate curs

declare @sql varchar(max)=''
select @sql+=sql+char(10) from #CreateScripts
print @sql

drop table #CreateScripts

 

Messages kısmındaki sonlara doğru Alter ile başlayan satırların tamamını alıp kaydedin. Daha sonra bu scriptler ile constraint leri tekrar create edeceğiz.

Evet şimdi constraint leri drop edebiliriz. Bunun için aşağıdaki script i execute ediniz.

use SampleDB
declare @sql varchar(max)=''
select @sql+='ALTER TABLE ['+tab.name+'] DROP CONSTRAINT ['+cons.name+']; '+char(10)
from sys.objects cons,sys.objects tab
where cons.type in ('C', 'F', 'PK', 'UQ', 'D')
and cons.parent_object_id=tab.object_id and tab.type='U'
order by cons.type
exec(@sql)

 

2.Index Drop

Constraint te yaptığımız gibi Index te de drop etmeden önce generate scriptleri hazırlamamız gerekiyor ki daha sonra create edebilelim. Create script generate için aşağıdaki script i kullanabilirsiniz.

DECLARE @TabName varchar(100)=NULL
DECLARE @tableName varchar(100)
DECLARE TCur CURSOR FOR
SELECT '['+SCHEMA_NAME(t.schema_id)+'].['+t.name+']' FROM sys.tables t WHERE exists(SELECT TOP 1 1 FROM sys.indexes WHERE object_id=t.object_id and index_id>0)
AND (t.object_id=OBJECT_ID(@TabName) OR @TabName is null)
OPEN TCur
FETCH FROM TCur INTO @tableName
WHILE @@FETCH_STATUS=0
BEGIN
      DECLARE  ICur CURSOR FOR
      SELECT name,is_primary_key from sys.indexes i WHERE  exists(SELECT TOP 1 1 FROM sys.index_columns ic
      WHERE i.object_id=ic.object_id and i.index_id=ic.index_id) and
      i.object_id=OBJECT_ID(@tableName)
      OPEN ICur
      DECLARE @IName VARCHAR(100),@IsPK BIT,@SQL VARCHAR(MAX),@CName varchar(100),@is_descending_key bit
      FETCH FROM ICur INTO @IName,@IsPK
      WHILE @@FETCH_STATUS=0
      BEGIN
            IF(@IsPK=1)
            BEGIN
                  SET @SQL='ALTER TABLE '+@tableName+' ADD PRIMARY KEY'+CHAR(10)+'('+CHAR(10)
                  DECLARE CCur CURSOR FOR
                  SELECT COL_NAME(i.object_id,ic.column_id),ic.is_descending_key FROM sys.indexes i inner join sys.index_columns ic
                  ON i.object_id=ic.object_id and i.index_id=ic.index_id
                  WHERE i.object_id=OBJECT_ID(@tableName) and i.name=@IName
                  OPEN CCur
                  FETCH FROM CCur INTO @CName,@is_descending_key
                  SET @SQL+='['+@CName+'] '+CASE WHEN @is_descending_key=0 THEN 'ASC' ELSE 'DESC' END+CHAR(10) 
                  FETCH NEXT FROM CCur INTO @CName,@is_descending_key
                  WHILE @@FETCH_STATUS=0
                  BEGIN
                        SET @SQL+=',['+@CName+'] '+CASE WHEN @is_descending_key=0 THEN 'ASC' ELSE 'DESC' END+CHAR(10)     
                        FETCH NEXT FROM CCur INTO @CName,@is_descending_key
                  END
                  CLOSE CCur
                  DEALLOCATE CCur
                  SET @SQL+=');'
                  PRINT @SQL
            END
            ELSE
            BEGIN 
                  SET @SQL='CREATE '+(SELECT  type_desc FROM sys.indexes WHERE object_id=OBJECT_ID(@tableName) and name=@IName)+' INDEX ['+@IName+'] ON '+@tableName+CHAR(10)+'('+CHAR(10)
                  DECLARE CCur CURSOR FOR
                  SELECT COL_NAME(i.object_id,ic.column_id),ic.is_descending_key FROM sys.indexes i inner join sys.index_columns ic
                  ON i.object_id=ic.object_id and i.index_id=ic.index_id
                  WHERE i.object_id=OBJECT_ID(@tableName) and i.name=@IName
                  OPEN CCur
                  FETCH FROM CCur INTO @CName,@is_descending_key
                  SET @SQL+='['+@CName+'] '+CASE WHEN @is_descending_key=0 THEN 'ASC' ELSE 'DESC' END+CHAR(10) 
                  FETCH NEXT FROM CCur INTO @CName,@is_descending_key
                  WHILE @@FETCH_STATUS=0
                  BEGIN
                        SET @SQL+=',['+@CName+'] '+CASE WHEN @is_descending_key=0 THEN 'ASC' ELSE 'DESC' END+CHAR(10)     
                        FETCH NEXT FROM CCur INTO @CName,@is_descending_key
                  END
                  CLOSE CCur
                  DEALLOCATE CCur
                  SET @SQL+=');'
                  PRINT @SQL
            END
            FETCH NEXT FROM ICur INTO @IName,@IsPK
      END
      CLOSE ICur
      DEALLOCATE ICur
      FETCH NEXT FROM TCur INTO @tableName
END
CLOSE TCur
DEALLOCATE TCur

 

Messages kısmındaki yazıları kopyalayıp kaydedelim. Daha sonra create index adımında bu create script ini kullanacağız.

Create script i hazır olduğuna göre artık index leri drop edebiliriz.

Bunun için aşağıdaki script i kullanabilirsiniz.

declare @str varchar(max)=''
select @str += 'DROP INDEX ['+i.name +'] ON ['+schema_name(t.schema_id)+'].['+t.name+']; '+CHAR(10)
from sys.indexes i
left join sys.objects t on t.object_id=i.object_id
where t.type='u' and i.index_id>0
exec(@str)

 

3.Change DB Collation

DB nin collation ını değiştirmek için aşağıdaki script i kullanabilirsiniz.

ALTER DATABASE SampleDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE SampleDB COLLATE TURKISH_CI_AS
ALTER DATABASE SampleDB SET MULTI_USER

 

4.Change Columns Collation

Bu adımda DB de default collation kullanmayan column ların collation ını değiştireceğiz. Hangi column ları değiştireceğimizi bulmak için aşağıdaki script i kullanabilirsiniz.

-------------------------------------------------------------
--- LM_ChangeCollation - Change collation in all tables
--- made by Luis Monteiro - ljmonteiro@eurociber.pt 
--- modified by wilfred van dijk - wvand@wilfredvandijk.nl
-------------------------------------------------------------
DECLARE @new_collation varchar(100)
DECLARE @debug bit
DECLARE
	@table sysname,
	@previous sysname,
	@column varchar(60),
	@type varchar(20),
	@legth varchar(4),
	@nullable varchar(8),
	@sql varchar(8000),
	@msg varchar(8000),
	@servercollation varchar(120)
/*
uncomment one of the following lines:
*/
set @new_collation = convert(sysname, databasepropertyex(DB_NAME(), 'collation'))
--- set @new_collation = convert(sysname, serverproperty('collation'))
/*
@debug = 0 to execute
*/
set @debug = 1
if @new_collation is null
begin
	print 'which collation?'
	goto einde
end

DECLARE C1 CURSOR FOR
select 'Table' = b.name,
	'Column' = a.name,
	'Type' = type_name(a.system_type_id),
	'Length' = a.max_length,
	'Nullable' = case when a.is_nullable = 0 then 'NOT NULL' else ' ' end
from sys.columns a
join sysobjects b on a.object_id = b.id
where b.xtype = 'U'
	and b.name not like 'dt%'
	and type_name(a.system_type_id) in ('char', 'varchar', 'text', 'nchar', 'nvarchar', 'ntext')
	and a.[collation_name] <> @new_collation
order by b.name,a.column_id

OPEN C1
FETCH NEXT
FROM C1
INTO @table,@column,@type,@legth,@nullable
set @previous = @table
WHILE @@FETCH_STATUS = 0
BEGIN
	if @table <> @previous print ''
	set @sql = 'ALTER TABLE ' + QUOTENAME(@table) + ' ALTER COLUMN ' + QUOTENAME(@column) + ' '
	set @sql = @sql + @type + '(' + @legth + ')' + ' COLLATE ' + @new_collation + ' ' + @nullable
	print @SQL
	if @debug = 0 
	begin
		begin try
			EXEC (@sql)
		end try
		begin catch
			print 'ERROR:' + ERROR_MESSAGE()
			print '' 
		end catch
	end
	set @previous = @table
FETCH NEXT
FROM C1
INTO @table,@column,@type,@legth,@nullable
END
CLOSE C1
DEALLOCATE C1
einde:

 

Bu script sonucununda çıkan alter script lerini kullanarak kolonları alter ederek collation larını değiştiriyoruz.


5.Constraint ReCreate

1 numaralı adımda oluşturduğumuz constraint create script ini kullanarak constraint leri tekrar create ediyoruz.


6. Index ReCreate

2 numaralı adımda oluşturduğumuz index create scriptini kullanarak index leri tekrar create ediyoruz.

Bu adımlardan sonra eğer hiç bir hata almadıysanız DB nin script i değişmiş olması gerekiyor. Kontrol etmek için 4 nolu adımdaki select işlemini tekrarlayabilirsiniz. Bu sorgu sonucunda kayıt dönmemesi gerekiyor.


İyi çalışmalar.

Turgay Sahtiyan


Kaynaklar:

DBA Mail Alert yazı dizisindeki 2. yazım Log Statslar üzerine. Bu SP vasıtasıyla hangi DB log unun ne kadar dolulukta olduğunu görebilir, belirtiğiniz orandan büyükleri schedule vasıtasıyla belirli aralıklarla mail attırabilirsiniz.

CREATE proc [LogStatsMailSP]
as
declare @CmpRate float
select @CmpRate = 70 --%70 den fazla kullanılan Log file ları monitor etmek

create table #SQLPerfLogS(DatabaseName varchar(100),LogSize varchar(100),LogUsed varchar(100)
,Status varchar(10));

insert into #SQLPerfLogS exec('dbcc sqlperf(logspace)')
select * from #SQLPerfLogS	

 

Diğer DBA Mail Alert lerle alakalı yazılarıma ulaşmak için aşağıdaki linkleri kullanabilirsiniz.

Database File Statistics

Log Stats

Long Running Queries

Disk Usage Report

 

İyi Çalışmalar




	

	

DBA lerin en önemli işlerinden biride serverları ı monitor etmektir. Database lerin doluluk durumları, Log file ların kullanım oranları, uzun süredir çalışan query ler yada data file ların bulunduğu disklerin durumunu takip etmek serverların availability lerini sağlamak için oldukça önemlidir.

Size bu konu üzerine yazmış olduğum 4 SP den bahsedeceğim. Bu SP ler için schedule ayarlayarak attıracağınız mailler ile server ların durumlarını monitör edebilirsiniz.Mail göndermek ile alakalı daha önceden yazmış olduğum yazımı okumanızı tavsiye ederim. Bu yazıma aşağıdaki linkten ulaşabilirsiniz.

http://www.turgaysahtiyan.com/post/SQL-Server-2008-den-Mail-Gonderme.aspx


İlk yazım Database File Statistic SP si. Yani verdiğiniz parametreden daha büyük doluluk oranlarına sahip olan DB leri monitör etmek.

Database File Statistic

CREATE proc [DatabaseFileStatsMailSP]
as
declare @Rparam int
select @Rparam = 70 --%70 den fazlası dolu olan DB leri mail atacağız.

 create table #TempGONDER(DatabaseName varchar(100),CurrentDataFileSizes int,CurrentDataSizes int,UnAllocatedDataSize int,UnAllocatedDataRate int,AllocatedDataRate int,HasDisableAutoGrowthFile tinyint,DataFileCount tinyint);
 EXEC sp_MSforeachdb '
 use ?;
 insert into #TempGonder
 select DatabaseName =DB_NAME(),
 CurrentDataFileSizes=(select SUM((size*8)/1024) from sys.database_files(nolock) where type=0),
 CurrentDataSizes=(SELECT     (SUM (reserved_page_count)*8)/1024  FROM sys.dm_db_partition_stats(nolock)),
 UnAllocatedDataSize=(select SUM((size*8)/1024) from sys.database_files(nolock) where type=0)-(SELECT     (SUM (reserved_page_count)*8)/1024  FROM sys.dm_db_partition_stats(nolock)),
 UnAllocatedDataRate=CONVERT(INT,(
 CONVERT(DECIMAL(10,2),(select SUM((size*8)/1024) from sys.database_files(nolock) where type=0)-(SELECT     (SUM (reserved_page_count)*8)/1024  FROM sys.dm_db_partition_stats(nolock)))/
 CONVERT(DECIMAL(10,2),(select SUM((size*8)/1024) from sys.database_files(nolock) where type=0))
 )*100),
 AllocatedDataRate=100-CONVERT(INT,(
 CONVERT(DECIMAL(10,2),(select SUM((size*8)/1024) from sys.database_files(nolock) where type=0)-(SELECT     (SUM (reserved_page_count)*8)/1024  FROM sys.dm_db_partition_stats(nolock)))/
 CONVERT(DECIMAL(10,2),(select SUM((size*8)/1024) from sys.database_files(nolock) where type=0))
 )*100),
 HasDisableAutoGrowthFile=(SELECT CASE WHEN EXISTS(select * from sys.database_files(nolock) where type=0 AND growth=0) THEN 1 ELSE 0 END),
 DataFileCount=(select count(1) from sys.database_files(nolock) where type=0)'
 
Select * FROM #TempGONDER WHERE DatabaseName not in ('master','model','msdb') 
and (HasDisableAutoGrowthFile=1 OR AllocatedDataRate>@Rparam)

 

Kolon adları ve açıklamalarından bahsetmek gerekirse;

DatabaseName Database in Adı
CurrentDataFileSizes DB File ının şu anki büyüklüğü
CurrentDataSizes DB nin gerçek büyüklüğü
UnAllocatedDataSize Boş alan boyutu
UnAllocatedDataRate Boş olan alanın DB File a oranı
AllocatedDataRate Dolu olu alanın DB File oranı
HasDisableAutoGrowthFile(*) DB nin Auto growth özelliği olmayan file ı var mı?
DataFileCount DB kaç data file dan oluşmakta.

(*) HasDisableAutoGrowthFile kolonundan ekstra olarak bahsetmek istiyorum. Eğer Data file ların auto growth ları boş ise ve file lar dolarsa otomatik olarak büyüyemeyecek ve database kullanılamaz hale gelecektir.

 

Diğer DBA Mail Alert lerle alakalı yazılarıma ulaşmak için aşağıdaki linkleri kullanabilirsiniz.

Database File Statistics

Log Stats

Long Running Queries

Disk Usage Report

 

İyi çalışmalar