Przywracanie kopii zapasowej bazy danych SQL Server w niższej wersji


185

Jak przywrócić plik kopii zapasowej bazy danych SQL Server w wyższej wersji na SQL Server w niższej wersji?

Za pomocą programu SQL Server 2008 R2 (10.50.1600) utworzyłem plik kopii zapasowej i teraz chcę go przywrócić na serwerze SQL Server 2008 na żywo (10.00.1600) .

Kiedy próbowałem przywrócić kopię zapasową do SQL Server 2008, pojawia się błąd, Restore Failedponieważ:

Kopia zapasowa bazy danych została wykonana na serwerze z wersją 10.50.1600. Ta wersja jest niezgodna z tym serwerem, na którym działa wersja 10.00.1600.

Jak przywrócić plik kopii zapasowej na tym serwerze?


2
Nie możesz tego zrobić - to po prostu niemożliwe. SQL Server nie zezwala * na obniżenie "bazy danych z wyższej wersji do niższej.
marc_s

18
Microsoft wie wszystko o SQL Serverie (odkąd go stworzyli), a jednak przenoszenie danych między 2 wersjami jest niemożliwe. Po prostu nie rozumiem, dlaczego jakiś tryb zgodności nie jest dostępny w eksporcie. Jak ciężko może być?
dvdmn

1
@dvdmn tak trudne, jak każdy odcinek Top Gear, w którym mówią, że - różne typy, różne stwierdzenia, różne układy bloków. Przenoszenie danych między bazami danych jest bardzo łatwe, niezależnie od wersji. Obniżenie nie jest jednak .
Panagiotis Kanavos

2
@PanagiotisKanavos Nie zgadzam się, w mysql możesz wyeksportować db jako polecenia sql i możesz przywrócić go w dowolnej wersji mysql (w dół lub w górę). Tak, możesz również wyeksportować sql db jako skrypt, ale przywrócenie go nie jest łatwe, jeśli masz jakieś zapisane funkcje / procedury, które są od siebie zależne. Zasadniczo nie jest to przydatne / rozwiązanie.
dvdmn

3
@dvdmn eksportowanie skryptów bazy danych różni się całkowicie od tworzenia kopii zapasowych. Zdaję sobie sprawę, że niektóre produkty nie oferują funkcji tworzenia kopii zapasowych / przywracania ani gorzej, pomieszaj te dwie koncepcje. Często dzieje się tak z przyczyn historycznych: brak kopii zapasowej w przeszłości, niektóre produkty nazywane eksportowaniem / skryptami o tej nazwie. Teraz, gdy to robią , muszą nadal rozwiązywać konflikty terminów, rozmawiając o fizycznych i logicznych kopiach zapasowych, a następnie mieszają się, gdy rozmawiają o skryptach
Panagiotis Kanavos

Odpowiedzi:


78

Nie, obniżenie poziomu bazy danych nie jest możliwe. 10.50.1600 to wersja SQL Server 2008 R2 . Nie ma absolutnie żadnego sposobu, aby przywrócić lub dołączyć tę bazę danych do instancji SQL Server 2008, którą próbujesz przywrócić (10.00.1600 to SQL Server 2008). Twoje jedyne opcje to:

  • uaktualnij to wystąpienie do SQL Server 2008 R2 lub
  • przywróć kopię zapasową, którą masz w instancji SQL Server 2008 R2, wyeksportuj wszystkie dane i zaimportuj je do bazy danych SQL Server 2008.

Nie mogę zaktualizować serwera na żywo klientów z powodu ograniczeń uprawnień. a moja baza danych ma ponad 2,5 GB, więc nie mogłem utworzyć skryptu danych z powodu błędu wyjątku pamięci.

9
@Gaurav Nie twórz skryptów danych - zamiast tego wykryj całą bazę danych (tabele, procy, wyzwalacze, ograniczenia itp.) Bez danych, utwórz nową bazę danych, następnie kliknij prawym przyciskiem myszy źródłową bazę danych, przejdź do „Narzędzia”, a następnie „Eksport danych”, aby przenieść zawartość tabel do bazy danych.
Jim McLeod

17
Jestem bardzo podejrzliwy, jeśli chodzi o szybką odpowiedź „nie ma możliwości” - oznacza to tylko, że jeszcze nie znalazłeś drogi. Może być wiele powodów, dla których chcesz to zrobić, więc nie jest to pomocna odpowiedź.
Jay Imerman

6
Nie zgadzam się, @Jay, czasami „nie możesz” jest idealną odpowiedzią, chociaż bardziej przydatne jest oferowanie obejść tam, gdzie są one dostępne.
Russell Fox

1
@Zhang, jeśli masz pytania, zadawaj je jako pytania, a nie jako komentarz.
Remus Rusanu,

83

Możesz użyć funkcji o nazwie Eksportuj warstwę danych, która generuje .bacpacplik zawierający schemat bazy danych i dane.

Na serwerze docelowym możesz użyć opcji Importuj warstwę danych, która tworzy i zapełnia nową bazę danych z wcześniej utworzonego .bacpacpliku

Jeśli chcesz tylko przenieść schemat bazy danych, możesz użyć aplikacji Wyodrębnij warstwę danych do utworzenia pliku i Wdróż aplikację warstwy danych do wdrożenia utworzonego schematu bazy danych.

Próbowałem tego procesu na różnych wersjach SQL Server od SQL 2014 do SQL 2012 oraz od SQL 2014 do SQL 2008R2 i działałem dobrze.


8
To odpowiedź zasługuje na większą uwagę. W rzeczywistości działa po prostu w większości przypadków. Jeśli jednak są tam osieroceni użytkownicy SQL, operacje eksportu zakończą się niepowodzeniem. Zawsze możesz usunąć / dodać te bity ręcznie, aby w inny sposób przekroczyć wersje SQL.
Doktor Blue

3
Właśnie próbowałem tego, aby utworzyć bazę danych utworzoną na MSSQLEX2014 (V12) na moim MSSQLEX2012 (V11). Po prostu pojawia się błąd „Microsoft.Data.Tools.Schema.Sql.Sql120DatabaseSchemaProvider jest niepoprawny” i nie ma możliwości jego zmiany.
Craig,

5
Importowanie z SQL Server 2014 do 2012 za pomocą .bakpac DOES działa, ale wymaga poprawnej wersji SSMS. Na przykład używam SSMS 2016 CTP3 i działało bezbłędnie. NIE działało dla mnie przy użyciu SSMS 2012. Nie testowałem SSMS 2014.
Greg Gum

1
Ktoś wie, czy można skryptu tej procedury w T-SQL? AKTUALIZACJA (odpowiadając sobie po trochę googlingu): możesz to zautomatyzować za pomocą sqlpackage.exewiersza poleceń. Google na więcej.
Alex

1
To jedyne rozwiązanie, które działało dla mnie w przypadku obniżenia dość dużego / skomplikowanego SQL2017 do SQL2016. Wydajność również bardzo dobra.
Keith Blows

35

Niekoniecznie zadziała

Będzie działać

  • Generowanie skryptu - Zadania -> Generuj skrypty . Upewnij się, że ustawiłeś żądaną docelową wersję programu SQL Server na stronie Ustaw opcje skryptów -> Zaawansowane . Możesz także wybrać, czy chcesz skopiować schemat, dane, czy jedno i drugie. Zauważ, że w wygenerowanym skrypcie może zaistnieć potrzeba zmiany folderu DATA dla plików mdf / ldf, jeśli przejdziesz z trybu innego niż ekspresowy na ekspresowy lub odwrotnie.

  • Microsoft SQL Server Database Publishing Services - wydaje mi się, że zawiera SQL Server 2005 i nowsze wersje. Pobierz najnowszą wersję stąd . Wymagania wstępne: sqlncli.msi/ sqlncli_x64.msi/ sqlncli_ia64.msi, SQLServer2005_XMO.msi/ SQLServer2005_XMO_x64.msi/ SQLServer2005_XMO_ia64.msi(pobierz tutaj ).


7
Generowanie skryptu nie jest wiarygodne w przypadku dużych baz danych, należy unikać, jeśli to w ogóle możliwe.
Chris

Oba linki na dole to 404.
Sнаđошƒаӽ

29

Oto moje 2 centy za różne opcje wykonania tego:

Narzędzia innych firm : Prawdopodobnie najłatwiejszym sposobem na wykonanie zadania jest utworzenie pustej bazy danych w niższej wersji, a następnie użycie narzędzi innych firm do odczytania kopii zapasowej i zsynchronizowania nowo utworzonej bazy danych z kopią zapasową.

Czerwona brama jest jedną z najpopularniejszych, ale istnieje wiele innych, takich jak ApexSQL Diff , ApexSQL Data Diff , Adept SQL , Idera …. Wszystkie są narzędziami premium, ale możesz wykonać zadanie w trybie próbnym;)

Generowanie skryptów : jak wspomniano już wcześniej, zawsze możesz tworzyć struktury skryptów i danych za pomocą SSMS, ale musisz wziąć pod uwagę kolejność wykonywania. Domyślnie skrypty obiektowe nie są porządkowane poprawnie i będziesz musiał zająć się zależnościami. Może to stanowić problem, jeśli baza danych jest duża i zawiera wiele obiektów.

Kreator importu i eksportu : To nie jest idealne rozwiązanie, ponieważ nie przywróci on wszystkich obiektów, a jedynie tabele danych, ale można rozważyć szybkie i brudne poprawki, gdy jest to potrzebne.


1
Klon Sql Red Gate nie obsługuje klonowania między różnymi wersjami serwera SQL, zgłaszając dokładnie ten sam błąd, który pojawia się, gdy próbuję to zrobić ręcznie.
DarkDeny,

29

Nie można przywrócić bazy danych (lub dołączyć) utworzonej w wyższej wersji do niższej wersji. Jedynym sposobem jest utworzenie skryptu dla wszystkich obiektów i użycie go do wygenerowania bazy danych.

wprowadź opis zdjęcia tutaj

wybierz „Schemat i dane” - jeśli chcesz przenieść obie rzeczy do pliku skryptu kopii zapasowej,
wybierz Tylko schemat - jeśli tylko schemat jest potrzebny.

wprowadź opis zdjęcia tutaj

Tak, teraz skończyłeś z Utwórz skrypt ze schematem i danymi bazy danych.


16

Innym sposobem jest skorzystanie z funkcji „Kopiuj bazę danych”:

Znajdź, klikając prawym przyciskiem myszy źródłową bazę danych> „Zadania”> „Kopiuj bazę danych”.

Możesz skopiować bazę danych do niższej wersji SQL Server Instance. Działa to dla mnie z SQL Server 2008 R2 (SP1) - 10.50.2789.0 do Microsoft SQL Server 2008 (SP2) - 10.0.3798.0


3
Zauważ, że to nie zadziała, jeśli celem jest SQL Server express „Serwer docelowy nie może być SQL Server 2005 lub nowszą instancją Express”. social.msdn.microsoft.com/Forums/en-US/sqlgetstarted/thread/…
Ohad Schneider

2
Nie można również skopiować bazy danych z SQL Server 2012 do SQL Server 2008 w ten sposób.
Twinkles

1
Kopiowanie bazy danych to operacja
odłączania

1
Dzięki za podpowiedź! To bardzo mi pomogło. Skopiowałem dane z SQL 2008 R2 do SQL 2008.
dns_nx

8

Możesz tego spróbować.

  1. Utwórz bazę danych w SQL Server 2008.
  2. Za pomocą funkcji Import danych importuj dane z SQL Server R2 (lub dowolnej wyższej wersji).
  3. użyj „RedGate SQLCompare” do synchronizacji skryptu.

6

Przejdź do Zadanie-> Generuj skrypty ...

W sekcji Zaawansowane w „Typach danych dla skryptu” wybierz "Schema and data"i spróbuj uruchomić ten skrypt w niższej wersji.


5
To bardzo dobre rozwiązanie, ale działa bardzo słabo z większymi bazami danych.
veljasije 12.04.16

5

To nie jest ładne, ale tak to zrobiłem, pod warunkiem, że masz tę opcję zainstalowaną w instalacji SQL 2008 R2.

1) Kliknij prawym przyciskiem myszy bazę danych w SQL Server 2008 R2 „Zadania” .. „Generuj skrypty” w kreatorze, wybierz całą bazę danych i obiekty w pierwszym kroku. W kroku „Ustaw opcje skryptów” powinieneś zobaczyć przycisk „Zaawansowane”, wybierz to i upewnij się, że wybierasz „Skrypt dla wersji serwera” = SQL Server 2008 ”, a nie R2. Jest to kluczowy krok, ponieważ„ importuj dane ” sam w sobie nie przynosi wszystkich kluczy podstawowych, stałych i innych obiektów, takich jak procedury składowane. ”

2) Uruchom skrypt SQL wygenerowany na nowej instancji instalacji lub bazy danych SQL Express lub SQL Server 2008 za pomocą okna zapytania lub otwórz zapisany skrypt .sql i uruchom go, a powinieneś zobaczyć nową bazę danych.

3) Teraz kliknij prawym przyciskiem myszy nową bazę danych i wybierz „Zadania” .. „Importuj dane ..” wybierz źródło jako bazę danych R2 i miejsce docelowe jako nową bazę danych. „Skopiuj dane z jednej lub więcej tabel lub widoków”, zaznacz górne pole wyboru, aby zaznaczyć wszystkie tabele, a następnie w następnym kroku uruchom pakiet i powinieneś mieć wszystko w starszej wersji. To powinno działać również w przypadku powrotu do wersji 2005. Mam nadzieję, że to komuś pomoże.


cześć @motogeek, mam ten sam problem, ale mam R2 na serwerze produkcyjnym i 2008 na lokalnym, w tym przypadku nie mogę użyć danych importu i eksportu. jakie byłoby na to idealne rozwiązanie?
Abbas

2

możesz używać BCP in i out dla małych stolików.

Polecenie BCP OUT: -

BCP "SELECT *  FROM [Dinesh].[dbo].[Invoices]" QUERYOUT C:\av\Invoices1.txt -S MC0XENTC -T -c -r c:\error.csv

Polecenie BCP IN: - Utwórz strukturę tabeli dla Invoicescopy1.

BCP [Dinesh].[dbo].[Invoicescopy1] IN C:\av\Invoices.txt -S MC0XENTC -T -c

0

Rozumiem, że to stary post, ale może być przydatne dla osób, które wiedzą, że Kreator migracji platformy Azure (dostępny w Codeplex - nie można połączyć się z tym, co Codeplex jest w chwili pisania tego tekstu) zrobi to łatwo.


To narzędzie zostało zastąpione przez Asystenta migracji danych programu SQL Server. Zobacz: stackoverflow.com/questions/46517060/…
ahwm

0

Aby migrować wszystko, musisz użyć kreatorów importu / eksportu w SSMS

Nie jest możliwe „obniżenie wersji” przy użyciu kopii zapasowej / przywracania lub odłączania / dołączania. Dlatego musisz:

  1. Wykonaj kopię zapasową bazy danych z serwera z nową wersją SSMS / SQL.
  2. Zaimportuj dane z wygenerowanego pliku .bak, rozwijając menu „Zadania” (po kliknięciu docelowej bazy danych prawym przyciskiem myszy) i wybierając opcję „Importuj dane”.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.