Synchronizacja baz danych

0

Witam
Piszę program który ma za zadanie zsynchronizować lub przenieść dane z jednej bazy danych do drugiej. Program najpierw wylistuje tabele jakie są w bazie danych użytkownik wybiera które tabele mają być synchronizowane i start. Założenia są takie by informacje były przekazywane z bazy do bazy tak by nic na dysku nie zapisywać.
Teraz konkretne pytanie techniczne. Jak taką operację najlepiej wykonać.

1 Pomysł
Najpierw wykonać TRUNCATE TABLE a następnie rekord po rekordzie wpychać na nowo informacje.

2 Pomysł
Tak jak pomysł 1 tylko ubrać to BEGIN TRANSACTION SET XACT_ABORT ON i na końcu COMMIT TRANSACTION. Tylko moje obawy są o miejsce w bazie TEMPDB. Czy baza nie spuchnie tak że miejsca na dysku nie braknie. Jeżeli będziemy przenosić np 2GB danych to spokojnie gorzej jak zaczniemy przenosić tabele w których znajdują się dane wielkości 100GB i większe bo z takimi też mam odczynienia. Użytkownik chce trzymać dane od początku świata do celów statystycznych itp.

3 Pomysł
Ten pomysł jest bardzo świeży i najmniej o niem wiem pod względem technicznym. Chodzi o wywołanie wewnętrznych modułów takich jak BCP (bulk copy). Jeszcze nie wiem czy da się tą metodą kopiować dane z serwera na serwer czy tylko do pliku.

Czy te pomysły są dobre. Jakie niosą zagrożenia w razie jakiegoś crash'a i czy w ogóle mają prawo bytu czy są jakieś lepsze sposoby rozwiązania tego problemu.

0

Nie odtwarza się na RELACYJNYCH bazach danych wybranych tabel. Właśnie dlatego, że są relacyjne.
Robi się BACKUP + RESTORE

0
  • Jeśli to ma być jednorazowa akcja to Backup i restore jak pisze @Marcin.Miga
  • Jeśli to ma być ciągła akcja i są to dwie podobne bazy to można się zastanowić nad replikacją
  • Jeśli to ma być ciągła akcja i są to różne bazy to trzeba już trochę swojego kodu napisać. Ale to bardziej niż truncate polecałbym porównywanie wierszy lub hashu z wierszy lub hashy z hashy z wierszy (takie hashe z z hashy do porównywania jakoś się nazywały ale niestety nie pamiętam)
2

jeśli to ma być ciągłe i wydajne to dodaj sobie dodatkowe pole albo z datą ostatniej aktualizacji (nie do końca pewne) albo z id ostatniej zmiany (jeden generator dla WSZYSTKICH tabel, które może wybrać user BARDZO ułatwi sprawę). Potem tylko bierzesz pod uwagę te rekordy, które się zmieniły od ostatniego razu (albo p dacie albo po id zmiany). Oczywiście trzeba gdzieś trzymać info o usuniętych rekordach. Trunacte jest niebezpieczny - jeśli będziesz miał FK to albo nie zrobisz truncate albo usuniesz wszystkie rekordy z tabel podrzędnych a wtedy jak tych tabel user nie zaznaczy do synchronizacji to jest kupa

0

Chodzi o to że jestem testerem. To ma przyspieszyć mi przywracanie bazy do testów. To nie jest program do zastosowań produkcyjnych. Musze przetestować pewną część kodu która robi coś na bazie. Szybciej jak tylko te tabele przywrócę do stanu początkowego niż wywalać i na nowo stawiać bazę. Obraz też waży a ja w jednym projekcie nie siedzę. Więc same obrazy tych baz mogą sporo ważyć. Szybciej jak np z produkcji na potrzeby testów przerzucę parę tabel niż całą bazę. Zdaję sobie sprawę że takie kopanie na bazie może pomieszać relacje. Ale tak jak mówię to do przyspieszenia pracy. A częste usuwanie i stawianie tej samej bazy w MSSQL powoduje błędy w przydzielaniu użytkowników do bazy. Niby użytkownik ma dostęp do bazy ale jej nie ma (error 15023).

3

No to chyba najszybciej będzie przed rozpoczeciem testów zrobić snapshot i po testach przywrócić dane ze snapshotu, odpadna problemy z tym, że zapomnisz o jakiejś tabeli, lub będziesz walczył z kolejnością dodawania w odpowiedniej kolejności ze względu na FK, pogladowo:

https://pl.seequality.net/sql_server_database_snapshots/

1 użytkowników online, w tym zalogowanych: 0, gości: 1