読者です 読者をやめる 読者になる 読者になる

なからなLife

geekに憧れと敬意を抱きながら、SE、ITコンサル、商品企画、事業企画、管理会計、総務・情シス、再び受託でDB屋さんと流浪する人のブログです。

亡き父の四十九日法要が無事に終わって

雑記

少し落ち着いてきました。ブログも少しずつ再開させようかなと思います。


父のいない実家で、母と話をしているときも、父はただ入院しているだけでまだ生きているかのような、いつでも会えるかのような感覚が抜け切れません。
納棺、葬儀、火葬、その瞬間瞬間は強烈な悲しみに襲われるのにも関わらず。


そして、自分たち家族と一緒にいる時の自然な表情をしている写真から作った遺影を見ると、今にも話しかけてきそうで、涙がこらえきれなくなります。


・・・まだ落ち着いてないじゃん。




昔のことを思い返してみると、自分が小学校1年のとき、今回亡くなった父の父である祖父が亡くなりました。
直系親族の死というのは物心がついてから初めての経験で、通夜から葬儀・告別式、納骨までの記憶は強烈に残っています。
一連のイベント自体は強烈な体験であったその一方で、当時もやはり祖父の死というものをなかなか現実のものとして受け入れきれず、なんとなく初めての儀式において身内側の席に座っていた、という感じです。


そして、自分の子供が小学校1年というタイミングで、私の父、私の子供にとっての祖父がなくなるというタイミング。
同じように、強烈な体験として残ったのではないかと思います。


男が比較的短命な家系なようで、父と祖父の年齢もほぼ一緒。自分の寿命が逆算できるかのようです。


あと30年。


元々あまり「生」というものに執着がない自分だけど、自分自身のことよりも、残される家族に何を残そうかという方面で、残りの人生どうしようとか考える機会が増えました。


父を超えるような立派な人間にはなれそうにはないけれど、せめて家族が困らない程度に、何か残せたらいいなぁ。

タブ切り替えのショートカット

雑記

Excelは、Ctrl+PageUp/PageDown。
IEは、Ctrl+Tab/Ctrl+Shift+Tab。
FireFoxChromeは、上記どちらでも可。


自分は、ExcelChromeの利用頻度が高いという流れから「Ctrl+PageUp/PageDown」派。



めったに使わないIE使うときに気持ち悪くて仕方がない。。。
MS内のプロダクト間の操作統一性のなさ、未だに引きずってんのな。

topコマンドからログファイルを出力させるために、sedとawkをかじる

雑記

topの概要

語り尽くされてますし、manにもすごく丁寧に説明がありますので、見た目だけ。

top - 10:12:59 up 42 min,  3 users,  load average: 0.00, 0.01, 0.05
Tasks: 159 total,   1 running, 158 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.6%us,  0.4%sy,  0.0%ni, 96.8%id,  2.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4048536k total,  1446716k used,  2601820k free,    36404k buffers
Swap:  4194300k total,        0k used,  4194300k free,  1124068k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
 2965 root      20   0  158m  27m 9572 S  2.0  0.7   0:09.76 Xorg               
    1 root      20   0 19408 1528 1228 S  0.0  0.0   0:01.51 init               
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd           
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.01 ksoftirqd/0        
    5 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/0:0H       
    6 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kworker/u:0        
    7 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/u:0H      
(以下略)


こんな感じで出力されるので、ただファイルに蓄積していっても、時間推移を見るのも一苦労。

後で集計しやすいように、監視対象カテゴリに絞って出力させる。

色々加工するにはなんだかんだExcelが便利なんだけど、このtopのフォーマットってそのままではとても扱いにくい。
やっぱりExcelに取り込むなら、CSVとかTSVとか固定長とか、そういったものが相性がいい。


なので、それを目指してゴニョゴニョします。


サマリ部

file=には任意の出力先を、Sleepには任意の更新間隔(秒)を。あとはいじる必要は特に無いです。
ワンライナーにしてますが、読みにくい&スクリプトとして保存する際は、素直に見やすい改行形式でどうぞ。


なお、ここでawkがやっていることは、「各行の1つ目の要素が***のものに絞り込む」ってことだけ。この程度だったらgrepでもよいのかな?今回はあえてawk使いたかったのでawkでやってみました。

# top - ロードアベレージ監視
while true;do  file="/tmp/TOP_top.$(date '+%Y%m%d')";  date=$(date '+%Y%m%d %H:%M:%S');  top=$(echo -n $(top -b -n 1 -c -d 0 | awk '$1 == "top"'));  echo "${date} ${top}" >> $file; sleep 15;done;
# Tasks監視
while true;do  file="/tmp/TOP_tasks.$(date '+%Y%m%d')";  date=$(date '+%Y%m%d %H:%M:%S');  top=$(echo -n $(top -b -n 1 -c -d 0 | awk '$1 == "Tasks"'));  echo "${date} ${top}" >> $file; sleep 15;done;
# CPU監視
while true;do  file="/tmp/TOP_cpus.$(date '+%Y%m%d')";  date=$(date '+%Y%m%d %H:%M:%S');  top=$(echo -n $(top -b -n 1 -c -d 0 | awk '$1 == "Cpu(s):"'));  echo "${date} ${top}" >> $file; sleep 15;done;
# メモリ監視
while true;do  file="/tmp/TOP_mem.$(date '+%Y%m%d')";  date=$(date '+%Y%m%d %H:%M:%S');  top=$(echo -n $(top -b -n 1 -c -d 0 | awk '$1 == "Mem:"'));  echo "${date} ${top}" >> $file; sleep 15;done;
# swap監視
while true;do  file="/tmp/TOP_swap.$(date '+%Y%m%d')";  date=$(date '+%Y%m%d %H:%M:%S');  top=$(echo -n $(top -b -n 1 -c -d 0 | awk '$1 == "Swap:"'));  echo "${date} ${top}" >> $file; sleep 15;done;

なお、topのデフォルト起動時は「1」を押すと複数CPUの場合にそれぞれの情報に分かれて表示されるのですが、topのコマンドライン引数としてはサポートされていません。
代わりに設定ファイルで起動時デフォルトを設定できるので、必要に応じてそれを使うことになります。


今回は、「環境やたらにいじれないところで、突発的に短時間の性能監視してくれと言われた時に、さっと実行できるもの」という想定(ていうか現実)の元で使えるものが欲しかったため、あえてその辺りはいじりません。
カスタムする場合は、ここにもmanの日本語訳がおいてあるので、「5. ファイル」の章をしっかり読んで下さい。
Man page of TOP

プロセス部

サンプルは以下となります。
プロセスを特定するもので絞り込みが必要ですので、そのための情報を事前に確認しておく必要があります。
プロセスIDで絞り込む場合、先にtopかpsで監視対象のプロセスIDを確認した後に実行することになります。


# プロセスID - PID=2965の場合
while true;do  file="/tmp/TOP_pid.$(date '+%Y%m%d')";  date=$(date '+%Y%m%d %H:%M:%S');  top=$(echo -n $(top -b -n 1 -c -d 0 -p 2965 | awk '$1 == 2965'));  echo "${date} ${top}" >> $file; sleep 15;done;
# ユーザーID - USER=rootの場合。複数行抽出される可能性が高いので、sedを使っています。
while true;do  file="/tmp/TOP_uid.$(date '+%Y%m%d')";  date=$(date '+%Y%m%d %H:%M:%S');  top -b -n 1 -c -d 0 -u root | sed -n -e /root/p | sed -e "s/^/$date/"  >> $file; sleep 15;done;


絞込の結果が複数になってしまう場合、1行で出力されると非常に扱いにくいので、
1:冒頭の日付を各行に追加
2:改行含めて出力
という要件を加えた結果、こうなりました。


sedの1つ目は、「root」が含まれる行だけを抽出。これもawkgrepと大差ないか。
sedn2つ目は、各行の先頭に日付を追加。先にdateで日付を変数$dateに詰めておき、「^=行頭」に置換させる命令になってます。
echoをかませると、複数行が条件に引っかかった時に1行出力になってしまうようなので、echoはやめてsedの結果をファイルに直接リダイレクトしています。


これで取得したファイルをexcelにでも取り込んであげれば、フィルタもソートもグラフ化もラク。


パワフルなツールsedawk

今までなぜか触れる機会がまったくなかったsedawkですが、ネット検索しながらここまで作れました。


どこでもたいてい使えて非常に強力なツールなので、もっと使い込みたいです。



sed & awkプログラミング 改訂版 (A nutshell handbook)

sed & awkプログラミング 改訂版 (A nutshell handbook)



・・・ウチのカミさん*1が昔sedawkをバリバリ使っていたことを昨晩初めて知った!もう忘れたって。

*1:元DB屋。もう業界離れて10年超

innodb_log_file_sizeの適正値の目安

MySQL

1時間に1回チェックポイントが発生する程度。

それってoraどこかで聞いたような。


こうやって算出する

mysqlのコマンド「SHOW ENGINE INNODB STATUS」の「Log sequence number」か、「SHOW GLOBAL STATUS」の「Innodb_os_log_written」を1分間隔で取得し、その差分を求め、60倍して1時間あたりの更新量を求め、システム的にキリのいい数字にして上げればOK。


でも、たいていこんなに使わないってさ。

スタート地点としては悪くはない、ってところ。
でも、上振れ下振れともに例外もあるから、うまいことやってや。そこが腕の見せ所って感じか。

なお、ここの英語ページの超訳です。

perconaさん。MySQLの深い話になると、結局ここにはあたることになる。
www.percona.com



蛇足

みんなだいすき「市況かぶ全力2階建」における人気企画「マーク・カーニーを関西弁で調理する専門家」シリーズを思い出したが、残念ながら自分は根っからの関東人のため、真似できなかった。残念。
マーク・カーニーを関西弁で調理する専門家 : 市況かぶ全力2階建


実践ハイパフォーマンスMySQL 第3版

実践ハイパフォーマンスMySQL 第3版

RDS-MySQLでデフォルト作成される「innodb」スキーマって何よ?

MySQL

RDS-MySQL5.6.23のお話です。他のバージョンは見てません。

インストール直後のデータベース一覧

ローカルに作った場合

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+


RDSに作った場合

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| innodb             |
| mysql              |
| performance_schema |
+--------------------+

上から2番目、「innodb」っていうデータベースができてる。誰だよ?
中身を見ると、見事に何もない。



カギは、MySQLのディレクトリ構成にあった。

MySQLでは、データベース名とディレクトリ名が紐付いています。


yumでインストールした場合、

/var/lib/mysql/<データベース名>/

の下に、実体となるファイルが配置されます。

/var/lib/mysql/mysql
/var/lib/mysql/performance_schema

と言った感じでディレクトリがあり、その下にファイルが配置されています。*1


RDSはSSHログインしてlsコマンドを叩く、といったことはできませんが、この原則に基づくと、「innodbスキーマがある、ということは、

/var/lib/mysql/innodb

があるだろう、という推測ができます。(例外もあります)


何のために?何かのファイルがあるのでしょう。


テーブルが無いので、InnoDB系のファイル.frm、.ibdや、名前に反してMyISAM系のMYD、MYIがいるってこともなさそう。


なお、DROP DATABASE INNODBすると、エラーで怒られるらしいです。

Hmm, regardless of whether it’s safe to delete the innodb schema or not, RDS won’t let you do it anyway (tested on a temporary test instance):

DROP DATABASE `innodb`;
Error dropping database (can't rmdir './innodb/', errno: 17)

http://www.faqssys.info/is-it-safe-to-delete-the-innodb-schema-on-a-new-amazon-rds-instance/

中身はともかく、ディレクトリをどうにかしようとしているようです。


次に探るべきは、他の目的でこのディレクトリを使っていないか、ということ。

サーバーのシステム変数にあたってみる

何か明示的にディレクトリを指定して使用していないか、調べるとしたら、サーバーシステム変数でしょう。


「SHOW GLOBAL VARIABLES」でもいいし、こういう時はMySQL Workbenchの「Status and System Variables」のフィルタ機能も便利。

mysql> SHOW GLOBAL VARIABLES LIKE '%dir%';
+-----------------------------------------+-------------------------------------------+
| Variable_name                           | Value                                     |
+-----------------------------------------+-------------------------------------------+
| basedir                                 | /rdsdbbin/mysql/                          |
| binlog_direct_non_transactional_updates | OFF                                       |
| character_sets_dir                      | /rdsdbbin/mysql-5.6.23.R1/share/charsets/ |
| datadir                                 | /rdsdbdata/db/                            |
| ignore_db_dirs                          |                                           |
| innodb_data_home_dir                    | /rdsdbdata/db/innodb                      |
| innodb_log_group_home_dir               | /rdsdbdata/log/innodb                     |
| innodb_max_dirty_pages_pct              | 75                                        |
| innodb_max_dirty_pages_pct_lwm          | 0                                         |
| innodb_undo_directory                   | .                                         |
| lc_messages_dir                         | /rdsdbbin/mysql-5.6.23.R1/share/          |
| plugin_dir                              | /rdsdbbin/mysql-5.6.23.R1/lib/plugin/     |
| slave_load_tmpdir                       | /rdsdbdata/tmp                            |
| tmpdir                                  | /rdsdbdata/tmp                            |
+-----------------------------------------+-------------------------------------------+


はい。いました。ここ注目。

| datadir                                 | /rdsdbdata/db/                            |
| innodb_data_home_dir                    | /rdsdbdata/db/innodb                      |

ローカルにyumMySQLを入れると

| datadir                                 | /var/lib/mysql/            |
| innodb_data_home_dir                    |                            |

こうなります。


innodb_data_home_dirは、マニュアルによると

システムテーブルスペース内のすべての InnoDB のデータファイルのディレクトリパスに共通する部分です。この設定によって、innodb_file_per_table を有効にしたときの file-per-table テーブルスペースの場所は影響を受けません。デフォルト値は、MySQL の data ディレクトリです。値を空の文字列として指定した場合は、innodb_data_file_path 内で完全なファイルパスを使用できます。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.12 InnoDB の起動オプションおよびシステム変数

という記載があり、さらに「空の場合はinnodb_data_file_pathを見ろ!」ということで、

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_data_file_path';
+-----------------------+------------------------+
| Variable_name         | Value                  |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend |
+-----------------------+------------------------+

と、ファイル名のみ、パス指定なしで記載されているので、innodb_data_home_dirディレクトリのデフォルトはdatadirとなります。


datadir、つまりローカルのyum構築環境で「/var/lib/mysql/」にあるファイル。
そして、拡張子無しで「ibdata1」。
これこそ、「デフォルトの表領域ファイル」にして、innodb_file_per_table=OFFにした時のテーブルデータの格納先です。


RDSでは、この「ibdata1」ファイルの格納先として、「/rdsdbdata/db/innodb」を指定しており、そのディレクトリを「innodbスキーマ」という形で定義し、MySQLとディレクトリとを強制的に関連付けている、ということになります。


なんでこんな構成にしたのか、その意図まではわかりませんが、そうなっています。



なお、ここに絡んできたシステム変数「datadir」「innodb_data_home_dir」「innodb_data_file_path」は、RDSでは変更不可になっています。

まとめ

RDS-MySQL5.6で作成されるデフォルト作成されるinnodbスキーマ
・中身は空っぽ
・削除はできない
・ibdata1ファイルを持つディレクトリと紐付いている


以上です。


実践ハイパフォーマンスMySQL 第3版

実践ハイパフォーマンスMySQL 第3版

*1:information_schema用のディレクトリはありませんでした。

MySQLの「ALL権限」のレベル

MySQL

なにがどう違うの!

GRANT ALL PRIVILEGES ON *.* TO 'ユーザ'@'%';
GRANT ALL PRIVILEGES ON `%`.* TO 'ユーザ'@'%';

前者は「グローバル権限」、後者は「データベース権限、ただし、全データベース」。

権限のスコープレベルをデータベースレベルに落としているのに、「%」つまり全データベースに対して許しているので、データベースレベルで可能な権限はすべて使える。「ほとんど」なんでもできちゃう?

だ・か・ら!何が違うの?

まずは
atsuizo.hatenadiary.jp
のおさらい。


MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.7.1.4 GRANT 構文
に一覧がありますが、権限によってグローバルレベルで付与できるもの、データベースレベルで付与できるが違います。


これをもう少し噛み砕くと、以下のような表になります。

権限 GLOBAL DB
ALL[PRIVILEGES]
ALTER
ALTER ROUTINE
CREATE
CREATE ROUTINE
CREATE TABLESPACE -
CREATE TEMPORARY TABLES
CREATE USER 1
CREATE VIEW
DELETE
DROP
EVENT
EXECUTE
FILE -
INDEX
INSERT
LOCK TABLES
PROCESS 2
PROXY -
REFERENCE
RELOAD -
REPLICATION CLIENT -
REPLICATION SLAVE -
SELECT
SHOW DATABASES 3
SHOW VIEW
SHUTDOWN 4
SUPER -
TRIGGER
UPDATE
USAGE -
GRANT OPTION

公式ドキュメントから読み取るとこうなるのですが、MySQL Workbenchの「Users and Privileges」を見ると、
GRANT ALL PRIVILEGES ON `%`.* TO 'ユーザ'@'%';
で付与したユーザーには、DB列で◯がついていない所にも権限が付与されているように見えます。


ほんとは全部について挙動確認して解説したいんだけど、今回は無理。


上記の表で番号の入っている箇所にフォーカスして違いを説明します。

1.CREATE USER

グローバルのCREATE USERを付与した時と同様、ユーザ作れます。作った直後の権限状態も「USAGE ON *.*」で全く同じ。

2.PROCESS

ここ重要!

SHOW FULL PROCESSLISTコマンドで、接続中のユーザ(ユーザ名、ホスト)、状態、実行中のクエリなどを取得できるわけですが、「グローバルで付与されていないと、他のユーザーの情報が見えない」という仕様になっています。


自分の情報だけ見えても役に立たないです。投げてるコマンドも「SHOW FULL PROCESSLIST」って表示されるだけですし。わかっとるわっ、っていう。


3.SHOW DATABASES

グローバルのSHOW DATABASEを付与した時と同様、SHOW DATABASEコマンドで一覧取得できます。

4.SHUTDOWN

「mysqladmin -u ユーザ -p shutdown」で、シャットダウンすることができるようになる権限ですが、これも、PROCESSと同様に、データベース単位の話ではなく、MySQLサーバー全体の話なので、「グローバル」での付与が必要なものです。
GRANT ALL PRIVILEGES ON `%`.* TO 'ユーザ'@'%';
な権限を付与されたユーザで実行するとPROCESSのように「コマンドは通るけど情報が少ない」ではなく、完全に「実行不可」です。


Linuxであればservice(init.d)で起動・停止することも多いですし、「mysqladmin shutdown」を手打ちで実行することって、あんまり無いですけどね。

まとめ

データベース単位で制御できるものは、データベースレベル「%.*」でも同じ効果が期待できるけど、
データベース単位ではない制御に関係するものは、グローバルレベル「*.*」で付与しないとやりたいことができないこともあるよ!


権限はしっかり確認して設定しよう!


実践ハイパフォーマンスMySQL 第3版

実践ハイパフォーマンスMySQL 第3版

RDS MySQL5.6にSYSスキーマを組み込もうとして失敗する件

MySQL

日本語情報、ぜんぜんないのね。

ていうか、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にする可能性が高いと思います。地雷(初期パスワード有効期限問題)も取り除かれたしねっ。


実践ハイパフォーマンスMySQL 第3版

実践ハイパフォーマンスMySQL 第3版