Two files with crossed mappings to a database, representing SQL Server error 5161 file id mismatch

SQL Server Error 5161: An Unexpected File ID Was Encountered Hatası ve Çözümü

SQL Server error 5161’in ne anlama geldiği, TempDB ya da dosya yolu değişikliklerinden sonra neden ortaya çıktığı ve TempDB ile kullanıcı veritabanlarında veri riske atılmadan nasıl çözüleceği.

Nisan 12, 2023

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:

▤ Messages

Error: 5161, Severity: 16, State: 1. An unexpected file id was encountered. File id 3 was expected but 4 was read from “T:\TempDB\tempdev2.ndf”. Verify that files are mapped correctly in sys.master_files. ALTER DATABASE can be used to correct the mappings.

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 Acil Destek

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.

Acil Destek Alın

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 FILE ile 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.

  1. SQL Server servisinin durduğundan emin olun.
  2. Error log’daki mesajda adı geçen dosyayı silmek yerine yeniden adlandırın (örneğin tempdev2.ndf.eski).
  3. Servisi başlatın. SQL Server, meta verideki tanıma göre dosyayı yeniden oluşturur.
  4. Servis açıldıktan sonra sys.master_files ile 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.

  1. 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.
  2. 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.

SQL Server’ın bir veritabanı dosyasını açtığında, başlıkta meta veride beklenenden farklı bir dosya numarası bulduğunu gösterir. Meta verideki yol yanlış dosyayı göstermektedir.
Servis durdurulur, error log’da adı geçen eski dosya yeniden adlandırılır ve servis başlatılır; TempDB dosyayı yeniden oluşturur. Tanım hatalıysa SQL Server -f ile başlatılıp ALTER DATABASE tempdb ile düzeltilir.
Veritabanı çevrimdışı yapılır, dosya yolları ALTER DATABASE … MODIFY FILE ile doğru dosyalara göre düzeltilir ve veritabanı çevrimiçi yapılır. Dosyalar asla silinmemelidir.
sys.master_files görünümündeki physical_name değerleri, diskteki dosyalarla karşılaştırılır; aynı yolun iki kez geçmemesi gerekir.

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.

4.7/5