RDS MySQL5.6にSYSスキーマを組み込もうとして失敗する件
日本語情報、ぜんぜんないのね。
ていうか、MySQLのSYSスキーマ自体がそんなに普及していないのかな。
SYSスキーマは、パフォーマンスを見る上で重要なPerformance_Schemaの情報を見やすくしてくれるViewのセット。
ソースとセットアップ手順は、以下のURLの通り。
GitHub - mysql/mysql-sys: The MySQL sys schema
オンプレ環境ならセットアップでまったくトラブることもないし、MySQL Workbenchから1クリックでセットアップできちゃうのに、対象がRDSになった途端にひっかかる、というお話です。
なお、Oracleの最強ユーザ「SYS」とは違います。
どこでひっかかるのか。
スクリプトを覗き込んでみて、1件ずつ処理してみると、かなり冒頭にあるCREATE TRIGGERで引っかかってる。
エラーメッセージは、以下のとおり。
Error Code: 1419. 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)
超訳)「SUPER権限が足りねえよ。それと、バイナリロギングが有効になってんよ」
はい。RDSではSUPER権限は取得できません。詰んだ?
メッセージの後半、カッコの中に注目。
MySQL「you *might* want to use the less safe log_bin_trust_function_creators variable」
超訳)「log_bin_trust_function_creatorsが使えるよ(ぼそっ)」
「使える」ってなんだよ!
このオプションは対応する log_bin_trust_function_creators システム変数を設定します。引数が指定されない場合、このオプションは変数を 1 に設定します。log_bin_trust_function_creators は、ストアドファンクションおよびトリガー作成に対して MySQL がどのように制限を適用するかに影響します。セクション20.7「ストアドプログラムのバイナリロギング」を参照してください。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 17.1.4.4 バイナリログのオプションと変数
で、素直に参照すると
MySQL 5.6 でストアドファンクションを使用するための現在の条件は、次のように要約できます。これらの条件は、ストアドプロシージャーまたはイベントスケジューラのイベントには適用されず、バイナリロギングが有効でないかぎり適用されません。
ストアドファンクションを生成または変更するには、ユーザーは、通常必要になる CREATE ROUTINE 権限または ALTER ROUTINE 権限以外に、SUPER 権限が必要です。(関数定義の DEFINER 値によっては、バイナリロギングが有効かどうかにかかわらず SUPER が必要になる場合があります。セクション13.1.15「CREATE PROCEDURE および CREATE FUNCTION 構文」を参照してください。)
(中略)
関数作成に関する前述の条件 (SUPER 権限を持つ必要があることと、関数が決定的であるか、データを変更しないと宣言する必要があること) を緩和するには、log_bin_trust_function_creators グローバルシステム変数を 1 に設定します。デフォルトでこの変数には 0 の値が設定されていますが、次のように変更できます。
mysql> SET GLOBAL log_bin_trust_function_creators = 1;
サーバーの起動時に --log-bin-trust-function-creators=1 オプションを使用することによって、この変数を設定することもできます。
バイナリロギングが有効でない場合、log_bin_trust_function_creators は適用されません。前述のように、関数定義の DEFINER 値が必要としないかぎり、関数の作成に SUPER は必要ありません。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 20.7 ストアドプログラムのバイナリロギング
キタコレ。
バイナリロギングを有効にしている場合、安全性を考慮して、ファンクションやトリガーの生成にSUPER権限も必要とするようにデフォルト設定されてます。
SUPER権限なしでも対応できるように緩和することができます。そのへんの制御は、以下のグローバルパラメータ(動的変更可)が絡んでます。
log_bin_trust_function_creators=0(デフォルト:無効) -> 1(許可)
しかし、GLOBALのサーバーパラメータを変更するには、SUPER権限が必要です!やっぱりSUPERなんです!
なので、ストアドファンクションやトリガーを作りたい人が勝手に「log_bin_trust_function_creators」を変更して作りこむことはできません。
グローバルのサーバーパラメータは、マネジメントコンソールまたはCLIから変更します。
ということで、SYSスキーマにかぎらず、ストアドファンクションやトリガーはすべてこの辺のお話が絡んできます。
ですので、このあたりはしっかり読み込んでおきましょう。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 20.6 ストアドプログラムおよびビューのアクセスコントロール
MySQL :: MySQL 5.6 リファレンスマニュアル :: 20.7 ストアドプログラムのバイナリロギング
まとめ:RDSのMySQL5.6ににSYSスキーマを組み込むには
1.マネジメントコンソール or CLIで「log_bin_trust_function_creators=1(TRUE)」に修正
2.githubから取得したmysql-sysの中にある、「generate_sql_file.sh」を実行し、RDS用のsqlファイル「sys___inline.sql」を作る。
Generate a MySQL 5.6 SQL file for RDS:
./generate_sql_file.sh -v 56 -b -u CURRENT_USER
3.RDSに接続して、「sys_<sys_version>_<mysql_version_identifier>_inline.sql」ファイルを読み込ませて実行する。
mysql>SOURCE sys_<sys_version>_<mysql_version_identifier>_inline.sql
こんな感じで。
なお、手順1、2をやらずに3だけ実行すると、不完全なSYSスキーマが出来上がります。
トリガーとストアドファンクションが生成できず、それを使ったVIEWが作れず、全体として半分くらいしか生成されません。
無いよりはマシ、MySQL WorkbenchのPerformance Reportsも多少は動くようにはなりますが。。。
もっと簡単にSYSスキーマを使う方法。
MySQL5.7からデフォルトで組み込まれてます!
New! Sysスキーマ: MySQLの詳細な稼働状況を簡単に確認可能
MySQL :: MySQL 5.7: 3倍高速
これからRDS-MySQLで構築する場合、5.7にする可能性が高いと思います。地雷(初期パスワード有効期限問題)も取り除かれたしねっ。
- 作者: Baron Schwartz,Peter Zaitsev,Vadim Tkachenko,菊池研自,株式会社クイープ
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/11/25
- メディア: 大型本
- この商品を含むブログ (7件) を見る