MySQLのレプリケーション機能において、レプリカはソースから送信されたトランザクションをそのまま実行し、ソースと同じデータ状態を保つように設計されています。レプリケーションを設定する際には、REPLICATION SLAVE
権限を持つアカウントがソースに存在する必要があります。このアカウントを使用して、レプリカはソースに接続し、レプリケーションを開始することができます。このプロセスでは、レプリカはソースから受け取ったトランザクションの権限のチェックをせずに適用します。
MySQL 8.
PRIVILEGE_CHECKS_USER
アカウントの作成と設定
MySQL 8.CHANGE REPLICATION SOURCE TO
またはCHANGE MASTER TO
)PRIVILEGE_
アカウントを指定できます。
PRIVILEGE_
アカウントにはユーザーアカウントを指定します。デフォルトはNULLであり、指定なしです。ソースから受け取ったトランザクションをレプリカが適用するときに、ここに指定されたユーザーアカウント権限と照合してチェックし、そのトランザクションの適用が認可されていることを確認します。
また、PRIVILEGE_
アカウントを指定するときは、REQUIRE_
オプションを1に指定することをおすすめします。これは行ベースレプリケーションのトランザクションのみを受けていれるようにするオプションです。ステートメントベースレプリケーションであると、トランザクションによっては管理者レベルの権限が必要になるときがあるためです。よりセキュアにするために、この指定を行います。
PRIVILEGE_
アカウントに指定するアカウントにはREPLICATION_
権限が必要です。それと、予想されるすべてのトランザクションを適用するのに十分な追加の権限の付与を行います。
次の例では、前述の例でPRIVILEGE_
アカウントに指定した'repl_
ユーザアカウントに対して、REPLICATION_
権限の付与とdb1
データベースの全テーブルにINSERTできるように指定しています。
以上の設定を行うと、db1
データベースの全テーブルに対するINSERTのみレプリケーションされます。それ以外のトランザクションがくると、レプリケーションは停止するようになります。
PRIVILEGE_CHECKS_USER
アカウントの用途
PRIVILEGE_
アカウントの用途としては、以下の2つがあります。
- セキュリティの向上
- ヒューマンエラーからの保護
「セキュリティの向上」PRIVILEGE_
アカウントに付与することで、不正な操作からレプリカを保護することができます。
「ヒューマンエラーからの保護」DROP
権限を剥奪したPRIVILEGE_
アカウントを用意します。ミスにより誤ってテーブルを削除したとしても、レプリカでは削除されず残ることになります。ただし、これは複雑な構成になり、イレギュラーな作業時にレプリケーション停止のリスクがあるため、実運用には適さないと考えます。このようなヒューマンエラーに対してはバックアップからリストアするのがいいでしょう。
失敗したトランザクションへの対応方法
PRIVILEGE_
アカウントに対する権限チェックが失敗した場合、トランザクションは実行されず、レプリケーションは停止します。
停止後に失敗したトランザクションを確認して対応方法を検討します。失敗したトランザクションの確認方法はmysqlbinlog
コマンドを利用して、該当のトランザクションを特定します。
該当のトランザクションを特定し、それがセキュリティ上の問題がないことを確認します。問題ないことが確認できたら、以下のような対応方法があります。
- 適切な権限の付与:実行されるべきトランザクションであれば、
PRIVILEGE_
アカウントに適切な権限を付与してレプリケーションを再開します。CHECKS_ USER - トランザクションのスキップ:一時的に予期していないトランザクションであり、無視してもよいものであればスキップします。スキップ方法はGTIDであれば、17.
1.7. 、GTIDでない場合は 17.3.1 GTID のあるトランザクションのスキップ 1.7. をご確認ください。3.2 GTID のないトランザクションのスキップ
まとめ
今回はレプリカのレプリケーション権限チェックについて紹介しました。17.