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)