Zgodność wsteczna SQL Server 2012 dla kopii zapasowych z 2008 roku

14

Mam wielu klientów z SQL Server 2008 i właśnie to mam tutaj na moim serwerze. Korzystam z plików kopii zapasowych, aby przesyłać bazy danych tam iz powrotem między klientami i moim biurem.

Czytałem, że podczas tworzenia kopii zapasowej z SQL Server 2012 nie ma sposobu, aby przywrócić ją do instancji z 2008 roku. Zakładałem, że poziom kompatybilności poradziłby sobie z tym problemem, ale tak nie jest. Dlatego nie mam pojęcia, jak zaktualizować. Poza uaktualnieniem wszystkich moich klientów naraz, co jest niemożliwe, nie mogę wymyślić żadnego czystego sposobu na zrobienie tego.

Muszę wysłać bazę danych do klienta, a także otrzymać bazę danych od klienta. To jest moja pierwsza aktualizacja wersji na SQL Server, więc jestem nowy w tym problemie. Wszelkie pomysły, jak postępować?

Jeff Stock
źródło
4
Możesz mieć jednocześnie jedną instancję SQL Server 2008 i jedną instancję SQL Server 2012 zainstalowaną na serwerze w tym samym czasie z różnymi nazwami instancji. Być może to rozwiązałoby Twoje problemy z klientami w różnych wersjach?
Mikael Eriksson
Podobne pytanie w sprawie SO: stackoverflow.com/q/1744808/95710
DForck42

Odpowiedzi:

16

W grę wchodzą dwie rzeczy: numer wersji pliku i poziom zgodności. Po dołączeniu bazy danych do nowszej wersji głównej (na przykład od 2008 do 2008 R2 lub od 2008 R2 do 2012) wersja bazy danych zostaje trwale zmieniona i nie można ponownie dołączyć tej bazy danych do starszej wersji.

Poziom zgodności służy do analizowania przestarzałych T-SQL przestarzałych szkół, które działały w starszych wersjach SQL Server. Nie zmienia to sposobu przechowywania danych na dysku.

Aby przekazać bazę danych komuś ze starszej wersji programu SQL Server, musisz wyeksportować dane i zaimportować je do innej bazy danych. Pomocne są do tego narzędzia takie jak porównywanie danych Red Gate.

Brent Ozar
źródło
Tak, miałem wcześniej ten sam problem. Skończyło się tworzenie skryptów dla całej bazy danych, a następnie wykonywanie skryptów dla wszystkich danych. Tego dnia na ratunek przyszły narzędzia SQL Compare i Data Compare firmy Red Gate.
DForck42
@ DForck42: W moim przypadku baza danych była zbyt duża, aby wykonać skrypt za pomocą danych, więc skończyłem ze skryptowaniem schematu, a następnie przeniesieniem danych bcp.
ivan_pozdeev
@ivan_pozdeev, czy mówisz, że został wyeksportowany przy użyciu BCP programu SQL Server 2012 i zaimportowany przy użyciu BCP programu SQL Server 2008R2? Dobrze wiedzieć, że formaty plików są zgodne, dzięki.
Chris
2
@Chris msdn.microsoft.com/en-us/library/ms162802.aspx „W SQL Server 2014 narzędzie bcp obsługuje rodzime pliki danych kompatybilne z SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2008 R2 i SQL Server 2012. ”
ivan_pozdeev
Dzięki @ivan_posdeev, to było objawienie. Udokumentowałem poniższe kroki na wypadek, gdyby pomógł komukolwiek innemu.
Chris
6

Ustawienie poziomu zgodności jest używane przez SQL Server do ustalenia, w jaki sposób należy obsługiwać określone nowe funkcje. W ten sposób DB można migrować do nowszej wersji SQL bez problemów z aplikacją. Poziom zgodności można zmieniać tam iz powrotem.

Niestety pliki kopii zapasowych nie są kompatybilne wstecz. Jedną z metod byłoby użycie importu / eksportu do przeniesienia danych z bieżącej bazy danych do starszej wersji wersji.

StanleyJohns
źródło
3

W przypadku migracji SQL użyj darmowego i otwartego oprogramowania SQL Database Wizard Migration Wizard.

Miałem bazę danych o pojemności 5 GB z kilkoma ~ 10 milionami rekordów i wypróbowałem trasę za pomocą Generate Script, a następnie uruchomiłem ją za pomocą narzędzia sqlcmd.exe. Przede wszystkim wygenerowany skrypt nie zawsze działał poprawnie. Po drugie, sqlcmd.exe może również zawieść w przypadku dużych plików, narzekając na dostępną pamięć. osql.exe działa, ale po prostu trwa wieki (i ma te same argumenty wiersza poleceń).

Potem natknąłem się na wspaniałe narzędzie do migracji programu SQL Server do baz danych SQL Azure. Działa to również w przypadku SQL Server na SQL Server, na przykład jeśli chcesz przeprowadzić migrację bazy danych SQL 2012 do 2008 R2. Używa programu bcp.exe, który używa kopii zbiorczej. Dostępna jest wersja interfejsu graficznego i wiersza polecenia (partia) i jest to oprogramowanie typu open source. Zobacz http://sqlazuremw.codeplex.com/ . W moim przypadku operacja zajęła 16 minut.

Na ekranie zaawansowanym możesz wybrać, że celem jest SQL Server, a nie SQL Azure.

lvmeijer
źródło
2

Odkryłem, że BCP jest bardziej skuteczny niż niektóre narzędzia do wprowadzania danych do wcześniejszej wersji SQL Server i do pobierania danych z RDS. (Dzięki @ivan_posdeev.)

Najpierw generuję schemat, klikając bazę danych prawym przyciskiem myszy w SQL Server Management Studio, Zadania, Generuj skrypty. Zaznacz wszystkie obiekty, w obiektach zaawansowanych upewnij się, że wszystko, czego potrzebujesz, będzie skryptowane (statystyki, indeksy itp.), Odznacz „USE database”, jeśli twoja docelowa baza danych ma inną nazwę, ustaw zgodność z wersją docelowej bazy danych i wygeneruj plik, który tworzy twój schemat. Stworzenie bazy danych na temat miejsca docelowego i uruchomić ten plik na nim (za pomocą osql, sqlcmdlub GUI).

Aby przenieść dane, uruchom następujące zapytanie dwukrotnie w źródłowej bazie danych, najpierw komentując drugą kolumnę w celu wygenerowania pliku wsadowego w celu wyodrębnienia danych, a następnie komentując pierwszą kolumnę w celu wygenerowania importowanego pliku wsadowego do uruchomienia w miejscu docelowym. (Musisz dodać serwery źródłowe i docelowe, nazwy instancji, katalogi plików wyjściowych i wejściowych, nazwy użytkowników i hasła. Aby zastosować zintegrowane zabezpieczenia, zastąp-U-P opcjami i -T).

Obsługuje Unicode, jeśli nie jest to potrzebne, zmień -Nprzełącznik w obu instrukcjach na -n.

SELECT 
   'bcp SOURCEDATABASE.' + s.Name + '.' + t.NAME  + ' out d:\dbdump\' + s.Name + '.' + t.NAME  + '.dat -N -S SOURCESERVER\INSTANCE -UUSER -PPASSWORD'
--    'bcp DESTINATIONDATASE.' + s.Name + '.' + t.NAME  + ' in d:\dbdump\' + s.Name + '.' + t.NAME  + '.dat -N -S DESTINATIONSERVER\INSTANCE -UUSER -PPASSWORD -E -h TABLOCK -b 1000 -e d:\dbdump\' + s.Name + '.' + t.NAME  + '.ERRORS.dat'
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
ORDER BY 
    s.Name, t.NAME

Po uruchomieniu sprawdź pliki o nazwie schema.tablename.ERRORS.dat - obejmie wszystkie wiersze, które się nie powiodły, puste, jeśli żaden nie.

Referencja MSDN dla BCP tutaj , bardziej przyjazny przegląd opcji BCP tutaj .

Przekonałem się, że jest to znacznie lepsze od generowania skryptów i każdego z narzędzi, które wypróbowałem. Działa również na bazach danych RDS (które nie zezwalają na tworzenie kopii zapasowych). Wygenerowane pliki danych mają rozmiar skryptów SQL o 30%, ich uruchomienie zajmuje ułamek czasu i jest znacznie bardziej niezawodne. (Skrypty generowane przez SQL Server dla skryptów danych zawsze się wyzwalają, czasem przewidywalnie czasami nie, wygenerowany SQL nie był zgodny z 2008R2 (np. Używany nvarchar(0), często nie został ukończony bez wyraźnego powodu itp. BCP replikuje również wszelkie naruszenia ograniczeń , takich jak integralność referencyjna).

Chris
źródło