MySQLのデータベース(スキーマ)に別名を付けるcreate_synonym_db

 昨日の 日本MySQLユーザ会会(MyNA会)で、yoku0825さんがお話の中で紹介してくれていた、create_synonym_db が面白かったので、記録しておく。曰く:


 sysスキーマの中にある create_synonym_db を使うと、データベースに別名を付けることができます。
この「データベース」というのは、CREATE DATABASE したりする、あの「データベース」ね。useしたりする、あれね。


例として紹介されていたのは、performance_schema という長ったらしい名前に p_s という別名を付けるというもの。

mysql> call sys.create_synonym_db('performance_schema', 'p_s');                                                 
+----------------------------------------+
| summary                                |
+----------------------------------------+
| Created 87 views in the `p_s` database |
+----------------------------------------+
1 row in set (0.21 sec)

 と実行すると、performance_schema の中にある87個のテーブルまたはビューに対して、p_s データベースの中にビューを作ってくれます。データベースリストを見ると p_s ができていることがわかります。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mytest             |
| p_s                |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)


 もちろん、自分で作ったテーブルに対しても、別名を付けることができます。以下は、test データベースに対して t という名前でも利用できるようにしたもの。

mysql> call sys.create_synonym_db('test','t');
+------------------------------------+
| summary                            |
+------------------------------------+
| Created 1 view in the `t` database |
+------------------------------------+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

mysql> show databases;                                                                                                                       
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| t                  |
| test               |
+--------------------+
6 rows in set (0.00 sec)


 この日記では「別名」と書きましたが、特別なエイリアス用の仕組みがあるわけではなく、ビューを作ってくれるもののようです。 テーブル/ビューの一覧を information_schema から見てみると判ります。

mysql> select table_schema, table_name, table_type FROM information_schema.tables;
+--------------------+------------------------------------------------------+-------------+
| table_schema       | table_name                                           | table_type  |
+--------------------+------------------------------------------------------+-------------+
| information_schema | CHARACTER_SETS                                       | SYSTEM VIEW |
| information_schema | COLLATIONS                                           | SYSTEM VIEW |
:
| p_s                | accounts                                             | VIEW        |
| p_s                | cond_instances                                       | VIEW        |
| p_s                | events_stages_current                                | VIEW        |
| p_s                | events_stages_history                                | VIEW        |
| p_s                | events_stages_history_long                           | VIEW        |
:
| performance_schema | accounts                                             | BASE TABLE  |
| performance_schema | cond_instances                                       | BASE TABLE  |
| performance_schema | events_stages_current                                | BASE TABLE  |
| performance_schema | events_stages_history                                | BASE TABLE  |
| performance_schema | events_stages_history_long                           | BASE TABLE  |
:
+--------------------+------------------------------------------------------+-------------+
369 rows in set (0.01 sec)

 また、そういう仕組みなので、synonym を作ったあとで CREATE TABLE したものは両方から見えるわけではないので、ちゅうい。



 ただ、character_set 等を保持してくれないみたいなのは、気になるところ。このサーバは character_set_server=utf8mb4 で動作させているので、 performance_schema が utf8 なのに、p_s が utf8_mb4 で作成されてしまっています。変換がかかるから問題ないような気もするけど、本来不要な変換が挟まることによるリスクが気になるのは、古き時代の単なるトラウマか。

mysql> select * FROM schemata;                                                                                                               
+--------------+--------------------+----------------------------+------------------------+----------+
| CATALOG_NAME | SCHEMA_NAME        | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH |
+--------------+--------------------+----------------------------+------------------------+----------+
| def          | information_schema | utf8                       | utf8_general_ci        | NULL     |
| def          | mysql              | utf8mb4                    | utf8mb4_general_ci     | NULL     |
| def          | p_s                | utf8mb4                    | utf8mb4_general_ci     | NULL     |
| def          | performance_schema | utf8                       | utf8_general_ci        | NULL     |
| def          | sys                | utf8                       | utf8_general_ci        | NULL     |
| def          | t                  | utf8mb4                    | utf8mb4_general_ci     | NULL     |
| def          | test               | utf8mb4                    | utf8mb4_general_ci     | NULL     |
+--------------+--------------------+----------------------------+------------------------+----------+
7 rows in set (0.00 sec)

#もしかして、bugs事案? もう誰かレポート済みかな。