2015年7月15日水曜日

MySQL 5.7では迂闊にperformance_schemaをOFFするとSHOW STATUSが使えない(修正されました)

【2015/12/16 22:19】



動作は5.7.7で確認していて、 5.7.8で暗黙のデフォルトがOFFになるって書いてある のでやってみた。

MySQL 5.7.6から show_compatibility_56 というサーバー変数が追加されている。

SHOW {GLOBAL|SESSION} STATUS, SHOW {GLOBAL|SESSION} VARIABLES は今まで内部的にinformation_schemaのテーブルを叩いていた。これをperformance_schemaのテーブルを叩くように変えるのがこのパラメーター。

ONだとinformation_schemaから、OFFだとperformance_schemaから情報を取ってくる。


mysql57> SELECT @@version;
+--------------+
| @@version    |
+--------------+
| 5.7.7-rc-log |
+--------------+
1 row in set (0.00 sec)

mysql57> SELECT @@show_compatibility_56;
+-------------------------+
| @@show_compatibility_56 |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

mysql57> SELECT COUNT(*) FROM information_schema.GLOBAL_VARIABLES;
+----------+
| COUNT(*) |
+----------+
|      476 |
+----------+
1 row in set, 2 warnings (0.01 sec)

mysql57> SELECT COUNT(*) FROM performance_schema.global_variables;
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

mysql57> SHOW GLOBAL VARIABLES;
..
476 rows in set, 1 warning (0.01 sec)

これが5.7.7までのデフォルトのままの動作。


mysql57> SELECT @@show_compatibility_56;
+-------------------------+
| @@show_compatibility_56 |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set (0.00 sec)

mysql57> SELECT COUNT(*) FROM information_schema.GLOBAL_VARIABLES;
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+
1 row in set, 1 warning (0.00 sec)

mysql57> SELECT COUNT(*) FROM performance_schema.global_variables;
+----------+
| COUNT(*) |
+----------+
|      475 |
+----------+
1 row in set (0.00 sec)

mysql57> SHOW GLOBAL VARIABLES;
..
475 rows in set (0.00 sec)

これが、5.7.8からの暗黙のデフォルトでの動作。


件数が微妙に違うのはいいとして(?)、その他ちょこちょこと。


* performance_schemaをOFFにしてると怒られる。

mysql57> SELECT @@performance_schema;
+----------------------+
| @@performance_schema |
+----------------------+
|                    0 |
+----------------------+
1 row in set (0.00 sec)

mysql57> SELECT @@show_compatibility_56;
+-------------------------+
| @@show_compatibility_56 |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set (0.00 sec)

mysql57> SHOW STATUS;
ERROR 1286 (42000): Unknown storage engine 'PERFORMANCE_SCHEMA'

performance_schema= 0だったらshow_compatibility_56= 0できないようにしてほしい(´・ω・`)


* performance_schemaのテーブルに対するSELECT権限が必要。

mysql57> SHOW GRANTS;
+--------------------------------------+
| Grants for yoku0825@%                |
+--------------------------------------+
| GRANT USAGE ON *.* TO 'yoku0825'@'%' |
+--------------------------------------+
1 row in set (0.00 sec)

mysql57> SHOW STATUS;
ERROR 1142 (42000): SELECT command denied to user 'yoku0825'@'localhost' for table 'session_status'

information_schemaへのアクセスを制限するものはなかったけれど、performance_schemaはフツーのdbと同じくGRANTの制限を受けるのでこうなる。

さてさて…自作スクリプトでinformation_schema.GLOBAL_STATUSとか当たってるんだけどどうしようかな。。あと、GRANTの方はどこかで引っかかりそうな気がする。監視用ユーザーとか。

忘れないようにしておかないと(´・ω・`)

0 件のコメント :

コメントを投稿