このガイド に従ってPercona Server 5.5でレプリケーションを実行していて、スレーブのread-only=1
にmy.cnf
を追加して読み取り専用にする必要があるかどうか疑問に思いましたか?
このガイドでは、ユーザーが複製されるようにmysqlテーブルのレプリケーションを設定していますが、私は主にmysqldumpを取得するためにスレーブを使用しており、緊急時にマスターになるように再構成しているため、書き込みを有効にする必要がある(または有効にする必要がある)とは思わないそれは常に?
スレーブが 読み取り専用 の場合、それは世界から100%シールドされていません。
MySQLのドキュメントによるとread-only
この変数はデフォルトでオフになっています。有効にすると、サーバーは、SUPER特権を持つユーザーからの更新、または(スレーブサーバー上で)スレーブスレッドによって実行された更新を除いて、更新を許可しません。レプリケーション設定では、スレーブサーバーでread_onlyを有効にして、スレーブがマスターサーバーからの更新のみを受け入れ、クライアントからの更新を受け入れないようにすると便利です。
したがって、 SUPER特権 を持つユーザーは、そのようなスレーブに対して自由に読み書きできます...
すべての非特権ユーザーにSUPER特権がないことを確認してください。
すべてのSUPER権限を一度に取り消す場合は、マスターとスレーブでこれを実行してください。
UPDATE mysql.user SET super_priv='N' WHERE user<>'root';
FLUSH PRIVILEGES;
スレーブを参照すると、これはSUPER特権をroot
だけに予約し、それ以外の場合は制限されている書き込みを非特権が実行することを防ぎます。
最近、MySQL 5.7が super_read_only を導入することを最近知りました。
5.7 Docsが言うので、これは [〜#〜] super [〜#〜] ユーザーを停止します
Read_onlyシステム変数が有効になっている場合、サーバーは、SUPER特権を持つユーザーからのクライアント更新のみを許可します。 super_read_onlyシステム変数も有効になっている場合、サーバーは、SUPERを持つユーザーからのクライアントの更新を禁止します。読み取り専用モードの説明と、read_onlyとsuper_read_onlyの相互作用に関する情報については、read_onlyシステム変数の説明を参照してください。
マスターサーバーのsuper_read_onlyへの変更は、スレーブサーバーに複製されません。この値は、マスターの設定とは関係なく、スレーブサーバーで設定できます。
super_read_onlyはMySQL 5.7.8で追加されました。
MySQLレプリケーションスレーブを読み取り専用に設定する必要がありますか?
はい、R/O modesを使用してスレーブサーバーを実行することをお勧めします。以前の特権ユーザーは、このようなスレーブのデータを変更することができましたが、その後、R/O制限「ノブ」も取得しました。
重要な理由—単純なデータのマックアップやレプリケーションを中断させるキーの競合など(実際にはスレーブはもうない)のためにスレーブを効果的に使用不能にする可能性がある不適切な書き込みで後悔するよりも、書き込みで失敗する方がよい。
また、オーケストレーション/ロードスプリットに使用されるソフトウェアもあり、これらのサーバー間で適切な要求ルーティングを行うように構成されたプール内のサーバーのR/Oステータスを考慮します。
これは安全です。これを使って。
MySQL 8.0を含むここでの問題は、read_only = ON
コマンドを実行するときに、MySQLがstart slave
の設定を強制しないことです。なぜ問題があるのですか?ほとんどすべてのMySQL DBAはデータの破損を防ぐためにROでスレーブを使用し、スレーブ上のデータを変更するSQL、または設定を変更しないアプリを誤って実行するdbaが常に存在するためです。スレーブに書き込みたい場合は、いくつかのスキーマがあり、このスキーマに書き込みを行う必要があるため、read_only
コマンドをよりインテリジェントにして、read_only for schema
を実行する必要があります。これは、Replicate_Ignore_DB
を実行するマルチマスターサーバーとスレーブで非常に役立ちます。したがって、現時点では、手動で制御を行い、非常に注意する必要があります。
楽しい。