TempDB dosya sayısını artırdınız, bir dosyanın yerini değiştirdiniz ya da bir veritabanının dosyalarını başka bir diske taşıdınız; ardından servis yeniden başladığında SQL Server ya hiç açılmıyor ya da veritabanı çevrimiçi olmuyor. Error log’da şu mesaj var:
Bu hata, SQL Server’ın bir dosyayı açtığında, dosyanın başlığında beklediğinden farklı bir dosya numarası (file id) bulduğunu söyler. Başka bir deyişle meta verideki yol, yanlış dosyayı göstermektedir. Bu yazıda hatanın tipik nedenlerini ve güvenli çözüm adımlarını anlatıyoruz.
SQL Server ya da veritabanınız açılmıyor mu?
Aryasoft'un acil destek ekibi dosya eşleme ve başlangıç hatalarını veri kaybı riski olmadan çözer.
Neden Olur?
SQL Server her veritabanı dosyasının yolunu sys.master_files içinde tutar; her dosyanın başlığında da kendi dosya numarası yazar. Başlangıçta bu iki bilgi eşleşmezse 5161 hatası oluşur. Tipik nedenler:
- Eski bir TempDB dosyasının diskte kalması: Bir TempDB dosyası kaldırıldıktan sonra fiziksel dosya silinmez. Daha sonra yeni bir dosya aynı yol ve adla tanımlanırsa, SQL Server başlangıçta diskteki eski dosyayı bulur ve başlığındaki numara yeni tanımla eşleşmez.
- İki dosyanın aynı yolu göstermesi:
ALTER DATABASE ... MODIFY FILEile yol değiştirirken bir yazım hatası yüzünden iki mantıksal dosya aynı fiziksel dosyaya işaret eder. - Dosyaların karışması: Veritabanı dosyaları elle taşınırken bir veritabanının ndf ya da ldf dosyası, başka bir dosyanın yeriyle karıştırılmıştır.
Önce: Mevcut Eşlemeyi Görün
SQL Server çalışıyorsa (sorun yalnızca bir kullanıcı veritabanındaysa), meta verideki yolları listeleyin:
SELECT DB_NAME(database_id) AS database_name, file_id, name AS logical_name,
type_desc, physical_name, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'tempdb') -- ya da sorunlu veritabanı
ORDER BY file_id;
Aynı physical_name değerinin iki satırda geçip geçmediğine ve yolların diskteki dosyalarla eşleşip eşleşmediğine bakın.
TempDB Kaynaklı 5161
TempDB her başlangıçta yeniden oluşturulur; bu yüzden TempDB dosyalarındaki eski içerik korunmaya değmez. Hatanın kaynağı genellikle diskte kalmış eski bir dosyadır.
- SQL Server servisinin durduğundan emin olun.
- Error log’daki mesajda adı geçen dosyayı silmek yerine yeniden adlandırın (örneğin
tempdev2.ndf.eski). - Servisi başlatın. SQL Server, meta verideki tanıma göre dosyayı yeniden oluşturur.
- Servis açıldıktan sonra
sys.master_filesile TempDB dosyalarını kontrol edin ve eski dosyayı silin.
Servis yine açılmıyorsa ve TempDB tanımının kendisi hatalıysa, SQL Server’ı minimum yapılandırmayla (-f startup parametresi) başlatıp tanımı düzeltin:
net stop MSSQLSERVER
net start MSSQLSERVER /f /m"SQLCMD"
-- Hatalı dosya tanımını düzeltin ya da kaldırın
ALTER DATABASE tempdb MODIFY FILE (NAME = N'tempdev2', FILENAME = N'T:\TempDB\tempdev2.ndf');
-- veya
ALTER DATABASE tempdb REMOVE FILE tempdev2;
Ardından servisi normal şekilde yeniden başlatın. Startup parametrelerinin ayrıntıları için startup parametreleri rehberimize bakın.
Uyarı
TempDB dosya yapılandırmasını değiştirirken her dosya için benzersiz bir fiziksel ad kullanın ve değişiklikten sonraki ilk yeniden başlatmayı bakım penceresinde, error log’u izleyerek yapın. TempDB açılamazsa SQL Server da açılmaz; bu da tüm veritabanlarının erişilemez olması demektir.
Kullanıcı Veritabanı Kaynaklı 5161
Kullanıcı veritabanlarında dosyalar asla silinmemeli ya da yeniden oluşturulmamalıdır; bu dosyalar verinin kendisidir.
- Veritabanının her dosyasının nerede olduğunu ve hangisinin hangisi olduğunu belirleyin. Dosya başlıklarının hangi veritabanına ait olduğundan emin değilseniz önce dosyaların bir kopyasını alın.
- Veritabanını çevrimdışı yapın ve yolları doğru dosyalara göre düzeltin:
ALTER DATABASE SatisDB SET OFFLINE WITH ROLLBACK IMMEDIATE;
ALTER DATABASE SatisDB MODIFY FILE (NAME = N'SatisDB_Data2', FILENAME = N'E:\Data\SatisDB_Data2.ndf');
ALTER DATABASE SatisDB MODIFY FILE (NAME = N'SatisDB_Log', FILENAME = N'L:\Log\SatisDB_Log.ldf');
ALTER DATABASE SatisDB SET ONLINE;
Kritik
Kullanıcı veritabanı dosyalarının yerini değiştirirken hangi fiziksel dosyanın hangi mantıksal dosyaya ait olduğundan emin değilseniz deneme yanılma yapmayın. Yanlış eşlemeyle veritabanını açmaya çalışmak durumu kötüleştirebilir. Önce dosyaların kopyasını alın; gerekirse son sağlam yedekten geri dönüşü planlayın.
Önlemek İçin
- Dosya yollarını değiştiren script’leri çalıştırmadan önce
sys.master_filesçıktısını kaydedin. - Kaldırılan TempDB dosyalarının fiziksel dosyalarını, servis yeniden başlatıldıktan sonra silin.
- Her dosya için benzersiz ve açıklayıcı fiziksel adlar kullanın.
- Değişiklikten sonraki ilk yeniden başlatmayı kontrollü yapın ve error log’u izleyin.
Dosya yerleşimi ve TempDB yapılandırması için TempDB rehberimize bakın.
İlgili Yazılar
SQL Server Acil Destek
Açılmayan bir veritabanında risk almayın
Aryasoft’un kıdemli DBA ekibi dosya eşleme, TempDB ve başlangıç hatalarını kontrollü adımlarla çözer; kullanıcı verisini riske atmadan sistemi yeniden ayağa kaldırır.