web-dev-qa-db-ja.com

MySQLスレーブへのレプリケーション以外の書き込みを防止しますか?

一部のMySQLデータベースサーバーには、パフォーマンスのために行ベースのレプリケーションが設定されています。ソフトウェアはマスターに書き込み、マスターまたはスレーブから読み取ります。ほとんどの場合、すべてがうまく機能しています。

MySQLがMySQLスレーブであることを知っていても、MySQLがスレーブへの書き込みを許可することは私の理解です。理想的には、これを閉じたいので、誰かが読み取り接続を取得してUPDATEを実行する不正なコードを書いても、スレーブにデータを置くのではなくエラーをスローします。

MySQLでこれを行う方法はありますか?もちろん、ソフトウェアからもこれを不可能にしたいのですが、サーバーのファイアウォールのように、私はできるだけ防御的になりたいと思っています。

ありがとう!

13
Ken

My.cnfで read-only オプションを有効にします。 mysqldで--read-onlyを使用して、コマンドラインでフラグとして指定することもできます。

13
Warner

read_only=1を設定する代わりに(たとえば、スレーブインスタンスに他のスクラッチパッド/レポート/開発データベースがある場合)、SELECT以外のすべての特権を、すべてのユーザーから、複製しているDBに削除することがあります。

つまり、マスターで [〜#〜] grant [〜#〜] コマンドを実行した後、 [〜#〜] revoke [〜#〜] を実行しますスレーブのコマンド。

5
Riedsio

MySQL 5.7.8 以降、 super_read_only オプションが追加され、SUPERユーザーでさえクライアントの更新を実行できなくなりました。レプリケーションプロセスが中断されることはありません。他の設定と同様に、次のように設定できます。

  • コマンドライン形式(--super_read_only=ON)、
  • my.cnfの変数として(super_read_only=1)、または
  • クライアントプロンプトから(SET GLOBAL super_read_only = 1;)。

ご了承ください:

  • super_read_onlyを有効にすると、暗黙的にread_onlyが有効になります
  • read_onlyを無効にすると、super_read_onlyが暗黙的に無効になります

いくつかの警告:

  • read_onlysuper_read_onlyも、一時テーブルでの操作を妨げません。
  • ANALYZE TABLEやOPTIMIZE TABLEなどのメタデータ操作を妨げることはありません。
  • super_read_onlyを有効にした特定のクエリのバグが報告されています。

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

2
billyw

最初の投稿がいくらか示唆しているように、あなたは許可を得てそれを行います。読み取り専用オプションは、FYIとしてのスーパーユーザーには機能しません。また、書き込みを防止したいスレーブに対しては、実際には有効なソリューションではありません。ユーザー、データベース、テーブルの権限で書き込みを禁止する必要があります。 1つは、レプリケーションユーザーがスレーブとの同期を維持するために、スレーブに書き込むことができる必要があることです。書き込みを制御するためのより良い方法は、スレーブでのみ読み取りを実行する必要がある問題のユーザーに対して書き込み(つまり、挿入、作成など)を許可するオプションを取り消す必要があることです。

1
Jeff

スレーブ上のユーザーにのみレプリケーション関連の権限を与えます。 rootユーザー権限の問題はまだ残っていますが、DBサーバーへのリモートrootアクセスを削除できます。

0
Craig