MySQLの新しい「sys」スキーマ

この記事は、2015年「MySQLマニュアルを読む」アドベントカレンダーの19日目です.


 MySQL 5.7.7 からは、新たに「sys」という名前のスキーマが追加されました。

MySQL :: MySQL 5.7 Reference Manual :: 22 MySQL sys Schema

 これは大雑把に言うと、MySQLの開発や管理をする上で便利な機能を集めたものです。
もう少し具体的には、便利なストアドプロシージャ(ストアドファンクション)やVIEWなどを集めたものだと考えて良いかと思います。

22.1 Prerequisites for Using the sys Schema
22.2 Using the sys Schema
22.3 sys Schema Progress Reporting
22.4 sys Schema Object Reference
    22.4.1 sys Schema Object Index
    22.4.2 sys Schema Tables and Triggers
    22.4.3 sys Schema Views
    22.4.4 sys Schema Stored Procedures
    22.4.5 sys Schema Stored Functions

 まず VIEW について。
sysスキーマには、100個を越えるVIEWが用意されています(似た機能の別名的なものもあるので実際は60個くらいと考えてよさそう)。私は最近あまり、MySQLを使った大きな運用に関わっていないのでピンと来ないのですが、様々なサーバの状態を見ることができそうです。プロセス状態、InnoDBのバッファ状態、ホストの状態、セッションやメモリの状態などなど。INFORMATION_SCHAMA や PERFORMANCE_SCHEMA から状態を取得します。
 多くのVIEWがあるので、運用や開発に使ってみようという方は、マニュアルから、それっぽい名前のものに当たりをつけて試してみると良いでしょう。 
MySQL :: MySQL 5.7 Reference Manual :: 22.4.3 sys Schema Views

 なお、マニュアルを眺めた方は気づかれたかと思いますが、同じような名前で、先頭に x$ がつくものとつかないものがあります。
これは、
 先頭に x$ がつかないもの: 人間に見やすいように出力(主に ms(ミリ秒)やbyte単位などで出力)
 先頭に x$ がつくもの: より正確な値を出力
という違いがあります。
いくつかの VIEW を眺めてみたところ、たとえば秒単位で出力するものについて、前者は 0.01s まで、後者は ns(ナノ秒)までをあらわす数字が出力されていました。


 次に、Stored Procedure および Stored Function について。
値を返さないものがプロシジャで、値を返すものがファンクションです。
sysスキーマにおいては、CALLでコールして状態を変化させたり設定変更したりするのがプロシジャ、
なんらかの取得結果や演算結果の値を取得するのがファンクション、となります。

 プロシジャについては何をどう変更するのか、今回は追いませんので、興味あるかたは以下マニュアルにて確認ください。MySQL5.7.10の時点では、26個ほどのプロシジャが用意されているようです。
MySQL :: MySQL 5.7 Reference Manual :: 22.4.4 sys Schema Stored Procedures

 ファンクションについて、21個ほどのファンクションが用意されているようです。まず、コンマ区切りのリストに項目を追加したり、逆にリストから項目を除いたりするファンクションや、x$ビューで得られた細かい数字を見やすい形に変換してくれるファンクションなどが目につきます。


sysスキーマのファンクション一覧:From MySQL :: MySQL 5.7 Reference Manual :: 22.4.5 sys Schema Stored Functions

単位変換:
format_bytes()
format_path()
format_statement()
format_time()

コンマ文字列加工:
list_add()
list_drop()

パス名文字列からの抽出:
extract_schema_from_file_name()
extract_table_from_file_name()

パフォーマンススキーマからの情報取得系:
ps_is_account_enabled()
ps_is_consumer_enabled()
ps_is_instrument_default_enabled()
ps_is_instrument_default_timed()
ps_is_thread_instrumented()
ps_thread_account()
ps_thread_id()
ps_thread_stack()
ps_thread_trx_info()

その他:
sys_get_config(config_name,default_return_value) <-- sys_configの値を取得
version_major()
version_minor()
version_patch()


 さて、ここで驚くべきことに気づきました。現在MySQLの最新バージョンは、バージョン 5.7。古くからのMySQLユーザの方は、MySQL 4.0 から 4.1 への大きな変更での混乱を覚えていることでしょう。
そう、MySQLに於いては「5.7」「4.1」などというのがメジャーバージョンであり、私も各地のセミナーでドヤ顔でそのように説明してきました。
 が、、、この sys スキーマには version_major() など、version_*()な関数が3つ、目につきますね。試してみましょう*1

mysql> SELECT VERSION(), VERSION_MAJOR(), VERSION_MINOR(), VERSION_PATCH();
+-----------+-----------------+-----------------+-----------------+
| VERSION() | VERSION_MAJOR() | VERSION_MINOR() | VERSION_PATCH() |
+-----------+-----------------+-----------------+-----------------+
| 5.7.10    |               5 |               7 |              10 |
+-----------+-----------------+-----------------+-----------------+


 なんということでしょう!!!
sysスキーマによると、いま使っているMySQLのメジャーバージョンは 5 です! もう一度書きます。「MySQLのメジャーバージョンが、5!!!」。
いやぁ、参った。。これはバグ報告すべきでしょうか(笑)。MAJOR_UPPER、MAJOR_LOWER とか、かなぁ、、、適切な名前を考えるとしたら。



 と書いてからふと思い出したけど、MySQLソースコードの中では昔からこのような名付けがされていたかも。(日々、ソースコードリポジトリから変更を取得してきて、ここの設定値が変更されていたら「バージョンがあがるぞ!」と自分に通知するようなスクリプトを書いていた記憶が・・・)

VERSION:

MYSQL_VERSION_MAJOR=5
MYSQL_VERSION_MINOR=7
MYSQL_VERSION_PATCH=10
MYSQL_VERSION_EXTRA=

 いやぁ、、、それでも、、、、「"5.7" というカタマリで "メジャーバージョン" です!」と言い切ってしまってきたからなぁ、、、参った。。これからは「メジャーバージョンは 5 で、マイナーバージョンが 7 です。しかし、MySQLではマイナーバージョンまでがメジャーなバージョンです!」とか説明するか。。意味不明。



追記:
 twitter で yoku0825 さんに教えていただきました。


 「シリーズ」または「リリース系列」と呼べばいいんですね。「メジャーバージョンは 5.7」という言い方は、今後使わないことにします。「5.7シリーズ」「5.7系列」「リリース系列が 5.7」などの言い回し、まだちょっと慣れないけど、慣れていくよう、浸透するよう、努力したいと思います。 *2



追追記:翌日の日記に、(MySQLマニュアル内での)バージョン番号に関する説明について書きました。
sakaik.hateblo.jp

*1:VERSIONというのはsysスキーマのファンクションではなく

*2:もうすでに「マニュアル」の話、どうでもよくなってるw