プロシージャの中身のクエリはスロークエリログに落ちない の続き。
Vanilla MySQLだとプロシージャの中身がログに落ちませんが、Percona Server ではスロークエリログが拡張されていて、ログに落ちます。
log_slow_sp_statements で出力の有無を設定します。デフォルトではプロシージャの中身をスロークエリログに出力する設定になってます。
mysql> SHOW GLOBAL VARIABLES LIKE 'log_slow_sp_statements';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| log_slow_sp_statements | ON |
+------------------------+-------+
1 row in set (0.00 sec)
試してみます。
mysql> DELIMITER //
mysql> CREATE PROCEDURE sample()
-> BEGIN
-> SELECT SLEEP(10);
-> END
-> //
Query OK, 0 rows affected (0.02 sec)
mysql> DELIMITER ;
mysql>
mysql> SET GLOBAL slow_query_log =on;
Query OK, 0 rows affected (0.01 sec)
mysql> SET GLOBAL long_query_time = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> CALL sample;
+-----------+
| SLEEP(10) |
+-----------+
Vanilla MySQL だとこうだったのが
/usr/sbin/mysqld, Version: 8.0.15 (MySQL Community Server - GPL). started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
# Time: 2019-04-03T06:54:09.547179Z
# User@Host: root[root] @ localhost Id: 30
# Query_time: 10.001274 Lock_time: 0.000376 Rows_sent: 1 Rows_examined: 0
SET timestamp=1554274439;
call test.sample();
Percona Server ではこう。
Stored_routine の項目にプロシージャの名前が記載され、プロシージャの中のSQLがログに記載されてます。
/usr/sbin/mysqld, Version: 8.0.15-6 (Percona Server (GPL), Release 6, Revision 63abd08). started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
# Time: 2019-08-03T12:54:22.490311Z
# User@Host: root[root] @ localhost Id: 9
# Schema: t Last_errno: 0 Killed: 0
# Query_time: 10.000860 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0 Rows_affected: 0
# Bytes_sent: 57
# Stored_routine: t.sample
use t;
SET timestamp=1564836852;
SELECT SLEEP(10);