Zastanów się nad utworzeniem nowej tabeli z tym samym schematem i kolumną konwersji wierszy, a także dodaj widok na obu tabelach, który tworzy całość. Niech ludzie używają widoku i piszą zamiast wyzwalaczy względem bazowych tabel i widoków.
Wkładki powinny być wysyłane do nowej tabeli, aktualizacje powinny przenosić dane do nowej tabeli, a usunięcia powinny być stosowane do obu tabel.
Następnie wykonuj ruchy wsadowe w tle, przenosząc jednocześnie tyle rekordów, ile możesz, do nowej tabeli. Nadal możesz mieć problemy z współbieżnością, a także pewne plany wykonania, ale pozwala ci pozostać online podczas wykonywania ruchów.
Najlepiej jest rozpocząć proces w piątek po południu, aby zminimalizować wpływ na użytkowników końcowych i postarać się to zrobić przed poniedziałkiem rano. Kiedy już znajdzie się na miejscu, możesz zmienić widok, tak aby wskazywał tylko na nowy stół, a plany wykonania krytyczne znikają. Idealnie.
Aby uniknąć wyzwalania wyzwalaczy podczas migracji danych partiami, spójrz na liczbę wierszy w usuniętych / wstawionych tabelach wyzwalacza i pomiń działania, jeśli są zbliżone do liczby wierszy w partii.
Na koniec Michael postanowił pominąć widok (i nie usuwać z oryginalnej tabeli), aby uzyskać bardziej stabilne plany. Kompromis obejmował zasadniczo dwie kopie stołu. Przekształcił go w serię postów na blogu .
Jeśli
TIMESTAMP
dodajesz toNULLABLE
:VARBINARY(8)
kolumnęPo to jest wypełniane, w powrotem do tyłu SQL, kolumna po prostu dodaje zaludnionych i dodaj kolumnę.
DROP
VARBINARY(8)
TIMESTAMP NULL
Jeśli
TIMESTAMP
dodajesz toNOT NULLABLE
:BINARY(8)
kolumnęPo to jest wypełniane, w powrotem do tyłu SQL, kolumna po prostu dodaje zaludnionych i kolumna.
DROP
BINARY(8)
ADD THE TIMESTAMP NOT NULL
źródło