说明:前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处理;

在InnoDB Plugin之前,一般通过show full processlist和show engine innodb status命令查看当前的数据库请求,然后再判断当前事务中锁的情况。随着mysql的发展,已经提供更加便捷的方法来监控数据库中的锁等待现象了。

在information_schema下面有三张表:INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS,通过这三张表,可以更简单地监控当前的事务并分析可能存在的问题。

INNODB_TRX表及结构

Column name

Description

TRX_WEIGHT

The weight of a transaction, reflecting (but not necessarily the exact count of) the number of rows altered and the number of rows locked by the transaction. To resolve a deadlock, InnoDB selects the transaction with the smallest weight as the “victim” to rollback. Transactions that have changed non-transactional tables are considered heavier than others, regardless of the number of altered and locked rows.

TRX_STATE

Transaction execution state. One of RUNNING, LOCK WAIT, ROLLING BACK or COMMITTING.

TRX_STARTED

Transaction start time.

TRX_REQUESTED_LOCK_ID

ID of the lock the transaction is currently waiting for (if TRX_STATE is LOCK WAIT, otherwise NULL). Details about the lock can be found by joining with INNODB_LOCKS on LOCK_ID.

TRX_WAIT_STARTED

Time when the transaction started waiting on the lock (if TRX_STATE is LOCK WAIT, otherwise NULL).

TRX_QUERY

The SQL query that is being executed by the transaction.

TRX_OPERATION_STATE

The transaction's current operation, or NULL.

TRX_TABLES_IN_USE

The number of InnoDB tables used while processing the current SQL statement of this transaction.

TRX_TABLES_LOCKED

Number of InnoDB tables that the current SQL statement has row locks on. (Because these are row locks, not table locks, the tables can usually still be read from and written to by multiple transactions, despite some rows being locked.)

TRX_LOCK_STRUCTS

The number of locks reserved by the transaction.

TRX_LOCK_MEMORY_BYTES

Total size taken up by the lock structures of this transaction in memory.

TRX_ROWS_LOCKED

Approximate number or rows locked by this transaction. The value might include delete-marked rows that are physically present but not visible to the transaction.

TRX_ROWS_MODIFIED

The number of modified and inserted rows in this transaction.

TRX_CONCURRENCY_TICKETS

A value indicating how much work the current transaction can do before being swapped out, as specified by the innodb_concurrency_tickets option.

TRX_ISOLATION_LEVEL

The isolation level of the current transaction.

TRX_UNIQUE_CHECKS

Whether unique checks are turned on or off for the current transaction. (They might be turned off during a bulk data load, for example.)

TRX_FOREIGN_KEY_CHECKS

Whether foreign key checks are turned on or off for the current transaction. (They might be turned off during a bulk data load, for example.)

TRX_LAST_FOREIGN_KEY_ERROR

Detailed error message for last FK error, or NULL.

TRX_ADAPTIVE_HASH_LATCHED

Whether or not the adaptive hash index is locked by the current transaction. (Only a single transaction at a time can modify the adaptive hash index.)

TRX_ADAPTIVE_HASH_TIMEOUT

Whether to relinquish the search latch immediately for the adaptive hash index, or reserve it across calls from MySQL. When there is no AHI contention, this value remains zero and statements reserve the latch until they finish. During times of contention, it counts down to zero, and statements release the latch immediately after each row lookup.

TRX_IS_READ_ONLY

A value of 1 indicates the transaction is read-only. (5.6.4 and up.)

TRX_AUTOCOMMIT_NON_LOCKING

A value of 1 indicates the transaction is a SELECT statement that does not use the FOR UPDATE or LOCK IN SHARED MODE clauses, and is executing with the autocommit setting turned on so that the transaction will only contain this one statement. (5.6.4 and up.) When this column and TRX_IS_READ_ONLY are both 1, InnoDB optimizes the transaction to reduce the overhead associated with transactions that change table data.

比较常用的列:

trx_id:InnoDB存储引擎内部唯一的事物ID

trx_status:当前事务的状态

trx_status:事务的开始时间

trx_requested_lock_id:等待事务的锁ID

trx_wait_started:事务等待的开始时间

trx_weight:事务的权重,反应一个事务修改和锁定的行数,当发现死锁需要回滚时,权重越小的值被回滚

trx_mysql_thread_id:MySQL中的进程ID,与show processlist中的ID值相对应

trx_query:事务运行的SQL语句

INNODB_LOCKS

Column name

Description

LOCK_ID

Unique lock ID number, internal to InnoDB. Treat it as an opaque string. Although LOCK_ID currently contains TRX_ID, the format of the data in LOCK_ID is not guaranteed to remain the same in future releases. Do not write programs that parse the LOCK_ID value.

LOCK_TRX_ID

ID of the transaction holding this lock. Details about the transaction can be found by joining with INNODB_TRX on TRX_ID.

LOCK_MODE

Mode of the lock. One of S, X, IS, IX, S_GAP, X_GAP, IS_GAP, IX_GAP, or AUTO_INC for shared, exclusive, intention shared, intention exclusive row locks, shared and exclusive gap locks, intention shared and intention exclusive gap locks, and auto-increment table level lock, respectively. Refer to the sections Section 14.5.3, “InnoDB Lock Modes” and Section 14.5.2, “The InnoDB Transaction Model and Locking” for information on InnoDB locking.

LOCK_TYPE

Type of the lock. One of RECORD or TABLE for record (row) level or table level locks, respectively.

LOCK_TABLE

Name of the table that has been locked or contains locked records.

LOCK_INDEX

Name of the index if LOCK_TYPE='RECORD', otherwise NULL.

LOCK_SPACE

Tablespace ID of the locked record if LOCK_TYPE='RECORD', otherwise NULL.

LOCK_PAGE

Page number of the locked record if LOCK_TYPE='RECORD', otherwise NULL.

LOCK_REC

Heap number of the locked record within the page if LOCK_TYPE='RECORD', otherwise NULL.

LOCK_DATA

Primary key value(s) of the locked record if LOCK_TYPE='RECORD', otherwise NULL. This column contains the value(s) of the primary key column(s) in the locked row, formatted as a valid SQL string (ready to be copied to SQL commands). If there is no primary key then the InnoDB internal unique row ID number is used. If a gap lock is taken for key values or ranges above the largest value in the index, LOCK_DATA reports “supremum pseudo-record”. When the page containing the locked record is not in the buffer pool (in the case that it was paged out to disk while the lock was held), InnoDB does not fetch the page from disk, to avoid unnecessary disk operations. Instead, LOCK_DATA is set to NULL.

INNODB_LOCK_WAITS

Column name

Description

REQUESTING_TRX_ID

ID of the requesting transaction.

REQUESTED_LOCK_ID

ID of the lock for which a transaction is waiting. Details about the lock can be found by joining with INNODB_LOCKS on LOCK_ID.

BLOCKING_TRX_ID

ID of the blocking transaction.

BLOCKING_LOCK_ID

ID of a lock held by a transaction blocking another transaction from proceeding. Details about the lock can be found by joining with INNODB_LOCKS on LOCK_ID.

以上这些表,其实只要知道其中比较常用的字段,就差不多能够满足日常的工作需求了,下面通过测试进行演示;

一、准备工作

1、在test下面随便创建一张表john,并取消自动commit操作,脚本如下:

mysql> use information_schema

Database changed

mysql> select count(*) from tables;

+----------+

| count(*) |

+----------+

|       81 |

+----------+1 row in set (0.06 sec)

mysql> create table test.john as select * from tables;

Query OK, 82 rows affected (0.29 sec)

Records: 82  Duplicates: 0  Warnings: 0

mysql> insert into john select * from john;

Query OK, 671744 rows affected (2 min 19.03 sec)

Records: 671744  Duplicates: 0  Warnings: 0

(经过几次插入后john表的数据671744行)

mysql> set @@autocommit=0;Query OK, 0 rows affected (0.00 sec)

(取消数据库的自动commit)

二、进行表john加锁操作,脚本如下:

mysql> select count(*) from john for update;

+----------+

| count(*) |

+----------+

|  2686976 |

+----------+

1 row in set (8.19 sec)

在另外一个窗口中监控innodb锁的状态;

mysql> SELECT  * FROM INNODB_TRX\G;

*************************** 1. row ***************************

trx_id: B14                                                /请记住该trx_id/

trx_state: RUNNING                                       /当前状态/

trx_started: 2014-11-29 14:07:51

trx_requested_lock_id: NULL

trx_wait_started: NULL

trx_weight: 15905

trx_mysql_thread_id: 10                                          /在process 里面的id值/

trx_query: select count(*) from john for update;    /当前执行的语句/

trx_operation_state: fetching rows

trx_tables_in_use: 1

trx_tables_locked: 1

trx_lock_structs: 15905

trx_lock_memory_bytes: 1554872

trx_rows_locked: 1360743

trx_rows_modified: 0

trx_concurrency_tickets: 0

trx_isolation_level: REPEATABLE READ

trx_unique_checks: 1

trx_foreign_key_checks: 1

trx_last_foreign_key_error: NULL

trx_adaptive_hash_latched: 0

trx_adaptive_hash_timeout: 10000

1 row in set (0.02 sec)

trx_id: B14 只是持有锁,但并没有产生锁等待;

三、模拟锁等待

3.1 在另外一个窗口中,执行语句:

mysql> select count(*) from john where table_name='CHARACTER_SETS' for update;

3.2 查看当前锁等待的情况

INNODB_TRX的锁情况:

mysql> SELECT  * FROM INNODB_TRX\G;

*************************** 1. row ***************************

trx_id: B15

trx_state: LOCK WAIT                       //状态为锁等待//

trx_started: 2014-11-29 14:12:28

trx_requested_lock_id: B15:0:32777:2

trx_wait_started: 2014-11-29 14:12:28

trx_weight: 2

trx_mysql_thread_id: 10                           //在process里面可以看到相应的状态//

trx_query: select count(*) from john where table_name='CHARACTER_SETS' for update                //锁等待的语句//

trx_operation_state: starting index read

trx_tables_in_use: 1

trx_tables_locked: 1

trx_lock_structs: 2

trx_lock_memory_bytes: 376

trx_rows_locked: 1

trx_rows_modified: 0

trx_concurrency_tickets: 0

trx_isolation_level: REPEATABLE READ

trx_unique_checks: 1

trx_foreign_key_checks: 1

trx_last_foreign_key_error: NULL

trx_adaptive_hash_latched: 0

trx_adaptive_hash_timeout: 10000

*************************** 2. row ***************************

trx_id: B14

trx_state: RUNNING

trx_started: 2014-11-29 14:07:51

trx_requested_lock_id: NULL

trx_wait_started: NULL

trx_weight: 31777

trx_mysql_thread_id: 8

trx_query: NULL

trx_operation_state: NULL

trx_tables_in_use: 0

trx_tables_locked: 0

trx_lock_structs: 31777

trx_lock_memory_bytes: 3094968

trx_rows_locked: 2718752

trx_rows_modified: 0

trx_concurrency_tickets: 0

trx_isolation_level: REPEATABLE READ

trx_unique_checks: 1

trx_foreign_key_checks: 1

trx_last_foreign_key_error: NULL

trx_adaptive_hash_latched: 0

trx_adaptive_hash_timeout: 10000

2 rows in set (0.02 sec)

请注意:因为我们只有模拟两个session,所以这边只有两个会话。(因此一个处于锁等待,另外一个必然就是持有锁的对象。实际的生产环境中可能这边会出现很多列,所以需要用下面的语句才能判断:锁等待和持有锁对象的匹配关系)

3.3 锁等待和持有锁的相互关系

mysql> SELECT * FROM INNODB_LOCK_WAITS\G;

*************************** 1. row ***************************

requesting_trx_id: B15

requested_lock_id: B15:0:32777:2

blocking_trx_id: B14

blocking_lock_id: B14:0:32777:2

1 row in set (0.03 sec)

ERROR:

No query specified

通过视图INNODB_LOCK_WAITS可以清晰的看到B14持有锁,而B15处于锁等待;

3.4 锁等待的原因

mysql> SELECT * FROM INNODB_LOCKS\G;

*************************** 1. row ***************************

lock_id: B15:0:32777:2

lock_trx_id: B15

lock_mode: X

lock_type: RECORD

lock_table: `test`.`john`

lock_index: `GEN_CLUST_INDEX`

lock_space: 0

lock_page: 32777

lock_rec: 2

lock_data: 0x000000640000

*************************** 2. row ***************************

lock_id: B14:0:32777:2

lock_trx_id: B14

lock_mode: X

lock_type: RECORD

lock_table: `test`.`john`

lock_index: `GEN_CLUST_INDEX`

lock_space: 0

lock_page: 32777

lock_rec: 2

lock_data: 0x000000640000

2 rows in set (0.01 sec)

可以看到持有锁的模式、对象

3.5 在进程里面查看状态

Id值为8的进程,Info显示为NULL值,可以推断当前的session由于未进行commit导致锁未释放的;

总结:通过以上几个视图,就可以很快速的判断出锁等待的对象及原因了,从这上面也可以看出mysql管理更加便捷和容易了;

监控mysql锁定状态_mysql InnoDB锁等待的查看及分析相关推荐

  1. 监控mysql锁定状态_MySQL 锁的监控及处理

    故障模拟 # 添加两项配置 vi /etc/my.cnf [mysqld] autocommit=0 innodb_lock_wait_timeout = 3600 systemctl restart ...

  2. 监控mysql锁定状态_Shell脚本监控MySQL主从状态

    分享一个Linux下,监控MySQL主从状态及配合企业微信机器人报警的Shell脚本SLAVE_IP:为监控的主机IPUSER:为msyql用户PASSWORD:为mysql密码WHEREIS_MYS ...

  3. 监控mysql锁定状态_企业实战Mysql不停机维护主从同步

    实战环境: Mysql-5.7 Xtrabackup-2.4 Xtrabackup 介绍: Percona XtraBackup是一款基于MySQL的服务器的开源热备份实用程序,在备份过程中不会锁定数 ...

  4. mysql 表死锁_MySQL Innodb表导致死锁日志情况分析与归纳

    案例描述在定时脚本运行过程中,发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志. 两个sql语句如下:(1)insert into backup ...

  5. 监控mysql的shell脚本_监控MySQL主从状态的shell脚本

    分享一个Linux下,监控MySQL主从状态及配合企业微信机器人报警的Shell脚本 SLAVE_IP:为监控的主机IP USER:为msyql用户 PASSWORD:为mysql密码 WHEREIS ...

  6. mysql 主从复制 监控_监控MySQL主从复制状态的脚本

    思路是通过show slave status这条命令来查看主从复制的状态,然后根据状态字段的值进行判断. show slave status\G; #显示slave状态; slave_IO_Runni ...

  7. mysql innodb默认的锁_Mysql InnoDB锁

    MySQL 不同引擎的锁机制: MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-leve locking)或表级锁,默认为页面锁 InnoD ...

  8. delete select语句_MySQL InnoDB锁介绍及不同SQL语句分别加什么样的锁

    作者:iceman1952 链接:https://blog.csdn.net/iceman1952/article/details/85504278 本文中,我们详细介绍MySQL InnoDB存储引 ...

  9. mysql 性能状态_MySQL性能状态查看方式

    1. QPS(每秒Query量) QPS = Questions(or Queries) / seconds mysql > show global status like 'Question% ...

  10. 配置CACTI监控MySQL数据库状态(1)准备工作

    MySQL数据库做为开源数据库软件中的佼佼者,虽然应用领域众多,但其自身在性能监测方面很不给力,尽管MySQL也提供的专用了GUI工作,可是监测只是其中的一个很小的功能点,监测项少且很不灵活,当拥有多 ...

最新文章

  1. hbase查看表结构_HBase
  2. python 空对象模式_Python 单例模式(3种方式)
  3. 一寸、两寸证件照photoshop批处理动作
  4. javascript调用activex控件
  5. 5年前的Dubbo,2年前的Spring Cloud,都输给了这个架构!
  6. 【MM模块】 Goods Receipt 收货 2
  7. gitbook 入门教程之解决windows热加载失败问题
  8. poj2109 Power of Cryptography(数学题)
  9. 学习笔记-工业相机与普通相机优劣利弊
  10. 90-30-020-源码-任务调度-Kylin任务调度
  11. linux服务器禁ip策略,Linux服务器自动封禁访问异常的IP脚本(一)
  12. @RequestParam接收解析不到 POST 提交的 数据
  13. svn update中文报错_svn不能更新也不能提交!为什么?
  14. python关闭对象语法_用Python打开和关闭文件
  15. Pixhawk---基于NSH的Firmware开发与调试
  16. 客户端性能优化实战经验分享
  17. 模拟器链接appium
  18. JavaScript,setTimeout的使用案例
  19. 趣店财报:最会赚钱的趣店亏了
  20. 宏观经济调控政策笔记+

热门文章

  1. 用C++实现QQ自动登陆器,仿佛开了外挂,秒杀各种神操作!
  2. JS基础——两张图来回切换
  3. red5-server-1.0.6-RELEASE 启动异常
  4. Open JDK patched with font fix
  5. 业务逻辑这个是什么东东
  6. 在线视频下载网址合集
  7. 计算机个性化桌面后总是恢复,Win7切换主题导致个性化桌面图标失效恢复初始的解决方法...
  8. 找不到驱动程序类,加载驱动失败,连接数据库失败
  9. Questasim覆盖率数据分析
  10. 蓝牙变成“未知USB设备”的解决方法