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