MSSQL Server’da Restore İşleminde Versiyon Uyumsuzluğu Hatası ve Çözüm Yolları

SQL Server yöneticilerinin sıkça karşılaştığı “The database was backed up on a server running version X. That version is incompatible with this server” hatası, bir veritabanı yedeğinin (backup), alındığı sunucudan daha düşük bir SQL Server sürümüne geri yüklenmeye çalışılması durumunda ortaya çıkar.

Restore of database ‘SQL2022Compatibility160’ failed.
(Microsoft.SqlServer.Management.RelationalEngineTasks)

Additional information:
Microsoft.Data.SqlClient.SqlError: The database was backed up on a server running version 16.00.1000. That version is incompatible with this server, which is running version 15.00.2000. Either restore the database on a server that supports the backup, or use a backup that is compatible with this server. (Microsoft.SqlServer.SmoExtended)

SQL Server’da veritabanı yedekleri geriye dönük uyumlu değildir. Yani 2022 sürümünde alınan bir yedeği, 2019 sürümüne doğrudan Restore yöntemiyle yükleyemezsiniz. Compatibility Level’ın (Uyumluluk Seviyesi) düşük tutulmuş olması bu durumu değiştirmez; çünkü fiziksel dosya yapısı daha üst bir versiyona aittir.

Aşağıdaki komut ile sunucumuza yüklü olan Sql Server Sürümünü görebiliriz. Gelen sonuç ile Sql Server’ımızın hangi compatibility değeri desteklediğini aşağıda bulunan level tablosundan görebiliriz.

SELECT SERVERPROPERTY('ProductVersion');

Microsoft’un sayfasından almış olduğum uyumluluk seviyesiyle  karşılaştırdığımızda desteklenmediğini görmekteyiz. Bu işlem en alt sürümden en yüksek sürüme geçerken de karşılaşıla bilecek bir sorun olarak karşımıza çıkmaktadır.

Aşağıdaki diğer örneğimizde sql server 2022 versiyonunda compatibility level 140 ve 160 olacak şekilde backup alınmaktadır. Daha sonra ilgili backuplar restore edildiğinde aşağıdaki hata verilmektedir.

Aşağıdaki scriptlerle backup dizinlerinin versiyonuna bakıldığında iki backup dizininde de aynı sql server versiyonunun olduğu görülmektedir.

RESTORE HEADERONLY FROM DISK = 'M:\YEDEK1\XXXSQL20$SQLCXS25_AG\test23CompatibilityLevel140.bak';
RESTORE HEADERONLY FROM DISK = 'M:\YEDEK1\XXXSQL20$SQLCXS25_AG\test23CompatibilityLevel160.bak';

Bu komutun sonucunda çıkan DatabaseVersion kodu sql server versiyonu belirtmektedir.

  • 957: SQL Server 2022
  • 904: SQL Server 2019
  • 869: SQL Server 2017
  • 852: SQL Server 2016

Eğer mutlaka daha eski bir SQL Server versiyonuna veri taşımanız gerekiyorsa, standart .bak dosyası yerine şu alternatif yöntemleri kullanmalısınız:

  • BACPAC Export/Import: SSMS üzerinden “Export Data-tier Application” seçeneğini kullanarak şema ve veriyi bir .bacpac dosyası olarak dışa aktarıp eski sunucuda içeri alabilirsiniz. bu gibi sorunlar karşılaşırsanız Export data-tier application ile bu sorunu çözebilirsiniz. Export data-tier application makalesine ulaşmak için tıklayınız.
  • Generate Scripts: Veritabanına sağ tıklayıp Tasks > Generate Scripts adımlarını izleyerek, hem tablo yapılarını hem de verileri içeren devasa bir .sql dosyası oluşturup eski sunucuda çalıştırabilirsiniz.
  • Import/Export Wizard: Verileri tablo bazlı olarak eski sunucuya transfer edebilirsiniz. 

Ne kadar backup almadan önce compatibility level restore edilecek sql server servisiyle aynı olsa da backup aldığı sql server versiyonuna bakmaktadır. Restore edildiği andaki compatibility level seviyesi kontrol edilmez. Veritabanı ilk oluştururken ki versiyona bakmaktadır.

SQL Server’da yedekleme (Backup/Restore) işlemleri sadece yukarı yönlü çalışır (2019’dan 2022’ye geçiş gibi). Alt sürümlere veri taşımak için script oluşturma veya veri dışa aktarma (Export Data) gibi yöntemler tercih edilmelidir.

Başka makalede görüşmek dileğiyle…

Boş konuşmalardan kaçının Müminin-3

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir