Bug #90228 sys.innodb_lock_waits showing the wrong blocking query
Submitted: 27 Mar 2018 11:19 Modified: 28 Mar 2018 3:05
Reporter: Shinya Sugiyama Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: SYS Schema Severity:S3 (Non-critical)
Version:5.7.21 OS:Any
Assigned to: CPU Architecture:Any
Tags: Informatiton_Schema, lock, performance_schema, sys

[27 Mar 2018 11:19] Shinya Sugiyama
Description:
sys.innodb_lock_waits showing the wrong blocking query.

/*** @SLAVE ***/  
root@localhost [REPLI]> start transaction;select * from T_Sample01 where ID = 23 for update;

/*** @Master ***/

root@localhost [REPLI]> update T_Sample01 set memo = 'LOCK TEST FOR MEM5' where ID = 23;

/*** @SALVE ***/

root@localhost [REPLI]> show processlist; show engine innodb status\G show slave status\G select * from sys.innodb_lock_waits\G
+----+-----------------+-----------+-------+---------+------+----------------------------------+-----------------------------------------------------------------+
| Id | User            | Host      | db    | Command | Time | State                            | Info                                                            |
+----+-----------------+-----------+-------+---------+------+----------------------------------+-----------------------------------------------------------------+
|  1 | system user     |           | NULL  | Connect | 2030 | Waiting for master to send event | NULL                                                            |
|  2 | system user     |           | NULL  | Connect |   12 | System lock                      | update T_Sample01 set memo = 'LOCK TEST FOR MEM4' where ID = 23 |
|  3 | event_scheduler | localhost | NULL  | Daemon  | 2030 | Waiting on empty queue           | NULL                                                            |
|  6 | root            | localhost | REPLI | Query   |    0 | starting                         | show processlist                                                |
+----+-----------------+-----------+-------+---------+------+----------------------------------+-----------------------------------------------------------------+
4 rows in set (0.00 sec)

*************************** 1. row ***************************
  Type: InnoDB
  Name:
Status:
=====================================
2018-03-23 21:44:25 0x7f7b14040700 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 6 seconds
<SNIP>
------------
TRANSACTIONS
------------
Trx id counter 835758
Purge done for trx's n:o < 835745 undo n:o < 0 state: running but idle
History list length 0
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 421641847433952, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 835757, ACTIVE 12 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 2, OS thread handle 140166124865280, query id 60074 System lock
update T_Sample01 set memo = 'LOCK TEST FOR MEM4' where ID = 23
------- TRX HAS BEEN WAITING 12 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 46 page no 3 n bits 96 index PRIMARY of table `REPLI`.`T_Sample01` trx id 835757 lock_mode X locks rec but not gap waiting
Record lock, heap no 28 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 4; hex 80000017; asc     ;;
 1: len 6; hex 00000009aedb; asc       ;;
 2: len 7; hex 25000000472f00; asc %   G/ ;;
 3: len 18; hex 4c4f434b205445535420464f52204d454d33; asc LOCK TEST FOR MEM3;;

------------------
---TRANSACTION 835756, ACTIVE 17 sec
2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 6, OS thread handle 140166593513216, query id 60091 localhost root starting
show engine innodb status
Trx read view will not see trx with id >= 835758, sees < 835757
<SNIP>
----------------------------
END OF INNODB MONITOR OUTPUT
============================

1 row in set (0.00 sec)

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.56.113

<SNIP>
      Slave_SQL_Running_State: System lock
           Master_Retry_Count: 86400
<SNIP>
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)

*************************** 1. row ***************************
                wait_started: 2018-03-23 21:44:13
                    wait_age: 00:00:12
               wait_age_secs: 12
                locked_table: `REPLI`.`T_Sample01`
                locked_index: PRIMARY
                 locked_type: RECORD
              waiting_trx_id: 835757
         waiting_trx_started: 2018-03-23 21:44:13
             waiting_trx_age: 00:00:12
     waiting_trx_rows_locked: 1
   waiting_trx_rows_modified: 0
                 waiting_pid: 2
               waiting_query: update T_Sample01 set memo = 'LOCK TEST FOR MEM4' where ID = 23
             waiting_lock_id: 835757:46:3:28
           waiting_lock_mode: X
             blocking_trx_id: 835756
                blocking_pid: 6
              blocking_query: select * from sys.innodb_lock_waits   <---This is wrong information..
            blocking_lock_id: 835756:46:3:28
          blocking_lock_mode: X
        blocking_trx_started: 2018-03-23 21:44:08
            blocking_trx_age: 00:00:17
    blocking_trx_rows_locked: 1
  blocking_trx_rows_modified: 0
     sql_kill_blocking_query: KILL QUERY 6
sql_kill_blocking_connection: KILL 6
1 row in set, 3 warnings (0.01 sec)

/*** @SALVE ***/

root@localhost [REPLI]> select * from performance_schema.threads where processlist_state='System lock'\G
*************************** 1. row ***************************
          THREAD_ID: 75
               NAME: thread/sql/slave_sql
               TYPE: FOREGROUND
     PROCESSLIST_ID: 2
   PROCESSLIST_USER: NULL
   PROCESSLIST_HOST: NULL
     PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: Connect
   PROCESSLIST_TIME: 72
  PROCESSLIST_STATE: System lock
   PROCESSLIST_INFO: update T_Sample01 set memo = 'LOCK TEST FOR MEM4' where ID = 23
   PARENT_THREAD_ID: 1
               ROLE: NULL
       INSTRUMENTED: YES
            HISTORY: YES
    CONNECTION_TYPE: NULL
       THREAD_OS_ID: 3267
1 row in set (0.00 sec)

/*** @SALVE ***/
root@localhost [REPLI]> select * from INFORMATION_SCHEMA.INNODB_LOCK_WAITS\G
*************************** 1. row ***************************
requesting_trx_id: 835761
requested_lock_id: 835761:46:3:28
  blocking_trx_id: 835756
 blocking_lock_id: 835756:46:3:28
1 row in set, 1 warning (0.00 sec)

root@localhost [REPLI]> select * from INFORMATION_SCHEMA.INNODB_LOCKS\G
*************************** 1. row ***************************
    lock_id: 835764:46:3:28
lock_trx_id: 835764
  lock_mode: X
  lock_type: RECORD
 lock_table: `REPLI`.`T_Sample01`
 lock_index: PRIMARY
 lock_space: 46
  lock_page: 3
   lock_rec: 28
  lock_data: 23
*************************** 2. row ***************************
    lock_id: 835756:46:3:28
lock_trx_id: 835756
  lock_mode: X
  lock_type: RECORD
 lock_table: `REPLI`.`T_Sample01`
 lock_index: PRIMARY
 lock_space: 46
  lock_page: 3
   lock_rec: 28
  lock_data: 23
2 rows in set, 1 warning (0.00 sec)

How to repeat:
1)  Start Transaction and Lock Row on the Slave
2)  delete the specific row on the Master. (The row is locked on the slave)
3)  system lock is occurred on the slave.
4)  Run select * from sys.innodb_lock_waits, it shows wrong blocking query.

Suggested fix:
Please show correct blocking query on sys.innodb_lock_waits.
[27 Mar 2018 11:20] Shinya Sugiyama
Screen Shot for this bug.

Attachment: Slave_Status.PNG (image/png, text), 111.11 KiB.

[27 Mar 2018 14:54] MySQL Verification Team
Hello Sugiyama-San,

Thank you for the report and feedback!

Thanks,
Umesh
[28 Mar 2018 3:02] Shinya Sugiyama
I confirmed with same session, so it shows this symptom.
I will attach result and close this report.
[28 Mar 2018 3:02] Shinya Sugiyama
Confirm with different session.

Attachment: diff_session.PNG (image/png, text), 78.65 KiB.

[28 Mar 2018 3:05] Shinya Sugiyama
This is happen because of using sys.innodb_lock_waits in the same session.
[28 Mar 2018 8:15] Shinya Sugiyama
temporary modificattion to sys.innodb_lock_waits

Attachment: sys.innodb_lock_waits.sql (application/octet-stream, text), 2.22 KiB.