2018年1月10日水曜日

pfs_example_plugin_employee.so is 何

プラグインディレクトリーを覗いてたら pfs_example_plugin_employee.so なるファイルがあって知らないものなので調べてみた。
知らないプラグインを見つけた時の身元調査用に使えるかも知れないのでメモ。

まずはビルドしたディレクトリーの中で find 、MySQL(に限らないのかもだけど)ではコンパイルした時にソースコードのすぐとなりにバイナリーが出来上がるので、変に名前の一部からディレクトリーの名前を類推するよりもこっちの方が楽だったりする。
$ find -name "pfs_example_plugin_employee.so"
./plugin/pfs_table_plugin/CMakeFiles/CMakeRelink.dir/pfs_example_plugin_employee.so
./plugin_output_directory/pfs_example_plugin_employee.so
という訳でソースは plugin/pfs_table_plugin の近くにありそう。
$ ll plugin/pfs_table_plugin/
total 124
drwxrwxr-x 4 yoku0825 yoku0825   125 Jan  9 13:47 CMakeFiles
-rw-rw-r-- 1 yoku0825 yoku0825  2274 Jan  9 13:47 cmake_install.cmake
-rw-r--r-- 1 yoku0825 yoku0825  1175 Sep 19 20:33 CMakeLists.txt
-rw-rw-r-- 1 yoku0825 yoku0825   319 Sep 21 22:29 CTestTestfile.cmake
-rw-rw-r-- 1 yoku0825 yoku0825 15021 Sep 21 22:29 Makefile
-rw-r--r-- 1 yoku0825 yoku0825 13276 Sep 19 20:33 pfs_example_employee_name.cc
-rw-r--r-- 1 yoku0825 yoku0825  5220 Sep 19 20:33 pfs_example_employee_name.h
-rw-r--r-- 1 yoku0825 yoku0825 10242 Sep 19 20:33 pfs_example_employee_salary.cc
-rw-r--r-- 1 yoku0825 yoku0825  4404 Sep 19 20:33 pfs_example_employee_salary.h
-rw-r--r-- 1 yoku0825 yoku0825 10271 Sep 19 20:33 pfs_example_machine.cc
-rw-r--r-- 1 yoku0825 yoku0825  4482 Sep 19 20:33 pfs_example_machine.h
-rw-r--r-- 1 yoku0825 yoku0825  8236 Sep 19 20:33 pfs_example_machines_by_emp_by_mtype.cc
-rw-r--r-- 1 yoku0825 yoku0825  5235 Sep 19 20:33 pfs_example_machines_by_emp_by_mtype.h
-rw-r--r-- 1 yoku0825 yoku0825 11821 Sep 19 20:33 pfs_example_plugin_employee.cc
本体はきっと pfs_example_plugin_employee.cc だなあと思いつつ中身を覗く。
MySQLのプラグインのソースを読むときは mysql_declare_plugin を探すと良い気がしていて、そこに SHOW PLUGINS で表示される情報や INSTALL PLUGIN, UNINSTALL PLUGIN の時に走る関数が指定されている。ちなみに INSTALL PLUGIN で指定するプラグインの名前は mysql_declare_plugin の引数になっている。これ豆。
…限りなく情報はゼロに近かった。 そんなに長くもないコードなのでゆっくり読むけれど、何をどう考えてもPerformance Schemaプラグインのサンプルコード。そもそも名前からそう。しかし MYSQL_DAEMON_PLUGIN なのか。RCだから取り敢えずなのかどうかわからないけれど。
取り敢えず有効化してみようか。
mysql80 7> INSTALL PLUGIN pfs_example_plugin_employee SONAME 'pfs_example_plugin_employee.so';
Query OK, 0 rows affected (0.01 sec)

mysql80 7> SHOW PLUGINS\G
..
*************************** 42. row ***************************
   Name: pfs_example_plugin_employee
 Status: ACTIVE
   Type: DAEMON
Library: pfs_example_plugin_employee.so
License: GPL
できた。 これできっとp_sのテーブルができているはず。
mysql80 7> use performance_schema
Database changed

mysql80 7> SHOW TABLES LIKE '%example%';
+------------------------------------------+
| Tables_in_performance_schema (%example%) |
+------------------------------------------+
| pfs_example_employee_name                |
| pfs_example_employee_salary              |
| pfs_example_machine                      |
| pfs_example_machine_by_employee_by_type  |
+------------------------------------------+
4 rows in set (0.00 sec)

mysql80 7> SHOW CREATE TABLE pfs_example_employee_name\G
*************************** 1. row ***************************
       Table: pfs_example_employee_name
Create Table: CREATE TABLE `pfs_example_employee_name` (
  `EMPLOYEE_NUMBER` int(11) NOT NULL,
  `FIRST_NAME` char(20) DEFAULT NULL,
  `LAST_NAME` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`EMPLOYEE_NUMBER`),
  KEY `FIRST_NAME` (`FIRST_NAME`)
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
☆―(ノ゚Д゚)八(゚Д゚ )ノイエ―イ
しかしこれ
mysql80 7> SELECT * FROM pfs_example_employee_name;
Empty set (0.00 sec)

mysql80 7> SELECT * FROM pfs_example_employee_salary;
Empty set (0.00 sec)

mysql80 7> SELECT * FROM pfs_example_machine;
Empty set (0.00 sec)

mysql80 7> SELECT * FROM pfs_example_machine_by_employee_by_type;
Empty set (0.00 sec)
中身が軒並み空なのは、想定した通りなんだろうか…( INSTALL PLUGIN した時に いかにも固定値で値を詰め込むような処理 を通るんだけれども…)
取り敢えずまあ、information_schemaプラグインのようにPerformance Schemaプラグインを書ける時代が来る鴨ってことですね。
取り敢えずPerformance Schemaプラグインに関する記述は(Daemonプラグインのところにも)まだ記述がない。
リリースノートにはなんか、8.0.2でその辺のインターフェイスが作られたようなことが書いてあった。
To support dynamic Performance Schema table manipulation, a new component service named pfs_table_service is now available.
MySQL :: MySQL 8.0 Release Notes :: Changes in MySQL 8.0.2 (2017-07-17, Development Milestone)

【2018/01/10 18:07】
rpmで mysql-community-test を入れるとこの pfs_example_plugin_employee プラグインが入っているわけですが、こっちで試すとちゃんとレコードが入ってた。


$ yum install --enablerepo="mysql80-community" mysql-community-test
$ mysqld --initialize-insecure --user=mysql
$ /etc/init.d/mysqld start

mysql> INSTALL PLUGIN pfs_example_plugin_employee SONAME 'pfs_example_plugin_employee.so';
Query OK, 0 rows affected (0.09 sec)

mysql> SELECT * FROM pfs_example_employee_name;
+-----------------+------------+-----------+
| EMPLOYEE_NUMBER | FIRST_NAME | LAST_NAME |
+-----------------+------------+-----------+
|               1 | foo1       | bar1      |
|               2 | foo2       | bar2      |
|               3 | foo3       | bar3      |
+-----------------+------------+-----------+
3 rows in set (0.01 sec)

mysql> SELECT * FROM pfs_example_employee_salary;
+-----------------+-----------------+---------------+---------------+
| EMPLOYEE_NUMBER | EMPLOYEE_SALARY | DATE_OF_BIRTH | TIME_OF_BIRTH |
+-----------------+-----------------+---------------+---------------+
|               1 |            1000 | 2013-11-12    | 12:02:34      |
|               2 |            2000 | 2016-02-29    | 12:12:30      |
|               3 |            3000 | 2017-03-24    | 11:12:50      |
+-----------------+-----------------+---------------+---------------+
3 rows in set (0.07 sec)

mysql> SELECT * FROM pfs_example_machine;
+-------------------+--------------+--------------+-----------------+
| MACHINE_SL_NUMBER | MACHINE_TYPE | MACHINE_MADE | EMPLOYEE_NUMBER |
+-------------------+--------------+--------------+-----------------+
|                 1 | DESKTOP      | Lenovo       |               1 |
|                 2 | LAPTOP       | Dell         |               2 |
|                 3 | MOBILE       | Apple        |               1 |
|                 4 | MOBILE       | Samsung      |               1 |
|                 5 | LAPTOP       | Lenovo       |               2 |
|                 6 | MOBILE       | Nokia        |               2 |
|                 7 | LAPTOP       | Apple        |               1 |
|                 8 | LAPTOP       | HP           |               3 |
|                 9 | DESKTOP      | Apple        |               3 |
+-------------------+--------------+--------------+-----------------+
9 rows in set (0.00 sec)

mysql> SELECT * FROM pfs_example_machine_by_employee_by_type;
+------------+-----------+--------------+-------+
| FIRST_NAME | LAST_NAME | MACHINE_TYPE | COUNT |
+------------+-----------+--------------+-------+
| foo1       | bar1      | LAPTOP       |     1 |
| foo1       | bar1      | DESKTOP      |     1 |
| foo1       | bar1      | MOBILE       |     2 |
| foo2       | bar2      | LAPTOP       |     2 |
| foo2       | bar2      | MOBILE       |     1 |
| foo3       | bar3      | LAPTOP       |     1 |
| foo3       | bar3      | DESKTOP      |     1 |
+------------+-----------+--------------+-------+
7 rows in set (0.00 sec)




0 件のコメント :

コメントを投稿