RDS nie pozwala nawet głównemu użytkownikowi na SUPER
uprawnienia i jest to wymagane do wykonania FLUSH TABLES WITH READ LOCK
. (Jest to niefortunne ograniczenie RDS).
Niepowodzenie instrukcja jest generowana przez --master-data
opcja, która jest oczywiście niezbędna, jeśli chcesz mieć możliwość poznania dokładnych współrzędnych binlogu, w którym rozpoczyna się tworzenie kopii zapasowej. FLUSH TABLES WITH READ LOCK
uzyskuje globalną blokadę odczytu we wszystkich tabelach, co pozwala mysqldump START TRANSACTION WITH CONSISTENT SNAPSHOT
(tak jak w przypadku --single-transaction
), a następnie SHOW MASTER STATUS
aby uzyskać współrzędne dziennika binarnego, po czym zwalnia globalną blokadę odczytu, ponieważ ma transakcję, która utrzyma widoczne dane w stanie zgodnym z tą pozycją dziennika.
RDS łamie ten mechanizm, odmawiając SUPER
przywileje i nie zapewniają żadnego oczywistego obejścia.
Dostępnych jest kilka zwariowanych opcji, które pozwalają prawidłowo obejść ten problem, z których żadna nie może być szczególnie atrakcyjna:
-
wykonaj kopię zapasową w okresie małego ruchu. Jeśli współrzędne binlogu nie zmieniły się od momentu rozpoczęcia tworzenia kopii zapasowej do rozpoczęcia zapisywania danych do pliku wyjściowego lub serwera docelowego (zakładając, że użyłeś
--single-transaction
), to zadziała, ponieważ wiesz, że współrzędne nie zmieniły się podczas działania procesu. -
obserwuj pozycję binlogu na master tuż przed rozpoczęciem tworzenia kopii zapasowej i użyj tych współrzędnych za pomocą
CHANGE MASTER TO
. Jeślibinlog_format
twojego mistrza jest ustawiona naROW
to powinno działać, chociaż prawdopodobnie będziesz musiał pominąć kilka początkowych błędów, ale nie powinno być później żadnych błędów. Działa to, ponieważ replikacja oparta na wierszach jest bardzo deterministyczna i zatrzyma się, jeśli spróbuje wstawić coś, co już istnieje, lub usunąć coś, co już nie istnieje. Po przejściu błędów znajdziesz się przy prawdziwych współrzędnych binlogu, w którym faktycznie rozpoczął się spójny zrzut ekranu. -
jak w poprzednim punkcie, ale po przywróceniu kopii zapasowej spróbuj określić poprawną pozycję za pomocą
mysqlbinlog --base64-output=decode-rows --verbose
aby odczytać binlog mastera z otrzymanymi współrzędnymi, sprawdzić swojego nowego slave'a, aby zobaczyć, które zdarzenia musiały już zostać wykonane przed faktycznym rozpoczęciem zrzutu, i używając współrzędnych określonych w ten sposób, abyCHANGE MASTER TO
. -
użyj zewnętrznego procesu, aby uzyskać blokadę odczytu na każdej tabeli na serwerze, która zatrzyma wszystkie zapisy; zwróć uwagę, że pozycja binlogu z
SHOW MASTER STATUS
przestał inkrementować, uruchom tworzenie kopii zapasowej i zwolnij te blokady.
Jeśli użyjesz któregoś z tych podejść, innego niż być może ostatniego, szczególnie ważne jest, abyś porównał tabele, aby upewnić się, że twój slave jest identyczny z masterem po uruchomieniu. Jeśli natrafisz na kolejne błędy replikacji... to nie było.
Prawdopodobnie najbezpieczniejsza opcja — ale może też najbardziej irytująca ponieważ wydaje się, że nie powinno to być konieczne — zacznij od utworzenia repliki do odczytu RDS mastera RDS. Po uruchomieniu i zsynchronizowaniu z systemem głównym można zatrzymać replikację w replice do odczytu RDS, wykonując dostarczoną przez RDS procedurę składowaną, CALL mysql.rds_stop_replication
który został wprowadzony w RDS 5.6.13 i 5.5.33 który nie wymaga SUPER
przywilej.
Po zatrzymaniu repliki RDS slave weź swój mysqldump
z repliki do odczytu RDS, która będzie teraz zawierała niezmienny zestaw danych od określonego zestawu współrzędnych głównych. Przywróć tę kopię zapasową do swojego zewnętrznego urządzenia podrzędnego, a następnie użyj RDS do odczytu współrzędnych głównych repliki z SHOW SLAVE STATUS
Exec_Master_Log_Pos
i Relay_Master_Log_File
jako CHANGE MASTER TO
współrzędne.
Wartość pokazana w Exec_Master_Log_Pos
na urządzeniu podrzędnym jest początek następnej transakcji lub wydarzenie do przetworzenia
, i właśnie tam twój nowy slave musi zacząć czytać na urządzeniu głównym.
Następnie możesz wycofać replikę do odczytu RDS, gdy zewnętrzne urządzenie podrzędne będzie już gotowe do pracy.