GA

2019/12/09

MySQL 8.0予約語問題にも使える、performance_schemaからエラーになったクエリーをたたき出す方法

TL;DR

  • events_statements_*テーブルmessage_text カラムにエラーメッセージが入っている
  • MySQL 5.6とそれ以降で使える
    • こんな便利なものに気が付いていなかった…

注意

  • MySQL 5.6では events_statements_history は enabled = ‘NO’ になっているので自分で UPDATE する必要がある
  • 動作自体は説明するより↓を見てもらった方が速いと思う。
    • errors > 0 にしてエラーを返さなかったクエリーは無視
    • warnings > 0 にはしたけど、ワーニングメッセージは mysql_errno にも message_text にも入ってこないのでダメだった。。
予約語を踏み抜いたり、 GROUP BY .. ASC みたいなのはパースエラー( mysql_errno = 1064) で出てくるので、それを知ってるとユニットテストとかと組み合わせて予約語対応も捗るかも知れない。
mysql80 48> SELECT * FROM d1.t1 GROUP BY num ASC;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ASC' at line 1

mysql80 48> SELECT num AS rank FROM d1.t1 GROUP BY num ASC;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'rank FROM d1.t1 GROUP BY num ASC' at line 1

mysql80 48> SELECT thread_id, event_name, sql_text, current_schema, mysql_errno, message_text, errors, warnings FROM performance_schema.events_statements_history WHERE errors > 0 OR warnings > 0;
+-----------+---------------------+------------------------------------------------+----------------+-------------+----------------------------------------------------------------------------------------------------------------------------------+--------+----------+
| thread_id | event_name          | sql_text                                       | current_schema | mysql_errno | message_text                                                                                                                     | errors | warnings |
+-----------+---------------------+------------------------------------------------+----------------+-------------+----------------------------------------------------------------------------------------------------------------------------------+--------+----------+
|       111 | statement/sql/error | SELECT * FROM d1.t1 GROUP BY num ASC           | NULL           |        1064 | You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use |      1 |        0 |
|       111 | statement/sql/error | SELECT num AS rank FROM d1.t1 GROUP BY num ASC | NULL           |        1064 | You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use |      1 |        0 |
+-----------+---------------------+------------------------------------------------+----------------+-------------+----------------------------------------------------------------------------------------------------------------------------------+--------+----------+
2 rows in set (0.00 sec)

0 件のコメント :

コメントを投稿