Ich muss eine ganze Reihe (100+) großer (Millionen von Zeilen) Tabellen von einer SQL2008-Datenbank in eine andere verschieben.
Ich habe ursprünglich nur den Import / Export-Assistenten verwendet, aber in allen Zieltabellen fehlten Primär- und Fremdschlüssel, Indizes, Einschränkungen, Trigger usw. Magier.)
Was ist der richtige Weg, um dies zu tun?
Wenn dies nur ein paar Tabellen wären, würde ich zur Quelle zurückkehren, die Tabellendefinition (mit allen Indizes usw.) per Skript ausgeben und dann die Indexerstellungsteile des Skripts auf dem Ziel ausführen. Bei so vielen Tabellen scheint dies jedoch unpraktisch.
Wenn nicht so viele Daten vorhanden wären, könnte ich den Assistenten "Skripte erstellen ..." verwenden, um die Quelle einschließlich der Daten zu skripten. Ein Skript mit 72 m Zeilen scheint jedoch keine gute Idee zu sein!
Antworten:
Das Skripten der Tabellen und die anschließende Verwendung von SSIS zum Übertragen der Daten wäre die zuverlässigste und effektivste Methode, um die Daten in die neue Datenbank zu verschieben.
quelle
Wir haben es tatsächlich mit viel manueller Skripterstellung in Verbindung mit dem Import-Assistenten gemacht, aber heute Morgen habe ich dank Tibor Karaszis Blog-Artikel eine bessere Antwort gefunden .
Ein Teil unserer Frustration hier war, dass der SQL 2000 "DTS Import / Export-Assistent" dies durch Auswahl von "Objekte und Daten kopieren" praktisch einfach macht:
Diese dritte Option bietet die Möglichkeit, Indizes / Trigger usw. einzuschließen:
Diese Option wurde vom SQL 2005/ 2008- Importassistenten ENTFERNT . Warum? Keine Ahnung:
In 2005/2008 müssen Sie anscheinend ein SSIS-Paket in BIDS manuell erstellen und die Task "SQL Server-Objekte übertragen" verwenden , die dieselben Optionen enthält, die im 2000-Assistenten enthalten waren:
quelle
Ich würde in Betracht ziehen, die Tabelle als Skript zu erstellen oder Vergleichstools (z. B. Red Gate) zu verwenden, um die Tabellen in der Zieldatenbank zu generieren. Noch ohne Indexe oder Einschränkungen.
Dann würde ich erwägen, die Datenbank mit einem anderen Namen auf dem gleichen Server wiederherzustellen und zu tun
.. für jede Tabelle, bei Bedarf mit SET IDENTITY INSERT ON
Dann würde ich nach dem Laden der Daten Indizes und Einschränkungen hinzufügen.
Es hängt von Ihrem Komfortniveau mit SSIS (die Antwort von mrdenny) ab, oder ob Sie rohes SQL bevorzugen.
quelle
Ich würde Herrn Dennys Antwort hinzufügen: Schreiben Sie das Tabellenschema aus und verwenden Sie dann BCP, um die Daten zu verschieben. Wenn Sie nicht mit SSIS vertraut sind, sollten die Verwendung von BCP und Batches einfach sein. Für Millionen von Zeilen ist nichts besser als BCP (Bulk Insert) :).
quelle
Ich bin derjenige, der mit SSIS völlig unwohl ist.
Wenn die Quelltabellen keine Identitätsspalten haben
Nun die T-SQL, um die Select * into ... -Anweisungen zu generieren
Dies erzeugt eine Zeile für jede Tabelle, die kopiert werden soll
Für den Fall, dass die Tabellen Identitätsspalten enthalten, schreibe ich die Tabellen mit Identitätseigenschaft und Primärschlüsseln.
In diesem Fall verwende ich Einfügen in ... Auswählen ... nicht über einen Verbindungsserver, da dies keine Massentechnik ist. Ich arbeite an einigen PowerShell-Skripten, die [dieser SO-Frage 1] ähneln , aber ich arbeite immer noch an der Fehlerbehandlung. Wirklich große Tabellen können Speicherfehler verursachen, da eine ganze Tabelle in den Speicher geladen wird, bevor sie über SQLBulkCopy an die Datenbank gesendet wird.
Die Neuerstellung von Indizes usw. ähnelt dem obigen Fall. Dieses Mal kann ich die Neuerstellung der Primärschlüssel überspringen.
quelle
Sie können Vergleichstools verwenden, die Datenbankschemata und -daten vergleichen und zuerst ein leeres Datenbankschema mit der ursprünglichen Datenbank synchronisieren , um alle Tabellen zu erstellen.
Synchronisieren Sie dann die Daten aus der ursprünglichen Datenbank mit der neuen Datenbank (alle Tabellen sind vorhanden, aber alle leer), um die Datensätze in die Tabellen einzufügen
Ich verwende dafür ApexSQL Diff und ApexSQL Data Diff , aber es gibt auch andere ähnliche Tools.
Das Gute an diesem Vorgang ist, dass Sie die Datenbanken nicht mit dem Tool synchronisieren müssen, da dies für Millionen von Zeilen sehr schmerzhaft sein kann.
Sie können einfach ein INSERT INTO SQL-Skript erstellen (wundern Sie sich nicht, wenn es mehrere Gigs sind) und es ausführen.
Da so große Skripte nicht einmal in SQL Server Management Studio geöffnet werden können, verwende ich sqlcmd oder osql
quelle
Wie @mrdenny erwähnt -
Verwenden Sie zum Einfügen von Daten anstelle von SSIS BCP
bcp die Daten mit dem folgenden Skript aus. Setzen Sie SSMS in den Textmodus und kopieren Sie die vom unten stehenden Skript erzeugte Ausgabe in eine bat-Datei.
Führen Sie die bat-Datei aus, die die DAT-Dateien in dem von Ihnen angegebenen Ordner generiert.
Führen Sie das folgende Skript auf dem aus
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.
quelle