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
<<  Aralık 2017  >>
PaSaÇaPeCuCuPa
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567
Keywords

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]

FILEPROPERTY sistem fonksiyonunun syntax ı aşağıdaki gibidir.

FILEPROPERTY (file_name ,property )

file_name parametresi ile hangi file ı kontrol edebileceğinizi belirtebilirsiniz. Property parametresinin alabileceği değerler anlamları aşağıdaki gibidir.

Parametre Adı

Açıklaması

IsReadOnly

File ın Readonly olup olmadığını döndürür. Dönen değer 1 ise Readonly, 0 ise Readonly değil manasına gelir.

IsPrimaryFile

File ın Primary File olup olmadığını döndürür. Dönen değer 1 ise Primary File, 0 ise Secondary File manasına gelir.

IsLogFile

File ın Log File ı olup olmadığını döndürür. Dönen değer 1 ise Log File, 0 ise Data File manasına gelir.

SpaceUsed

File ın ne kadarının dolu olduğunu döndürür.


Aşağıdaki sorgu ile AdventureWorks Database File larının ReadOnly, PrimaryFile, LogFile, SpaceUsed değerlerini sorgulayabilirsiniz.

use AdventureWorks

select f.fileid, f.name as LogicalFileName
	, f.filename as FileNameWithURL
	, FILEPROPERTY(f.name, 'IsReadOnly') as IsReadOnly
	, FILEPROPERTY(f.name, 'IsPrimaryFile') as IsPrimaryFile
	, FILEPROPERTY(f.name, 'IsLogFile') as IsLogFile
	, Round(cast(f.size*8 as float)/1024,2) as TotalSize_MB
	, Round(cast(FILEPROPERTY(f.name, 'SpaceUsed')*8 as float)/1024,2) as SpaceUsed_MB
	, Round(cast((f.size - FILEPROPERTY(f.name, 'SpaceUsed'))*8 as float)/1024,2) as FreeSpace_MB
from sys.sysfiles f
order by f.fileid

 

Sorgu sonucu şu tarz bir şey olacaktır.

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


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

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 Full Recovery Model de Transaction Log backup ı alınmadığı sürece Commit edilmemiş transaction lar log dosyasından silinmeyeceği için log dosyası plan dışı büyüyüp DB yi erişilmez duruma getirebilir. Bu yüzden Production ortamından Test ortamlarına DB aktarımı yaptıktan sonra Recovery Model lerini Full da bırakmamak gerekir.

Aşağıdaki script ile instance da bulunan bütün DB lerin Recovery Modellerini Simple yapabilirsiniz.

declare @SQL varchar(max)=''
select @SQL+='ALTER DATABASE '+name+' SET RECOVERY SIMPLE;'+CHAR(10) 
from sys.databases 
where recovery_model_desc!='SIMPLE'
exec(@SQL)

 

İ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 Data Collector collection setlerinden Query Statistics server larımdan birinde aşağıdaki hatayı vermekteydi.

SSIS error. Component name: DFT - Create Interesting Queries Upload Batch, Code: -1073450982, Subcomponent: SSIS.Pipeline, Description: component "ODS - Get current snapshot of dm_exec_query_stats" (16412) failed the pre-execute phase and returned error code 0xC0202009.

[more]

Hata ile alakalı google da arama yaptığımda aşağıdaki KB article a eriştim.

http://support.microsoft.com/kb/975915

Gerçekten de makaledeki script i server ımda uyguladığımda “arithmetic overflow” hatası gelmekte.

Microsoft bu hatanın giderilmesi için Cumulative Update 5 in yapılması gerektiğini söylemekte. Benim daha yapmaya fırsatım olmadı, belki siz o cesareti bulur yaparsınız :)

 

Ekleme (18.08.2010) : Bu hatanın unsupported çözümü için lütfen aşağıdaki makaleye bakınız.

http://www.turgaysahtiyan.com/post/SQL-Server-Data-Collector-Query-Statistisc-Collection-Set-indeki-Hatanc4b1n-Cozumu.aspx

 

İ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 Data Collector ın rutin izlemelerim sırasında bütün server larımda birden down olduğunu gördüm. 4 Collection setim inde job ları aşağıdaki hatayı vererek işlemleri sonlandırıyordu.

Executed as user: XXX\YYYYY. The step did not generate any output. Process Exit Code 5. The step failed.

[more]

image

Daha detaylı bakmak için execution log u sorguladığımda

use msdb
select * from syscollector_execution_log
where collection_set_id=1
order by start_time desc

 

aşağıdaki hata mesajına eriştim.

SSIS error. Component name: SQL - Get SnapshotID, Code: -1073548784, Subcomponent: Execute SQL Task, Description: Executing the query "{call core.sp_create_snapshot (?, ?, ?, ?, ?, ?)}" failed with the following error: "The specified @collector_type_uid (302E93D1-3424-4BE7-AA8E-84813ECF2419) is not valid in this data warehouse.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

Bu hata mesajıyla alakalı araştırma yapmaya devam ederken gün içinde SQL Server DataWarehouse DB sini temizlediğim aklıma geldi J Temizlik yaparken fazladan data silmiş olabileceğimi değerlendirdim.

Gerçekten de DataWarehouse yani dataların toplandığı DB de dbo.syscollector_collector_types tablosunu yanlışlıkla temizlediğimi gördüm. Oysaki burada data collection type larının bulunması gerekiyor. Ve bu tabloya SP de select çekerken boş değer döndüğü için hata alıyor.

Bu table ı doldurmak için Data Collector kurulu bir sistemden Insert sorgularını oluşturdum. Bu sorgularda aşağıdaki gibi.

insert core.supported_collector_types_internal    
	select '302E93D1-3424-4BE7-AA8E-84813ECF2419' 
insert core.supported_collector_types_internal    
	select '0E218CF8-ECB5-417B-B533-D851C0251271' 
insert core.supported_collector_types_internal    
	select '14AF3C12-38E6-4155-BD29-F33E7966BA23' 
insert core.supported_collector_types_internal    
	select '294605DD-21DE-40B2-B20F-F3E170EA1EC3'

 

Sizde aynı hatayla karşılaşırsanız DataWarehouse DB sinde yukarıdaki insert leri uygulamanız yeterli olacaktır.

 

İ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


Gün geçmiyorki SQL Server Data Collector ün bir hatasıyla daha karşılaşmayayım J

Bugünkü hatamız, Server Side Trace Collection set inin upload unda karşılaştığım aşağıdaki hata.

SSIS error. Component name: SQL - Get trace info, Code: -1073548535, Subcomponent: Execute SQL Task, Description: An error occurred while assigning a value to variable "TraceStartTime": "Single Row result set is specified, but no rows were returned.".

[more]

SQL Server Collector job larını rutin olarak izlediğim bir anda ServerSide Trace ile alakalı olan collection ın upload job ının hata verdiğini gördüm.

Aşağıdaki sorgu ile hata detayını sorguladığımda;

select failure_message,* from syscollector_execution_log 
where collection_set_id=4 
order by start_time desc

 

failure_message kısmında aşağıda hataya eriştim.

SSIS error. Component name: SQL - Get trace info, Code: -1073548535, Subcomponent: Execute SQL Task, Description: An error occurred while assigning a value to variable "TraceStartTime": "Single Row result set is specified, but no rows were returned.".

İlk bakışta da anlayacağınız gibi hata SSIS paketi ile alakalı. Data Collector collection setler için SSIS paketi kullanmakta ve demekki bu hata bu paketlerden birinden gelmekte. Bizim hatamız Server Side Trace Colletion set inin upload unda olduğu için bu paketi server da bulup içini incelemeye koyuluyoruz.

res1

Hata detayında task Result set inin Single Row olduğu sonucuna varıyoruz. Aynı zamanda bu task ta TraceStartTime variable ı var. Bu 2 ipucunu kullanarak hata veren task ın SQL – Get Trace Info olduğu sonucuna varıyoruz. Bu Task ın detayını incelediğimizde

res2

Dikkatimizi hemen SQL Statement çekiyor. Demek ki bu statement çalıştığında sonuç döndüremiyor ve task failure oluyor. O zaman sıradaki işlemimiz bu statement daki SP yi yani dbo.sp_syscollector_get_trace_info SP sini incelemek.

SP oldukça basit.

CREATE PROCEDURE [dbo].[sp_syscollector_get_trace_info]  
    @trace_path  nvarchar(512),  
    @use_default int  
AS  
BEGIN  
    SELECT   
        CONVERT(nvarchar(30), t.start_time, 126) as start_time,  
        CASE t.status   
            WHEN 1 THEN 1   
            ELSE 0   
        END AS is_running,   
        ISNULL(t.dropped_event_count,0) as dropped_event_count,  
        t.id  
    FROM sys.traces t  
    WHERE (@use_default=1 and t.is_default=1)  
          OR (@use_default=0 AND t.path LIKE (@trace_path + N'%.trc'))  
END

 

BU SP nin yaptığı gelen parametreler ile sys.traces i sorgulayıp eşleşen trace i yakalamak.

Benim case imde sys.traces sadece default trace i döndürmekteydi. Yani bu collection ın kullandığı yada kullanması gerektiği trace uçmuş :) Dolayısıyla SP nin sonucu task a boş gelmekte oda Single Row özelliğinden dolayı fail edip akabinde de job fail etmekte. Çok zincirleme oldu değil mi :)

Çözüm olarak Server Side trace tanımlama işlemini tekrar gerçekleştirdim. Şu anda herhangi bir problem vermeden çalışmakta.

Bir sonraki Data Collector hatasında görüşmek üzere :)

 

İ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 restore işlemi gerçekleşirken default backup klasörüne bir check point file ı create edilir. Bu create edilen checkpoint file ı rollback bilgilerini tutar. Eğer restore işlemi yarıda kalırsa bu checkpoint file ı kullanılarak rollback işlemi yapılır.

Default backup directory SQL Server kurulumunda set edilir ve default değeri genellikle <I style="mso-bidi-font-style: normal">T:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\şeklinde bir yerdir. Eğer bu diskin bulunduğu yeri değiştirirseniz restore işleminde operating system aşağıdaki hataları verebilir. [more]

Hata 1

During restore restart, an I/O error occurred on checkpoint file ´T:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\RestoreCheckpointDB47.CKP´ (operating system error 3(The system cannot find the path specified.)). The statement is proceeding but cannot be restarted. Ensure that a valid storage location exists for the checkpoint file.


Hata 2

The operating system returned the error ´3(The system cannot find the path specified.)´ while attempting ´DeleteFile´ on ´T:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\RestoreCheckpointDB47.CKP’


Bu hata default backup directory de set edilen folder ın bulunamamasından kaynaklanmaktır. Dolayısıyla folder ı yeni folder bilgisiyle değiştirmemiz gerekir.

Bu değişikliği yapmak için registery de HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\BackupDirectory bölümündeki value yu yeni backup directory si ile değiştirmemiz gerekmektedir. Bu değişikliği yapmamız yukarıda hataların çözümü için yeterli olacaktır.

image

 

İ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 Configuration da Awe Enabled olduğu durumda SQL Server Service Account unun Lock Pages In Memory de yetkili olması gerekmektedir. [more]

Awe Enabled olup olmadığını aşağıdaki sorgu ile bakabiliriz. Bu sorgu da Value kısmındaki 1 enabled, 0 disabled manasına gelmektedir.

sp_configure 'AWE Enabled'

 

SQL Server Service Account unun ne olduğuna SQL Server Configuration Manager dan bakabiliriz.

image

Eğer Awe Enabled ise ve Lock Pages in Memory de SQL Server Service Account u yetkili değilse aşağıdaki gibi bir hata mesajı alınabilir.

Address Windowing Extensions (AWE) requires the ´lock pages in memory´ privilege which is not currently present in the access token of the process.

Service Account unu Lock Pages in Memory de yetkilendirirseniz bu hata mesajını almıyor olacaksınızdır.

image

 

İ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


Hepinizin bildiği gibi SQL Server 2008 kurulumuyla beraber Jobs altına syspolicy_purge_history diye bir job açılmakta. Bu job ın tam olarak ne iş yaptığını öğrenmek için aşağıdaki linkteki dökümanı okuyabilirsiniz.

http://www.haidongji.com/2008/11/20/what-does-syspolicy_purge_history-job-do/

Kısaca bahsedecek olursak, gene SQL Server 2008 ile beraber gelmiş olan Policy Based Management uygulamasının topladığı history leri silmek için bu job kullanılır.

Bizim bugünkü konumuz ise syspolicy_purge_history job ının cluster ortamlarda verdiği hata. [more]

Uzun süre önce kurmuş olduğumuz SQL Server 2008 Cluster environment ımız kurduğumuz zamandan beri Node 1 de çalışmaktaydı. Geçenlerde source ların tamamını node 2 ye aldığık. O günden beri syspolicy_purge_history job ı aşağıdaki hatayı vermekte.

purge

Message
Executed as user: XXXXXXX. The job script encountered the following errors. These errors did not stop the script: A job step received an error at line 1 in a PowerShell script. The corresponding line is '(Get-Item SQLSERVER:\SQLPolicy\XXXXXXX \DEFAULT).EraseSystemHealthPhantomRecords()'. Correct the script and reschedule the job. The error information returned by PowerShell is: 'SQL Server PowerShell provider error: Could not connect to 'XXXXXXXX\DEFAULT'. [Failed to connect to server XXXXXXX. --> A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)] Failed to connect to server XXXXXXX. A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server) ' A job step received an error at line 1 in a PowerShell script. The corresponding line is '(Get-Item SQLSERVER:\SQLPolicy\XXXXXXXX\DEFAULT).EraseSystemHealthPhantomRecords()'. Correct the script and reschedule the job. The error information returned by PowerShell is: 'Cannot find path 'SQLSERVER:\SQLPolicy\XXXXXXX\DEFAULT' because it does not exist. ' A job step received an error at line 1 in a PowerShell script. The corresponding line is '(Get-Item SQLSERVER:\SQLPolicy\XXXXXXX\DEFAULT).EraseSystemHealthPhantomRecords()'. Correct the script and reschedule the job. The error information returned by PowerShell is: 'You cannot call a method on a null-valued expression. '. Process Exit Code -1. The step failed.


Hata ile alakalı internette araştırma yaptığımda aşağıdaki KB article a eriştim.

http://support.microsoft.com/?scid=kb;en-us;955726&x=9&y=10

Şimdi gelin Resolution kısmında bahsedilen adımları beraber yapalım.


Hata Çözümü

Hatanın çözümü için microsoft 2 metod sunmakta.

Çözüm 1 - syspolicy_purge_history nin Özelliklerini Düzeltme

  1. SQL Server Agent >> Jobs >> syspolicy_purge_history >> Properties ekranını açalım. 
    purge2
  2. Steps kısmına geçelim 
    purge3
  3. Erase Phantom System Health Record satırını seçip Edit e basalım. 
    purge4
  4. Node un adının yazdığı yeri Cluster Virtual Name ile değiştirelim. Benim örneğimde SAHTIYAN_T kısmı MyCluster ile değiştirildi.
  5. Ok ve Close e basarak ekranlardan çıkalım.

 

Çözüm 2 - syspolicy_purge_history yi Tekrar Create Etme

Bunun için aşağıdaki script i çalıştırmanız yeterli olacaktır.

DECLARE @jobId uniqueidentifier

-- Obtain the current job identifier that is associated with the PurgeHistory
SELECT @jobId = CAST(current_value AS uniqueidentifier)
FROM msdb.dbo.syspolicy_configuration_internal
WHERE name = N'PurgeHistoryJobGuid'

-- Delete the job identifier association in the syspolicy configuration

DELETE FROM msdb.dbo.syspolicy_configuration_internal
WHERE name = N'PurgeHistoryJobGuid'

-- Delete the offending job
EXEC msdb.dbo.sp_delete_job @job_id = @jobId

-- Re-create the job and its association in the syspolicy configuration table
EXEC msdb.dbo.sp_syspolicy_create_purge_job

 


Sonuç

Çözüm yöntemlerinden herhangi birini uygulayıp job ı elle tetiklediğinizde problemsiz olarak çalıştığını göreceksiniz.

İ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 yazdığımız bir user defined function(UDF) da NewID() yada Rand() gibi system function larını kullandığımızda aşağıdaki gibi bir hata alırız.

Msg 443, Level 16, State 1, Procedure denemez, Line 4
Invalid use of side-effecting or time-dependent operator in 'newid' within a function.

Bugünkü yazımda bu hatanın sebebine, nasıl çözüm sağlayacağımıza ve NonDeterministic-Deterministic function ayrımına değiniyor olacağım.

[more]


Nedir bu Deterministic ve NonDeterministic Function ?

SQL Server da Function lar NonDeterministic ve Deterministic olarak 2 ye ayrılmaktadır.

Deterministic Function lar aynı parametre ile her çağrıldıklarında aynı değeri döndürürler. Örneğin aşağıdaki fonksiyon “kucuka” parametresiyle her çağırılışında aynı sonuç olan “BUYUKA” sonucunu döndürür. Dolayısıyla UPPER() bir deterministic function dır.

select UPPER('kucuka')

 

Non-Deterministic Function lar ise her çağırıldıklarında farklı bir sonuç döndürür. Örneğin NewID() sistem fonksiyonu her çağırılışında farklı bir Unique-Identifier döndürür.

select NewID()

 

SQL Server da bulunan bazı Non-Deterministic Function lar aşağıdaki gibidir.

  • GETDATE
  • GETUTCDATE
  • NEWID
  • RAND
  • NEWSEQUENTIALID
  • TEXTPTR
  • @@MAX_CONNECTIONS
  • @@CONNECTIONS
  • @@TOTAL_ERRORS

 

Konuyla ilgili BOL linkine aşağıdan erişebilirsiniz.
http://msdn.microsoft.com/en-us/library/ms178091.aspx 


User Defined Function larda Non-Deterministic Function Kullanımı

SQL Server da UDF lerde Non-Deterministic Function kullanımında bazı kısıtlamalar bulunmaktadır.

SQL Server 2000 de hiç bir Non-Deterministic function UDF lerde kullanılamazken, SQL Server 2005 ile bazıları artık UDF lerde kullanılabilmektedir.

Örneğin NewID() ve Rand() fonksiyonlarını UDF de kullanmak istediğimizde aşağıdaki gibi bir hata ile karşılaşırız.

create function GetNewID ()
returns uniqueidentifier
as begin
  return newID()
end

 

Msg 443, Level 16, State 1, Procedure GetNewID, Line 5
Invalid use of a side-effecting operator 'newid' within a function.


Peki çözümümüz ne olacak?


User Defined Function larda NewID() ve Rand() Non-Deterministic Function larının Kullanımı

Yukarıda da bahsettiğimiz gibi NewID() ve Rand() function ları UDF de kullanılamaz. Ufak bir trick ile View kullanarak bu kısıtlamayı aşmamız mümkün.

create view SelectNewID
as
  select newID() as ni

GO

create function GetNewID ()
returns uniqueidentifier
as begin
  declare @ui uniqueidentifier
  select @ui=ni from SelectNewId
  return @ui
end

GO

select dbo.GetNewID()
GO

 

Artık gönül rahatlığıyla UDF lerde Non-Deterministic Function kullabilirsiniz. :)

 

İ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


Bugün size bir çoğumuzun bilip hali hazırda kullanmakta olduğunu düşündüğüm bir konudan bahsetmek istiyorum. Belki hala bu özelliği kullanmayan vardır diyerek konuya giriyorum.

Bugünkü konumuz SQL Server Management Studio Object Explorer da bulunan filter özelliği.

[more]

Object Explorer filter özelliği, DB objeleri üzerinde çalışırken objeleri daha rahat bulmaya yarayan bir Management Studio özelliğidir.

Örneğin bir production DB nizde 10 bin den fazla table var ve siz table listesinden bir table a erişmek istiyorsunuz.

Zaten hali hazırda bu listeyi görüntüleyebilmek bile her makinanın harcı değilken birde bu listeden table ı bulmaya çalıştığınızı düşünün.

image

Object Explorer filter özelliği ile table listesinde ada yada schema adına göre filtreleme yaparak sorgu sonucunu kısaltıp erişmek istediğiniz objeye daha hızlı erişebilirsiniz.

Örneğin AdventureWorks DB sinde Production.Location tablo suna filter özelliği ile hızlıca erişmek istiyorum.

Bunun için Object Explorer da Tables node unda sağ tuşa tıklayıp Filter >> Filter Settings kısmına geçiyoruz.

image

Gelen ekranda aşağıdaki bilgiler ile arama yada filtreleme yapabiliyoruz.

  • Name – Aranan objenin adına göre filtreleme. Equal(Eşit), Contains(İçeren) yada Does Not Contain (İçermeyen) parametreleri ile sorgulama yapılabilmekte.
  • Schema – Aranan objenin schema adına göre filtreleme. Equal(Eşit), Contains(İçeren) yada Does Not Contain (İçermeyen) parametreleri ile sorgulama yapılabilmekte.
  • Owner – Aranan objenin owner ına göre filtreleme. Equal(Eşit) yada Does Not Contain (İçermeyen) parametreleri ile sorgulama yapılabilmekte.
  • Creation Date – Arana objenin oluşturulma tarihine göre filtreleme.

Biz örneğimizde Production.Location table ını arıyoruz. Bunun için filter ekranını aşağıdaki gibi dolduruyoruz.

image

Daha sonra Ok e bastığımızda table kısmını filterelemiş ve obje mize eriştiğimizi göreceğiz.

image

Yapılmış olan filtreyi Sağ tık ta açılan pencereden Filter >> Remove Filter dan kaldırabiliriz.

image

Basit ama önemli bir upucu olduğunu düşünüyorum.

Bu tarz filtreleme işlemlerinin Table, View, Stored Procedure, Function gibi objelerin tamamında uygulanabildiğini not düşerek yazıma son veriyorum.

 

İ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 2008 Management Studio da bir table ın tanımlamasında değişiklik yaptığınızda aşağıdaki gibi bir hata ile karşılaşabilirsiniz.

Saving changes is not permitted because the changes you have made require the listed tables to be dropped and re-created.

[more]

untitled 

Bu hata table ın tanımlamasında aşağıdaki değişiklikler yapıldıktan sonra kaydetmeye çalıştığınızda ortaya çıkar.

  • Table ın sonuna değil ortalarına bir kolon eklendiğinde
  • Bir kolon kaldırıldığında
  • Kolon null olup olmaması özelliği değiştirildiğinde
  • Kolonların yeri değiştirildiğinde.
  • Kolon un data tipi değiştirildiğinde.

Bu hatadan kurtulmak için Management Studio >> Options >> Designers >> Table and Database Designers menüsündeki Prevent saving changes that require the table to be re-created seçeneğinin işareti kaldırılmalıdır.

image

 

İ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


Hepinizin bildiği gibi SQL Server da otomatik artan kolonlara identity deniyor. Bu tablolarda silme yapılsa dahi identity değer kaldığı noktadan devam etmekte.

Hepimizin bir kez başına geldiğini düşünüyorum. Identity içeren tablonun içini delete ile silip tabloyu boşaltmamıza rağmen daha sonra bir insert yapınca identity alan 1 den değilde en son kaldığı yerden devam ediyor.

İşte bunun gibi durumlarda bir identity kolonun değerini 0 lamak yada istediğimiz bir değerden başlatmak için DBCC CHECKIDENT kullanılmakta.

Örneğin TBL_Ident tablosuna eklenecek bir sonraki kayıt 1 olsun istersek;

DBCC CHECKIDENT ('Tbl_Ident', RESEED, 0);
GO

[more]

Ya da bir sonraki kayıt 25 olsun istersek;

DBCC CHECKIDENT ('Tbl_Ident', RESEED, 24);
GO

 

Şimdi örneklerimize bakalım;

--Önce bir tablo create edelim
use AdventureWorks
GO
create table Tbl_Ident(id int NOT NULL IDENTITY (1, 1), name varchar(100))
GO

--Daha sonraya tabloya 3 satır ekleyelim
insert Tbl_Ident select 'ahmet'
insert Tbl_Ident select 'mehmet'
insert Tbl_Ident select 'ali'
GO

--Şu an identity kolonun değerine bakacak
DBCC CHECKIDENT ('Tbl_Ident', NORESEED);
GO
--Değerin 3 olduğunu göreceğiz.
--Checking identity information: current identity value '3', current column value '3'.
--DBCC execution completed. If DBCC printed error messages, contact your system administrator.

--Daha sonra bir satır ekleyelim ve silelim
insert Tbl_Ident select 'veli'
GO
delete Tbl_Ident where name='veli'
GO

--Daha sonra bir satır daha ekleyelim
--Bu satır 4.satır olmasına rağmen daha önceki silmeden dolayı 4 değil 5 nolu identity i alacak.
insert Tbl_Ident select 'ibo'
GO

DBCC CHECKIDENT ('Tbl_Ident', NORESEED);
GO
select * from Tbl_Ident
GO

--Bütün tabloyu silelim.
delete from Tbl_Ident
GO

--Hala identity 5
DBCC CHECKIDENT ('Tbl_Ident', NORESEED);
GO

--Şu an boş olan tabloya yeni bir satır atarsak identity 1 değil 6 olacak
insert Tbl_Ident select 'ayse'
GO

select * from Tbl_Ident

--Tekrar delete edelim
delete from Tbl_Ident
GO

--identity i 0 layalım. Yani bir sonraki insert 1 den başlayacak
DBCC CHECKIDENT ('Tbl_Ident', RESEED, 0);
GO

insert Tbl_Ident select 'ayse'
GO

--Gördüğünüz gibi Id tekrar 1 den başladı.
select * from Tbl_Ident

--table ı drop edelim
drop table Tbl_Ident

 

İ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


Siz hiç SQL Server Service ini –m parametresi ile single user olarak açtıktan sonra tek user hakkını alamadan başka bir user a kaptırdınız mı? Cevabınız evetse buyrun yazının devamına :) [more]

Bildiğiniz üzere bazı sistemsel işlemleri yapmak için SQL Server Service ini single user mode da açma ihtiyacı duymaktayız. Ve bu işlemi aşağıdaki kodu command prompt ta yazıp çalıştırırarak gerçekleştirmekteyiz.

…./sqlservr.exe –m

SQL Server bu parametre ile çalıştırıldığında sadece bir user ın girişine izin vermektedir. Ve eğer sizin bazı application larınız sürekli server a bağlantı kurmaya çalışıyorsa, bu tek user hakkını siz alamadan başkasına kaptırabilirsiniz.

–m "Client Application Name" ile bu tek user ın hangi application ile bağlantı kurabileceğini belirtmiş oluyorsunuz.

Örneğin servisi -m"sqlcmd" ile start ederseniz bu tek user ancak sqlcmd ile sisteme bağlanabilir.

Yada bu tek user ın SSMS-Query ile bağlanmasını istiyorsanız servisi -m"Microsoft SQL Server Management Studio - Query" şeklinde açmanız gerekmekte.

 

Bir örnek vererek yazımızı pekiştirelim ve sonlandıralım.

  1. Servisi -m"Microsoft SQL Server Management Studio - Query" ile start edelim.
  2. SSMS te new query ile bağlanmaya çalıştığımızda olduğunu göreceğiz.
  3. Bu bağlantıyı kapatalım ve osql ile deneyelim. Aşağıdaki gibi bağlanamadığınızı göreceksinizdir.
    image

 

İ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 Model DB nin nasıl taşınacağını anlatmıştım. Bu yazıma http://www.turgaysahtiyan.com/post/SQL-Server-2008-e28093-Model-ve-MSDB-Database-lerinin-Tasc4b1nmasc4b1.aspx adresinden erişebilirsiniz.

Bu yazımda ise tavsiye edilen bu yöntemle taşıma yaparken almış olduğum “Cannot detach an opened database when the server is in minimally configured mode” hatasından ve çözümünden bahsediyor olacağım. [more]

Microsoft, model DB nin taşınması ile alakalı yayınladığı makalelerde SQL Server Service inin –m –c –T3608 parametresi ile açılması gerektiğini belirtmekte. Ne varki benim yaşadığım case de service i bu parametre ile açtıktan sonra model db yi detach ederken aşağıdaki gibi bir hata almakta ve detach yapamamaktaydım.

“Cannot detach an opened database when the server is in minimally configured mode”

Yaptığım araştırmalar sonucunda ilk olarak new query ekranında connection kurarken default database konusuna takıldım. Aynı hatayı alan bir kullanıcı bu hatanın sebebini; “Connection kuran kullanıcının default database i model ve use master ile başka bir database e geçilmesine rağmen hala model kullanılıyor” olarak yorumlamıştı. Dolayısıyla connection kurarken default database in değiştirilmesini önermişti.

Bu değişikliği connection kurarken login ekranında ki options a basınca açılan ekrandan yapabilmekteyiz.

image

Fakat benim case imde bu da işe yaramamıştı. Daha sonra araştırmalara devam ettiğimde service –s –m –T3608 flag i ile değil –f flag ı ile açma fikri ortaya çıktı.

Ve gerçekten de servis i –f ile başlattığımda model DB yi sorunsuz bir şekilde detach edip taşıyabildim :)

Bu arada ek bilgi vermek gerekirse –f flag ı servis i minimum configuration la açmakta ve single user mode olarak hizmet vermektedir. Dolayısıyla ekstradan –m parametresinin kullanılmasına gerek yoktur.

sqlservr.exe –f


Hayat kurtaran bu parametreyi açıkladıktan sonra yazıma son veriyorum :)

 

İ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


System database leri ve System Database lerinin taşınması konu başlıklı yazı dizimin son makalesinide bugün yazıyorum. Bu makalemde Model ve MSDB Database lerinin nasıl taşınacağına bakıyor olacağız. Ayrıca model DB yi taşırken almış olduğum bir hataya ve bu hatanın olası çözümlerini inceliyor olacağız. [more]

Daha önceki System Database leri makalelerimde belirttiğim gibi system database lerinin normal database lere göre taşınma şekilleri farklıdır. Örneğin bir özet geçecek olursak master db özel bir flag açılarak backup-restore yapılabilirken, temp db nin taşınması için alter script i kullanılır.

Model ve MSDB database leri için ise özel bir flag ile servis açıldıktan sonra detach – attach komutları kullanılır.

System database leri ve system database taşımaları ile alakalı yazdığım diğer makalelere aşağıdaki linklerden erişebilirsiniz.

http://www.turgaysahtiyan.com/post/SQL-Server-System-Databases-%28Sistem-Veritabanlarc4b1%29.aspx
http://www.turgaysahtiyan.com/post/SQL-Server-da-Master-DB-Database-File-larc4b1nc4b1-Tasc4b1mak.aspx
http://www.turgaysahtiyan.com/post/SQL-Server-e28093-master-database-backup-e28093-restore.aspx
http://www.turgaysahtiyan.com/post/TempDB-Database-File-larc4b1nc4b1-Tasc4b1mak.aspx


Şimdi bugünkü konumuza yani model ve msdb database lerinin nasıl taşınacağı konusuna geri dönelim.

Yapılacak işlemleri adım adım anlatmak gerekirse;

  1. SQL Server Service i Configuration manager dan yada bir cluster ortamı kullanılıyorsa ClusterAdmin ekranından offline yapılır.
  2. Daha sonra comand prompt açılır ve sql server –m –c –T3608 parametresi ile çalıştırılır.

    ……./sqlservr.exe –c –m –T3608

    Burada –m parametresi single user mode u, –c parametreside command prompt tan en hızlı şekilde servisi başlatmayı ifade etmektedir.
  3. Servis istediğimiz modda açıldıktan sonra yeni bir query window vasıtasıyla model ve msdb yi detach – attach edebiliriz.
  4. Model i detach etmek için

        Use Master 
        GO 
        sp_detach_db ‘model’ 
        GO 
        
  5. Model DB data ve log file larını yeni yerlerine kopyalayalım.
  6. Model i restore etmek için

    Use Master 
    GO 
    Create Database model on 
        (FILENAME = ‘YeniDrive\model.mdf’) 
       ,(FILENAME = ‘YeniDrive\modellog.ldf’) 
    For Attach; 
    GO 
  7. 4,5 ve 6. Adımları MSDB içinde uygulayalım
  8. Command Prompt u CTRL + C ile durduralım ve daha sonra kapatalım.
  9. SQL Server Service ini start edelim.


Taşıma işlemlerimiz tamamlanmış durumda.

Yaptığımız değişiklikleri kontrol etmek için sys.sysaltfiles a select çekebiliriz.

Select DB_NAME(dbid),* 
from sys.sysaltfiles
where DB_NAME(dbid) in ('model','msdb')

 

Model DB yi taşırken aldığım hata için ayrı bir makale hazırlıyor olacağı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


SQL Server Cluster ortamlarında kurulum gibi remove işlemide standalone instance lardan farklıdır. Bu yazımda 6 adımda bir SQL Server 2008 Cluster Instance ın nasıl kaldırılacağını anlatacağım. [more]

  1. Cluster Pasif node unda SQL Server 2008 CD si çalıştırılır ve Maintenance / Remove node from a SQL Server failover cluster seçilir. Resim 1
  2. Gelen ekranlardan remove edilmek istenen Instance seçimi yapılır ve next ler eşliğinde remove tamamlanır.
  3. Diğer pasif node ların tamamında 1 ve 2. Adımlar uygulanır.
  4. Aktif node a geçilip tekrar SQL Server 2008 CD si çalıştırılır ve Maintenance / Remove node from a SQL Server failover cluster seçilir.
  5. Gelen ekranlardan remove edilmek istenen Instance seçimi yapılır ve next ler eşliğinde remove tamamlanır.
  6. Son adım olarak Cluster Admin ekranından remove edilen instance ın Resource Group u kaldırılır.

 

Resim 1

image 
 

İ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


Dump Directory, SQL Server Error Log ları ve SQL Server Agent Error Log larının tutulduğu directory dir. System Database lerinin taşınmasından sonra, dump directory nün de disk i boşaltmak amaçlı taşınması gerekebilir.

Bu yazımda Dump Directory nin hem SQL Server Database Engine hemde SQL Server Agent Service i için nasıl değiştirebileceğini anlatacağım. [more]

Yazıma geçmeden önce konusu geçtiği için system database leri ve nasıl taşındıkları hakkındaki makeleme link vermek istiyorum.

http://www.turgaysahtiyan.com/post/SQL-Server-System-Databases-%28Sistem-Veritabanlarc4b1%29.aspx

Şimdi konumuza dönebiliriz. Aşağıdaki adımları uygulayarak Dump Directory i değiştirebilirsiniz.

  1. SQL Server Configuration Manager açılır.
  2. Dump Directory si değiştirilmek istenen Database Engine in properties ine girilir.
  3. Advance tab ından Dump Directory kısmı yeni klasör ile replace edilir. <I style="mso-bidi-font-style: normal">Resim 1</I>
  4. Ok e basılır ve Database Engine Restart edilir.
  5. Dump Directory si değiştirilmek istenen SQL Server Agent ın properties ine girilir.
  6. Advance tab ından Dump Directory kısmı yeni klasör ile replace edilir. <I style="mso-bidi-font-style: normal">Resim 2</I>
  7. Ok e basılır ve SQL Server Agent Restart edilir.

 

Resim 1

image

Resim 2

image

Oluşabilecek Problemler

Tavsiye edilen bu yönteme rağmen benim case imde olduğu gibi işlem tamamlanmayabilir. Örneğin benim yaptığım işlem sonucunda SQL Server Agent ın Dump Directory sini değiştirmeme rağmen aşağıdaki resimde göreceğiniz gibi SSMS üzerinden SQL Server Agent ın properties ine baktığımda hala eski directory bulunmaktaydı.

image

Bu problemi çözebilmek için HKEY_Local_Machine/Software/Microsoft/Microsoft SQL Server/ MSSQL10.MSSQLSERVER/SQLServerAgent/ErrorLogFile registry key ini yeni klasör değeri ile replace edip SQL Server Agent ı restart etmeniz gerekmektedir.

Bu yöntem bende işe yaradı. Sizde de işe yarar umarı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