MySQLでCREATE TRIGGERができなかったので調べてみた
You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
というエラーが出ていて CREATE TRIGGER
ができなかった。
結論から言うと、 CREATE TRIGGER
などのストアドファンクションの作成、変更はバイナリログが有効な環境の場合にSUPER権限が必要であるが、CREATE TRIGGER
を実行しようとするユーザーがSUPER権限を持っていないということだった(エラーメッセージそのままだけど)。
以下の方法で解決できることがわかった。
- DBに接続するユーザーにSUPER権限をもたせる
log_bin_trust_function_creators
というグローバルパラメータを1にする
👉SUPER権限でできること(MySQL5.6)
CHANGE MASTER TO
- スレーブがマスターに接続する設定をする構文
KILL
またはmysqladmin kill
コマンド- 実行中のクエリを強制終了させる構文
PURGE BINARY LOGS
- バイナリログを削除する構文
SET GLOBAL
- システムのグローバル設定を変更する構文
mysqladmin debug
コマンド- ロギングの有効化または無効化
read_only
システム変数が有効な場合の更新の実行max_connections
に接続数が達しても1つの接続を受け入れる- スレーブサーバー上でのレプリケーションの開始と停止
- バイナリロギングが有効な場合のストアドファンクション作成、変更の権限
またSUPER権限はグローバル権限であるため、システム全体に影響を及ぼすことができる権限である。安易にSUPER権限をもたせてしまうと様々な管理者用の機能を利用できてしまうため危険。ちなみにあるデータベースやテーブルのみのSUPER権限は存在しない。
👉log_bin_trust_function_creators
パラメータ
MySQL :: MySQL 5.6 リファレンスマニュアル :: 20.7 ストアドプログラムのバイナリロギング を参考。
ストアドファンクションを利用するための条件は以下。
- CREATE ROUTINE または ALTER ROUTINE権限以外に、SUPER権限が必要
- CREATE FUNCTIONの際は DETERMINISTIC 、 NO SQL または READS SQL DATA の少なくとも 1 つを明示的に指定する必要
- ファンクションの実行によるデータの変更が確定的である、またはデータを変更しないということを明示
- 例えば関数内で
UUID()
などを利用すると実行のたびに結果が違うためレプリケーション時にマスターとスレーブの整合性がとれなくなる - ちなみにTRIGGERはDETERMINISTICであるため構文に指定する必要はないが、
UUID()
などは注意が必要
そして、上記を緩和するためにlog_bin_trust_function_creators
パラメータを1にすることでストアドファンクションを作成、変更することができるようになる。しかし上記のようなレプリケーションの整合性の問題を理解し危険がないということを確認の上、設定することが必要ということだった。
その他参考URL
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.2.1 MySQL で提供される権限
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.4.2.1 CHANGE MASTER TO 構文
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.7.6.4 KILL 構文
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.4.1.1 PURGE BINARY LOGS 構文
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.5 システム変数の使用
- MySQL ストアドプログラムのバイナリロギング メモ - blog @kimromi
このあたり理解していくとMySQLにもっと踏み込めていけそうだ〜。