昨日の 日本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事案? もう誰かレポート済みかな。