Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Kopia zapasowa MySQL Amazon RDS

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śli binlog_format twojego mistrza jest ustawiona na ROW 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, aby CHANGE 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyzwania związane ze skalowaniem bazy danych Moodle MySQL

  2. Jak najlepiej wykorzystać funkcję komentowania w MySQL?

  3. parsowanie zapytań wyszukiwania pełnotekstowego wpisanych przez użytkownika do klauzuli WHERE MySQL przy użyciu PHP

  4. mysql zmienia wszystkie wartości w kolumnie

  5. MySQL — Odzyskaj porzuconą bazę danych schematów wydajności