Jak wprowadzać zmiany schematu w aktywnej bazie danych bez przestojów?
Załóżmy na przykład, że mam bazę danych PostgreSQL z tabelą zawierającą różne dane użytkownika, takie jak adresy e-mail itp., Wszystkie powiązane z określonymi użytkownikami. Gdybym chciał przenieść adresy e-mail do nowej dedykowanej tabeli, musiałbym zmienić schemat, a następnie przeprowadzić migrację danych e-mail do nowej tabeli. Jak można to zrobić bez zatrzymywania zapisów na oryginalnym stole? Z pewnością podczas gdy dane są zapisywane ze starej tabeli do nowej, nowe dane byłyby nadal zapisywane do starej tabeli i byłyby pomijane, prawda?
Wydaje mi się, że ten problem pojawia się dość często, ale nie mogę znaleźć standardowego rozwiązania tego problemu.
W tym artykule omówiono problem, ale tak naprawdę nie zrozumiałem kroku 3. Mówi, aby napisać do obu tabel, a następnie przenieść stare dane z pierwszej tabeli do nowej. Jak upewnić się, że migrujesz tylko stare dane?
(Używam PostgreSQL na Heroku .)
źródło
Odpowiedzi:
Prawie masz już odpowiedź:
Jeśli chodzi o krok 3 , użyj czegoś takiego (w jednej transakcji):
Wstaw to, czego jeszcze nie ma:
Zaktualizuj, co zmieniło się w międzyczasie:
Nowe dane nie zostaną zmienione, ponieważ są identyczne w obu miejscach.
źródło