Working as a Percona Support Engineer, every day we are seeing lots of issues related to MySQL replication. One very common issue is slave lagging. There are many reasons for slave lag but one common reason is that queries are taking more time on slave then master. How to check and log those long-running queries? From MySQL 5.1, log-slow-slave-statements variable was introduced, which you can enable on slave and log slow queries. But what if you want to log slow queries on slave in earlier versions like MySQL 5.0? There is a good solution/workaround: pt-query-digest. How? let’s take a look….

If you want to log all queries that are running on slave (including those, running by sql thread), you can use pt-query-digest with —processlist and –print (In pt-query-digest 2.1.9) OR –output (In pt-query-digest 2.2.7) options and log all queries in specific file. I have tested it in my local environment and it works.

You can start pt-query-digest like below on Slave,

nil@Dell:~$ /percona-toolkit-2.1.9/bin/pt-query-digest --processlist u=msandbox,p=msandbox,S=/tmp/mysql_sandbox34498.sock --print --no-report OR nil@Dell:-$ /percona-toolkit-2.2.7/bin/pt-query-digest --processlist u=msandbox,p=msandbox,S=/tmp/mysql_sandbox34498.sock --no-report --output=slowlog 1 2 3 4 5 nil @ Dell : ~ $ / percona - toolkit - 2.1.9 / bin / pt - query - digest -- processlist u = msandbox , p = msandbox , S = / tmp / mysql_sandbox34498 .sock -- print -- no - report OR nil @ Dell : - $ / percona - toolkit - 2.2.7 / bin / pt - query - digest -- processlist u = msandbox , p = msandbox , S = / tmp / mysql_sandbox34498 .sock -- no - report -- output = slowlog

Run some long running queries on Master,

nil@Dell:~$ mysql -umsandbox -p --socket=/tmp/mysql_sandbox34497.sock Enter password: mysql> use percona Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> delete from test limit 5000000; Query OK, 5000000 rows affected (1 min 54.33 sec) mysql> delete from test limit 5000000; Query OK, 5000000 rows affected (1 min 56.42 sec) 1 2 3 4 5 6 7 8 9 10 11 nil @ Dell : ~ $ mysql - umsandbox - p -- socket = / tmp / mysql_sandbox34497 .sock Enter password : mysql > use percona Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with - A Database changed mysql > delete from test limit 5000000 ; Query OK , 5000000 rows affected ( 1 min 54.33 sec ) mysql > delete from test limit 5000000 ; Query OK , 5000000 rows affected ( 1 min 56.42 sec )

mysql>

and you’ll see the output on Slave like this,

nil@Dell:~/Downloads/percona-toolkit-2.1.9/bin$ ./pt-query-digest --processlist u=msandbox,p=msandbox,S=/tmp/mysql_sandbox34498.sock --print --no-report # Time: 2014-03-18T12:10:57 # User@Host: system user[system user] @ [] # Query_time: 114.000000 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0 use percona; delete from test limit 5000000; nil@Dell:~/Downloads/percona-toolkit-2.2.7/bin$ pt-query-digest --processlist u=msandbox,p=msandbox,S=/tmp/mysql_sandbox34498.sock --no-report --output=slowlog # Time: 2014-03-18T12:21:05 # User@Host: system user[system user] @ [] # Query_time: 117.000000 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0 use percona; delete from test limit 5000000; 1 2 3 4 5 6 7 8 9 10 11 12 13 nil @ Dell : ~ / Downloads / percona - toolkit - 2.1.9 / bin $ . / pt - query - digest -- processlist u = msandbox , p = msandbox , S = / tmp / mysql_sandbox34498 .sock -- print -- no - report # Time: 2014-03-18T12:10:57 # User@Host: system user[system user] @ [] # Query_time: 114.000000 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0 use percona ; delete from test limit 5000000 ; nil @ Dell : ~ / Downloads / percona - toolkit - 2.2.7 / bin $ pt - query - digest -- processlist u = msandbox , p = msandbox , S = / tmp / mysql_sandbox34498 .sock -- no - report -- output = slowlog # Time: 2014-03-18T12:21:05 # User@Host: system user[system user] @ [] # Query_time: 117.000000 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0 use percona ; delete from test limit 5000000 ;

You can also run pt-query-digest in background like a daemon and send output to the specific file like slow.log and review it.

i.e /percona-toolkit-2.1.9/bin/pt-query-digest –processlist u=msandbox,p=msandbox,S=/tmp/mysql_sandbox34498.sock –print –no-report > slow.log 2>&1

OR

i.e /percona-toolkit-2.2.7/bin/pt-query-digest –processlist u=msandbox,p=msandbox,S=/tmp/mysql_sandbox34498.sock –no-report –output=slowlog > slow.log 2>&1

Here, the default output will be just like slow query log. If we have master-master replication where every master is slave too and we want to log only those statements that are executing by sql_thread then –filter option can be used like this:



pt-query-digest –filter ‘$event->user eq “system user”‘ –no-report –output=slowlog

Since pt-query-digest–processlist polls 10 times/second ( –interval option), it’s not reliable to use for collecting complete query logs, because quick queries could fall in between the polling intervals. And in any case, it won’t measure query time with precision any better than 1/10th of a second. But if the goal is to identify queries that are very long-running, it should be adequate.