Sepetiniz

SQL Server Servisinin Tempdb Nedeniyle Açılmaması(FCB::Open failed: Could not open..)

SQL Server Servisi açılırken her seferinde daha önceden ayarlanmış path’lerde tempdb’yi yeniden oluşturur. “Tempdb veritabanını başka bir diske taşımak” isimli makalede tempdb’nin oluşacağı diskleri nasıl ayarlayacağınızı görebilirsiniz.

 

 

Bir örnek üzerinden giderek daha iyi anlaşılacağını düşünüyorum. Öncelikle instance üzerinde aşağıdaki script’i çalıştıralım ama C diskinin altında Tempdb isminde bir klasör olmasın.

 

use master
go
alter database tempdb modify file (name = tempdev, filename = 'C:\Tempdb\tempdb.mdf')
go
alter database tempdb modify file (name = templog, filename = 'C:\Tempdb\templog.ldf')

 

 

C diskinin altında Tempdb isminde bir klasör olmadığı için yukardaki script aşağıdaki gibi hata alacaktır.

 

Msg 5121, Level 16, State 1, Line 3

The path specified by “C:\Tempdb\tempdb.mdf” is not in a valid directory.

Msg 5121, Level 16, State 1, Line 5

The path specified by “C:\Tempdb\templog.ldf” is not in a valid directory.

 

 

C diskinin altında Tempdb isminde bir klasör oluşturup tekrar aynı script’i çalıştırarak bir sonraki sql server servis restart’ında tempdb’yi C diskinin altındaki Tempdb klasöründe oluşacak şekilde set edelim.

 

 

Daha sonra oluşturduğumuz Tempdb klasörünü silelim. Buradaki amacımız servis’i restart ettikten sonra sql server’ın servis başlangıcında tempdb’yi  C diskinin altında Tempdb klasöründe oluşturmaya çalışması ama Tempdb klasörünü bulamadığı için oluşturmaması. Bu yüzden serviste başlamayacaktır.

 

 

Daha sonra SQL Server Configuration Manager üzerinden SQL Server Servis’ini restart ediyoruz. SQL Server başlamayacaktır. Eventviewer’dan Windows’un altındaki Application sekmesindeki hatalara baktığınızda aşağıdaki gibi bir hata görürsünüz. Eventviewer’a ulaşmak için çalıştır’dan eventvwr yazmalısınız.

 

 

FCB::Open failed: Could not open file C:\Tempdb\tempdb.mdf for file number 1.  OS error: 3(The system cannot find the path specified.).

 

 

Eğer C diskinin altında Tempdb klasörünü yeniden oluşturup servis’i başlatırsanız servis başlayacaktır. Böyle bir şansınız yoksa sql server servis’ini -f startup parametresi ile başlatmalısınız. SQL Server’ı -f startup parametresiyle nasıl başlatacağınızı “SQL Server Startup Parametreleri” isimli makalede bulabilirsiniz.

 

Servis’i başlatmadan önce SQL Server Agent Servisinin kapalı olduğundan emin olun. Çünkü -f parametresiyle sql server hem minimum konfigürasyonda hem de single user mode’da çalışacaktır. Yani aynı anda sadece tek kullanıcı sql server’a bağlanabilir. SQL Server Agent Servis açık olursa o bağlanmaya çalıştığı için siz bağlanamayabilirsiniz.

 

Daha sonra SSMS’i açtıktan sonra gelen Connect kutucuğunu Cancel diyerek kapatıyoruz ve New Query diyoruz. New Query dedikten sonra gelen connection ekranında ok diyerek query’nin bağlanacağı ekrana aşağıdaki script’i yapıştırarak tempdb’nin yeni oluşacağı path’i set ediyoruz. Böylelikle servis yeniden açıldığında tempdb’yi bu script’te belirttiğimiz path’de oluşturacak ve sorunumuz çözülecektir. Daha sonra set ettiğiniz -f parametresini remove diyerek kaldırıp servis’i restart etmelisiniz.

 

use master
go
alter database tempdb modify file (name = tempdev, filename = 'E:\Tempdb\tempdb.mdf')
go
alter database tempdb modify file (name = templog, filename = 'E:\Tempdb\templog.ldf')

 

 

Burada dikkat etmeniz gereken önemli bir nokta olarak, SSMS’i açtığınızda ilk gelen connection ekranına Cancel demezseniz SSMS’i kapatıp açmadan bu işlemi yapamazsınız. Aşağıdaki gibi bir hata alırsınız. Herşeyi yukarda anlattığım sırada yapmalısınız. Aksi takdirde aşağıdaki gibi hata alırsınız.

 

Hatada sql server’ın single user mode’da çalıştığını, bu yüzden aynı anda sadece tek administrator’ın sisteme bağlanabileceğini söylüyor.

 

Cannot connect to

 

Login failed for user ”. Reason: Server is in single user mode. Only one administrator can connect at this time.(Microsoft SQL Server, Error: 18461)

 

SQL Server Startup Parametreleri

SQL Server Startup Parametreleri ile sql server servisinin başlangıcında belirli dosyaların lokasyonları ve instance seviyesinde bazı koşullar belirlenir. Nadiren problem anında sorunu tespit etmek ve çözmek için set etmek gerekir.

 

SQL Server Kurulumu sırasında, sql server default startup parametrelerini windows registry’ye yazar. Startup parametrelerini görebilmek için SQL Server Configuration Manager’da SQL Server Services sekmesinde aşağıdaki gibi ilgili servise sağ tıklayarak properties diyoruz.

 

 

Karşımıza aşağıdaki gibi bir ekran çıkıyor.

 

 

Bu ekranda gördüğünüz gibi -d, -e ve -l startup parametreleri default olarak mevcut.

 

Specify a startup parameter kısmının altındaki text alanına -f yazarak Add derseniz sistem artık her açıldığında bu parametrenin değerlerine göre çalışacaktır. Kritik anlarda problem çözmek maksadıyla set ettiğiniz parametreleri sonunun çözümünden sonra aynı ekrandan remove diyerek kaldırmalısınız.

 

Add diyerek parametreyi set ettikten sonra ok’e bastığınızda, bu parametrenin bir sonraki servis restart’ında devreye gireceğini belirten aşağıdaki gibi bir uyarı verir.

 

Any changes made will be saved; however, they will not take effect until the service is stopped an restarted.

 

 

 

Aşağıda hangi startup parametresinin ne işe yaradığını gösteren tabloyu paylaşıyorum.

Default Startup Parametreleri

Açıklama

-d

Master veritabanının mdf dosyasının path’inin bilgisini içerir.

-e

ERRORLOG’un path’inin bilgisini içerir.

-l

Master veritabanının ldf dosyasının path’inin bilgisini içerir.

Diğer Startup Parametreleri

 

-c

SQL Server cmd komut satırından başlatıldığında servisin başlama süresini kısaltır. Normalde SQL Server başlatıldığında Servis olarak çalışır. Bu startup parametresini ekleyerek servis olarak başlamayacağını set etmiş oluyor. Bu yüzden başlatılma süreside kısalıyor.

-f

SQL Server Servisinin başlangıcında minimum konfigürasyonla çalışır. Bu şekilde sql server kısıtlı bir açılabilir. Örneğin over-commiting olmuş bir sunucuda memory yetersizliği nedeniyle sql server başlayamıyorsa bu parametreyi kullanarak başlatabilirsiniz. Yada sql server’ın tempdb’yi oluşturacağı disk’i bulamaması nedeniyle açılmıyorsa bu parametreyi kullanarak sorunu çözebilirsiniz. “SQL Server Servisinin Tempdb Nedeniyle Açılmaması” isimli makalemde detayları bulabilirsiniz.

-m

SQL Server servisi single user mode’da açılır. Başka kimsenin bağlanmasını istemediğiniz durumlarda, sql server’ı bu parametre ile başlatabilirsiniz. -f parametresi ile de single user mode’da açıldığını söylemiştik. 2 parametrenin farkı, -f ile sql server’ınminimum konfigürasyonda başlaması.

 

Dikkat: SQL Server’ı -m parametresi ile başlatırsanız sunucuda lokal admin grubunda olan kullanıcılar sql server üzerinde yetkileri olmasa bile sql server’a bağlandıklarında sysadmin hakkına sahip olurlar.

-g

Extended procedure .dll dosyası yükleme işlemleri, distributed query, ve automation object kullanımlarında memory tüketimi sql server’ın kullandığı memory pool’un dışındaki memory’yi kullanır. Bu parametre ile de bu ayrılan memory’nin MB cinsinden miktarı belirlenir. Bu alan default olarak 256 MB’dır.

 

SQL Server Error Log’da aşağıdakilerden birini görmediğiniz sürece bu parametreyi set etmemelisiniz.

 

“Failed Virtual Allocate Bytes: FAIL_VIRTUAL_RESERVE <size>”

 

“Failed Virtual Allocate Bytes: FAIL_VIRTUAL_COMMIT <size>”

-mClient 

Belirtilen uygulama için connection limiti koyar. Aşağıdaki gibi kullanabilirsiniz.

-m”Microsoft SQL Server Management Studio – Query”

-m”SQLCMD”

 

Bu parametreyi set etmek yerine uygulamalarda connection problemlerini çözmeleri konusunda uygulama geliştiricileri ile irtibata geçmelisiniz. Microsoft bir güvenlik çözümü olarak bu parametrenin set edilmemesini tavsiye ediyor.

-n

SQL Server event’lerini loglamak için Windows Application Log kullanılmaz. Microsoft bu parametrenin kullanılması durumunda -e parametresininde kullanılmasını aksi takdirde sql server event’lerinin loglanmayacağını belirtiyor.

-T

SQL Server’ın -T’den sonra belirtilen trace flag’ın etkileriyle başlatılmasını sağlar.

-x

Bazı izleme özelliklerini pasif ederek sql server’ı başlatır.

-E

Filegroup’taki her file için tahsis edilmiş extent sayısını artırır. OLTP sistemlerde kullanılmamalıdır. Az kullanıcısı olan data warehouse  sistemlerinde faydalı olabilir.

-h

Hot Add Memory ile server’ı restart etmeden fiziksel olarak memory eklenebiliyor. Bu işlemi gerçekleştirebilmeniz için işletim sisteminizin ez az Windows Server 2003 ve SQL Server’ın en az SQL Server 2005 olması gerekiyor. Aynı zamanda SQL Server’ın da 64 bit olması ya da AWE’nin aktif edilmiş olması gerekiyor. SQL Server’ı -h startup parametresiyle başlatmanız gerekiyor. SQL Server 2017 ‘de bu parametre artık desteklenmiyor.