Muszę zsynchronizować dużą tabelę ~ 500 milionów wierszy bez klucza podstawowego między SQL Server i MySQL. Tabela ma tylko klastrowy, niejednorodny indeks złożony.
Mam połączenie ODBC między serwerami, ale import ~ 8 milionów wierszy zajął około 45 minut, więc uważam, że większy pojedynczy import byłby nieuzasadniony, ponieważ mogą wystąpić przerwy w dowolnym momencie. Nie mogę zmienić istniejącej struktury tabel, mogę dodać inne tabele. Po dalszym czytaniu przesunięcie / pobranie nie jest opcją dla dużych tabel. „Wybierz… gdzie x między… a…” nie jest opcją, ponieważ nie mam unikalnego klucza.
Jak mogę wyeksportować tabelę partiami, które z pewnością zawierają wszystkie wiersze? Mój problem polega na tym, że ponieważ klucz klastrowany nie jest unikalny, kolejność po nim nie gwarantuje, że wiersze fizyczne mają taką samą kolejność między kolejnymi zapytaniami, a kolejność po wszystkich kolumnach potrwa zbyt długo. A w jaki sposób zaleciłbyś migrację partii za pomocą plików ODBC lub CSV?
źródło
Odpowiedzi:
Zakładając, że nie masz aktualizacji lub usunięć względem tabeli źródłowej, możesz spróbować wykonać następujące czynności:
1. Wykonaj kopię istniejącej tabeli przy użyciu składni CTAS (dla SQLServer to
SELECT * into source_table_copy FROM source_table
). Taka operacja jest bardzo szybka nawet dla dużych tabel.2. Dodaj
after insert
wyzwalacz dlasource_table
tej kopii nowych rekordów dosource_table_copy
.3. Teraz, kiedy wszystkie nowe rekordy w
source_table
podróży dosource_table_copy
jak dobrze, i można przenieść dane z tabeli skopiowany do MySQL w partii. Na przykład, jeśli masz łącze między 2 serwerami, wszystko można zrobić w ramach procedury przechowywanej TSQL.Np. Może wyglądać fragment kodu przenoszący do 20 rekordów na nowy serwer
Możliwe jest również użycie kursora do odczytu danych, a następnie usunięcia z
where current of
klauzulą.** Idealnie, musisz uniemożliwić aplikacjom wstawianie danych w
source_table
kroku 1. Jeśli to absolutnie niemożliwe, pójdę zafter insert
wyzwalaczem, który jest dodawany tuż przed krokiem 1 i usuwany zaraz po zakończeniu, który kopiuje dane do innej tabeli, którą mogę później połączyć zsource_table_copy
.źródło