Zapobiegać zapisom braku replikacji w MySQL slave?

13

Mamy kilka serwerów baz danych MySQL skonfigurowanych do replikacji opartej na wierszach w celu zwiększenia wydajności. Oprogramowanie zapisuje do urządzenia nadrzędnego i odczytuje dane z urządzenia nadrzędnego lub podrzędnego. W większości wszystko działa świetnie.

Rozumiem, że MySQL pozwoli na zapis do slave, nawet jeśli wie, że to slave MySQL. Idealnie chciałbym to zamknąć, więc nawet jeśli ktoś napisze zły kod, który uzyskuje połączenie do odczytu i wykonuje UPDATE, spowoduje to zgłoszenie błędu zamiast umieszczania danych w urządzeniu podrzędnym.

Czy istnieje sposób, aby to zrobić w MySQL? Oczywiście chcielibyśmy również uniemożliwić to naszemu oprogramowaniu, ale jak zapora ogniowa na naszych serwerach, chciałbym być jak najbardziej defensywny.

Dzięki!


źródło

Odpowiedzi:

13

Włącz read-onlyopcję w my.cnf. Można go również określić jako flagę w wierszu poleceń za --read-onlypomocą mysqld.

Warner
źródło
5
Zauważ, że to nie zadziała dla superużytkowników (tj. Użytkownika root w MySQL), ponieważ nie stosuje się tylko do odczytu.
vmfarms
5

Jako alternatywę dla ustawienia read_only=1(np. Gdy istnieją inne bazy danych scratchpad / raportowania / programowania w instancji slave), czasami odbieram wszystkie uprawnienia inne niż WYBÓR wszystkim użytkownikom do bazy danych, którą replikuję.

Oznacza to, że po uruchomieniu polecenia GRANT na urządzeniu nadrzędnym uruchamiam polecenie REVOKE na urządzeniu slave.

Riedsio
źródło
2

Począwszy od MySQL 5.7.8 , dostępna jest teraz super_read_onlyopcja, która uniemożliwia nawet użytkownikom SUPER wykonywanie aktualizacji klienta. Nie zakłóca to procesu replikacji. Podobnie jak w przypadku innych ustawień, można ustawić:

  • w formacie wiersza poleceń ( --super_read_only=ON),
  • jako zmienna w my.cnf ( super_read_only=1) lub
  • z wiersza polecenia klienta ( SET GLOBAL super_read_only = 1;).

Uwaga:

  • Włączanie super_read_onlyniejawnie włączaread_only
  • Wyłączenie read_onlydomyślnie wyłączasuper_read_only

Niektóre zastrzeżenia:

  • Ani read_onlynie super_read_onlyzapobiegnie operacjom na tabelach tymczasowych.
  • Nie zapobiegną operacjom metadanych, takim jak TABELA ANALIZOWA i TABELA OPTYMALIZACJI.
  • super_read_onlyZgłoszono błędy niektórych zapytań z włączoną funkcją.

Odniesienie: https://www.percona.com/blog/2016/09/27/using-the-super_read_only-system-variable/

billyw
źródło
1

Jak sugeruje pierwszy post, robisz to z uprawnieniami. Opcja tylko do odczytu nie działa dla superużytkowników jako FYI, a także nie jest tak naprawdę wykonalnym rozwiązaniem dla urządzenia podrzędnego, w którym chcesz zapobiec zapisywaniu. Musisz zapobiegać zapisom z uprawnieniami użytkownika / bazy danych / tabeli. Po pierwsze, użytkownik replikacji nadal musi mieć możliwość zapisu do urządzenia podrzędnego, aby zsynchronizować go z urządzeniem głównym. Lepszym sposobem na kontrolowanie zapisu jest odwołanie opcji, które pozwalają na zapis (tj. Wstawia, tworzy itp.) Dla danego użytkownika, który powinien wykonywać odczyty tylko na urządzeniu slave.

Jeff
źródło
0

Przyznaj prawa związane z replikacją tylko użytkownikom slave. Nadal masz problem z prawami użytkownika root, ale możesz usunąć zdalny dostęp użytkownika root do serwera DB.

Craig
źródło