mita2 database life

主にMySQLに関するメモです

プロシージャの中身はPerconaだとスロークエリログに落ちる

プロシージャの中身のクエリはスロークエリログに落ちない の続き。

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);