一部のMySQLデータベースサーバーには、パフォーマンスのために行ベースのレプリケーションが設定されています。ソフトウェアはマスターに書き込み、マスターまたはスレーブから読み取ります。ほとんどの場合、すべてがうまく機能しています。
MySQLがMySQLスレーブであることを知っていても、MySQLがスレーブへの書き込みを許可することは私の理解です。理想的には、これを閉じたいので、誰かが読み取り接続を取得してUPDATE
を実行する不正なコードを書いても、スレーブにデータを置くのではなくエラーをスローします。
MySQLでこれを行う方法はありますか?もちろん、ソフトウェアからもこれを不可能にしたいのですが、サーバーのファイアウォールのように、私はできるだけ防御的になりたいと思っています。
ありがとう!
My.cnfで read-only
オプションを有効にします。 mysqldで--read-only
を使用して、コマンドラインでフラグとして指定することもできます。
read_only=1
を設定する代わりに(たとえば、スレーブインスタンスに他のスクラッチパッド/レポート/開発データベースがある場合)、SELECT以外のすべての特権を、すべてのユーザーから、複製しているDBに削除することがあります。
つまり、マスターで [〜#〜] grant [〜#〜] コマンドを実行した後、 [〜#〜] revoke [〜#〜] を実行しますスレーブのコマンド。
MySQL 5.7.8 以降、 super_read_only
オプションが追加され、SUPERユーザーでさえクライアントの更新を実行できなくなりました。レプリケーションプロセスが中断されることはありません。他の設定と同様に、次のように設定できます。
--super_read_only=ON
)、super_read_only=1
)、またはSET GLOBAL super_read_only = 1;
)。ご了承ください:
super_read_only
を有効にすると、暗黙的にread_only
が有効になりますread_only
を無効にすると、super_read_only
が暗黙的に無効になりますいくつかの警告:
read_only
もsuper_read_only
も、一時テーブルでの操作を妨げません。super_read_only
を有効にした特定のクエリのバグが報告されています。参照: https://www.percona.com/blog/2016/09/27/using-the-super_read_only-system-variable/
最初の投稿がいくらか示唆しているように、あなたは許可を得てそれを行います。読み取り専用オプションは、FYIとしてのスーパーユーザーには機能しません。また、書き込みを防止したいスレーブに対しては、実際には有効なソリューションではありません。ユーザー、データベース、テーブルの権限で書き込みを禁止する必要があります。 1つは、レプリケーションユーザーがスレーブとの同期を維持するために、スレーブに書き込むことができる必要があることです。書き込みを制御するためのより良い方法は、スレーブでのみ読み取りを実行する必要がある問題のユーザーに対して書き込み(つまり、挿入、作成など)を許可するオプションを取り消す必要があることです。
スレーブ上のユーザーにのみレプリケーション関連の権限を与えます。 rootユーザー権限の問題はまだ残っていますが、DBサーバーへのリモートrootアクセスを削除できます。