So verschieben Sie eine Datenbank von SQL Server 2012 nach SQL Server 2005

30

Welche Optionen stehen mir zur Verfügung, wenn ich eine Datenbank von SQL Server 2012 (32 Bit) auf SQL Server 2005 (64 Bit) verschieben muss?

Ich weiß, ich kann nicht:

  • Herstellen Sie eine Sicherung der Datenbank in SQL Server 2005 wieder
  • abnehmen und anbringen

Ich weiss ich kann:

  • Verwenden Sie den Assistenten zum Importieren von Daten, und versuchen Sie es mit einer einzigen Datenbank. Es werden jedoch nur Daten verschoben, und selbst das war mühsam, da ich viel Arbeit beim Erstellen von temporären Tabellen zur Verwaltung von Identitätsspalten, zum Neuerstellen aller FKs, Indizes usw. benötigte.

Gibt es eine einfachere Möglichkeit?

Greg Balajewicz
quelle
12
Die einfachere Option wäre, ehrlich zu sein, das Ziel auf 2012 zu aktualisieren.
Aaron Bertrand

Antworten:

40

Sie können einer der folgenden Methoden folgen:

Hinweis: Wenn Sie neue Funktionen wie neue Datentypen usw. verwenden, müssen Sie diese testen, da dies zu Fehlern führt.

METHODE 1: Verwenden nativer Tools

  1. Skript aus der Datenbank SCHEMA_ONLY und erstellen Sie eine leere Datenbank auf dem Zielserver neu. Unten sind die Screenshots:

    Bildbeschreibung hier eingeben

    Bildbeschreibung hier eingeben

    Bildbeschreibung hier eingeben

  2. Verwenden Sie BCP OUT und BULK INSERT, um Daten einzufügen.

Unten finden Sie das Skript, das Ihnen bei Teil 2 hilft.

/************************************************************************************************************************************************
Author      :   KIN SHAH    *********************************************************************************************************************
Purpose     :   Move data from one server to another*********************************************************************************************
DATE        :   05-28-2013  *********************************************************************************************************************
Version     :   1.0.0   *************************************************************************************************************************
RDBMS       :   MS SQL Server 2008R2 and 2012   *************************************************************************************************
*************************************************************************************************************************************************/

-- 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_OUT\*.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_OUT\'                                           -- 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) <> 'some_schema_exclude'                     -- Optional to exclude any schema 
order by schema_name(schema_id)                         



--- 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 = 'destination_database_Name'               -- 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_OUT\'                             -- 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) <> 'some_schema_exclude'         -- Optional to exclude any schema 
order by schema_name(schema_id)

Methode 2: Verwenden von Tools von Drittanbietern

Erstellen Sie eine leere Datenbank auf dem Zielserver. Verwenden Sie den Schema- und Datenvergleich von Redgate, um Daten zu erstellen und auf den Zielserver zu laden.

Hinweis: Ich habe Redgates Schema und Datenvergleich verwendet und sie sind die besten Tools für solche Aufgaben. Wenn Sie also Tools von Drittanbietern verwenden, würde meine Empfehlung Redgate lauten.

Kin Shah
quelle
7
+1 aber denken Sie daran, dass es bestimmte Dinge gibt, die am Ziel einfach nicht funktionieren (und ich bin mir nicht sicher, wie elegant Tools von Drittanbietern damit umgehen werden). Objekte wie SEQUENZEN, Code wie OFFSET / FETCH, LAG / LEAD usw.
Aaron Bertrand
1
Nachdem Sie das Schema durch Skripterstellung und Ausführung dieser Skripte für die ältere Datenbank erstellt haben, können Sie die Daten auch direkt von einer Instanz auf eine andere kopieren, indem Sie einen Verbindungsserver einrichten. Es sollte nicht schwierig sein, eine Schleife zu erstellen, die die ganze Arbeit macht. Um mit FK-Einschränkungen umzugehen, müssen Sie sicherstellen, dass Sie die Tabellen in einer geeigneten Reihenfolge kopieren, oder Sie können die FKs vorübergehend entfernen und sie nach dem Kopieren wieder aktivieren. Ebenso möchten Sie alle Trigger im Ziel während des Kopiervorgangs deaktivieren.
David Spillett
4

Zusätzlich zu den hier bereits vorgeschlagenen Methoden können Sie auch versuchen, eine BACPAC-Datei zu erstellen und in Ihr Ziel zu importieren. Dies ist vergleichbar mit der Empfehlung von Microsoft, Ihre Datenbanken von On-Prem- auf Azure Cloud-Datenbanken zu migrieren.

Der Vorteil besteht darin, dass sowohl das Schema als auch die Daten exportiert werden und dass dies nicht von der Datenbankversion abhängt. Sie können also theoretisch Datenbanken von jeder Version in jede Version importieren.

Der Nachteil ist, dass vor dem Generieren der BACPAC-Datei an der Quelle ein strenger Validierungsprozess ausgeführt wird, der leicht fehlschlagen kann, wenn Sie auf Objekte außerhalb Ihrer Datenbank verweisen (ob Benutzer- oder Systemdatenbanken) oder wenn Sie dies tun verschlüsselte Objekte. Aber wenn Sie Glück haben und es nicht scheitert, kann es eine ziemlich einfache Lösung sein.

Sie benötigen lediglich eine der neueren SSMS-Versionen (17 oder 18): https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

Um mit dem Erstellen einer BACPAC-Datei zu beginnen, klicken Sie mit der rechten Maustaste auf eine Datenbank und wählen Sie "Datenebenenanwendung exportieren ..." (nicht mit "Datenebenenanwendung extrahieren ..." verwechseln, da dies etwas anderes ist):

Datenebenenanwendung exportieren ...

Sie erhalten einen einfachen Assistenten, der Sie durch die einzelnen Schritte führt. Wenn Sie fertig sind, können Sie auf Ihrem Zielserver die Option "Datenebenenanwendung importieren ..." verwenden, die angezeigt wird, wenn Sie mit der rechten Maustaste auf den Knoten "Datenbanken" klicken Anwendung ... "):

Datenebenenanwendung importieren ...

Auch hier wird ein einfacher Assistent angezeigt, der Sie durch die einzelnen Schritte führt.

Eitan Blumin
quelle
-1

Die Version von SQL Server zu verkleinern ist sehr mühsam.
Es gibt einige Möglichkeiten, wie zu verringern;
Erstellen Sie zunächst das gesamte Datenbankobjektskript und führen Sie es auf dem Zielserver aus.
Danach können Sie verwenden;

  • SSIS,
  • Daten importieren,
  • Drittanbieter-Tool wie RedGate oder andere.

Aber für RedGate Data Compare Tool,

Sie müssen berücksichtigen, dass nur Tabellen mit Primärschlüsseln verglichen werden. Wenn Ihre Tabellen keinen Primärschlüssel haben, müssen Sie andere Methoden verwenden

hasantatarli
quelle
8
Ich denke nicht, dass diese Antwort Kins Antwort verbessert
James Anderson
-3

Ein Downgrade einer Datenbank unter SQL Server ist nicht möglich. Eine Problemumgehung besteht jedoch darin, alle DB-Objekte zu skripten und das Skript auf die Zieldatenbank anzuwenden. SSIS ist eine großartige Möglichkeit, dies zu unterstützen.

Osama Waly
quelle
4
Denkst du, das fügt etwas Wichtiges zu Kins Antwort hinzu ?
Dezso