お題
- エラーになったクエリはスロークエリログに記録されるのか?
- されるとしたら、エラーになったクエリであることは判別可能なのか?
試してみます
1. 文法エラー
まずは、文法エラー。
mysql> UPDATE t.tx1 SET c1 100; 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 '100' at line 1
文法エラーでも、ログに落ちました。文法エラーでログが落ちるということは、どんなエラーでも、スロークエリログにクエリが書かれる予感がします(早速、答えが出てしまった)。
# Time: 2020-02-25T21:13:22.700729+09:00 # User@Host: root[root] @ localhost [] Id: 15 # Query_time: 0.000100 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0 Thread_id: 15 Errno: 0 Killed: 0 Bytes_received: 0 Bytes_sent: 162 Read_first: 0 Read_last: 0 Read_key: 0 Read_next: 0 Read_prev: 0 Read_rnd: 0 Read_rnd_next: 0 Sort_merge_passes: 0 Sort_range_count: 0 Sort_rows: 0 Sort_scan_count: 0 Created_tmp_disk_tables: 0 Created_tmp_tables: 0 Start: 2020-02-25T21:13:22.700629+09:00 End: 2020-02-25T21:13:22.700729+09:00 SET timestamp=1582632802; UPDATE t.tx1 SET c1 100;
2. 制約違反
Duplicate Entry の場合。
mysql> INSERT INTO t.tx1 VALUES(1, 100); ERROR 1062 (23000): Duplicate entry '1' for key 'tx1.PRIMARY'
制約違反でもログに落ちました。MySQL 8.0 で登場した log_slow_extra
を 有効にして、スロークエリログに記録される項目を増やしています。
Errno
は 0
(エラーなし扱い) のままみたいです。
# Time: 2020-02-25T22:05:24.647928+09:00 # User@Host: root[root] @ localhost [] Id: 84 # Query_time: 0.000537 Lock_time: 0.000235 Rows_sent: 0 Rows_examined: 0 Thread_id: 84 Errno: 0 Killed: 0 Bytes_received: 0 Bytes_sent: 54 Read_first: 0 Read_last: 0 Read_key: 0 Read_next: 0 Read_prev: 0 Read_rnd: 0 Read_rnd_next: 0 Sort_merge_passes: 0 Sort_range_count: 0 Sort_rows: 0 Sort_scan_count: 0 Created_tmp_disk_tables: 0 Created_tmp_tables: 0 Start: 2020-02-25T22:05:24.647391+09:00 End: 2020-02-25T22:05:24.647928+09:00 SET timestamp=1582635924; INSERT INTO t.tx1 VALUES(1, 100);
3. ロックタイムアウト
mysql> UPDATE t.tx1 SET c1 = 100; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
ハイ、こちらもログに落ちます。しかし、相変わらず、Errno
は 0
です。
# Time: 2020-02-25T21:11:55.309032+09:00 # User@Host: root[root] @ localhost [] Id: 14 # Query_time: 4.001521 Lock_time: 4.001169 Rows_sent: 0 Rows_examined: 1 Thread_id: 14 Errno: 0 Killed: 0 Bytes_received: 0 Bytes_sent: 67 Read_first: 1 Read_last: 0 Read_key: 1 Read_next: 0 Read_prev: 0 Read_rnd: 0 Read_rnd_next: 2 Sort_merge_passes: 0 Sort_range_count: 0 Sort_rows: 0 Sort_scan_count: 0 Created_tmp_disk_tables: 0 Created_tmp_tables: 0 Start: 2020-02-25T21:11:51.307511+09:00 End: 2020-02-25T21:11:55.309032+09:00 SET timestamp=1582632711; UPDATE t.tx1 SET c1 = 100;
4. 中断
エラーではありませんが、Ctrl-C
で中断したパターンも試してみます。
mysql> SELECT SLEEP(10); ^C^C -- query aborted +-----------+ | SLEEP(10) | +-----------+ +-----------+ 1 row in set (2.61 sec)
相変わらず、Errno
は 0
です。
Errno
はいつ 0
以外の値になるんですかねぇ・・・
# Time: 2020-02-25T21:02:38.084781+09:00 # User@Host: root[root] @ localhost [] Id: 9 # Query_time: 2.612076 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1 Thread_id: 9 Errno: 0 Killed: 0 Bytes_received: 0 Bytes_sent: 57 Read_first: 0 Read_last: 0 Read_key: 0 Read_next: 0 Read_prev: 0 Read_rnd: 0 Read_rnd_next: 0 Sort_merge_passes: 0 Sort_range_count: 0 Sort_rows: 0 Sort_scan_count: 0 Created_tmp_disk_tables: 0 Created_tmp_tables: 0 Start: 2020-02-25T21:02:35.472705+09:00 End: 2020-02-25T21:02:38.084781+09:00 SET timestamp=1582632155; SELECT SLEEP(10);
まとめ
- エラーになったクエリはスロークエリログに記録されるのか?→YES
- されるとしたら、エラーになったクエリであることは判別可能なのか?→NO
Errno
にエラー番号が書かれないケースがありそう(というか、Errno書かれるケースが不明)
参考
tom__bo さんが、先日、スロークエリログに関するエントリーを書いてました。 こちらもあわせてどうぞ。