20.3.2 获取InnoDB行锁争用情况
可以通过检查InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况:
mysql> show status like 'innodb_row_lock%'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | InnoDB_row_lock_current_waits | 0 | | InnoDB_row_lock_time | 0 | | InnoDB_row_lock_time_avg | 0 | | InnoDB_row_lock_time_max | 0 | | InnoDB_row_lock_waits | 0 | +-------------------------------+-------+ 5 rows in set (0.01 sec) |
如果发现锁争用比较严重,如InnoDB_row_lock_waits和InnoDB_row_lock_time_avg的值比较高,还可以通过设置InnoDB Monitors来进一步观察发生锁冲突的表、数据行等,并分析锁争用的原因。
具体方法如下:
mysql> CREATE TABLE innodb_monitor(a INT) ENGINE=INNODB; Query OK, 0 rows affected (0.14 sec) |
然后就可以用下面的语句来进行查看:
mysql> Show innodb status\G; *************************** 1. row *************************** Type: InnoDB Name: Status: … … ------------ TRANSACTIONS ------------ Trx id counter 0 117472192 Purge done for trx's n:o < 0 117472190 undo n:o < 0 0 History list length 17 Total number of lock structs in row lock hash table 0 LIST OF TRANSACTIONS FOR EACH SESSION: ---TRANSACTION 0 117472185, not started, process no 11052, OS thread id 1158191456 MySQL thread id 200610, query id 291197 localhost root ---TRANSACTION 0 117472183, not started, process no 11052, OS thread id 1158723936 MySQL thread id 199285, query id 291199 localhost root Show innodb status … |
监视器可以通过发出下列语句来停止查看:
mysql> DROP TABLE innodb_monitor; Query OK, 0 rows affected (0.05 sec) |
设置监视器后,在SHOW INNODB STATUS的显示内容中,会有详细的当前锁等待的信息,包括表名、锁类型、锁定记录的情况等,便于进行进一步的分析和问题的确定。打开监视器以后,默认情况下每15秒会向日志中记录监控的内容,如果长时间打开会导致.err文件变得非常的巨大,所以用户在确认问题原因之后,要记得删除监控表以关闭监视器,或者通过使用“--console”选项来启动服务器以关闭写日志文件。