Yedekleme verilerini MS SQL Server'ın yeni bir sürümünden eski bir sürüme aktarma

tarih öncesi

Bir keresinde, bir hatayı yeniden oluşturmak için üretim veritabanının bir yedeğine ihtiyacım vardı.

Şaşırtıcı bir şekilde, aşağıdaki sınırlamalarla karşılaştım:

  1. Veritabanı yedeği sürümde yapıldı SQL Server 2016 ve benimkiyle uyumlu değildi SQL Server 2014.
  2. İş bilgisayarımda kullanılan işletim sistemi şuydu: , Windows 7bu yüzden güncelleyemedim SQL Server 2016 sürümüne kadar
  3. Desteklenen ürün, sıkı bir şekilde birleştirilmiş eski bir mimariye sahip daha büyük bir sistemin parçasıydı ve ayrıca diğer ürünler ve tabanlarla da iletişim halindeydi, dolayısıyla başka bir istasyona dağıtılması çok uzun zaman alabilirdi.

Yukarıdakiler göz önüne alındığında, standart olmayan çözümlerin koltuk değneklerinin zamanının geldiği sonucuna vardım.

Verileri bir yedekten geri yükleme

Sanal makine kullanmayı seçtim Oracle VM VirtualBox Windows 10 ile (Edge tarayıcı için bir test görüntüsü alabilirsiniz. bundan dolayı). Sanal makine üzerine SQL Server 2016 kurulumu yapıldı ve uygulama veritabanı yedekten geri yüklendi (talimat).

Bir sanal makinede SQL Server'a erişimi yapılandırma

Ardından, SQL Server'a dışarıdan erişebilmek için bazı adımların atılması gerekiyordu:

  1. Güvenlik duvarı için, bağlantı noktası isteklerini atlamak için bir kural ekleyin 1433.
  2. Sunucuya erişimin Windows kimlik doğrulaması yoluyla değil, bir oturum açma adı ve parola kullanılarak SQL aracılığıyla yapılması arzu edilir (erişimi ayarlamak daha kolaydır). Ancak bu durumda, SQL Server özelliklerinde SQL Kimlik Doğrulamasını etkinleştirmeyi hatırlamanız gerekir.
  3. Sekmedeki SQL Server'daki kullanıcı ayarlarında Kullanıcı Eşleme geri yüklenen veritabanı için kullanıcı rolünü belirtin db_securityadmin.

Veri aktarımı

Aslında, veri aktarımının kendisi iki aşamadan oluşur:

  1. Veri şeması aktarımı (tablolar, görünümler, saklı yordamlar vb.)
  2. Verilerin kendisini aktarma

Veri şeması aktarımı

Aşağıdaki işlemleri gerçekleştiriyoruz:

  1. Seçme Görevler -> Komut Dosyaları Oluştur taşınabilir bir taban için.
  2. Aktarmanız gereken nesneleri seçin veya varsayılan değeri bırakın (bu durumda, tüm veritabanı nesneleri için komut dosyaları oluşturulacaktır).
  3. Komut dosyasını kaydetmek için ayarları belirtin. Komut dosyasını tek bir Unicode dosyasına kaydetmek en uygunudur. Ardından, başarısızlık durumunda tüm adımları tekrarlamanız gerekmez.

Komut dosyası kaydedildikten sonra, gerekli tabanı oluşturmak için orijinal SQL Server'da (eski sürüm) çalıştırılabilir.

Not: Komut dosyasını yürüttükten sonra, yedekteki veritabanı ayarları ile komut dosyası tarafından oluşturulan veritabanı arasındaki yazışmayı kontrol etmeniz gerekir. Benim durumumda, komut dosyasında COLLATE için bir ayar yoktu, bu da verileri aktarırken ve eklenen komut dosyasını kullanarak veritabanını yeniden oluşturmak için bir tef ile dans ederken bir hataya yol açtı.

Veri aktarımı

Verileri aktarmadan önce, veritabanındaki tüm kısıtlamaların kontrolünü devre dışı bırakmalısınız:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

Veri aktarımı, veri içe aktarma sihirbazı kullanılarak gerçekleştirilir Görevler -> Verileri İçe Aktar komut dosyası tarafından oluşturulan veritabanının bulunduğu SQL Server'da:

  1. Kaynağa bağlantı ayarlarını belirtin (sanal makinede SQL Server 2016). veri kaynağı kullandım SQL Server Yerel İstemcisi ve yukarıda belirtilen SQL kimlik doğrulaması.
  2. Hedef için bağlantı ayarlarını belirtin (ana makinede SQL Server 2014).
  3. Ardından, eşlemeyi ayarlayın. Hepsi seçilmelidir salt okunur değil nesneler (örneğin, görünümlerin seçilmesine gerek yoktur). Ek seçenekler olarak "Kimlik sütunlarına eklemeye izin ver"eğer böyle kullanılıyorsa.
    Not: eğer, birkaç tablo seçip özelliklerini ayarlamaya çalışırken "Kimlik sütunlarına eklemeye izin ver" özellik, seçilen tablolardan en az biri için zaten ayarlanmışsa, iletişim kutusu, özelliğin tüm seçili tablolar için zaten ayarlanmış olduğunu gösterecektir. Bu gerçek kafa karıştırıcı olabilir ve geçiş hatalarına yol açabilir.
  4. Transferi başlatıyoruz.
  5. Kısıtlama kontrolünü geri yükleme:
    EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

Herhangi bir hata oluşursa ayarları kontrol eder, hatalı oluşturulmuş veritabanını siler, scriptten yeniden oluşturur, düzeltmeleri yapar ve veri aktarımını tekrarlarız.

Sonuç

Bu görev oldukça nadirdir ve yalnızca yukarıdaki sınırlamalar nedeniyle gerçekleşir. En yaygın çözüm, SQL Server'ı yükseltmek veya uygulama mimarisi izin veriyorsa uzak bir sunucuya bağlanmaktır. Bununla birlikte, hiç kimse eski kodlardan ve düşük kaliteli geliştirmenin çarpık ellerinden muaf değildir. Umarım bu talimata ihtiyacınız olmaz, ancak yine de ihtiyacınız varsa, çok fazla zaman ve sinir tasarrufu yapmanıza yardımcı olacaktır. İlginiz için teşekkür ederiz!

Kullanılan kaynakların listesi

Kaynak: habr.com