27 Aralık 2009 Pazar

SQL Server ve Oracle Golden Gate hakkında yazılar...

Merhaba Arkadaşlar!


Şu anda çalışıyor olduğum banka, Online Reporting (Gerçek zamanlı) projeleri için "Oracle Golden Gate" ürününü kullanmaya karar verdi ve bu yönde yatırımlar yaptı. Bu ürünün yönetimi, bakımı, kurulumu vb. sorumlulukları bana ait. Bu nedenle bu ürünü önceden hiç bilmiyor olmama rağmen (hâlâ da iyi biliyorum gibi bir iddiam yok), geçen 3-4 aylık kullanım sürecinde birçok şey öğrendim. Bu konuda ITD isimli, Golden Gate' in distribütörlüğünü yapan firma ile de çalışıyoruz.

Zaman zaman bu ürünle ilgili sorunlar yaşadık ve hâlâ da yaşıyoruz. Sorun yaşadığımızda, ulu Google' ın bu sorunlar hakkında hiçbir şey bilmediğini gördüm. Ne yerli ne de yabancı herhangi bir kayıt, yazı vs. yok. Bunun nedenini, bu ürünü daha ziyade büyük şirketlerin kullanmasına (çünkü gerçekten maliyeti yüksek bir ürün) ve bu şirketlerin de bu ürünün distribütörleri ile bakım anlaşmaları olmasına bağlıyorum. Bu nedenle sorun çıktığında, doğrudan bakım anlaşması yapılan şirket aranıyor ve böylece Google vb. aradan çıkarılmış oluyor... Çalışıyor olduğum şirket de bir istisna değil.

Oracle Golden Gate' in Oracle Database gibi "platform free" olması ve birçok (10~) DBMS ürününü desteklemesi, bu ürünün SQL Server ile olan iş birliği hakkındaki olası bilgi paylaşımını daha da azaltıyor. Biz bu ürünü şirketimizde SQL Server ile birlikte kullanıyoruz ve bu konuda şirket içindeki Proses Talimatlarını da ben hazırlıyorum. Bu yazılarımı ve tecrübelerimi -her ne kadar küçük ve orta ölçekli şirketlerin bu yazılarımdan çok faydalanamayacağını biliyor olsam da- sizlerle de paylaşmak istedim.

Peki Golden Gate nedir? Golden Gate, aynen SQL Server Replication' ı gibidir ve TDM (Transactional Data Management) ürünüdür. Hatta SQL Server 2005 SP2, CU6 öncesi versiyonlar için birebir SQL Server Replication bileşenlerini kullanır. Yine aynen SQL Server Replication topolojileri gibi çeşitli topolojileri vardır. Tek yönlü veya çift yönlü veri aktarımı (replikasyon) yapabilir. Tabii bu noktada akla gelen soru "peki farkı nedir? neden SQL Server Replication değil de Oracle Golden Gate?". Bu sorunun özet yanıtı şu: Oracle Golden Gate ürününün topolojileri çok daha esnek, bu nedenle veri aktarımı çok daha hızlı oluyor. Bununla birlikte, kritik veritabanınızın Transaction Log dosyasının dolmasına neden olmayacak şekilde ayarlanabiliyor (bunun bazı durumlarda doğrulup kayı yok, bu konuya ileride, başka yazılarımda ayrıca değineceğim çünkü çok önemli). LSN' i kaçırdığı zaman ise, ilgili kayıtları Transaction Log yedek dosyalarından okuyabiliyor... Bunların hiçbirisini SQL Server Replication yapamıyor maalesef. Ayrıca (adı bende kalsın) bu konuda Türkiye' de uzman olan ve Microsoft için çalışıyor olan bir arkadaşım, bir MVP toplantısında yaptığımız muhabbette Golden Gate ürününün SQL Server Replication' dan çok daha hızlı olduğunu ve bu ürünü Oracle satın almadan önce (ki bu satın alma olayı bildiğim kadarıyla 2-3 ay önce oldu) Online Reporting ihtiyacı olan şirketlere kendilerinin önerdiğini iletmişti bana.

Bu kapsamda, Golden Gate' in Windows Server' da kurulumu, SQL Server 2005 ve Golden Gate ile Partition Switch işleminin nasıl yapılabileceği, kopan bir Golden Gate senkronizasyonunun nasıl tekrar sağlanabileceği, yeni tabloların replikasyona nasıl dahil edilebileceği, Golden Gate Best Practices gibi çeşitli konularda yazılar yazıyor olacağım. Umarım bir gün birilerinin işine yarar.

Ekrem Önsoy

"Failed to install and configure assemblies C:\Program Files\Microsoft SQL Server\90\DTS\Tasks\Microsoft.SqlServer.MSMQTask.dll in the COM+ catalog. E

HATA MESAJI:
"Failed to install and configure assemblies C:\Program Files\Microsoft SQL Server\90\DTS\Tasks\Microsoft.SqlServer.MSMQTask.dll in the COM+ catalog. Error: -2147467259 Error message: Unspecified error Error description: Error HRESULT E_FAIL has been returned from a call to a COM component."

AÇIKLAMA:
Sorun, Microsoft.SqlServer.MSMQTask.dll' in İşletim Sistemine kayıt olamamasından kaynaklanıyor. Özellikle 64Bit Integration Services kurmaya çalışırken, sistem üzerinde 32Bit .Net Framework bileşenleri varsa bu hatayla karşılaşılabiliyor.

ÇÖZÜM:
Sorunu çözmek için aşağıdaki gibi Microsoft.SqlServer.MSMQTask.dll’i unregister ve reregister yapabilirsiniz.

Unregister etmek için:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>regsvcs /u "C:\Program Files (x86)\Microsoft SQL Server\90\DTS\Tasks\Microsoft.SqlServer.MSMQTask.dll"

Microsoft (R) .NET Framework Services Installation Utility Version 2.0.50727.42 Copyright (c) Microsoft Corporation. All rights reserved. Uninstallation of assembly 'C:\Program Files (x86)\Microsoft SQL Server\90\DTS\Tasks\Microsoft.SqlServer.MSMQTask.dll' succeeded.

Register etmek için:
C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727>regsvcs.exe "C:\Program Files\Microsoft SQL Server\90\DTS\Tasks\Microsoft.SqlServer.MSMQTask.dll"

Microsoft (R) .NET Framework Services Installation Utility Version 2.0.50727.42 Copyright (c) Microsoft Corporation. All rights reserved.

"The SQL server specified in SSIS service configuration is not present or is not available. This might occur when there is no default instance of SQL

HATA MESAJI:
"The SQL server specified in SSIS service configuration is not present or is not available. This might occur when there is no default instance of SQL Server on the computer. For more information, see the topic "Configuring the Integration Services Service" in Server 2005 Books Online."

AÇIKLAMA:
SSMS’ ten SSIS servisine bağlanıp MSDB altındaki paketlere bakmak istediğinizde bu hata ile karşılaşabilirsiniz.

ÇÖZÜM:
http://msdn.microsoft.com/en-us/library/ms137789.aspx

"SystemOutOfMemory"

HATA MESAJI:
SystemOutOfMemory

AÇIKLAMA:
Örneğin SQL Server Management Studio' da bir SP çalıştırdığınızda Messages penceresinde böyle bir hata mesajıyla karşılaşabilirsiniz.

ÇÖZÜM:
Bu sorunun yaşandığı durumda, çalıştırılan SP' de yapılan her işlem için bir SELECT sorgusu kullanıldığını gördüm ve sonuç penceresinde binlerce sonuç dönüyordu. SSMS’ teki Messages penceresi de bu kadar çok mesajı depolayamadığından System.SystemOutOfMemory hatası alınıyordu. Yani sorun aslında SSMS’ ten kaynaklanıyordu...

Bu sorunu aşmak için gereksiz SELECT cümleciklerini kaldırabilirsiniz. Ayrıca SET NOCOUNT ON komutunu kullanabilirsiniz.

"The database could not be exclusively locked to perform the operation"

HATA MESAJI:
The database could not be exclusively locked to perform the operation

AÇIKLAMA:
Bir veritabanında işlem yaparken (meselâ veritabanın adını değiştirmek veya Collation ayarını değiştirmek gibi...) böyle bir hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Bu tarz işlemleri yapmak için veritabanına bağlı başka bir kullanıcı olmaması gerekiyor. Bunu da, aşağıdaki gibi bir komut bloğu ile sağlayabilirisiniz:

ALTER DATABASE Veritabanim SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
USE Veritabanim GO sp_renamedb N'Veritabanim', N'Veritabanim_Eski'
GO
ALTER DATABASE Veritabanim_Eski SET MULTI_USER GO

"The mail could not be sent to the recipients because of the mail server failure. (Sending Mail using Account 1 (YYYY-MM-DDTHH:MM:SS). Exception Messa

HATA MESAJI:
"The mail could not be sent to the recipients because of the mail server failure. (Sending Mail using Account 1 (YYYY-MM-DDTHH:MM:SS). Exception Message: Could not write to temp attachment file. (There is not enough space on the disk)"

AÇIKLAMA:
Database Mail kullanarak ekli bir eposta göndermeye çalışırken böyle bir hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Eğer Sistem Diskinizde (İşletim Sisteminin çalıştığı disk) yeterince yer yoksa böyle bir hata ile karşılaşırsınız. Sistem Diskinizde (ki bu genelde C:' dir) yeterince boş yer olduğundan emin olun.

1 Kasım 2009 Pazar

Dedicated Administrator Connection Portu

Merhaba arkadaşlar,


Her zaman başınıza gelebilecek birşey değiş, fakat geçenlerde benim başıma geldi ve açıkçası bu konuda bir kaynak bulmakta zorlandım. Hatta bulamadım, fakat biraz kurcalayınca çözümü kendim buldum.

Dedicated Administrator Connection (DAC) Portunun nereden ve neden değiştirilebileceği hiç aklınıza geldi mi? Geçenlerde yeni kurduğum bir SQL Server 2008 Instance' ının DAC' nin portunun standardizasyon ve Güvenlik Duvarı tarafındaki Kural tanımları için değiştirmem istendi.

İlk etapta aklıma birşey gelmedi, çünkü ne SQL Server Configuration Manager' da ne de başka bir arayüzde bu ayarla ilgili bir bölüm gördüğümü hatırlamamıştım. Tabii ki yapılabilecek en mantıklı şey olarak hemen Google' a sordum. Tam bir hayal kırıklığıydı, konu hakkında neredeyse hiçbir bilgiye ulaşamadım. Kim bilir, belki de ben yanlış kelimeleri arattım?

Neyse, daha fazla gevezelik etmeden çözümü ve konuyu açıklamaya başlayayım.

Öncelikle, her SQL Server 2005 ve üzeri Instance' ına, kurulum esnasında bir DAC portu atanır. SQL Server Instance' ınızın DAC portunu, SQL Error Log' unun başlangıcında aşağıdaki örnekte verilen satırdaki gibi görebilirsiniz:

SQL Error Log' dan örnek satır:
Dedicated admin connection support was established for listening locally on port 49486.
Server is listening on [ 127.0.0.1 49486].

DAC portunun değiştirilmesi gerektiği söylendiğinde aklıma birşeyin gelmemesi normalmiş. Çünkü gerçekten de aradım taradım ve bu ayarın nereden değiştirilebileceğini gösteren herhangi bir yazı, resim, arayüz vs. bulamadım.

Aklıma, bu tür ayarların Kayıt Defterinde (Registry) saklandığı geldi ve DAC' ye atanan portu Kayıt Defterinde arattım ve aşağıdaki anahtara ulaştım:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10.S08\MSSQLServer\SuperSocketNetLib\AdminConnection\Tcp

Eğer bu anahtarı elle değiştirirseniz ve SQL Server servisini durdurup tekrar başlatırsanız, yeni DAC portunuzun artık sizin atadığınız port olduğunu göreceksiniz. DAC portu, Dynamic bir port değildir. Bu nedenle her SQL Server servisinin kapanıp açılmasıyla değişmez. Hangi port belirtilmişse, hep o port kullanılmaya çalışılır.

"[Microsoft][ODBC SQL Server Driver]Unspecified error occured on SQL Server. Connection may have been terminated by the server. OS Error: 0"

HATA MESAJI:
"[Microsoft][ODBC SQL Server Driver]Unspecified error occured on SQL Server. Connection may have been terminated by the server. OS Error: 0"

AÇIKLAMA:
SQL Server' a bağlantı kurduktan hemen sonra veya birkaç dakika sonra bu hata mesajını alarak kopma sorunları yaşayabilirsiniz.

ÇÖZÜM:
Bu sorun, Windows Server 2003 ile ilgili bir sorundur. Sorunu çözmek için şu KB’ deki Fix’ i kullanabilirsiniz:

“http://support.microsoft.com/kb/948496”

"DROP DATABASE statement cannot be used inside a user transaction"

HATA MESAJI:
"DROP DATABASE statement cannot be used inside a user transaction"

AÇIKLAMA:
“DROP DATABASE” komutuyla bir veritabanını silmeye çalıştığınızda bu hata mesajını alabilirsiniz.

ÇÖZÜM:
Bu hata mesajını alıyorsanız, bu komutu çalıştırdığınız oturumdaki (Session) Transaction açık kalmıştır. ROLLBACK veya COMMIT komutlarını kullanarak bu Transaction’ ı sonlandırın veya başka bir oturum açın ve “DROP DATABASE” komutunu tekrar çalıştırın.

"Exclusive access could not be obtained because the database is in use."

HATA MESAJI:
"Exclusive access could not be obtained because the database is in use."

AÇIKLAMA:
Bu hatayı, işlem yapmak istediğiniz veritabanına başka bir işlem tarafından X (Exclusive) Lock konduğunda alırsınız. Buna bir örnek, Restore olan bir veritabanı olabilir... Bir veritabanı Restore oluyorken, Restore işlemini yapan SPID bu işlemi gerçekleştirmek adına bu veritabanı için X Lock alır.

ÇÖZÜM:
SQL Server 2005 ve daha üstü versiyonlarda "sys.dm_tran_locks" DMV' si ile hangi SPID' nin hangi veritabanı için ne çeşit bir Lock aldığını görebilirsiniz.

SQL Server 2000 için ise "sp_lock" sistem SP' sini kullanabilirsiniz.

"Dedicated administrator connections are not supported. (ObjectExplorer)"

HATA MESAJI:
"Dedicated administrator connections are not supported. (ObjectExplorer)"

AÇIKLAMA:
DAC (Dedicated Administrator Connection) özelliğini kullanarak SQL Server’ a bağlanmak için SSMS’ teki Object Explorer kullanıldığında böyle bir hata ile karşılaşılır.

ÇÖZÜM:
DAC kullanarak SQL Server’ a bağlantı kurmak için SQLCMD veya Query Editor kullanılmalıdır.

"Cannot drop full-text catalog 'katalog adı' because it contains a full-text index."

HATA MESAJI:
"Cannot drop full-text catalog 'katalog adı' because it contains a full-text index."

AÇIKLAMA:
Bir Full-Text Catalog’ u silmeye çaliştığınızda bu mesaj ile karşılaşabilirsiniz. Bunun nedeni, mesajın da söyledigi gibi bu kataloğun bir Index tarafından kullanılıyor olmasıdır.

ÇÖZÜM:
Hangi tablonun Full-Text Index kullandığını tespit etmek için aşağıdaki kodu çalıştırın:

SELECT name, ftcatid FROM sysobjects WHERE ftcatid > 0

BBu komutu çalıştırdıktan sonra, Full-Text kullanan tablolar listelenecek. Index’ in kullanımını kaldırmak için de aşağıdaki kodu çalıştırın:

EXEC sp_fulltext_table ‘tablo_adi’, ‘drop’ Artık sorunlu Full-Text Catalog’ unuzu aşağıdaki kod ile kaldırabilirsiniz:

DROP FULLTEXT CATALOG fulltext catalog adi>

"Could not backup database: The backup of full-text catalog 'index_adi' is not permitted because it is not online. Check errorlog file for the reason

HATA MESAJI:
"Could not backup database: The backup of full-text catalog 'index_adi' is not permitted because it is not online. Check errorlog file for the reason that full-text catalog became offline and bring it online. Or BACKUP can be performed by using the FILEGROUP or FILE clauses to restrict the selection to include only online data."

AÇIKLAMA:
Eğer yedeğini almaya çalıştığınız veritabanındaki Full-text Catalog, Online değil ise o zaman yedek almaya çalışırken bu hata ile karşilaşabilirsiniz.

ÇÖZÜM:
Hangi tablonun Full-Text Index kullandığını tespit etmek için aşağıdaki kodu çalıştırın:

SELECT name, ftcatid FROM sysobjects WHERE ftcatid > 0

BBu komutu çalıştırdıktan sonra, Full-Text kullanan tablolar listelenecek. Index’ in kullanımını kaldırmak için de aşağıdaki kodu çalıştırın:

EXEC sp_fulltext_table ‘tablo_adi’, ‘drop’ Artık sorunlu Full-Text Catalog’ unuzu aşağıdaki kod ile kaldırabilirsiniz:

DROP FULLTEXT CATALOG fulltext catalog adi>

"One or more files do not match the primary file of the database. If you are attempting to attach a database, retry the operation with the corr

HATA MESAJI:
"One or more files do not match the primary file of the database. If you are attempting to attach a database, retry the operation with the correct files. If this is an existing database, the file may be corrupted and should be restored from a backup."

AÇIKLAMA:
Eğer veri ve Transaction Log dosyaları farklı tarihli yedeklere aitse, böyle bir hata mesajı alınabilir.

Örneğin, “skorlar” isimli bir veritabanınız olduğunu düşünün. Bunun yedeğinin ise doğrudan *.mdf\ndf ve *.ldf şeklinde alındığını düşünün. Eğer 30.09.2009 tarihindeki veri dosyalarını ve 01.10.2009 tarihli Transaction Log dosyalarını birleştirip, veritabanını bu şekilde iliştirmeye çalışırsaniz bu hata mesajıyla karşılaşırsınız.

ÇÖZÜM:
Doğru veri ve Transaction Log dosyalarını eşleştirmeli ve böyle iliştirmelisiniz (Attach).

"'ONLINE' is not a recognized ALTER INDEX REBUILD PARTITION option."

HATA MESAJI:
"'ONLINE' is not a recognized ALTER INDEX REBUILD PARTITION option."

AÇIKLAMA:
Bir Partitioned Tabloda Index Rebuild çalışması yaparken, şayet ONLINE = ON özelliğini kullanırsanız bu hata mesajı ile karşılaşırsınız.

ÇÖZÜM:
Bu hata mesajını almanızın nedeni, SQL Server' ın Partition' lanmış tablolarda Index Rebuild işleminin ONLINE özelliğinin olmamasındandır.

Partition' lanmış tablolardaki Index' lerinizi Rebuild etmek istediğiniz zaman, bu işi OFFLINE yapmak durumundasınız.

9 Eylül 2009 Çarşamba

"Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'."

HATA MESAJI:
"Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'."

AÇIKLAMA:
sp_executesql sistem SP' si ile bir değişkendeki komutu çalıştırdığınızda bu hata mesajı ile karşılaşabilirsiniz.

Örnek:
DECLARE @komut VARCHAR(150)
SET @komut = 'SELECT * FROM TABLOM'

EXEC sp_executesql @komut

veya hiç değişken kullanmadan doğrudan aşağıdaki gibi bir komut çalıştırırsanız da aynı hata mesajıyla karşılaşırsınız:

EXEC sp_executesql 'SELECT * FROM TABLOM'

ÇÖZÜM:
Aslında hatanın nedeni, hata mesajının içerisinde de açıkça yazıyor. sp_executesql sistem SP' si için kullanacağınız @statement parametresi UNICODE olmalıdır. Bu @statement parametresi ister ilk örnekteki gibi bir değişken kullanılarak belirtilmiş olsun, isterse ikinci örnekteki gibi statik bir şekilde yazılmış olsun.

Yukarıdaki örneklerin doğruları ise şu şekildedir:
DECLARE @komut NVARCHAR(150)
SET @komut = N'SELECT * FROM TABLOM'

EXEC sp_executesql @komut

vve

EXEC sp_executesql N'SELECT * FROM TABLOM'

"SQL Server 2000 is not installed on this machine. Setup will not exit."

HATA MESAJI:
"SQL Server 2000 is not installed on this machine. Setup will not exit."

AÇIKLAMA:
Hiçbir SQL Server 2000 Instance' ının yüklü olmadığı bir makinede SP4' ü çalıştırırsanız veya sadece SQL Server 2000' in x64 versiyon Instance' larının bulunduğu bir makinede SP4' nin x86 versiyonunu çalıştırırsanız (veya tam tersi) o zaman bu mesaj ile karşılaşırsınız.

ÇÖZÜM:
SP' yi çalıştırdığınız sunucuda SQL Server 2000 Instance' ı olduğundan emin olun.

Ayrıca, çalıştırdığınız SP ile yüklü olan SQL Server 2000 Instance' larının aynı işlemci mimarisini (yani ikisi de x64 veya ikisi de x86 veya ikisi de x64-ITA olmalı) kullandığından emin olun.

"SQL Server 2000 is not installed on this machine. Setup will not exit."

HATA MESAJI:
"SQL Server 2000 is not installed on this machine. Setup will not exit."

AÇIKLAMA:
Hiçbir SQL Server 2000 Instance' ının yüklü olmadığı bir makinede SP4' ü çalıştırırsanız veya sadece SQL Server 2000' in x64 versiyon Instance' larının bulunduğu bir makinede SP4' nin x86 versiyonunu çalıştırırsanız (veya tam tersi) o zaman bu mesaj ile karşılaşırsınız.

ÇÖZÜM:
SP' yi çalıştırdığınız sunucuda SQL Server 2000 Instance' ı olduğundan emin olun.

Ayrıca, çalıştırdığınız SP ile yüklü olan SQL Server 2000 Instance' larının aynı işlemci mimarisini (yani ikisi de x64 veya ikisi de x86 veya ikisi de x64-ITA olmalı) kullandığından emin olun.

5 Eylül 2009 Cumartesi

"Argument data type xml is invalid for argument 1 of like function"

HATA MESAJI:
"Argument data type xml is invalid for argument 1 of like function"

AÇIKLAMA:
XML bir alanda LIKE operatörünü kullanarak bir sorgu çalıştırdığınızda böyle bir hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Örneğin "KategoriID INT", "YayinEvi NVARCHAR(70)", "Kitap XML" gibi alanları olan "Kitaplar" adlı bir tablonuz olduğunu varsayalım. Bu tablodaki Kitap isimli alanda LIKE operatörünü kullanarak, aşağıdaki gibi bir sorgu çalıştırırsanız:

SELECT KategoriID, YayinEvi FROM Kitaplar WHERE Kitap LIKE '%lay lay lom%'

O zaman bu hata ile karşılaşırsınız, çünkü XML alanını doğrudan LIKE operatörü ile sorgulayamazsınız. Böyle bir sorgunun çalışması için XML alanını NVARCHAR' a dönüştürebilirsiniz:

SELECT KategoriID, YayinEvi FROM Kitaplar WHERE (CAST(Kitap AS NVARCHAR(MAX)) LIKE '%lay lay lom%'

"The backed-up database has on-disk structure version 611. The server supports version 539 and cannot restore or upgrade this database. RESTORE

HATA MESAJI:
"The backed-up database has on-disk structure version 611. The server supports version 539 and cannot restore or upgrade this database. RESTORE FILELIST is terminating abnormally. (Microsoft SQL Server, Error: 3169)"

AÇIKLAMA:
SQL Server Management Studio kullanarak, bir SQL Server 2005 (90) versiyonu veritabanı yedeğini, bir SQL Server 2000 Instance' ına açmaya (Restore) çalışırsanız bu ve versiyon farklılığından kaynaklanabilecek benzeri bir hata mesajıyla karşılaşırsınız.

ÇÖZÜM:
Genel bir kural vardır, yeni versiyonlar eski versiyonları bilir; fakat eski versiyonlar yeni versiyonlardan bihaberdir. Bu konuda da bu kural geçerliliğini sürdürmektedir. Yani, SQL Server 2000 versiyon bir yedek dosyasını SQL Server 2005 Instance' ında açabilirsiniz; ama tam tersini yapamazsınız. Çünkü 2000, 2005' i tanımaz.

Eğer bir SQL Server 2005 yedeğini bir SQL Server 2000 Instance' ına açma gibi bir ihtiyacınız varsa, o zaman bu yedeği bir SQL Server 2005 Instance' ında açın ve bu veritabanının Script' ini çıkarın ve bu Script' i (2000' e uyumsuz yerleri çıkararak veya değiştirerek) 2000 Instance' ında çalıştırın. 2005 versiyon veritabanınızı 2000 Instance' ında ancak böyle oluşturabilirsiniz.

SSMS - Query Editor: Dosya Uzantısı

Merhaba arkadaşlar,


SQL Server Management Studio (SSMS)' teki Query Editor' de bir Script dosyasını çalıştırmak istiyorsanız, varsayılan olarak bu Script dosyasının uzantısının *.SQL olması gerekiyor.

Geçenlerde şöyle bir soru gördüm: "Ben, *.TXT dosyası gibi başka dosyaları da Query Editor' de aynen *.SQL dosyaları gibi çalıştırabilmek istiyorum. Query Editor tasarlanırken, sadece *.SQL uzantılı dosyaları çalıştırması için 'hard-coded" bir yöntemle mi yazılmış?" Biraz açıklama gerekebilir diye şöyle ifade edeyim, örneğin *.TXT uzantılı bir dosyayı Query Editor' de açarsanız, Execute düğmesinin görünmediğini ve F5 ile de bu dosyadaki kodları çalıştıramadığınızı görürsünüz.

Sorunun cevabı kısmen "Evet". Yani, *.SQL uzantılı dosyalar Query Editor' de varsayılan olarak ve "hard-coded" olarak çalışabilir şekilde tanımlanmıştır. Fakat istenilen dosya uzantılarının da çalıştırılabilir dosyalar listesine eklenmesi mümkün kılınmıştır.

Örneğin, eğer *.TXT uzantılı Script dosyalarını da aynen *.SQL dosyaları gibi çalıştırmak isterseniz aşağıdaki adımları izleyin:

- SSMS' i açın,
- Ana menüden Tools --> Options,
- Options penceresinde, sol tarafta bulunan listeden Text Editor --> File Extention,
- File Extention bölümünde, "Extention" kutusuna "txt" yazıp, "Editor" açılır kutusundan da "SQL Query Editor" ü seçip "Apply" düğmesine tıklayın ve "OK" düğmesine basarak "Options" penceresini kapatın.

Artık *.TXT uzantılı dosyalarınız da aynen *.SQL dosyaları gibi çalıştırılabilir bir şekilde açılacaktır.

Not:
Bu ayarlar SSMS' in SQL Server 2005 ve 2008 versiyonları için de aynıdır.


Ekrem Önsoy

"Status: 0, code: 20015, text: 'Login failed for user ''. The user is not associated with a trusted SQL Server connection."

HATA MESAJI:
"Status: 0, code: 20015, text: 'Login failed for user ''. The user is not associated with a trusted SQL Server connection."

AÇIKLAMA:
Aslında çok standart bir hata mesajı gibi duruyor. Fakat bu hata mesajını bir Replication senarsoyunda almıştım.

Bu kurulumda, Log Reader Agent' ın çalıştığı SQL Server Instance' ının SQL Server servisleri Local System hesabıyla çalışıyordu ve Log Reader Agent' ı, Publisher sunucusuna Windows Authentication ile bağlanmak üzere ayarlanmıştı ve Publisher' da da, Subscriber sunucusu için bir Bilgisayar Hesabı Login' i yoktu.

Hata mesajının tamamına bir örnek:
2009-08-27 06:46:06.297 Copyright (c) 2005 Microsoft Corporation
2009-08-27 06:46:06.297 Microsoft SQL Server Replication Agent: logread
2009-08-27 06:46:06.297
2009-08-27 06:46:06.297 The timestamps prepended to the output lines are expressed in terms of UTC time.
2009-08-27 06:46:06.297 User-specified agent parameter values:
-Publisher SUNUCU1
-PublisherDB VERITABANIM
-Distributor SUNUCU2
-DistributorSecurityMode 1
-Continuous
--XJOBID 0x6584F2DEBAB77C4C9A509D4A9A0506BE
-XJOBNAME SUNUCU1-VERITABANIM-1
-XSTEPID 2
--XSUBSYSTEM LogReader
-XSERVER SUNUCU1
-XCMDLINE 0
-XCancelEventHandle 00000000000003B4
-XParentProcessHandle 0000000000000468
2009-08-27 06:46:06.527 Status: 0, code: 20015, text: 'Login failed for user ''. The user is not associated with a trusted SQL Server connection.'.
22009-08-27 06:46:06.527 Login failed for user ''. The user is not associated with a trusted SQL Server connection.

Not: Bu mesajdaki gerçek bilgiler sahteleriyle değiştirilmiştir.

ÇÖZÜM:
Böyle bir durum için, Publisher tarafında oluşturacağınız bir SQL Server Login' ini kullanabilirsiniz. Bu Login' i "sysadmin" Server Fixed Role' üne dahil etmeniz uygundur.

SQL Server Management Studio' yu çalıştırın ve ilgili SQL Server Instance' ına bağlanın. Daha sonra aşağıdaki yolu izleyerek:

Object Explorer' dan Replication-->Local Publications-->Publication Properties-->Agent Security-->Log Reader Agent Security-->Connect to the Publisher’ da, Using the following SQL Server Login... kutularına, Log Reader için oluşturduğunuz SQL Server Login' inin bilgilerini girin ve bu sorundan kurtulun.

"The process is running and is waiting for a response from the server."

BİLGİ MESAJ:
"The process is running and is waiting for a response from the server."

AÇIKLAMA:
Eğer Synchronization penceresinde böyle bir mesaj görüyorsanız, o zaman SQL Server tarafında uzun süren bir işlem gerçekleşiyordur.

Örneğin Bulk Insert veya Index oluşturulması... Bu durumda yapmanız gereken bir şey yok, sadece bekleyin.

16 Ağustos 2009 Pazar

"The application failed to initialize properly (0xc0000135). Click on OK to terminate the application."

HATA MESAJI:
"The application failed to initialize properly (0xc0000135). Click on OK to terminate the application."

AÇIKLAMA:
SQL Server 2008' in Setup.exe' sini çalıştırdığınızda böyle bir hata mesajıyla karşılaşabilirsiniz.

ÇÖZÜM:
Bunun nedeni, sisteminize daha önceden .Net Framework 3.5' in yüklenmemiş olmasıdır.

Bu sorunu aşmak için ilk önce .Net Framework 3.5' i yükleyin (eğer yoksa Microsoft Download' tan da indirebilirsiniz), daha sonra Setup.exe' yi çalıştırmayı tekrar deneyin.

"While acting as a mirroring partner for database 'veritabanı_adı', server instance 'EKREM-PC\SQL2008' encountered error 948, status 2, severity 20. D

HATA MESAJI:
"While acting as a mirroring partner for database 'veritabanı_adı', server instance 'EKREM-PC\SQL2008' encountered error 948, status 2, severity 20. Database mirroring will be suspended. Try to resolve the error and resume mirroring."

AÇIKLAMA:
İki farklı versiyon SQL Server Instance' ı arasında Database Mirroring yaparsanız, Automatic veya Manual Failover olduğunda böyle bir hata mesajıyla karşılaşabilirsiniz.

ÇÖZÜM:
Database Mirroring için, Database Mirroring tasarımınızdaki Principal ve Mirror Sunucularının Instance Versiyon ve Edition' ları aynı olmalıdır.

Database Mirroring için SQL Server' ın Standard veya Enterprise Edition sürümüne ihtiyacınız var. Eğer bir tasarım yapacaksanız, o zaman bu tasarımdaki Principal ve Mirror sunucuların ikisi de ya Standard Edition olmalı ya da Enterprise Edition. Ayrıca iki sunucu Instance' ına da aynı Servis Paketleri ve Cumulative Update' ler uygulanmalı. Bir Instance 2005, diğeri de 2008 olamaz. Yoksa böyle bir hata mesajıyla karşılaşırsınız.

Bununla birlikte, Mirror sunucudaki veritabanı da "Suspect" durumuna geçer.

Not:
Örneğin bir Instance' ı 2005, diğerini de 2008 olarak kurmayı denerseniz SQL Server buna kızmayacaktır ve izin verecektir, fakat Failover yaptığınızda bu hata mesajıyla (veya benzeriyle, çünkü versiyonlar farklı olabilir) karşılaşacaksınız.

"The database 'veritabanı_adı' cannot be opened because it is version 655. This server supports version 612 and earlier. A downgrade path is not suppo

HATA MESAJI:
"The database 'veritabanı_adı' cannot be opened because it is version 655. This server supports version 612 and earlier. A downgrade path is not supported."

AÇIKLAMA:
İki farklı versiyon SQL Server Instance' ı arasında Database Mirroring yaparsanız, Automatic veya Manual Failover olduğunda böyle bir hata mesajıyla karşılaşabilirsiniz.

ÇÖZÜM:
Database Mirroring için, Database Mirroring tasarımınızdaki Principal ve Mirror Sunucularının Instance Versiyon ve Edition' ları aynı olmalıdır.

Database Mirroring için SQL Server' ın Standard veya Enterprise Edition sürümüne ihtiyacınız var. Eğer bir tasarım yapacaksanız, o zaman bu tasarımdaki Principal ve Mirror sunucuların ikisi de ya Standard Edition olmalı ya da Enterprise Edition. Ayrıca iki sunucu Instance' ına da aynı Servis Paketleri ve Cumulative Update' ler uygulanmalı. Bir Instance 2005, diğeri de 2008 olamaz. Yoksa böyle bir hata mesajıyla karşılaşırsınız.

Bununla birlikte, Mirror sunucudaki veritabanı da "Suspect" durumuna geçer.

Not:
Örneğin bir Instance' ı 2005, diğerini de 2008 olarak kurmayı denerseniz SQL Server buna kızmayacaktır ve izin verecektir, fakat Failover yaptığınızda bu hata mesajıyla (veya benzeriyle, çünkü versiyonlar farklı olabilir) karşılaşacaksınız.

"Error 15404: could not obtain information about Windows NT group/user 'Domain\User', error code 0x5."

HATA MESAJI:
"Error 15404: could not obtain information about Windows NT group/user 'Domain\User', error code 0x5."

AÇIKLAMA:
SQL Server' da bir işlem yaparken böyle bir hata ile karşılaşabilirsiniz.

Nedeni ise sunucunuzun Domain Controller ile haberleşemeyip, hesabınızın doğruluğunu kontrol edememesidir (authentication).

ÇÖZÜM:
Çözüm olarak ilgili sunucuyu kapatıp yeniden başlatmanızı tavsiye ederim, eğer sorun tekrar ediyorsa sistem yönetisine başvurmalısınız.

"RegCreateKeyEx() returned error 5, 'Access is denied.' (Microsoft SQL Server, Error: 22002)"

HATA MESAJI:
"RegCreateKeyEx() returned error 5, 'Access is denied.' (Microsoft SQL Server, Error: 22002)"

AÇIKLAMA:
SQL Server' da bir işlem yaparken böyle bir hata ile karşılaşabilirsiniz.

Ben, Replication' daki Distribution Configuration ayarını yapmak istediğimde bu hatayla karşılaşmıştım.

ÇÖZÜM:
Öncelikle şunu belirteyim ki, bu hata tamamen SQL Server servisinin yetkileriyle alâkalı. Benim durumumda, SQL Server servisi için özel bir yerel hesap oluşturmuştum ve onu kullanıyordum. Bu servis hesabını da SQL Server Configuration Manager' dan atamıştım, fakat buna rağmen işlemler sırasında böyle bir hata mesajıyla ve daha başka çeşitli sorunlarla karşılaştım.

Bahsini ettiğim SQL Server Instance' ı bir test Instance' ı olduğu için servis hesabını Local Service olarak değiştirdim ve aynı işlemi tekrar yapmayı denedim ve bu sefer çalıştı.

"An error occurred while processing the log for database ‘veritabanı_adı’ - SQL Server Assertion: File: , line=1905 - Stack Signature for the dump is

HATA MESAJI:
"An error occurred while processing the log for database ‘veritabanı_adı’ - SQL Server Assertion: File: , line=1905 - Stack Signature for the dump is 0xC121BB7C "

AÇIKLAMA:
SQL Server Error Log dosyalarında böyle hata mesajlarıyla karşılaşabilirsiniz.

Benim yaşadığım durumda, bu hata mesajları Transaction Log dosyası RESTORE edilirken ortaya çıkmıştı ve nedeni ise veri dosyalarının (database data files) bulunduğu diskte yeteri kadar yer kalmayışıydı.

ÇÖZÜM:
Veritabanı veri ve Transaction Log dosyalarının bulunduğu disklerde yeteri kadar yer olduğundan emin olun.

"SQL Server blocked access to procedure 'dbo.sp_set_sqlagent_properties' of component 'Agent XPs' because this component is turned off as part of the

HATA MESAJI:
"SQL Server blocked access to procedure 'dbo.sp_set_sqlagent_properties' of component 'Agent XPs' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Agent XPs' by using sp_configure. For more information about enabling 'Agent XPs', see "Surface Area Configuration" in SQL Server Books Online. (Microsoft SQL Server, Error: 15281)"

AÇIKLAMA:
SQL Server sunucunuzda Replication kurmak isterken böyle bir hata mesajı ile karşılaşabilirsiniz. Örneğin ben bu hata mesajıyla Distributor' ü yapılandırmak için Distributor Configuration penceresini açmak istediğimde karşılaşmıştım...

ÇÖZÜM:
Aslında hata mesajında ne yapmanız gerektiği belirtilmiş, fakat yine de bu hata mesajının daha anlaşılabilir olması için bir açıklama yapmak istedim.

Agent XPs adındaki SQL Server Extended Stored Procedure' leri etkinleştirmek için öncelikle SQL Server Instance' ınıza SQL Server Management Studio (GUI) veya SQLCMD (Komut istemcisinden) ile bağlanmalı ve aşağıdaki komutları çalıştırmalısınız.

USE MASTER
GO

sp_configure 'show advanced options', 1;
GO

RECONFIGURE;
GO

sp_configure 'Agent XPs', 1;
GO

RECONFIGURE;
GO

sp_configure 'show advanced options', 0;
GO

RECONFIGURE;
GO

"SQL Server replication requires the actual server name to make a connection to the server. Connections through a server alias, IP address, or any oth

HATA MESAJI:
"SQL Server replication requires the actual server name to make a connection to the server. Connections through a server alias, IP address, or any other alternate name are not supported. Specify the actual server name, 'xxx-6J02WD\SQL2005'. (Replication.Utilities)"

AÇIKLAMA:
SQL Server sunucunuzda Replication kurmak isterken böyle bir hata mesajı ile karşılaşabilirsiniz. Aslında bu hata mesajıyla başka bir işlem yapmaya çalışırken de karşılaşabilirsiniz...

Sorun, sunucu adının olması gerektiğinden farklı olmasından kaynaklanıyordu.

Biliyorum, açıklamam gerekiyor =)

SELECT SERVERPROPERTY('SERVERNAME')

ve

SELECT @@SERVERNAME

komutları ideal dünyada aynı sonuçları döndürür. Fakat benimki gibi ideal olmayan bir dünyada yaşıyorsanız duruma göre farklı sonuçlar döndürebilirler. Ama şunu söyleyebilirim ki, SELECT SERVERPROPERTY('SERVERNAME') karşılaştığım her durumda doğru sonucu döndürüyordu. Bu iki komut da belli ki farklı yerlere bakıyorlar, tam olarak nereye baktıklarını ben de bilemiyorum...

Peki... Ben neden bunlardan bahsettim? Çünkü, eğer yukarıda Mesaj Başlığı bölümünde yazan mesaj ile karşılaştıysanız, büyük bir ihtimalle bu iki komutu çalıştırdığınızda farklı sonuçlar aldığınızı göreceksiniz.

Örneğin benim durumumda SELECT SERVERPROPERTY('SERVERNAME') komutunu çalıştırdığımda dönen sonuç şöyleydi: "EKREM-PC\SQL2005" (tabii ki bu değildi); fakat SELECT @@SERVERNAME komutunu çalıştırdığımda aldığım sonuç xxx-6J02WD\SQL2005 idi. Bunun nedeni ise, SQL Server Instance' ını kurduktan sonra bilgisayar adını değiştirmemdi.

ÇÖZÜM:
Böyle bir durumda yapmanız gereken ise şudur, öncelikle SQL Server' ınızda kayıtlı olan yerel bilgisayar adını aşağıdaki komut ile silersiniz:

sp_dropserver 'xxx-6J02WD\SQL2005'
GO

Daha sonra doğru yerel bilgisayar adını aşağıdaki komut ile eklersiniz:

sp_addserver 'EKREM-PC\SQL2005', 'Local'
GO

Bu işlemleri yaptıktan sonra SQL Server Database Engine servisini SQL Server Configuration Manager' dan veya Services MMC' den durdurup yeniden başlatırsınız.

Artık SELECT SERVERPROPERTY('SERVERNAME') komutunu da çalıştırsanız SELECT @@SERVERNAME komutunu da çalıştırsanız aynı sonucu alırsınız ve Mesaj Başlığında belirtilen hata mesajıyla veya türevleriyle artık karşılaşmazsınız.

"Database '' is in warm-standby state (set by executing RESTORE WITH STANDBY) and cannot be backed up until the entire load sequence i

HATA MESAJI:
"Database '' is in warm-standby state (set by executing RESTORE WITH STANDBY) and cannot be backed up until the entire load sequence is completed."

AÇIKLAMA:
Veritabanınızın yedeğini alırken böyle bir hata mesajı ile karşılaşabilirsiniz.

ÇÖZÜM:
Eğer veritabanınız örneğin bir Log Shipping senaryosunda Secondary veritabanıysa veya bir Database Mirroring senaryosunda Mirror veritabanıysa, yani özetle eğer "Restoring..." dumundaysa, o zaman bu veritabanının yedeğini BACKUP DATABASE komutuyla alamazsınız.

Veritabanınızın yedeğini almak için Primary veritabanınızın yedeğini alın.

"BackupIoRequest::WaitForIoCompletion: read failure on backup device ''. Operating system error 38(Reached the end of the fil

HATA MESAJI:
"BackupIoRequest::WaitForIoCompletion: read failure on backup device ''. Operating system error 38(Reached the end of the file.)."

"Internal I/O request 0x67BAE6D8: Op: Read, pBuffer: 0x0F410000, Size: 65536, Position: 60536320, UMS: Internal: 0x103, InternalHigh: 0x0, Offset: 0x39BB600, OffsetHigh: 0x0, m_buf: 0x0F410000, m_len: 65536, m_actualBytes: 0, m_errcode: 38, BackupFile: "

"The backup data in '' is incorrectly formatted. Backups cannot be appended, but existing backup sets may still be usable.

AÇIKLAMA:
Transaction Log yedeğinizi RESTORE etmeye çalışırken (tek tek veya Log Shipping ile) böyle hata mesajlarıyla karşılaşabilirsiniz.

ÇÖZÜM:
Bu sorun ile, Log Shipping' te karşılaşmıştım. Bu sorunu, Secondary veritabanına yeni Log yedeklerinin Restore edilmediğinde farkettim. SQL Server Error Log dosyasını incelediğimde bu hata mesajlarıyla karşılaştım.

Nedenini kesin olarak bilemediğim bir sebepten dolayı bu hata mesajının oluşmasına neden olan Transaction Log yedeği, Secondary sunucuya ulaştığında bir şekilde bozulmuş (Corrupt). Aynı dosyanın doğru halini tekrar Secondary sunucusuna gönderdiğimde Log Shipping kaldığı yerden başarılı bir şekilde çalışmaya devam etti, bilginize...

25 Temmuz 2009 Cumartesi

"Property Owner is not available for Database '[veritabani_adi]'. This property may not exist for this object, or may not be retrievable due to insuff

HATA MESAJI:
"Property Owner is not available for Database '[veritabani_adi]'. This property may not exist for this object, or may not be retrievable due to insufficient access rights. (Microsoft.SqlServer.Smo)"

AÇIKLAMA:
Örneğin SQL Server Management Studio’ daki bir veritabanınızın özelliklerine bakmaya çalıştığınızda bu hata mesajıyla karşılaşabilirsiniz. Nedeni, veritabanının orijinal sahibinin değiştirilmesidir.

ÇÖZÜM:
"sp_changedbowner" sistem SP' sini kullanarak ilgili veritabanının sahibi olarak "sa" kullanıcısını atayabilirsiniz...

USE
GO
EXEC sp_changedbowner 'sa'

"An I/O delay issue was found for the disk I/O subsystem."

HATA MESAJI:
"An I/O delay issue was found for the disk I/O subsystem."

AÇIKLAMA:
Bu mesajı (mesaj 833) gördüğünüzde SQL Server diskten okuma yapmak veya yazma yapmak için izin istemiş ve bu isteğin cevaplanması 15 saniyeden uzun sürmüştür. Bu hata SQL Server tarafından raporlanır ve disk I/O sistemiyle ilgili bir sorunun göstergesidir. Bu kadar uzun süren gecikmeler SQL Server ortamınızda ciddi performans sorunlarına neden olur.

ÇÖZÜM:
Bu hatayı araştırmak için Sistem Olay Günlüğünün donanım ile ilgili hata mesajlarını araştırın.

Ayrıca, aşağıdaki performans sayaçlarını kullanın:
- Average Disk Sec/Transfer
- Average Disk Queue Length
- Current Disk Queue Length

Özellikle SQL Server çalışan bir bilgisayardaki Average Disk Sec/Transfer sayacının değeri 15 milisaniyeden düşüktür. Eğer Average Disk Sec/Transfer değeri yükselirse bu, disk IO sisteminin gelen talepleri karşılayamadığını gösterir ve bu durumda ya veritabanında performans iyileştirme çalışması yapmak ya da disk sistemini donanımsal olarak güçlendirmek gerekir.

"Access to the path 'C:\Program Files\Microsoft SQL Server\100\License Terms\SQLServer2008_License_ENT_1033.rtf' is denied."

HATA MESAJI:
"Access to the path 'C:\Program Files\Microsoft SQL Server\100\License Terms\SQLServer2008_License_ENT_1033.rtf' is denied."

AÇIKLAMA:
SQL Server 2008 yüklemesi sırasında böyle bir sorun ile karşılaşabilirsiniz...

ÇÖZÜM:
İtiraf ediyorum ki, çözüm de sorun kadar garip.

Bu durumla karşılaşıldığında, sorunun 'C:\Program Files\Microsoft SQL Server\100\License Terms\SQLServer2008_License_ENT_1033.rtf' dosyasının silinerek aşıldığını gördüm.

Eğer siz de böyle bir sorunla karşılaştıysanız bu dosyayı silin ve kuruluma tekrar başlayın.

Upgrade Blockers (2000' den 2005' e Geçişte)

Merhaba arkadaşlar,

SQL Server MVP Kalen Delaney' in Inside Microsoft SQL Server 2005 serisinden "The Storage Engine" isimli kitabını okurken, böyle bir konu dikkatimi çekti ve bunu Türkçeleştirerek sizinle de paylaşmak istedim. Belki eski bir konu gibi görünebilir fakat hâlâ birçok firma SQL Server 2000 kullanıyor. Bu nedenle böyle bir yazının Türkçe olarak arşivde durmasında fayda var diye düşünüyorum.

Konu şu, SQL Server 7.0 veya SQL Server 2000' den SQL Server 2005' e doğrudan (in place) yükseltme (upgrade) işlemi yaparken özellikle 5 başlığa dikkat etmeniz gerekiyor. Aksi takdirde yükseltme işlemi gerçekleştirilemiyor.

Bu konular açıklamalarıyla şöyle:

1- ID değeri 32767 olan bir veritabanı. SQL Server 2005, bu veritabanı ID değerini özel ve gizli bir veritabanı olan Resource Veritabanı için kullanmaktadır. Bu ID değerine sahip bir veritabanı SQL Server 2005' yükseltme öncesinde ya silinmeli ya da yükseltme işlemi yapılacak Instance' tan ilişiği koparılmalıdır (detach). Aynı veritabanını, SQL Server 2005' e yükseltme işlemi tamamlandıktan sonra tekrar iliştirebilirsiniz (attach) veya yükseltme işlemine geçmeden önce de tekrar iliştirebilirsiniz; fakat aynı veritabanı ID' sini almadığına dikkat etmeniz gerekir.

2- Aynı Security Identifier' lar (SIDs) varsa. Eğer SQL Server 7.0 veya SQL Server 2000 veritabanınızda aynı SID' e sahip iki tane Login ID' niz varsa, SQL Server 2005' e yükseltme işlemi başarısızlıkla sonuçlanacaktır. Bu sorunu aşmak için bir tanesi hariç, diğer aynı SID' e sahip olan Login' leri silmeniz gerekir.

3- Login isimleri bir Sabit Sunucu Rolü (Server Fixed Role) ile aynı adı taşıyorsa. Eğer SQL Server 7.0 veya SQL Server 2000 Instance' ınızdaki Login isimlerinden biri, Sabit Sunucu Rollerinin birisiyle aynı adı taşıyorsa (örneğin sysadmin), o zaman yükseltme işlemi başarısız olur. Yükseltme işlemi öncesi, ilgili Login ismini değiştirmeniz gerekir.

4- "sys" adında bir kullanıcısı bulunan bir veritabanı. Tüm SQL Server 2005 veritabanları "sys" adında bir Schema ve bir Kullanıcı içerir ve bunlar özel maksatlar için kullanılır. Eğer veritabanınızda zaten "sys" adında normal bir kullanıcı nesnesi varsa, o zaman bu kullanıcı adını yükseltme işlemi öncesinde değiştirmeniz gerekir. Eğer veritabanındaki kullanıcı adını değiştirmezseniz, yükseltme işlemi sonrasında bu veritabanı Şüpheli (Suspect) duruma geçecektir ve veritabanı çevrimiçi (online) duruma getirilmediği sürece de kullanılamaz olarak kalacaktır.

5- Bir tablo veya View' ün birden çok aynı isimde Index' inin olması. Eğer bir nesnenin (tablo veya View) aynı isimle birden çok Index' i olursa, yükseltme işlemi başarısızlıkla sonuçlanır. Index' leri, "sp_rename" sistem SP' sini kullanarak hepsi birbirinden farklı isimlere sahip olacak şekilde yeniden adlandırabilirsiniz.

Bir yükseltme işleminden önce, SQL Server Upgrade Advisor' ü kullanmanızı tavsiye ederim. Bu araç, bu tür sorunları otomatik olarak tespit edecek ve size raporlayacaktır. Bu aracı, SQL Server CD\DVD' sinde bulabilirsiniz.



Ekrem Önsoy

30 Haziran 2009 Salı

"[Microsoft][SQL Native Client ]Unexpected EOF encountered in BCP data-file"

HATA MESAJI:
"[Microsoft][SQL Native Client ]Unexpected EOF encountered in BCP data-file"

AÇIKLAMA:
BCP aracı ile, CSV biçimindeki bir dosyadan veritabanınıza veri aktarmaya çalışırken böyle bir hata mesajı ile karşılaşabilirsiniz.

ÇÖZÜM:
Sorunun nedeni, CSV biçimindeki dosyanızda kullanılan ayraçların (delimiters), komutunuzdaki ayraçtan farklı olmasıdır.

Örneğin, CSV dosyanız içerisindeki ayraç eğer virgül ise ve siz BCP komutunuzda herhangi bir ayraç belirtmediyseniz bu hata ile karşılaşırsınız. Varsayılan ayraç ise sekmedir. Virgül ayracının kullanılmadığı komut örneği:

BCP Veritabanim.dbo.Tablom in c:\dosya.csv -T -c -S sunucu_adi\instance_adi

Görüldüğü gibi bu komutta ayraç olarak virgül belirtilmemiş. Virgül ayracının belirtilmesi için "-t" parametresinin kullanılması gerekiyor.

27 Mayıs 2009 Çarşamba

Anında Dosya Oluşturulması (Instant File Initialization)

Merhaba arkadaşlar,

Normalde, veritabanınıza ait veri (İng. data) ve kayıt (İng. transaction log) dosyaları, önceden silinmiş olan dosyalardan arta kalan alanların sıfırlarla doldurulmasıyla oluşturulur. Örnek olarak:

- Veritabanı oluşturulması,
- Varolan bir veritabanına veri veya kayıt dosyalarının eklenmesi,
- Varolan bir dosyanın boyutunun büyütülmesi (ki bu otomatik genişleme (İng. autogrowth) özelliğini de içerir),
- Bir veritabanının yedeğinin açılması (İng. restore).

Bununla birlikte, eğer dosyanın yazılacağı alan önceden hiçbir dosya tarafından kullanılmadıysa, o zaman diskino alanında oluşturulacak olan dosyanın sıfırlarla doldurulması gerekmez.

SQL Server' ın Instant File Initialization özelliğini kullandığınızda, dosyanın oluşturulması için sıfırlarla doldurulma işlemine gerek kalmadan veri dosyalarının oluşturulmasını sağlayabilirsiniz. Bu özellik sadece veri dosyaları için geçerlidir, kayıt dosyaları için değil.

Önemli Not: Instant File Initialization özelliği Windows XP Professional, Windows Server 2003 ve üzeri versiyonlar için geçerlidir.

Nasıl Kullanılır?

Bu özelliğin etkin olması için, SQL Server servisi için kullandığınız hesabın Yerel Güvenlik İlkesinde (İng. local group policy) "Birim bakım görevleri gerçekleştir" (İng. perform volume maintenance tasks) ilkesinin bir üyesi olması gerekiyor. Varsayılan olarak ise bu ilkenin tek üyesi Administrators Windows Grubu' dur. Bu bağlamda, bu özelliğin etkin olup olmadığı SQL Server servisi için hangi servis hesabını kullandığınız ile ilintilidir. Eğer SQL Server servisiniz için, sisteminizdeki Administrators Windows Grubu' na üye bir hesabı kullanacaksanız, o zaman Instant File Initialization özelliği zaten etkin olacaktır. Eğer SQL Server servisiniz için Administrators Windows Grubu' na üye olmayan bir hesap kullanmak istiyorsanız (ki doğrusu budur) o zaman o hesabı "Birim bakım görevleri gerçekleştir" ilkesinin bir üyesi yapmanız ve SQL Server servisinizi durdurup yeniden başlatmanız gerekiyor.

Örnek:

Instant File Initialization özelliği etkin değilken aşağıdaki kodu kullanarak oluşturduğum veritabanı tam 12 dakika 37 saniyede oluşturuldu.

CREATE DATABASE [IFI_Test]
ON PRIMARY ( NAME = N'IFI_Test', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\ifi.mdf' , SIZE = 30720000KB , FILEGROWTH = 1024KB )
LOG ON ( NAME = N'IFI_Test_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\ifi_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%) GO

Şimdi, bu oluşturduğumuz test veritabanını silin ve SQL Server' ın Instant File Initialization özelliğini önceden anlattığım şekilde etkinleştirin ve yine yukarıdaki kod ile aynı veritabanını tekrar oluşturun ve hız farkını görün... Instant File Initialization özelliğini etkinleştirdikten sonra aynı veritabanı benim dizüstü bilgisayarımda 3-5 saniyede oluşturuldu. Oldukça farkediyor değil mi?


Ekrem Önsoy

"Unable to open the physical file "xxx.mdf". Operating system error 5: "5(failed to retrieve text for this error. Reason: 15105)". (Microsoft SQL Serv

HATA MESAJI:
"Unable to open the physical file "xxx.mdf". Operating system error 5: "5(failed to retrieve text for this error. Reason: 15105)". (Microsoft SQL Server, Error: 5120)"

AÇIKLAMA:
SQL Server Management Studio (SSMS) kullanarak bir veritabanını iliştirmek (attach) istediğinizde böyle bir hata mesajı ile karşılaşabilirsiniz.

ÇÖZÜM:
Bu hatanın, UAC (User Access Control) özelliğinin etkin olduğu Windows Vista işletim sistemlerindeyken alındığını gördüm.

Bu hata mesajını almadan veritabanınızı SQL Server Instance' ınıza SSMS ile eklemek için SSMS' i açacağınız zaman SSMS simgesi üzerindeyken farenin sağ tuşuna tıklayıp "Yönetici olarak çalıştır" (Run as Administrator) öğesini seçerek açmanız gerekiyor.

Ya da, UAC özelliğini etkisiz (disable) hale getirirseniz, SSMS' i yönetici olarak çalıştırmadan da bu hata mesajından sıyrılabilirsiniz.

"System.Data.SqlClient.SqlError: The media set has 2 media families but only 1 are provided. All members must be provided. (Microsoft.SqlServer.Smo)"

HATA MESAJI:
"System.Data.SqlClient.SqlError: The media set has 2 media families but only 1 are provided. All members must be provided. (Microsoft.SqlServer.Smo)"

AÇIKLAMA:
Bir yedek dosyasını açmak (restore) istediğinizde böyle bir hata mesajıyla karşılaşabilirsiniz.

Bu hatayı almanızın sebebi, ilgili veritabanının yedeğini birden fazla dosyaya almanız, fakat yedeği açarken bu yedek dosyalarından sadece bir tanesini kullanmanızdır.

Örnek:
BACKUP DATABASE [veritabanım] TO DISK = N'C:\Test\Yedek1.bak', DISK = N'C:\Test\Yedek2.bak' WITH NOFORMAT, NOINIT, NAME = N'veritabanım-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10 GO

ÇÖZÜM:
Eğer yedek dosyasını açarken, yedekleme yaparken kullandığınız tüm yedek dosyalarını kullanırsanız böyle bir hata ile karşılaşmazsınız.

Örnek (İlk örneğe göre):
RESTORE DATABASE [veritabanım] FROM DISK = N'C:\Test\Yedek1.bak', DISK = N'C:\Test\Yedek2.bak' WITH FILE = 1, MOVE N'veritabanım' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\veritabanım.mdf', MOVE N'veritabanım_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\veritabanım_1.ldf', NOUNLOAD, STATS = 10 GO

Not: Eğer bu açma işlemini SSMS arayüzünü kullanarak yapacaksanız, o zaman "Restore Database" penceresindeki "From device:" bölümünde şöyle bir metin görünmeli: "C:\Test\Yedek1.bak,C:\Test\Yedek2.bak". Yani tek bir tane yedek değil, yedeklerin tümü.

SQL Server 2008 Servis Paketi 1 Yayınlandı!

Merhaba Arkadaşlar!


Cumulative Update 3 ve diğer bazı FIX' lerin de içinde bulunduğu SQL Server 2008 Service Paketi 1 yayınlandı.

Servis Paketi 1' i indirmek için buraya tıklayın!


Ekrem Önsoy

[ipucu] Sorgu çalıştırma süresi

Bazen şöyle bir soru alıyorum: "Bir sorguyu Query Analyzer' da veya Query Editor' de çalıştırdığım zaman, çalışma süresi olarak en az saniyeyi görebiliyorum, süreyi milisaniye olarak nasıl görebilirim?" Eğer bir sorgunun çalışma süresi, çalışırken derlenme ve optimizasyon için ne kadar CPU zamanı harcadığı gibi bilgileri pratik olarak görmek için SET STATISTICS TIME ON komutunu kullanabilirsiniz. Ayrıca bu komut, SSMS' teki Tools\Options->Query Execution->SQL Server->Advanced bölümünden varsayılan hale de getirilebilir.

[İPUCU] SSMS: GO 'sayı'

Query Editor' de bir komutu bir döngüye sokmak için GO komutunu kullanabileceğinizi biliyor muydunuz? Misal: "SELECT GetDate() GO 1000" komutu, GetDate() fonksiyonunun 1000 kere çalışmasını sağlayacaktır.

"Component update returned a fatal error : 1603 Error Code: 0x80070643 (1603)"

HATA MESAJI:
"Component update returned a fatal error : 1603 Error Code: 0x80070643 (1603)"

AÇIKLAMASI:
SQL Server Setup' ı çalıştırdığınızda ve aşağıdaki bileşenlerin yükleneceği ilk pencerede böyle bir sorun ile karşılaşabilirsiniz.

- Microsoft SQL Server Setup Support Files
- .Net Framework 2.0
- Microsoft SQL Server Native Client

ÇÖZÜM:
Bu sorunun tam olarak neden kaynaklandığını bilemiyorum, fakat sorunu çözmek için SQL Server Setup' ı çalıştırmadan önce, .Net Framework 2.0' ı kendiniz kurarsanız SQL Server Setup' ı tekrar çalıştırdığınızda böyle bir hata mesajıyla karşılaşmazsınız. En azından ben bu sorunu böyle aşmıştım.

2009 Microsoft Most Valuable Professional Ödülü

Merhaba Arkadaşlar!


Microsoft SQL Server ürünü hakkındaki çalışmalarımdan dolayı Microsoft SQL Server dalında, 2009 Microsoft Most Valuable Professional (En Değerli Profesyonel) ödülünü kazandım.

Bundan böyle, bu ödülle birlikte SQL Server ile ilgili daha fazla bilgiye ulaşma şansım olacak. Bu sayede daha güzel paylaşımlar yapabilirim. Tabi bu paylaşımların da sınırları olması gerekiyor, çünkü NDA denilen bir anlaşma var ve bu anlaşma MVP ödülünü kazanan kişi ile doğrudan Microsoft arasında yapılıyor ve anlaşmayı çiğnemem benim için hiç de iyi olmaz; hukuki yaptırımları var.

Beni bu ödüle aday olarak gösteren Aaron Bertrand (SQL Server MVP), Alex Kuznetsov (SQL Server MVP) ve Baransel Doğan (MVP Lead) teşekkür ederim.

"I would like to thank to Aaron Bertrand (SQL Server MVP), Alex Kuznetsov (SQL Server MVP) and Baransel Dogan (MVP Lead) for nominating me for this award."

Ayrıca, çalışmalarımı desteklediği için eski patronum Hasan Aydın Şaşmaz' a da teşekkür ederim.

MVP Profilim:
https://mvp.support.microsoft.com/profile/Ekrem.Onsoy


Ekrem Önsoy

7 Nisan 2009 Salı

SSMS: Connect to Server - Sunucu Listesi

Merhaba arkadaşlar,

SQL Server Management Studio 2005 ve 2008' i ilk açtığınızda "Connect to Server" başlıklı bir pencere açılır ve bu pencerede, önceden bağlantı yaptığımız sunuculara ait bilgiler vardır. İşte bu bilgiler, bir dosyada tutulur ve SSMS açılırken bu dosya okunur ve yüklenir. Bazen, "Connect to Server" penceresindeli sunucu listesinde bulunan bazı sunucuları listeden çıkarmak isteyebilirsiniz; fakat bu mümkün değil, en azından henüz benim bildiğim bir yöntem yok.

Ama bu, listeyi sıfırlayamayacağınız anlamına da gelmiyor. Yani ya hep ya hiç... Eğer listedeki tüm sunucu bilgilerini silmek isterseniz, o zaman SSMS versiyonuna göre aşağıdaki yöntemleri kullanın.

Not:
Burada anlattıklarım Microsoft tarafından dokümante edilmiş bilgiler değildir. Henüz herhangi bir zararını görmesem de uyarmak isterim ki, bu dosyalarda yapılacak değişikliklerin beklenmedik sonuçları olabilir.

SQL Server Management Studio 2008 için:

"C:\Users\\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shell" klasöründeki "SqlStudio.bin" isimli dosyanın ismini değiştirin. Silmeyin, sadece ismini değiştirin; çünkü herhangi bir nedenden dolayı bu dosyaya veya içindeki bilgilere daha sonra tekrar gereksinim duyabilirsiniz. SSMS 2008, tekrar açıldığında bu dosyayı sıfırdan otomatik olarak oluşturacaktır.

SQL Server Management Studio 2005 için:

"C:\Users\\AppData\Roaming\Microsoft\Microsoft SQL Server\90\Tools\Shell" klasöründeki "mru.dat" dosyası için da aynen "SqlStudio.bin" dosyası için yaptıklarınızı yapıp, SSMS 2005 için aynı sonucu alabilirsiniz.

Not:
Burada verdiğim yollar Windows Vista için geçerlidir, kullandığınız işletim sistemine göre yollar farklılıklar gösterebilir; fakat dosya isimleri aynı olacaktır. Yapacağınız değişiklikleri bu doğrultuda yapmanızı öneririm.


Ekrem Önsoy

Windows XP SP3: MSXML Sorunu

Merhaba arkadaşlar,

Windows XP SP3 yükledikten sonra, SQL Server yüklerken MSXML ile ilgili bazı sorunlarla karşılaşabilirsiniz. Bu konuda çok kişinin sorun yaşadığını gördüğüm için, bu sorunu ve geçici çözümünü kayıt altına aldım. "Geçici" diyorum, çünkü henüz bu konuda Microsoft' tan yayınlanmış bir yama veya FIX yok; bununla birlikte, bildiğim kadarıyla konu üstünde çalışılıyor.

Sorun özetle, Windows takımının, MSXML dosyalarını Windows' un korunan sistem dosyaları kategorisine sokmalarından kaynaklanıyor. Windows XP' ye SP3 yüklendikten sonra MSXML' in versiyonu 6.0 olarak yükseltiliyor, fakat SQL Server 2005 kurmaya çalıştığınızda ise yüklenmeye çalışılan MSXML versiyonu 4.0. Windows XP SP3 yüklendikten sonra MSXML dosyaları da koruma altına alındığı için SQL Server 2005' in yüklenmesi sırasında MSXML ile ilgili sorunlarla karşılaşılıyor.

Bu sorundan kurtulmak için aşağıdaki yöntemleri uygulayabilirsiniz:

- Windows Installer Cleanup Wizard' ı indirin,
- Uygulamayı çalıştırdıktan sonra, listeden MSXML 6' yı bulun ve kaldırın,
- SQL Server 2005 (veya daha üstü bir versiyonu) yüklemeyi tekrar deneyin.

Daha sonra MSXML 6.0' ı Microsoft Download sitesinden indirip tekrar kurmanız iyi olacaktır.


Ekrem Önsoy
HATA MESAJI:
"The CHECK_POLICY and CHECK_EXPIRATION options cannot be turned OFF when MUST_CHANGE is ON."

AÇIKLAMA:
Bir Login ile SQL Server Instance' ınıza giriş yaparken şifrenizin zamanının dolduğu ve değiştirilmesi hakkında bir mesaj alabilirsiniz. Eğer böyle bir uyarı mesajı alıyorsanız, o zaman bu, ilgili Login' in "CHECK_EXPIRATION" özelliğinin etkin olduğu anlamına gelir.

Şifrenizin süresi dolduğunda ise, şifre muhakkak güncellenmelidir. Eğer şifreyi güncellemeden gidip de Login' in özelliklerinden "CHECK_EXPIRATION" özelliğini iptal etmek isterseniz yukarıdaki hata mesajıyla karşılaşırsınız.

ÇÖZÜM:
Öncelikle, ilgili Login' in şifresi değiştirilmelidir. Bu işlemi SSMS arayüzünü veya T-SQL komutlarını kullanarak yapabilirsiniz.

SSMS:
- SSMS' i açın -> Security -> Logins ve ardından ilgili Login' i bulduktan sonra üzerinde farenin sağ tuşuna tıklayın ve Properties penceresini açın.
- Login' in şifresini değiştirin ve "User must change password at next login" seçeneğinin işaretini kaldırın. OK' düğmesine tıklayıp pencereyi kapatın.
- Eğer Password Policy ve Password Expiration kurallarının bu Login için tekrar uygulanmasını istemiyorsanız, Login' in Properties penceresini tekrar açıp ve "Enforce password expiration" seçeneğinin işaretini de artık kaldırabilirsiniz. Bu işlemi daha önce yapamazdık, çünkü öncelikle bir önceki adımın tamamlanması gerekiyor.

T-SQL:
Aşağıdaki komutu kullanarak ilgili Login' in şifresini değiştirin.

ALTER LOGIN [Login_adı] WITH PASSWORD=N'xxx'

Daha sonra aşağıdaki komutu kullanarak CHECK_EXPIRATION ve CHECK_POLICY özelliklerini de kapatabilirsiniz.

ALTER LOGIN [Login_adı] WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
HATA MESAJI:
"Executing the query "ALTER INDEX [index_adı] ON [dbo].[tablo_adı] REORGANIZE WITH ( LOB_COMPACTION = ON ) " failed with the following error: "The index "index_adı" (partition 1) on table "tablo_adı" cannot be reorganized because page level locking is disabled.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly."

AÇIKLAMA:
Bir veritabanındaki Index' ler için Index Reorganization işlemi yaptığınızda böyle bir hata mesajıyla karşılaşabilirsiniz.

ÇÖZÜM:
Bu hatayı almanızın nedeni, ilgili Index' in ALLOW_PAGE_LOCKS özelliğinin kapalı olmasıdır.

Veritabanınızda bulunan tüm Index' lerin hangilerinin ALLOW_PAGE_LOCKS özelliğinin kapalı olup olmadığını görmek için şu sorguyu çalıştırabilirsiniz:

SELECT A.Name AS InName,ob.Name AS DBName FROM sys.indexes A LEFT OUTER JOIN sys.objects ob ON ob.object_id = A.object_id WHERE ALLOW_PAGE_LOCKS = 0 AND ob.type = 'U'

Bir Index' in ALLOW_PAGE_LOCKS özelliğini etkinleştirmeyi SSMS arayüzünden de yapabilirsiniz, T-SQL ile de:

- SSMS: İlgili tablodaki Index üzerinde farenin sağ tuşuna tıklayın, açılan menüden "Properties" öğesini seçin ve açılan penceredeki Options bölümünde bulunan "Use page locks when accessing the index" seçeneğini işaretleyip OK düğmesine tıklayarak Index Properties penceresini kapatın.

- T-SQL: İlgili Index' a ait bilgileri kullanarak aşağıdaki komutu çalıştırın:
ALTER INDEX ON SET (ALLOW_PAGE_LOCKS = ON)

"Cannot drop the database 'veritabanı_adı' because it is being used for replication. (Microsoft SQL Server, Error: 3724)"

HATA MESAJI:
"Cannot drop the database 'veritabanı_adı' because it is being used for replication. (Microsoft SQL Server, Error: 3724)"

AÇIKLAMA:
Bir veritabanını silmek istediğinizde böyle bir hata mesajıyla karşılaşabilirsiniz.

ÇÖZÜM:
Bu hata mesajını alıyorsanız öncelikle bu veritabanının herhangi bir Replication topolojisiyle ilişkisi olmadığından emin olun. Bu veritabanıyla ilgili herhangi bir Publication olmadığını da kontrol edin.

Eğer yine de bu hata mesajını alıyorsanız, o zaman tahminimce bu, zaten Replication' da kullanılan bir veritabanının örneği\kopyasıdır ve muhtemelen BACKUP\RESTORE ile bir SQL Server Instance' ından diğerine taşınmıştır.

Böyle bir durumda, veritabanının içinde bulunan Replication ile ilgili ayarları temizlemek için aşağıdaki Stored Procedure' ü çalıştırabilirsiniz:

sp_removedbreplication

Bu komut hakkında daha fazla bilgi için: http://msdn.microsoft.com/en-us/library/ms188734.aspx

"Invalid zero-length device name. Reissue the BACKUP statement with a valid device name. [SQLSTATE 42000] (Error 3044) BACKUP LOG is terminating ab

HATA MESAJI:
"Invalid zero-length device name. Reissue the BACKUP statement with a valid device name. [SQLSTATE 42000] (Error 3044) BACKUP LOG is terminating abnormally. [SQLSTATE 42000] (Error 3013). The step failed."

AÇIKLAMA:
Yedek alırken böyle bir hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Eğer bu hata ile karşılaştıysanız, yedek dosyası için bir dosya adı belirttiğinizden emin olun.

Örneğin, eğer aşağıdaki gibi bir komut çalıştırırsanız bu hatayı alırsınız:

BACKUP DATABASE AdventureWorks to DISK = N''

"BackupDiskFile::CreateMedia: Backup device 'Z:\xxx.bak' failed to create. Operating system error 5(error not found)."

HATA MESAJI:
"BackupDiskFile::CreateMedia: Backup device 'Z:\xxx.bak' failed to create. Operating system error 5(error not found)."

AÇIKLAMA:
Yedek almaya çalışırken böyle bir hata mesajı ile karşılaşabilirsiniz.

ÇÖZÜM:
Yukarıda belirtilen hata mesajına göre gidersek, bu hatayı almanızın nedeni, SQL Server servisiniz için kullandığınız hesabın Z: sürücüsünde gerekli güvenlik haklarına sahip olmamasıdır.

Bu hatanın oluşmasını engellemek için, Bilgisayarım' dan Z: sürücüsünün özelliklerine gidin ve Güvenlik (Security) sekmesinde, SQL Server için kullandığınız hesabı (eğer listede yoksa) listeye ekleyin ve bu hesabın bu sürücüde Yazma (Write) hakkı olduğundan emin olun.

"A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible

HATA MESAJI:
"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) (Microsoft SQL Server, Error: 2)"

AÇIKLAMA:
SQL Server Instance' ınıza bağlanırken böyle bir hata mesajıyla karşılaşabilirsiniz.

ÇÖZÜM:
Eğer bu hata mesajını alıyorsanız, belirttiğiniz SQL Server adı doğrudur; fakat bağlanılmaya çalışılan SQL Server servisi çalışmıyordur.

SQL Server servislerinin çalışırlığını kontrol etmek için SQL Server Configuration Manager veya Services MMC' sini (Başlat\Çalıştır = services.msc ENTER) kullanabilirsiniz.

"A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessi

HATA MESAJI:
"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: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)"

AÇIKLAMA:
SQL Server Instance' ınıza bağlanırken böyle bir hata mesajıyla karşılaşabilirsiniz.

ÇÖZÜM:
Bu hata mesajını görmenizin nedeni, büyük ihtimalle SQL Server Instance adını yanlış belirtmenizden kaynaklanıyordur.

SQL Server' da temel olarak iki Instance tipi vardır, bunlardan biri Default Instance, diğeri ise Named Instance' tır.

Default Instance, bir sistemde sadece bir kere kurulabilir ve bilgisayar adından ibarettir. Örneğin, benim bilgisayarımın adı EKREM-PC olsun, eğer ben bu bilgisayara kuracağım SQL Server Instance' ını bir Default Instance olarak kurarsam, o zaman benim SQL Server Instance' ımın adı da bilgisayar adı gibi EKREM-PC olacaktır. Connection String' imdeki SERVER veya DATA SOURCE olarak da "EKREM-PC" adını kullanmam gerekir.

Named Instance ise bir veya birden fazla kurulabilir. Named Instance, \ biçimindedir. Örnek: "EKREM-PC\SQLExpress". Buradaki "EKREM-PC" benim bilgisayarımın adı, "SQLExpress" ise SQL Server kurulumu esnasında SQL Server Instance' ıma verdiğim isimdir. Connection String' imde de SERVER veya DATA SOURCE olarak "EKREM-PC\SQLExpress" adını kullanmam gerekir.

Eğer SQL Server' a gerek üçüncü parti bir uygulama gerekse SQL Server Management Studio ile bağlanırken Server adı yanlış belirtilirse bu hata ile karşılaşırsınız.

"The transaction log for database 'veritabanı_adı' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column

HATA MESAJI:
"The transaction log for database 'veritabanı_adı' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases (Microsoft SQL Server, Error: 9002)"

AÇIKLAMA:
Bir veritabanında, kayıt dosyasına işlenecek bir işlem yaparken (yeni bir Index oluşturma, Index Rebuild vb.) böyle bir hata mesajıyla karşılaşabilirsiniz.

Hata size kısaca, Transaction Log dosyasında yeterince yer kalmadığını söylüyor.

ÇÖZÜM:
Sorunu çözmek için, ilgili veritabanının Transaction Log dosyasında, yapılacak işlem için yeterince boş yer olduğundan emin olun.

Transaction Log dosyalarınızda ne kadar boş yer kaldığını aşağıdaki komut ile öğrenebilirsiniz.

DBCC SQLPERF(logspace)

Transaction Log dosyanızı boşaltmak için daha fazla bilgi edinmek istiyorsanız http://www.ekremonsoy.net/makaleler/sql/tlog_buyumesi/tlog_buyumesi.aspx.

"String or binary data would be truncated."

HATA MESAJI:
"String or binary data would be truncated."

AÇIKLAMA:
Bir tablonuzda güncelleme veya yeni kayıt ekleme işlemi yaparken böyle bir hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Bu hata ile, bir alanı güncellemeye çalışırken veya bir tabloya yeni bir kayıt eklerken bu hatayı almanızın sebebi, alan genişliği az olan bir alana daha uzun bir genişlikte veri yazmaya çalışmanızdır.

Örneğin, NVARCHAR(10) veritipiyle tanımlanmış bir alana aşağıdaki şekilde veri güncellemeye çalışırsanız bu hatayı alırsınız:

UPDATE tabloX SET alanX = 'Ekrem Önsoy' WHERE alanNO = sayiX

2 Mart 2009 Pazartesi

Bir ağdaki SQL Server Instance' larını bulmak...

Merhaba Arkadaşlar!


Hiç, ağınızdaki SQL Server Instance' larını bulmanız gerektiği oldu mu? Bunun için bazı teknikler veya uygulamalar kullanabilirsiniz.

Örneğin, bir Active Directory' niz varsa, o zaman şirketinizde mantıksal bir prosedür oluşturursunuz ve bu prosedüre göre oluşturulacak olan SQL Server Instance' larını Active Directory' nize kaydedersiniz ve ağda yüklü olan SQL Server Instance' larını bulmak için de Active Directory' de arama yapabilirsiniz.

Ya da, SQLPing veya SQLRecon gibi uygulamaları kullanabilirsiniz. Bu uygulamalar hakkında daha fazla bilgi edinmek ve uygulamaları indirmek için aşağıdaki adresi ziyaret edebilirsiniz.

http://www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx


Ekrem Önsoy

SQL Server 2008 Management Studio Express Edition

Merhaba Arkadaşlar!


SQL Server 2008 Management Studio Express Edition' ı artık tek başına da aşağıdaki adresten indirebilirsiniz.

https://www.microsoft.com/downloads/details.aspx?FamilyID=08e52ac2-1d62-45f6-9a4a-4b76a8564a2b&displayLang=en


Ekrem Önsoy

"System.Data.SqlClient.SqlError: Backup and file manipulation operations (such as ALTER DATABASE ADD FILE) on a database must be serialized. Reissue

HATA MESAJI:
"System.Data.SqlClient.SqlError: Backup and file manipulation operations (such as ALTER DATABASE ADD FILE) on a database must be serialized. Reissue the statement after the current backup or file manipulation operation is completed. (Microsoft.SqlServer.Smo)"

AÇIKLAMA:
Veritabanınızın yedeğini almak istediğinizde böyle bir hata mesajı ile karşılaşabilirsiniz.

ÇÖZÜM:
Veritabanınızın yedeğini almak istediğinizde, eğer başka bir kişi veya iş tarafından da aynı veritabanının yedeği zaten alınıyorsa o zaman bu hata ile karşılaşırsınız.

Aşağıdaki komutu çalıştırıp, o anda bir yedekleme işlemi yapılıp yapılmadığından emin olabilirsiniz:

SELECT * FROM sys.dm_exec_requests WHERE session_id > 51

Bu komutu çalıştırdıktan sonra "Command" alanında "BACKUP DATABASE" gibi bir komut görürseniz, anlayın ki o anda zaten yedek alınıyor.

"Invalid object name 'dbo.syspublications'. (Microsoft SQL Server, Error: 208)"

HATA MESAJI:
"Invalid object name 'dbo.syspublications'. (Microsoft SQL Server, Error: 208)"

AÇIKLAMA:
Yeni bir Publication oluştururken böyle bir hata mesajı ile karşılaşabilirsiniz.

ÇÖZÜM:
Öncelikle, eğer Distributor olarak başka bir sunucuyu yapılandırdıysanız, veritabanınızı yayınlayacağınız sunucunun, Distributor' daki Publishers listesinde olduğundan emin olmalısınız.

Daha sonra eski Publication' dan arta kalan tüm Replication ayarlarını temizleyebilirsiniz. Bunu da "sp_removedbreplication" sistem Stored Procedure' ü ile yapabilirsiniz.

Örnek:
sp_removedbreplication 'veritabanı_adı'

Bu adımlardan sonra muhtemelen bu hatayı almayacaksınız, en azından benim durumumda bu adımlar bu sorunu çözdü.

9 Şubat 2009 Pazartesi

SQL Server Instance' ına Sistem Yöneticisi Olarak Giremediğinizde

Merhaba arkadaşlar,

Olmaz demeyin, gerçekten olduğuna kaç kere şahit oldum. Kullanıcılar bazen farkında olmadan tüm System Administrator yetkisine sahip Login' leri silebiliyorlar ve bunun sonucunda da SQL Server Instance' larına yönetici olarak bağlanamıyorlar.

Bu gibi durumlarda genellikle başvurulan yöntem, SQL Server Instance' ının sistemden kaldırılması, yeni bir SQL Server Instance' ının kurulması ve veritabanlarının yeni Instance' a bağlanması oluyor. Bu şekilde, eğer sistem veritabanlarının (master, msdb gibi) yedekleri yoksa, tüm Maintanence Plan' lar, Job' lar, Login' ler vb. yok oluyor. Zaten bu sistem veritabanlarının yedekleri olsa dahi, Login bilgilerinin saklandığı "master" veritabanında da "sysadmin" rolüne üye bir Login bulunmayabilir. Ayrıca bu, çok zahmetli ve zaman alıcı bir iş olacaktır.

Bunun yerine aşağıdaki yöntemi uygulamanızı tavsiye ederim:

- Sisteme Yerel Yöneticiler (Local Administrators) Windows grubuna üye bir kullanıcıyla oturum açın,
- SQL Server Intance' ınızı Tek Kullanıcılı Mod (Single User Mode)' da açın, bunun için:
- SQL Server Configuration Manager' ı açın,
- SQL Server 2005 Services isimli düğüme tıklayın ve sağdaki pencereden ilgili SQL Server Instance' ınızın
özelliklerine (Properties) gidin,
- "Advanced" sekmesinde, "Startup Parameters" özelliğini bulun ve oraya, Resim-1' deki gibi "-m" parametresini
ekleyin.
- Parametre ekleme işleminden sonra SQL Server Instance' ınızın Veritabanı Motoru (Database Engine) servisini
durdurup yeniden başlatmanız gerekiyor.

Resim-1


Burada dikkat etmeniz gereken şey ise, SQL Server Instance' ınızın artık sadece bir kullanıcı kabul edeceğidir. Bu yüzden ilgili SQL Server Instance' ına ait SQL Server Agent servisinin çalışmadığından emin olun.

Tüm bu gereklilikleri yerine getirdikten sonra, SQL Server Management Studio (SSMS)' yu açın ve Query Editor' ü kullanarak ilgili SQL Server Instance' ınıza bağlanın. Object Explorer' dan değil, Query Editor' den bağlandığınıza emin olun, çünkü Object Explorer' dan bağlandığınızda sistemi eski haline getirmek için Login değişiklikleri yapmak istediğinizde SSMS SQL Server Instance' ınıza birden fazla bağlantı kurmak isteyecektir ve sistem de bunu kabul edemeyeceği için bu da hataya neden olacaktır.

SSMS' i açtıktan sonra yeni bir Query Editor penceresi açmak için SSMS' in sol üst köşesinde bulunan New Query düğmesine tıklayabilir veya File->New->Database Engine Query menüsünü kullanabilirsiniz.

Query Editor' de yeni bir sorgulama penceresi açtıktan sonra System Administrator haklarına sahip yeni bir kullanıcı oluşturmak için aşağıdaki komutları kendi ortamınıza uyarlayarak çalıştırmanız gerekiyor:

-- Yeni bir Windows Login oluşturma:
CREATE LOGIN [Test6\Administrator] FROM WINDOWS

-- Oluşturulan Login' i "sysadmin" Server Fixed Role' üne üye yapma:
EXEC sp_addsrvrolemember 'test6\Administrator', 'sysadmin';

Yeni Login oluşturma hakkında daha fazla bilgi için aşağıdaki adrese gözatın:
http://msdn.microsoft.com/en-us/library/ms189751(SQL.90).aspx

sp_addsrvrolemember Sistem Stored Procedure' ü için ise aşağıdaki adresi inceleyebilirsiniz:
http://msdn.microsoft.com/en-us/library/ms186320.aspx

Yeni Login de oluşturulup gerekli haklar verildikten sonra SQL Server Instance' ınıza başlangıç parametresi olaran eklediğiniz "-m" parametresini yukarıda izlediğiniz yolu izleyerek çıkarıp, SQL Server Instance' ınızın Database Engine servisini tekrar başlatmanız gerekir ve artık oluşturduğunuz Login ile SQL Server Instance' ınıza Sistem Yöneticisi olarak bağlanabilirsiniz!



Ekrem Önsoy

Eksik Index' ler ve DMV' ler

ÖNEMLİ NOT:
Bu sayfada tablolar düzgün görünmüyor, bu nedenle bu yazının aynısını aşağıdaki adresten okumanızı tavsiye ederim:
http://www.ekremonsoy.net/makaleler/sql/eksik_indexler/eksik_indexler.aspx

Merhaba arkadaşlar,

Muhtemelen çoğunuzun da bildiği gibi, SQL Server 2005 ile birlikte Dynamic Management Views (DMV) ve Dynamic Management Functions (DMF) diye adlandırılan kullanımı kolay, pratik ve işlevsel olan araçlar da kullanımımıza sunuldu.

Bu yazımda, tüm DMV veya DMF' lerden bahsetmeyeceğim; hatta sadece DMV' lerden ve yazının başlığından da anlaşılacağı üzere sadece Index' ler konusunda kullanılabilecek 3 tane DMV' den bahsedeceğim sizlere. Bu DMV ler:

- sys.dm_db_missing_index_group_stats

- sys.dm_db_missing_index_groups

- sys.dm_db_missing_index_details

Query Optimizer bir Sorgu Planı (Query Plan) oluşturduğunda, bu plan için en iyi olabilecek Index' leri analiz eder. Eğer kullanılabilecek en uygun Index' ler oluşturulmamışsa, o zaman Query Optimizer elindeki yapıyla oluşturabileceği en uygun planı oluşturur ama yaptığı analiz sonucunda uygun bulduğu en iyi Index' ler hakkındaki bilgiyi de saklar. Yukarıda listelediğim DMV' ler ile de Query Optimizer' ın kaydettiği bu bilgilere ulaşabiliriz ve bu bilgileri yorumlayarak, sistemimize en uygun olabilecek Index' leri kendimiz oluşturabiliriz. Bu DMV' ler bize ihtiyacımız olan çoğu bilgiyi sağlıyorlar. Meselâ hangi tabloda, hangi alanların kullanıcılarca çok sorgulandığı ve eğer xxx alanında xxx alanlarını kapsayan bir Index olması durumunda yapılan sorguların % kaç performans kazanabileceğine kadar...



Bu DMV de neyin nesi?

DMV' ler size, SQL Server sunucunuzun sağlıklı çalışabilirliğini gözlemleyebileceğiniz, sorunları teşhis edebileceğiniz ve performans düzenlemeleri yapabileceğiniz bilgileri verir.

DMV' leri kullanırken sadece isimlerini vererek kullanamazsınız, en azından Schema isimlerini de belirtmelisiniz. Bu nesnelerin tümü, "sys" isimli Schema' nın altındadır ve hepsinin de isimleri "dm_" karakterleriyle başlar. Örneğin: sys.dm_db_missing_index_group_stats gibi.

Bu DMV' den dönen sonuçlar, veritabanlarına yapılan her sorgudan sonra güncellenir. Bu yazıda değindiğim DMV' lerden gelecek bilgilerin, SQL Server Instance' ının servisinin yeniden başlatılması halinde sıfırlanacağını dikkate almanız gerekiyor. Çünkü servis yeniden başlatıldıktan sonra kısa zamanda büyük ihtimalle henüz sağlıklı bir Index oluşturma kararına varabileceğiniz kadar veri birikmiş olmayacaktır. Bu tür analizleri yaparken yeteri kadar verinin biriktiğinden emin olmalısınız.

DMV' leri aynen normal View' ler gibi sorgulayabilirsiniz, örneğin:

SELECT TOP 10 *

FROM sys.dm_db_missing_index_group_stats;

GO

Bazı DMV' ler doğrudan sorgulanamaz ve parametre ister, bunu da not etmekte fayda var.

Ayrıca, DMV ve DMF' lerin iki türü olduğunu da belirtmek lâzım. Bunlar:

- Sunucu düzeyinde çalışan DMV ve DMF' ler. Bu düzeydeki bir DMV ve DMF' i çalıştırmak için kullanıcının sunucu düzeyinde VIEW SERVER STATE iznine sahip olması gerekir. *

- Veritabanı düzeyinde çalışan DMV ve DMF' lerdir. Bu düzeydeki bir DMV ve DMF' i çalıştırmak için ise kullanıcının VIEW DATABASE STATE iznine haiz olması gerekmektedir. *

* Bununla birlikte, elbette ilgili nesne için de SELECT izinlerinin bulunması gerekiyor. Bu yazıda değindiğim dört DMV de, "master" sistem veritabanındadır.

sys.dm_db_missing_index_group_stats

Eksik Index grupları hakkında bilgi verir. Aşağıda, bu DMV' nin içerdiği ve benim en çok işe yarayacağını düşündüğüm alanları ve bu alanların açıklamalarını vereceğim.
Alan adı Veri tipi Açıklama
group_handle int Bir eksik Index grubunu tanımlar.
unique_compiles bigint Bu Index grubundan yararlanabilecek derlenen ve tekrarlı derlenen sorgu sayısı.
user_seeks bigint Gruptaki Index oluşturulsaydı, bu alanda belirtilen sorgu sayısı kadar sorgu için bu Index kullanılabilecekti. (Arama işlemi için) *
user_scans bigint Gruptaki Index oluşturulsaydı, bu alanda belirtilen sorgu sayısı kadar sorgu için bu Index kullanılabilecekti. (Tarama işlemi için) *
avg_total_user_cost float Gruptaki Index' in kullanılması halinde, yapılacak sorgulamalar için ortalama olarak düşürülecek maliyet miktarı.
avg_user_impact float Bu Index' in oluşturulmasıyla kullanıcı sorgularının edinilebileceği ortalama yüzde miktarı. Bu değer şu anlama geliyor: eğer bu Index grubu oluşturulmuş olsaydı, sorgunun maliyeti bu yüzde kadar düşürülebilirdi.

* Bu alanlarda belirtilen Seek ve Scan işlemleri, Index Seek ve Index Scan işlemleridir. Bu işlemler başlı başına ayrı bir konu olduğu için bu yazımda değinemem. Sadece kavramların havada kalmaması için bir not koymak istedim.

** Diğer alanlar hakkında da bilgi almak istiyorsanız, Books Online' daki ilgili sayfayı ziyaret edebilirsiniz: http://msdn.microsoft.com/en-us/library/ms345421(SQL.90).aspx

Aşağıdaki örnekte, kullanıcı sorgulamaları için en yüksek performans artışı sağlayabilecek 10 eksik Index' i buluyoruz:

SELECT s.group_handle, s.avg_total_user_cost , s.avg_user_impact , s.last_user_seek , s.unique_compiles
FROM sys.dm_db_missing_index_group_stats s
ORDER BY s.avg_user_impact desc

Bu sorguyu çalıştırdığınızda alacağınız sonuç tek başına yeterli olmayacaktır. Bu sorguyla birlikte diğer "missing_index" DMV' lerini de kullanmamız gerekecek, böylece hangi alanları kullanarak Index oluşturabileceğimiz bilgisini de edinebileceğiz.



sys.dm_db_missing_index_groups

Belli bir Index grubunda hangi eksik Index' lerin bulunduğu hakkında bilgi verir. Aşağıda, bu DMV' nin içerdiği alanları ve bu alanların açıklamalarını vereceğim.
Alan adı Veri tipi Açıklama
index_group_handle int Bir eksik Index grubunu tanımlar.
index_handle int index_group_handle ile belirlenen gruptaki eksik Index' leri belirler.

Bu DMV için örnek yapmıyorum, çünkü tek başına kullanımı anlamlı hiçbir şey vermeyecektir. Bu DMV dm_db_missing_index_group_stats ile dm_db_missing_index_details arasında köprü kurmak için kullanılabilir. Bir sonraki başlık olan dm_db_missing_index_details örneğinde göreceksiniz.



sys.dm_db_missing_index_details

Eksik Index hakkında ayrıntılı bilgi verir. Aşağıda, bu DMV' nin içerdiği alanları ve bu alanların açıklamalarını vereceğim.
Alan adı Veri tipi Açıklama
index_handle int Belli bir Index' i tanımlar. Tanımlama numarası sunucu çapında eşsizdir.
database_id smallint Eksik Index' in bulunduğu tablonun hangi veritabanında olduğunu tanımlar. Veritabanının ID' sini döndürecektir; eğer veritabanının adını görmek isterseniz o zaman bu alanı SELECT cümleciği içerisinde OBJECT_NAME(database_id) olarak tanımlayabilirsiniz.
object_id int Eksik Index' in hangi tabloda olduğunu tanımlar.
equality_columns nvarchar(4000) Eşitlik şartlarının bulunduğu ve virgüllerle ayrılmış alanların listesini verir. (Örn: tablo.alanAdı = değer)
inequality_columns nvarchar(4000) Eşitlik olmayan şartların bulunduğu ve virgüllerle ayrılmış alanların listesini verir. (Örn: tablo.alanAdı > değer)

"=" den başka tüm operatörler eşitlik olmayan şartlar listesine girer. Operatörler hakkına daha fazla bilgi almak için buraya tıklayın (İngilizce).
included_columns nvarchar(4000) Covering Index* oluşturmak için kullanılacak alanların listesini virgüllerle ayrılmış şekilde verir.
statement nvarchar(4000) Eksik Index' in bulunduğu tablonun adı.

* Özet: Covering Indexes \ Included Columns, SQL Server 2005 ile gelen bir yeniliktir. Özetlemek gerekirse, Key alan olarak bir Index' e en fazla 900 Byte' lık alan ekleyebilirsiniz. Bazı durumlarda bu değerden daha büyük alanları eklemek gerekebilir, işte SQL Server 2005 ile gelen Included Columns özelliği sayesinde artık Index' lere daha fazla alan ekleyebiliyoruz. Bu alanlara da Non-Key Alanlar deniyor. Bu konuda daha fazla bilgi için buraya tıklayın (İngilizce).

Bu DMV' yi tek başına kullanmak bayağı zahmetli olabilir. Bu nedenle ben daha ziyade önceki iki DMV ile birlikte hepsini kullanmayı tercih ediyorum. Meselâ aşağıdaki örneğe bakın:

SELECT d.* , s.avg_total_user_cost , s.avg_user_impact , s.last_user_seek ,s.unique_compiles
FROM sys.dm_db_missing_index_group_stats s , sys.dm_db_missing_index_groups g , sys.dm_db_missing_index_details d
WHERE s.group_handle = g.index_group_handle AND d.index_handle = g.index_handle order by s.avg_user_impact desc



Önemli Notlar

Yukarıda bahsettiğim DMV' lerden alacağınız eksik Index bilgileri sadece tablolarınıza karşı çalıştırılan SELECT sorgularından edinilmiştir. Yani bu DMV' ler tarafından verilen bilgilerin INSER\UPDATE ve DELETE işlemlerine ne gibi etkilerinin olacağı bilgisi yoktur. Bu nedenle bu DMV' lerden aldığınız bilgilere %100 güvenerek Index oluşturmamalısınız.

Benim size bu noktadaki tavsiyem dm_db_index_usage_stats DMV' sini kullanarak, oluşturduğunuz Index' lerin kullanımını da gözlemeniz. Eğer bu DMV ile aldığınız bilgilerde, oluşturduğunuz Index' lere karşı yapılan SEEK ve SCAN işlemleri UPDATE işlemlerinden daha az ise o zaman bu Index' in size çok faydalı olacağını söylemek yanlış olurdu.

dm_db_index_usage_stats' i çalıştırmak size zahmetli geliyorsa o zaman SQL Server Management Studio 2005 ile birlikte gelen raporları da kullanabilirsiniz. Meselâ SSMS' i açtıktan sonra bir veritabanının üzerinde farenin sağ tuşuna tıklayın, açılan menüden de Reports -> Standard Reports -> Index Usage Statistics' e tıkladığınızda dm_db_index_usage_stats DMV' si kullanılarak alınmış bir raporu görebilirsiniz. Bu rapordaki veriler ışığında da hangi Index' lerin ne kadar çok, hangilerinin ne kadar az kullanıldığını belirleyebilirsiniz.



Ekrem Önsoy

"Replication is skipping schema version logging because the systranschemas table is not present in database 'veritabani_ID'. This is an informational

MESAJ:
"Replication is skipping schema version logging because the systranschemas table is not present in database 'veritabani_ID'. This is an informational message only. No user action is required."

AÇIKLAMA:
Replication kurulu bir sisteminizde, Publication olarak kullandığınız fakat daha sonra bu Publication' ı kaldırdığınız bir veritabanınız için SQL Server Log dosyalarında böyle bir mesaj ile karşılaşabilirsiniz.

Hatta önceden Replication' a dahil olan fakat sonradan bu veritabanının Publication' ınını kaldırdığınız veritabanınızda bir değişiklik yapmaya kalktığınızda, bu veritabanının Replication' a dahil olduğunu söyleyen ve bu nedenle değişiklik yapmanızı engelleyen bir mesaj ile de karşılaşabilirsiniz.

Böyle durumlarda genellikle Publication doğru şekilde kaldırılmamış oluyor. Bu nedenle bu işlemi "sp_removedbreplication" sistem Stored Procedure' u ile yapabilirsiniz.

Örnek:
sp_removedbreplication 'veritabanı_adı'

Bu komut hakkında daha fazla bilgi için aşağıdaki sayfayı inceleyebilirsiniz:
http://msdn.microsoft.com/en-us/library/ms188734.aspx

"Autogrow of file in database was cancelled by user or timed out after milliseconds. Use ALTER DATABAS

MESAJ:
"Autogrow of file in database was cancelled by user or timed out after milliseconds. Use ALTER DATABASE to set a smaller FILEGROWTH value for this file or to explicitly set a new file size."

AÇIKLAMA:
SQL Server Log dosyalarında sürekli olarak veya sık sık böyle bir mesaj görebilirsiniz. Bunun nedeni, veritabanınızı oluşturan dosyalardan olan veri dosyasının veya kayıt (log) dosyasının içerisinde yer olmadığından ve yeni kayıtları kabul etmeleri için yer gerektiğinden dolayı sürekli büyüme gereksinimlerinden kaynaklanıyordur.

Veri ve kayıt dosyalarında her zaman yeterli boşluk olmalıdır ki, böyle fiziksel dosya büyütme işlemlerine sık sık gerek kalmasın. Bu tür işlemler yapılırken kullanıcıların işlemleri bekletilir ve böylece kilitlenmeler, donmalar vs. yaşanır.

"One or more of the server network addresses lacks a fully qualified domain name (FQDN). Specify the FQDN for each server, and click Start Mirroring

HATA MESAJI:
"One or more of the server network addresses lacks a fully qualified domain name (FQDN). Specify the FQDN for each server, and click Start Mirroring again. The syntax for a fully-qualified TCP address is: TCP://.[.]:"

AÇIKLAMA:
SQL Server Management Studio' da, bir veritabanının Properties penceresindeki Mirror bölümünden Database Mirroring oluşturmaya çalışırken bu sorun ile karşılaşabilirsiniz.

ÇÖZÜM:
Sorun, Wizard' ın bir şekilde bilgisayar ismini çözememesinden kaynaklanıyor.

Meselâ iki tane farklı SQL Server Instance' ını aynı makine üstünde kurdunuz diyelim ve bu hata ile karşılaştınız. Bu sorunu çözmek için ilgili veritabanının Properties penceresindeki Mirror bölümünde bulunan Configure Security düğmesine tıklayıp Database Mirroring topolojisine dahil Instance' ların bağlantı ayarlarını yaptıktan sonra size Database Mirroring' i hemen başlatmak isteyip istemediğiniz sorulur. Siz hemen başlatmak istemeyeceksiniz, çünkü Principal ve Mirror bilgileri olarak bilgisayar isimleri yazıyor ve siz eğer bu hata ile karşılaşıyorsanız o zaman orada bilgisayar isimlerin yerine IP adreslerinin yazmasını isteyeceksiniz. Bu nedenle de hemen başlatmak istemediğinizi belirteceksiniz ve belirttiğim alanların yeniden düzenlenebilir olduğunu göreceksiniz.

O alanlara, ilgili bilgisayarların\sunucuların IP adreslerini yazın ve artık Start Mirroring düğmesine tıklayarak aynalama işleminizi mutlu bir şekilde başlatabilirsiniz.

"BACKUP LOG cannot be performed because there is no current database backup."

HATA MESAJI:
"BACKUP LOG cannot be performed because there is no current database backup."

AÇIKLAMA:
BACKUP LOG komutuyla bir veritabanının Transaction Log yedeğini almaya çalışırken böyle bir hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Bunun nedeni, bu veritabanının henüz hiç tam yedeğinin (Full Backup) alınmamasıdır. BACKUP LOG ve BACKUP DATABASE ... WITH DIFFERENTIAL komutlarını çalıştırmadan önce bu işlemleri yapmaya çalıştığınız veritabanının tam ydeğini BACKUP DATABASE komutuyla almalısınız.

Bu komut hakkında daha fazla bilgi edinmek için aşağıdaki adresi ziyaret edebilirsiniz:
http://msdn.microsoft.com/en-us/library/ms186865(SQL.90).aspx

"The database must be online to have a database snapshot."

HATA MESAJI:
"The database must be online to have a database snapshot."

AÇIKLAMA:
Bir veritabanının Database Snapshot' ını oluştururken böyle bir hata mesajıyla karşılaşabilirsiniz.

ÇÖZÜM:
Bu hata mesajını, Database Mirroring' e dahil olmayan ve NORECOVERY durumundaki (Restoring...) bir veritabanının Snapshot' ını oluşturmaya çalışırsanız alırsınız.

Eğer Database Snapshot' ını oluşturmaya çalıştığınız veritabanının bir Mirror veritabanı olduğunu düşünüyorsanız, o zaman Database Mirroring' i doğru yapılandırdığınızdan emin olmalısınız.

Eğer Database Snapshot' ını oluşturmaya çalıştığınız veritabanı Database Mirroring' e dahil olmayan normal bir kullanıcı veritabanıysa, o zaman bu veritabanının NORECOVERY durumunda olmadığından emin olun.

"Delivering replicated transactions"

Replication Monitor' de, "Distributor to Subscriber History" isimli sekmede uzun bir süre böyle bir mesaj görebilirsiniz.

Bu mesajı gördüğünüzde de Undistributed Commands sekmesindeki bekleyen komutlar kutusunda birçok (bu birçok milyonları da bulabilir) Transaction' ın Distributor' dan Subscriber' lara henüz gönderilmediğini görebilirsiniz.

Bu gibi durumlara, Publisher tarafında yüklü yeni kayıtlar veya büyük güncellemeler yapıldığında karşılaşılabilir. Sadece sakin ve sabırlı olun. Tüm Transaction' ların zamanla aktarıldığını göreceksiniz.

Ayrıca önlem olarak, varsayılan değeri 72 saat olan ve Distribution Properties' te bulunan Transaction Retention Period' un değerini de uzatabilirsiniz. Bu sayede bazı Subscriber' larınız için Reinitialization işlemi yapmaktan kurtulursunuz. Fakat her şey normale döndükten sonra da bu değeri tekrar varsayılan değerine, yani 72 saate getirmenizi tavsiye ederim.

"The Log Reader Agent failed to construct a replicated command from log sequence number (LSN) {001327a0:00010ec1:000b}. Back up the publication datab

HATA MESAJI:
"The Log Reader Agent failed to construct a replicated command from log sequence number (LSN) {001327a0:00010ec1:000b}. Back up the publication database and contact Customer Support Services. (Source: MSSQLServer, Error number: 18805)"

AÇIKLAMA:
Transactional Replication kurulu bir sistemde, Replication Monitor' de böyle bir hata ile karşılaşabilirsiniz. Bu hata ile birlikte bu hatayı da alabilirsiniz.

ÇÖZÜM:
Bu sorun, SQL Server 2005 SP2 CU9 ve öncesinde; ayrıca SP3 ve öncesinde bir BUG olarak mevcuttur.

Bu sorunu çözmek için, eğer SP2 ile çalışmaya devam etmek istiyorsanız SP2 Cumulative Update 10' u yüklemelisiniz. Eğer SP3 yüklüyse, o zaman da SP3 Cumulative Update 1' i yüklemeniz gerekiyor.

SQL Server 2005 SP2 Cumulative Update 10 için aşağıdaki bağlantıyı kullanabilirsiniz:
http://support.microsoft.com/kb/956854/LN/

SQL Server 2005 SP3 Cumulative Update 1 için aşağıdaki bağlantıyı kullanabilirsiniz:
http://support.microsoft.com/kb/959195/LN/

"An unexpected Text Information Begin (TIB) log record was encountered while processing the TIB for offset 0. Last TIB processed: (textInfoFlags 0

HATA MESAJI:
"An unexpected Text Information Begin (TIB) log record was encountered while processing the TIB for offset 0. Last TIB processed: (textInfoFlags 0xfffffff5, coloffset 3248, newSize 0, oldSize 4294967296). Contact Customer Support Services. (Source: MSSQLServer, Error number: 18834) Get help: http://help/18834"

AÇIKLAMA:
Transactional Replication kurulu bir sistemde, Replication Monitor' de böyle bir hata ile karşılaşabilirsiniz. Bu hata ile birlikte bu hatayı da alabilirsiniz.

ÇÖZÜM:
Bu sorun, SQL Server 2005 SP2 CU9 ve öncesinde; ayrıca SP3 ve öncesinde bir BUG olarak mevcuttur.

Bu sorunu çözmek için, eğer SP2 ile çalışmaya devam etmek istiyorsanız SP2 Cumulative Update 10' u yüklemelisiniz. Eğer SP3 yüklüyse, o zaman da SP3 Cumulative Update 1' i yüklemeniz gerekiyor.

SQL Server 2005 SP2 Cumulative Update 10 için aşağıdaki bağlantıyı kullanabilirsiniz:
http://support.microsoft.com/kb/956854/LN/

SQL Server 2005 SP3 Cumulative Update 1 için aşağıdaki bağlantıyı kullanabilirsiniz:
http://support.microsoft.com/kb/959195/LN/

Bir Database Snapshot' ı Silmek

Normalde, kullanıcıların bağlı olduğu bir veritabanını doğrudan DROP DATABASE komutuyla silemezsiniz; fakat bu veritabanı eğer bir Database Snapshot ise, o zaman doğrudan "DROP DATABASE " gibi bir komutla kaç kullanıcı bağlı olursa olsun bu veritabanını silebilirsiniz. Burada dikkat edilmesi gereken ise, bu komutu çalıştıracak kullanıcının bu Database Snapshot' a o anda bağlantısı olmaması gerektiğidir. Aksi takdirde "Cannot drop database because it is currently in use." hatasını alırsınız.

11 Ocak 2009 Pazar

SQL Server 2005 Servis Paketi 3

Uzun zamandır beklenen Servis Paketi 3, 15 Aralık 2008 tarihinde yayınlandı.

Bu Servis Paketini indirmek için aşağıdaki adrese gidebilirsiniz:
http://www.microsoft.com/downloads/details.aspx?FamilyID=ae7387c3-348c-4faa-8ae5-949fdfbe59c4&displaylang=en

"The transaction ended in the trigger. The batch has been aborted. (Source: MSSQLServer, Error number: 3609)"

HATA MESAJI:
The transaction ended in the trigger. The batch has been aborted. (Source: MSSQLServer, Error number: 3609)"

AÇIKLAMA:
Eğer Trigger' larınızda "NOT FOR REPLICATION" komutunu kullanmadıysanız, o zaman Replication Monitor' de sık sık bu hatayı alırsınız ve "Undistributed Commands" sekmesinde de görüleceği üzere Subscriber' lara aktarılamayan komut sayısı sürekli artar.

Bunun sonucu olarak Transaction Log dosyanız şişer, Distributor için belirlenmiş Retention Period süresi de dolduktan sonra (ki varsayılan 72 Saattir), Subscriber' ınız için Reinitialization işlemi yapmanız gerekir...

ÇÖZÜM:
"sys.triggers" CataLog View' ünü kullanarak veritabanlarınızdaki Trigger' ları tespit edebilirsiniz. Ardından da tüm Trigger' ların ilgili bölümlerinde "NOT FOR REPLICATION" komutunun bulunduğundan emin olun.

Trigger' larda "NOT FOR REPLCATION" komutunu nasıl kullanacağınızı görmek için Books Online' dan ilgili sayfaya bakabilirsiniz: http://msdn.microsoft.com/en-us/library/ms189799.aspx

"Msg 21397, Level 16, State 1, Procedure sp_MSsetupnosyncsubwithlsnatdist, Line 213 The transactions required for synchronizing the nosync subscriptio

HATA MESAJI:
Msg 21397, Level 16, State 1, Procedure sp_MSsetupnosyncsubwithlsnatdist, Line 213 The transactions required for synchronizing the nosync subscription created from the specified backup are unavailable at the Distributor. Retry the operation again with a more up-to-date log, differential, or full database backup. The Subscriber was dropped.

AÇIKLAMA:
SQL Server 2005' te, Bir Transactional Replication yapısı kurup, Initialization işlemini de yedekle çözmek istediğinizde, Subscriber için bir Subscription eklerken bu hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Publisher' daki veritabanınızın Recovery Model' ının FULL olduğundan emin olun.

Eğer sorununuz yukarıdaki sebep değilse, o zaman Publisher' daki veritabanını Subscriber' a taşımak amacıyla yedek almadan önce Distributor' daki "Distrubution clean up: distribution" isimli Job' ın Disabled durumunda olduğundan emin olun.

"Event filter with query "select * from __InstanceModificationEvent within 10 where TargetInstance isa 'Win32_Service'" could not be (re)activated in

HATA MESAJI:
"Event filter with query "select * from __InstanceModificationEvent within 10 where TargetInstance isa 'Win32_Service'" could not be (re)activated in namespace "//./root/Microsoft/SqlServer/ComputerManagement" because of error 0x80041010. Events may not be delivered through this filter until the problem is corrected."

AÇIKLAMA:
Windows Event Application Log' larında böyle bir hata görebilirsiniz.

ÇÖZÜM:
Bu hatayı almamak için, SQL Server 2005' in Servis Paketi 2' sini yüklemelisiniz. Bu servis paketini Client Tools' a da uygulamayı sakın unutmayın, yoksa bu hatayı almaya devam edersiniz.

Pending Reboot Requirement (Error)

HATA MESAJI:
"Pending Reboot Requirement (Error)

A previous installation required a reboot of the machine for changes to take effect. To proceed, restart your computer and then run SQL Server Setup again."

AÇIKLAMA:
Bir SQL Server 2005 Instance' ı kurarken "System Configuration Check" penceresinde bu hata ile karşılaşabilirsiniz.

Bu hata, özellikle önceden kurmuş olduğunuz bir SQL Server 2005 Instance' ını kaldırdıktan sonra tekrar yeni bir SQL Server 2005 Instance' ı kurarken karşınıza çıkar.

Ayrıca sunucuyu kaç kere yeniden başlatırsanız başlatın, bu hatayı almaya devam edersiniz. Yani tam saç baş yolduracak cinsten bir hata =)

ÇÖZÜM:
Bu hatadan kurtulmak için aşağıdaki adımları gerçekleştirin:

- Regedit' i açın.
- F3' kısayol tuşuna tıklayarak Find' ı açın ve tırnakları kullanmadan şu değeri aratın: "PendingFileRenameOperations".
- Muhtemelen iki değerde sonuç verecek ve bu değerlerin adı da şöyle olacak: "Pending Rename Operations"
- Bu değer içerisinde yazan: "CurrentControlSet\Control\Session Manager\PendingFileRenameOperations" bilgisini temizleyip kaydedin.

Bu adımları izlediğiniz takdirde, sunucunuzu tekrar başlatmanıza gerek kalmadan SQL Server 2005 Setup' ı tekrar çalıştırdığınızda "System Configuration Check" penceresinde bu hata ile karşılaşmayacaksınız.