Wir haben einige MySQL-Datenbankserver mit zeilenbasierter Replikation eingerichtet, um die Leistung zu verbessern. Die Software schreibt in den Master und liest entweder vom Master oder vom Slave. Alles funktioniert großartig, zum größten Teil.
Ich verstehe, dass MySQL Schreibzugriffe auf den Slave zulässt, obwohl er weiß, dass es sich um einen MySQL-Slave handelt. Im Idealfall würde ich dies gerne schließen. Selbst wenn jemand einen fehlerhaften Code schreibt, der eine Leseverbindung erhält und eine ausführt UPDATE
, wird ein Fehler ausgegeben, anstatt Daten auf den Slave zu schreiben .
Gibt es eine Möglichkeit, dies in MySQL zu tun? Natürlich möchten wir dies auch mit unserer Software unmöglich machen, aber wie eine Firewall auf unseren Servern möchte ich so defensiv wie möglich sein.
Vielen Dank!
Als Alternative zur Einstellung
read_only=1
(z. B. wenn die Slave-Instanz andere Scratchpad- / Berichts- / Entwicklungsdatenbanken enthält) entferne ich manchmal alle anderen Berechtigungen als SELECT von allen Benutzern in die zu replizierende Datenbank.Das heißt, nachdem ich den Befehl GRANT auf dem Master ausgeführt habe, führe ich den Befehl REVOKE auf dem Slave aus.
quelle
Ab MySQL 5.7.8 gibt es jetzt eine
super_read_only
Option, die sogar SUPER-Benutzer daran hindert, Client-Updates durchzuführen. Der Replikationsprozess wird nicht unterbrochen. Wie bei anderen Einstellungen kann Folgendes eingestellt werden:--super_read_only=ON
),super_read_only=1
) oderSET GLOBAL super_read_only = 1;
).Beachten Sie, dass:
super_read_only
Implizit aktivieren aktiviertread_only
read_only
implizite Deaktivieren wird deaktiviertsuper_read_only
Einige Einschränkungen:
read_only
nochsuper_read_only
werden Operationen für temporäre Tabellen verhindert.super_read_only
aktivierter Funktion gemeldet.Referenz: https://www.percona.com/blog/2016/09/27/using-the-super_read_only-system-variable/
quelle
Wie der erste Beitrag etwas andeutet, tun Sie dies mit Berechtigungen. Die schreibgeschützte Option funktioniert nicht für Superuser als FYI und ist auch nicht wirklich eine praktikable Lösung für einen Slave, bei dem Sie Schreibzugriffe verhindern möchten. Sie müssen Schreibvorgänge mit Benutzer- / Datenbank- / Tabellenberechtigungen verhindern. Zum einen muss der Replikationsbenutzer weiterhin in der Lage sein, auf den Slave zu schreiben, um ihn mit dem Master synchron zu halten. Eine bessere Möglichkeit, Schreibvorgänge zu steuern, besteht darin, Optionen zu widerrufen, die Schreibvorgänge (z. B. Einfügen, Erstellen usw.) für den betreffenden Benutzer zulassen, bei denen nur Lesevorgänge auf dem Slave ausgeführt werden sollen.
quelle
Gewähren Sie den Benutzern auf dem Slave nur replikationsbezogene Rechte. Sie haben immer noch das Problem der Root-Benutzerrechte, können jedoch den Remote-Root-Zugriff auf den DB-Server entfernen.
quelle