Wiederherstellen der SQL Server 2012-Sicherung in einer SQL Server 2008-Datenbank?

41

Gibt es eine Möglichkeit, eine SQL Server 2012-Datenbanksicherung auf einem SQL Server 2008 wiederherzustellen?

Ich habe versucht, eine Datei anzuhängen, sie funktioniert nicht.

Aaron Bertrand
quelle
Es gibt eine andere Frage, die dieser entspricht und sehr gut beantwortet wird: superuser.com/questions/468578/…
Cavaleiro
1
Hier gibt es eine gute funktionierende Antwort auf dieses Problem (Migration, nicht Sichern / Wiederherstellen): stackoverflow.com/questions/19837886/…
Don Jewett

Antworten:

30

Sie haben mehrere Möglichkeiten:

Option A : Datenbank im Kompatibilitätsmodus mit der Option "Skript generieren" ausschreiben:

Hinweis: Wenn Sie eine Datenbank mit Schema und Daten aus dem Skript entfernen, ist das Skript abhängig von Ihrer Datengröße umfangreich und wird von SSMS, sqlcmd oder osql nicht verarbeitet (möglicherweise auch in GB).

Bildbeschreibung hier eingeben

Option B:

Schreiben Sie zuerst Tabellen mit allen Indizes, FKs usw. aus und erstellen Sie leere Tabellen in der Zieldatenbank - Option mit NUR SCHEMA (keine Daten).

Verwenden Sie BCP, um Daten einzufügen

  1. bcp die Daten unter Verwendung des folgenden Skripts aus. Setzen Sie SSMS in den Textmodus und kopieren Sie die vom unten stehenden Skript erzeugte Ausgabe in eine bat-Datei.

    -- 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. Führen Sie die bat-Datei aus, die die DAT-Dateien in dem von Ihnen angegebenen Ordner generiert.

  3. Führen Sie das folgende Skript auf dem Zielserver mit SSMS erneut im Textmodus aus.

    --- 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. Führen Sie die Ausgabe mit SSMS aus, um Daten wieder in die Tabellen einzufügen.

Dies ist eine sehr schnelle bcp-Methode, da sie den einheitlichen Modus verwendet.

Kin Shah
quelle
Sehr hilfreich - Methode B funktionierte für mich (SQL, das von Methode A generiert wurde, hatte 7 GB und SSMS hatte nichts davon). Einige SSIDs und Verbindungsserver gingen nicht richtig über, aber wann funktioniert etwas, was mit Verbindungsservern zu tun hat, zum ersten Mal? Ich bin mir nicht sicher, ob ich das gerne in der Produktion verwenden würde, aber um eine Testumgebung schnell auf 95% zu bringen, war es perfekt.
Aucuparia
@aucuparia Some SSIDs and linked servers didn't go across properly. Verbindungsserver müssen manuell geskriptet werden. SSIDs können mit sp_helprevlogin übertragen werden. SQLAgent-Jobs, ssis-Pakete usw. sollten gemäß Ihren Anforderungen verschoben werden. Bei dieser Methode geht es darum, die Daten so schnell wie möglich abzurufen, wenn Sie zwei Datenbanken downgraden oder zusammenführen.
Kin Shah
Option B war die einzige Methode, die für mich funktioniert hat, da die generierten Skripte auf andere Weise zu groß waren
JumpingJezza,
23

Nein, Sie können nicht rückwärts, sondern nur vorwärts gehen. Sie können eine leere Datenbank in 2008 erstellen und dann den Assistenten zum Generieren von Skripten in Management Studio verwenden, um das Schema und die Daten (oder Vergleichstools von Drittanbietern von Red Gate und anderen) zu skripten. Stellen Sie sicher, dass Sie die richtige Zielversion als 2008 festgelegt haben, und Sie müssen inkompatible Elemente (z. B. OFFSET oder FORMAT) ausarbeiten, die Sie möglicherweise 2012 verwendet haben.

Aaron Bertrand
quelle
8

Es gibt keine unterstützte Möglichkeit, dies zu tun, da SQL Server diese Art von Kompatibilität nicht zulässt.

Was Sie tun können, ist zu

  1. Datenbank unter SQL 2012 wiederherstellen

  2. Generieren Sie Skripte für Objekte und Daten

  3. Bereinigen Sie Skripte von allen Details, die für SQL 2012 eindeutig sind
  4. Skripte im Jahr 2008 ausführen

Wenn Sie nicht über SQL Server 2012 verfügen, können Sie Sicherungskopien mit Tools von Drittanbietern lesen und Daten und Strukturen extrahieren.

In diesem Fall erstellen Sie einfach eine leere Datenbank in SQL 2008 und verwenden Tools wie ApexSQL Diff und ApexSQL Data Diff , um Objekte und Daten zu synchronisieren. Sie können diese auch von anderen großen Anbietern wie Red-Gate oder Idera finden.

David Smithers
quelle