Ich muss eine große Tabelle ~ 500 Millionen Zeilen ohne Primärschlüssel zwischen SQL Server und MySQL synchronisieren. Die Tabelle enthält nur einen zusammengesetzten nicht eindeutigen Clustered-Index.
Ich habe zwar eine ODBC-Verbindung zwischen den Servern, aber ein Import von ~ 8 Millionen Zeilen dauerte ungefähr 45 Minuten. Daher halte ich einen größeren Einzelimport für unangemessen, da zu jedem Zeitpunkt Unterbrechungen auftreten können. Ich kann die vorhandene Tabellenstruktur nicht ändern, ich kann andere Tabellen hinzufügen. Nach dem weiteren Lesen ist Offset / Fetch keine Option für große Tabellen. "Wählen Sie ... wobei x zwischen ... und ..." ist keine Option, da ich keinen eindeutigen Schlüssel habe.
Wie kann ich die Tabelle in Stapeln exportieren, die garantiert alle Zeilen enthalten? Mein Problem ist, dass, da der Clustered-Schlüssel nicht eindeutig ist, die Reihenfolge danach nicht garantiert, dass die physischen Zeilen zwischen aufeinanderfolgenden Abfragen dieselbe Reihenfolge haben, und die Reihenfolge, nachdem alle Spalten zu lange dauern würden. Und wie würden Sie empfehlen, die Stapel über ODBC- oder CSV-Dateien zu migrieren?
quelle
Antworten:
Angenommen, Sie haben keine Aktualisierungen oder Löschungen
für die Quelltabelle, können Sie Folgendes versuchen: 1. Erstellen Sie eine Kopie der vorhandenen Tabelle mithilfe der CTAS-Syntax (für SQLServer ist dies der Fall
SELECT * into source_table_copy FROM source_table
). Ein solcher Vorgang ist selbst bei großen Tischen sehr schnell.2. Fügen Sie einen
after insert
Trigger hinzusource_table
, in den neue Datensätze kopiert werdensource_table_copy
.3. Jetzt
source_table
gehen auch alle neuen Datensätze zusource_table_copy
und Sie können Daten stapelweise aus der kopierten Tabelle nach MySQL verschieben. Wenn Sie beispielsweise eine Verbindung zwischen zwei Servern haben, kann alles innerhalb der gespeicherten TSQL-Prozedur ausgeführt werden.Beispielsweise könnte ein Code aussehen, der bis zu 20 Datensätze auf einen neuen Server verschiebt
Es ist auch möglich, mit CURSOR Daten zu lesen und dann mit
where current of
Klausel zu löschen .** Idealerweise müssen Sie verhindern, dass Anwendungen in
source_table
Schritt 1 Daten einfügen . Wenn dies absolut unmöglich ist, verwende ich einenafter insert
Trigger, der unmittelbar vor Schritt 1 hinzugefügt und direkt nach Abschluss entfernt wird, um Daten in eine andere Tabelle zu kopieren, die ich kann später zusammenführen mitsource_table_copy
.quelle