サーバサイドプリペアドステートメントはperformance_schemaに記録されない
あるクエリがperformance_schemaに記録されなかった。
原因を調べていて1つ記録されない条件を見つけたのでメモ。
まず、問題ないパターン。
mysql> SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2019-07-30 10:40:47 |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT SQL_TEXT FROM events_statements_history;
+-------------------------------------------------------------------+
| SQL_TEXT |
+-------------------------------------------------------------------+
| NULL |
|
| NULL |
| CALL sys.ps_truncate_all_tables(FALSE) |
| SELECT NOW() |
| NULL |
+-------------------------------------------------------------------+
10 rows in set (0.00 sec)
「SELECT NOW()」がしっかり、performance_schemaに記録されてますね。
しかし、サーバサイド プリペアドステートメントを使うと・・・
mysql> PREPARE stmt FROM 'SELECT "PREPARE"';
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE stmt;
+---------+
| PREPARE |
+---------+
| PREPARE |
+---------+
1 row in set (0.00 sec)
mysql> SELECT SQL_TEXT FROM events_statements_history;
+-------------------------------------------------------------------+
| SQL_TEXT |
+-------------------------------------------------------------------+
| NULL
| NULL |
| CALL sys.ps_truncate_all_tables(FALSE) |
| PREPARE stmt FROM ... |
| EXECUTE stmt |
+-------------------------------------------------------------------+
10 rows in set (0.00 sec)
(゚д゚)あらやだ! クエリの部分が「...」になってしまったワ。
ファンクションやプロシージャの中のSQLも記録されませんから、それと同じと思えば、違和感ないか?
子ネタでした(つづく?)
原因を調べていて1つ記録されない条件を見つけたのでメモ。
まず、問題ないパターン。
mysql> SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2019-07-30 10:40:47 |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT SQL_TEXT FROM events_statements_history;
+-------------------------------------------------------------------+
| SQL_TEXT |
+-------------------------------------------------------------------+
| NULL |
|
| NULL |
| CALL sys.ps_truncate_all_tables(FALSE) |
| SELECT NOW() |
| NULL |
+-------------------------------------------------------------------+
10 rows in set (0.00 sec)
「SELECT NOW()」がしっかり、performance_schemaに記録されてますね。
しかし、サーバサイド プリペアドステートメントを使うと・・・
mysql> PREPARE stmt FROM 'SELECT "PREPARE"';
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE stmt;
+---------+
| PREPARE |
+---------+
| PREPARE |
+---------+
1 row in set (0.00 sec)
mysql> SELECT SQL_TEXT FROM events_statements_history;
+-------------------------------------------------------------------+
| SQL_TEXT |
+-------------------------------------------------------------------+
| NULL
| NULL |
| CALL sys.ps_truncate_all_tables(FALSE) |
| PREPARE stmt FROM ... |
| EXECUTE stmt |
+-------------------------------------------------------------------+
10 rows in set (0.00 sec)
(゚д゚)あらやだ! クエリの部分が「...」になってしまったワ。
ファンクションやプロシージャの中のSQLも記録されませんから、それと同じと思えば、違和感ないか?
子ネタでした(つづく?)