Przywrócić kopię zapasową SQL Server 2012 do bazy danych SQL Server 2008?

41

Czy istnieje sposób na przywrócenie kopii zapasowej bazy danych SQL Server 2012 na SQL Server 2008?

Próbowałem załączyć plik, to nie działa.

Aaron Bertrand
źródło
Jest jeszcze jedno pytanie równe temu i na które bardzo dobrze odpowiedziano: superuser.com/questions/468578/...
Cavaleiro,
1
Tutaj jest świetna robocza odpowiedź na ten problem (migracja, a nie tworzenie kopii zapasowych / przywracanie): stackoverflow.com/questions/19837886/...
Don Jewett

Odpowiedzi:

30

Masz kilka opcji:

Opcja A : Wypisuj bazę danych w trybie zgodności za pomocą opcji Wygeneruj skrypt:

Uwaga: Jeśli wykonasz skrypt bazy danych ze schematem i danymi, w zależności od rozmiaru danych, skrypt będzie ogromny i nie będzie obsługiwany przez SSMS, sqlcmd lub osql (może być również w GB).

wprowadź opis zdjęcia tutaj

Opcja B:

Najpierw najpierw wypisz tabele ze wszystkimi indeksami, FK itp. I utwórz puste tabele w docelowej bazie danych - opcja TYLKO w SCHEMIE (Brak danych).

Użyj BCP, aby wstawić dane

  1. bcp odczyt danych za pomocą poniższego skryptu. ustaw SSMS w trybie tekstowym i skopiuj dane wyjściowe wygenerowane przez poniższy skrypt w pliku nietoperza.

    -- save below output in a bat file by executing below in SSMS in TEXT mode
    
    -- clean up: create a bat file with this command --> del D:\BCP\*.dat 
    
    select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" ' /* path to BCP.exe */
        +  QUOTENAME(DB_NAME())+ '.' /* Current Database */
        +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'            
        +  QUOTENAME(name)  
        +  ' out D:\BCP\'  /* Path where BCP out files will be stored */
        +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_' 
        +  REPLACE(name,' ','') 
        + '.dat -T -E -SServerName\Instance -n' /* ServerName, -E will take care of Identity, -n is for Native Format */
    from sys.tables
    where is_ms_shipped = 0 and name <> 'sysdiagrams'                       /* sysdiagrams is classified my MS as UserTable and we dont want it */
    /*and schema_name(schema_id) <> 'unwantedschema'    */                             /* Optional to exclude any schema  */
    order by schema_name(schema_id)
  2. Uruchom plik bat, który wygeneruje pliki .dat w określonym folderze.

  3. Uruchom ponownie skrypt poniżej na serwerze docelowym z SSMS w trybie tekstowym.

    --- Execute this on the destination server.database from SSMS.
    
    --- Make sure the change the @Destdbname and the bcp out path as per your environment.
    
    declare @Destdbname sysname
    set @Destdbname = 'destinationDB' /* Destination Database Name where you want to Bulk Insert in */
    select 'BULK INSERT ' 
    /*Remember Tables must be present on destination database */ 
    + QUOTENAME(@Destdbname) + '.' 
    + QUOTENAME(SCHEMA_NAME(SCHEMA_ID)) 
    + '.' + QUOTENAME(name) 
    + ' from ''D:\BCP\' /* Change here for bcp out path */ 
    + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') 
    + '.dat'' with ( KEEPIDENTITY, DATAFILETYPE = ''native'', TABLOCK )' 
    + char(10) 
    + 'print ''Bulk insert for ' + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') + ' is done... ''' 
    + char(10) + 'go'
       from sys.tables
       where is_ms_shipped = 0
    and name <> 'sysdiagrams' /* sysdiagrams is classified my MS as UserTable and we dont want it */
    and schema_name(schema_id) <> 'unwantedschema' /* Optional to exclude any schema */
        order by schema_name(schema_id) 
  4. Uruchom dane wyjściowe za pomocą SSMS, aby wstawić dane z powrotem do tabel.

Jest to bardzo szybka metoda BCP, ponieważ wykorzystuje tryb macierzysty.

Kin Shah
źródło
Bardzo pomocna - metoda B działała dla mnie (SQL wygenerowany metodą A wynosił 7 GB, a SSMS jej nie miał). Niektóre identyfikatory SSID i połączone serwery nie działały poprawnie, ale kiedy cokolwiek wspólnego z połączonymi serwerami kiedykolwiek działa po raz pierwszy? Nie jestem pewien, czy chętnie skorzystam z tego w środowisku produkcyjnym, ale dla szybkiego uzyskania środowiska testowego o 95% było to idealne rozwiązanie.
aucuparia,
@aucuparia Some SSIDs and linked servers didn't go across properly. Połączone serwery muszą zostać ręcznie skrypty. Identyfikatory SSID mogą być przesyłane do sieci za pomocą sp_helprevlogin. Zadania SQLAgent, pakiety ssis itp. Należy przenosić zgodnie z własnymi potrzebami. Celem tej metody jest uzyskanie danych tak szybko, jak to możliwe, podczas obniżania lub łączenia 2 baz danych.
Kin Shah,
Opcja B była jedyną metodą, która działała dla mnie, ponieważ wygenerowane skrypty były zbyt duże na inne sposoby
JumpingJezza
23

Nie, nie możesz cofać się, tylko do przodu. Możesz utworzyć pustą bazę danych w 2008 roku, a następnie użyć kreatora Generuj skrypty w Management Studio do skryptu schematu i danych (lub narzędzi porównawczych innych firm z Red Gate i innych). Upewnij się, że ustawiłeś właściwą wersję docelową na 2008 r., A będziesz musiał wdrożyć niekompatybilne rzeczy (np. OFFSET lub FORMAT), których mogłeś użyć w 2012 r.

Aaron Bertrand
źródło
8

Nie ma obsługiwanego sposobu, aby to zrobić, ponieważ SQL Server nie pozwala na tego rodzaju kompatybilność.

Możesz to zrobić

  1. przywróć bazę danych na SQL 2012

  2. generuj skrypty dla obiektów i danych

  3. wyczyść skrypty ze wszystkich szczegółów, które są unikalne dla SQL 2012
  4. wykonać skrypty w 2008 roku

Jeśli nie masz programu SQL Server 2012, możesz użyć narzędzi innych firm do odczytu kopii zapasowych oraz wyodrębnienia danych i struktury.

W takim przypadku po prostu utwórz pustą bazę danych w SQL 2008 i użyj narzędzi takich jak ApexSQL Diff i ApexSQL Data Diff do synchronizacji obiektów i danych. Można je również znaleźć u innych głównych dostawców, takich jak Red-Gate lub Idera.

David Smithers
źródło