Przenoszenie danych między serwerami SQL za pomocą wygenerowanych skryptów.

Dziś pokażę jak wykonać przeniesienie danych pomiędzy serwerami z różnymi wersjami SQL. Jeśli chcielibyśmy przenieść ze starszego serwera na nowszy nie powinno być z tym większego problemu. Problemy pojawiają się jeśli chcemy przenieść dane (bazy) z serwera o wyższej wersji do serwera z niższą wersją. Niestety tu napotkamy na problemy (zarówno próbując wykonać Attach plików MDF i LDF z nowszej wersji, jak i próbując odzyskać backup wykonany na wyższej wersji)

Możemy skorzystać z exportu a następnie importu danych znajdujących się w bazie. Ja jednak pokażę jak wygenerować skrypty pozwalające na migrację danych.

Załóżmy że mamy dwa serwery (SQL2019 i SQL2016) i chcemy przenieść całą bazę z wyższej wersji (2019) do wersji starszej (2016).
Łączymy się do serwera źródłowego. Wybieramy bazę którą chcemy przenieść i z menu wybieramy opcję GENERATE SCRIPTS

Mamy do wybory dwie opcje. Pierwsza pozwala na wygenerowanie skryptu dla całej bazy.

Drugi dla pojedynczych obiektów bazy (tabele, widoki lub procedury składowane).

Przy wyborze Single Script File (jeden skrypt) wybieramy Ścieżkę i nazwę skryptu. Możemy również m.in. wybrać od razu wczytanie skryptu do okna SQL Management Studio.

Po naciśnięciu przycisku ADVANCED mamy sporą listę parametrów dotyczących tworzonych skryptów.

Na głównie będą interesowały poniższe czyli wybór czy w skrypcie mają być zawarte dane znajdujące się w tabelach czy tylko skrypty tworzące strukturę czy jedno i drugie:

Wersja docelowej wersji SQL-a:

Edycja docelowej wersji SQL-a:

Możemy również wybrać opcję w której wygenerowane zostaną skrypty dla poszczególnych obiektów (np. tabel). Wskazujemy w takim przypadku tylko folder gdzie mają się znaleźć skrypty a nazwy zostaną wygenerowane automatycznie

Małe podsumowanie i naciśnięcie FINISH spowoduje uruchomienie tworzenia skryptów.

Skrypty utworzone.

Teraz nie pozostaje nic innego jak skopiować je na docelowy serwer i uruchomić.
Powinniśmy zacząć od skryptu tworzącego nasza bazę (w naszym przypadku Northwind.Database.sql). Przy tworzeniu bazy nalezy zwrócić uwagę na ścieżki do plików bazy czy jest wpisana odpowiednia ścieżka.
Następnie wykonujemy skrypty dla poszczególnych obiektów (najpierw tabel, potem widoków, procedur składowanych itd).
Jak widać poniżej skrypt dla tabeli dbo.Categories.Table składa się z sekcji tworzącej tabele (CREATE TABLE) wraz z indeksami jak i jej napełnienie (INSERT dla każdego wiersza osobny)

PROCEDURA

Inną metoda jest zastosowanie procedury za pomocą której wygenerujemy skrypt to wprowadzenia danych do naszej tabeli. Link do wkryptu sp_generate_inserts.sql

Procedurę uruchamiamy poleceniem (przykładowo dla bazy Nortwind i tabeli dbo.Customers

EXEC sp_generate_inserts 'Customers'

Aby ograniczyć wielkość pliku uruchomimy to z parametrem określającym wygenerowanie skryptu dla TOP(5) wierszy tabeli

EXEC sp_generate_inserts 'Customers', @top = 5

--INSERTs generated by 'sp_generate_inserts' stored procedure written by Vyas
--Build number: 22
--Problems/Suggestions? Contact Vyas @ vyaskn@hotmail.com
--http://vyaskn.tripod.com
 
SET NOCOUNT ON
 
PRINT 'Inserting values into [Customers]'

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
INSERT INTO [Customers] ([CustomerID],[CompanyName],[ContactName],[ContactTitle],[Address],[City],[Region],[PostalCode],[Country],[Phone],[Fax])VALUES('ALFKI','Alfreds Futterkiste','Maria Anders','Sales Representative','Obere Str. 57','Berlin',NULL,'12209'
INSERT INTO [Customers] ([CustomerID],[CompanyName],[ContactName],[ContactTitle],[Address],[City],[Region],[PostalCode],[Country],[Phone],[Fax])VALUES('ANATR','Ana Trujillo Emparedados y helados','Ana Trujillo','Owner','Avda. de la Constitución 2222','Méxi
INSERT INTO [Customers] ([CustomerID],[CompanyName],[ContactName],[ContactTitle],[Address],[City],[Region],[PostalCode],[Country],[Phone],[Fax])VALUES('ANTON','Antonio Moreno Taquería','Antonio Moreno','Owner','Mataderos  2312','México D.F.',NULL,'05023','
INSERT INTO [Customers] ([CustomerID],[CompanyName],[ContactName],[ContactTitle],[Address],[City],[Region],[PostalCode],[Country],[Phone],[Fax])VALUES('AROUT','Around the Horn','Thomas Hardy','Sales Representative','120 Hanover Sq.','London',NULL,'WA1 1DP'
INSERT INTO [Customers] ([CustomerID],[CompanyName],[ContactName],[ContactTitle],[Address],[City],[Region],[PostalCode],[Country],[Phone],[Fax])VALUES('BERGS','Berglunds snabbköp','Christina Berglund','Order Administrator','Berguvsvägen  8','Luleå',NULL,'S

PRINT 'Done'

SET NOCOUNT OFF

Po zakończeniu prac usuwamy procedure poleceniem
drop proc sp_generate_inserts

Więcej informacji dotyczącej procedury sp_generate_inserts :
https://vyaskn.tripod.com/code.htm#inserts

Ten wpis został opublikowany w kategorii Microsoft SQL. Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz