Przeniesienie danych kopii zapasowej z nowej wersji MS SQL Server do starszej wersji

prehistoria

Kiedyś, aby odtworzyć błąd, potrzebowałem kopii zapasowej produkcyjnej bazy danych.

Ku mojemu zdziwieniu natrafiłem na następujące ograniczenia:

  1. Kopia zapasowa bazy danych została wykonana na wersji SQL Server 2016 i nie był zgodny z moim SQL Server 2014.
  2. Na moim komputerze służbowym używany był system operacyjny Windows 7więc nie mogłem zaktualizować SQL Server do wersji 2016
  3. Obsługiwany produkt był częścią większego systemu o ściśle powiązanej starszej architekturze i współpracował także z innymi produktami i bazami, więc wdrożenie go na innej stacji mogło zająć bardzo dużo czasu.

Biorąc powyższe pod uwagę doszedłem do wniosku, że przyszedł czas na kule niestandardowych rozwiązań.

Przywracanie danych z kopii zapasowej

Zdecydowałem się na maszynę wirtualną Oracle VM VirtualBox z systemem Windows 10 (możesz zrobić testowy obraz dla przeglądarki Edge stąd). Na maszynie wirtualnej zainstalowano SQL Server 2016 i przywrócono bazę danych aplikacji z kopii zapasowej (instrukcja).

Konfiguracja dostępu do SQL Server na maszynie wirtualnej

Następnie należało wykonać kilka czynności, aby móc uzyskać dostęp do SQL Server z zewnątrz:

  1. W przypadku zapory dodaj regułę pomijania żądań portów 1433.
  2. Pożądane jest, aby dostęp do serwera nie odbywał się poprzez uwierzytelnianie Windows, ale poprzez SQL przy użyciu loginu i hasła (łatwiej jest skonfigurować dostęp). Jednak w tym przypadku trzeba pamiętać o włączeniu uwierzytelniania SQL we właściwościach SQL Servera.
  3. W ustawieniach użytkownika na SQL Server na zakładce Mapowanie użytkownika określ rolę użytkownika dla przywróconej bazy danych db_administrator bezpieczeństwa.

Transfer danych

Właściwie sam transfer danych składa się z dwóch etapów:

  1. Transfer schematu danych (tabele, widoki, procedury składowane itp.)
  2. Samo przeniesienie danych

Transfer schematu danych

Wykonujemy następujące operacje:

  1. wybierać Zadania -> Generuj skrypty do przenośnej podstawy.
  2. Wybierz obiekty, które chcesz przenieść lub pozostaw wartość domyślną (w tym przypadku dla wszystkich obiektów bazy danych zostaną utworzone skrypty).
  3. Określ ustawienia zapisywania skryptu. Najwygodniej jest zapisać skrypt w jednym pliku Unicode. Wtedy, w przypadku niepowodzenia, nie trzeba powtarzać wszystkich kroków ponownie.

Po zapisaniu skryptu można go uruchomić na oryginalnym SQL Server (stara wersja), aby utworzyć wymaganą bazę.

Uwaga: Po wykonaniu skryptu należy sprawdzić zgodność ustawień bazy danych z kopii zapasowej z bazą utworzoną przez skrypt. W moim przypadku w skrypcie nie było ustawienia COLLATE, co doprowadziło do niepowodzenia podczas przesyłania danych i tańca z tamburynem w celu odtworzenia bazy danych za pomocą uzupełnionego skryptu.

Transfer danych

Przed przeniesieniem danych należy wyłączyć sprawdzanie wszystkich ograniczeń w bazie danych:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

Transfer danych odbywa się za pomocą kreatora importu danych Zadania -> Importuj dane na SQL Server, gdzie znajduje się baza danych utworzona przez skrypt:

  1. Określ ustawienia połączenia ze źródłem (SQL Server 2016 na maszynie wirtualnej). Użyłem źródła danych Natywny klient SQL Server oraz wspomniane uwierzytelnianie SQL.
  2. Określ ustawienia połączenia dla miejsca docelowego (SQL Server 2014 na komputerze hosta).
  3. Następnie skonfiguruj mapowanie. Wszystkie muszą być wybrane nie tylko do odczytu obiekty (na przykład widoki nie muszą być wybierane). Jako opcje dodatkowe wybierz „Zezwalaj na wstawianie do kolumn tożsamości”jeśli takie są używane.
    Uwaga: if podczas próby wybrania kilku tabel i ustawienia ich właściwości „Zezwalaj na wstawianie do kolumn tożsamości” właściwość została już ustawiona dla co najmniej jednej z wybranych tabel, w oknie dialogowym zostanie pokazana informacja, że ​​właściwość została już ustawiona dla wszystkich wybranych tabel. Ten fakt może być mylący i prowadzić do błędów migracji.
  4. Rozpoczynamy transfer.
  5. Przywracanie sprawdzania ograniczeń:
    EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

W przypadku wystąpienia błędów sprawdzamy ustawienia, usuwamy bazę utworzoną z błędami, tworzymy ją na nowo ze skryptu, dokonujemy poprawek i powtarzamy transfer danych.

wniosek

To zadanie jest dość rzadkie i występuje tylko ze względu na powyższe ograniczenia. Najczęstszym rozwiązaniem jest aktualizacja SQL Server lub połączenie się ze zdalnym serwerem, jeśli pozwala na to architektura aplikacji. Jednak nikt nie jest odporny na przestarzały kod i krzywe ręce związane z rozwojem o niskiej jakości. Mam nadzieję, że ta instrukcja nie będzie Ci potrzebna, ale jeśli nadal będziesz jej potrzebować, pomoże to zaoszczędzić mnóstwo czasu i nerwów. Dziękuję za uwagę!

Lista wykorzystanych źródeł

Źródło: www.habr.com