Muszę przenieść całą grupę (ponad 100) dużych (miliony wierszy) tabel z jednej bazy danych SQL2008 do drugiej.
Pierwotnie użyłem Kreatora importu / eksportu, ale we wszystkich tabelach docelowych brakowało kluczy głównych i obcych, indeksów, ograniczeń, wyzwalaczy itp. (Kolumny tożsamości zostały również przekonwertowane na zwykłe INT, ale myślę, że właśnie przegapiłem pole wyboru w polu czarodziej.)
Jak to zrobić?
Gdyby to było tylko kilka tabel, wróciłbym do źródła, wypisałbym definicję tabeli (ze wszystkimi indeksami itp.), A następnie uruchomiłem część tworzenia indeksu skryptu w miejscu docelowym. Ale przy tak wielu stołach wydaje się to niepraktyczne.
Gdyby nie było tak dużo danych, mógłbym użyć kreatora „Utwórz skrypty ...”, aby wyskrybować źródło, w tym dane, ale skrypt o długości 72 metrów nie wydaje się dobrym pomysłem!
Odpowiedzi:
Skryptowanie tabel, a następnie używanie SSIS do przesyłania danych byłoby najbardziej niezawodnym i skutecznym sposobem przenoszenia danych do nowej bazy danych.
źródło
Zrobiliśmy to za pomocą wielu ręcznych skryptów w połączeniu z kreatorem importu, ale dziś rano znalazłem lepszą odpowiedź dzięki uprzejmości blogu Tibora Karasziego .
Częścią naszej frustracji było to, że SQL 2000 „Kreator importu / eksportu DTS” sprawia, że jest to prawie banalnie proste, wybierając „Kopiuj obiekty i dane”:
Ta trzecia opcja zawiera opcję włączenia indeksów / wyzwalaczy itp .:
Ta opcja została usunięta z Kreatora importu SQL 2005/2008 . Dlaczego? Brak pomysłu:
W roku 2005/2008 najwyraźniej musisz ręcznie utworzyć pakiet SSIS w BIDS i użyć zadania Transfer SQL Server Objects , które zawiera wszystkie te same opcje, które były dostępne w kreatorze 2000:
źródło
Zastanowiłbym się, czy nie utworzyć skryptów w tabeli, lub użyć narzędzi porównawczych (np. Red Gate), aby wygenerować tabele w docelowej bazie danych. Bez indeksów i ograniczeń jeszcze.
Następnie rozważę przywrócenie bazy danych pod inną nazwą na tym samym serwerze i zrobienie tego
.. dla każdej tabeli, w razie potrzeby ustaw WŁĄCZANIE WKŁADKI TOŻSAMOŚCI
Następnie dodawałbym indeksy i ograniczenia po wczytaniu danych.
Zależy to od Twojego poziomu komfortu w SSIS (odpowiedź mrdenny) lub od tego, czy wolisz surowy SQL.
źródło
Dodałbym do odpowiedzi pana Denny'ego: wypisz schemat tabel, a następnie użyj BCP do przeniesienia danych. Jeśli nie znasz SSIS, korzystanie z BCP i partii powinno być łatwe do zrobienia. Dla milionów wierszy nic nie przebije BCP (wkładka zbiorcza) :).
źródło
To ja czuję się całkowicie niekomfortowo z SSIS.
Gdy tabele źródłowe nie mają kolumn tożsamości
Teraz T-SQL do generowania instrukcji Select * into ...
To generuje wiersz dla każdej tabeli do skopiowania
W przypadku, gdy tabele zawierają kolumny tożsamości, tworzę skrypty tabel, w tym właściwość tożsamości i klucze podstawowe.
Nie używam wstawiania w ... select ... w tym przypadku za pomocą połączonego serwera, ponieważ nie jest to technika zbiorcza. Pracuję nad niektórymi skryptami PowerShell podobnymi do [tego SO pytania 1 , ale nadal pracuję nad obsługą błędów. Naprawdę duże tabele mogą powodować błędy braku pamięci, ponieważ cała tabela jest ładowana do pamięci, zanim zostanie wysłana przez SQLBulkCopy do bazy danych.
Odtwarzanie indeksów itp. Jest podobne do powyższego przypadku. Tym razem mogę pominąć odtwarzanie kluczy podstawowych.
źródło
Możesz użyć narzędzi porównawczych, które porównują schematy i dane bazy danych i najpierw zsynchronizują puste miejsce schemat bazy danych z oryginalną bazą danych, aby utworzyć wszystkie tabele.
Następnie zsynchronizuj dane z oryginalnej bazy danych z nową (wszystkie tabele są tam, ale wszystkie są puste), aby wstawić rekordy do tabel
Używam ApexSQL Diff i ApexSQL Data Diff , ale istnieją inne podobne narzędzia.
Zaletą tego procesu jest fakt, że nie trzeba synchronizować baz danych za pomocą tego narzędzia, ponieważ może to być bardzo bolesne dla milionów wierszy.
Możesz po prostu utworzyć skrypt INSERT INTO SQL (nie zdziw się, jeśli jest kilka koncertów) i go uruchom.
Ponieważ tak dużych skryptów nie można nawet otworzyć w SQL Server Management Studio, używam sqlcmd lub osql
źródło
Jak wspomniano @mrdenny -
Zamiast korzystać z SSIS, użyj BCP do wstawienia danych
bcp odczyt danych za pomocą poniższego skryptu. ustaw SSMS w trybie tekstowym i skopiuj dane wyjściowe wygenerowane przez poniższy skrypt w pliku nietoperza.
Uruchom plik bat, który wygeneruje pliki .dat w określonym folderze.
Uruchom poniżej skryptu na
Uruchom dane wyjściowe za pomocą SSMS, aby wstawić dane z powrotem do tabel.
Jest to bardzo szybka metoda BCP, ponieważ wykorzystuje tryb macierzysty.
źródło