MySQL查看锁表

来源:互联网 发布:格式工厂是什么软件 编辑:程序博客网 时间:2024/06/14 17:22
锁状态
 
  • mysql的锁有表锁和行锁,myisam最小锁为表锁,innodb最小锁为行锁,可以通过以下命令获取锁定次数、锁定造成其他线程等待次数,以及锁定等待时间信息。
  1. show status like '%lock%';
  • 如当Table_locks_waited与Table_locks_immediate的比值较大,则说明我们的表锁造成的阻塞比较严重,可能需要调整Query语句,或者更改存储引擎,亦或者需要调整业务逻辑。当然,具体改善方式必须根据实际场景来判断。
  • Innodb_row_lock_waits较大,则说明Innodb的行锁也比较严重,且影响了其他线程的正常处理。同样需要查找出原因并解决。造成Innodb行锁严重的原因可能是Query语句所利用的索引不够合理(Innodb行锁是基于索引来锁定的),造成间隙锁过大。也可能是系统本身处理能力有限,则需要从其他方面来考虑解决。

表信息
  1. show status like 'Table%';

  • Table_locks_immediate  指的是能够立即获得表级锁的次数
  • Table_locks_waited  指的是不能立即获取表级锁而需要等待的次数


在5.5中,information_schema 库中增加了三个关于锁的表(MEMORY引擎):


  • 当前运行的所有事务

  1. SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

  1. root@127.0.0.1 : information_schema 13:29:05> desc innodb_trx ;
  2. +—————————-+———————+——+—–+———————+——-+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +—————————-+———————+——+—–+———————+——-+
  5. | trx_id | varchar(18) | NO | | | |#事务ID
  6. | trx_state | varchar(13) | NO | | | |#事务状态:
  7. | trx_started | datetime | NO | | 0000-00-00 00:00:00 | |#事务开始时间;
  8. | trx_requested_lock_id | varchar(81) | YES | | NULL | |#innodb_locks.lock_id
  9. | trx_wait_started | datetime | YES | | NULL | |#事务开始等待的时间
  10. | trx_weight | bigint(21) unsigned | NO | | 0 | |#
  11. | trx_mysql_thread_id | bigint(21) unsigned | NO | | 0 | |#事务线程ID
  12. | trx_query | varchar(1024) | YES | | NULL | |#具体SQL语句
  13. | trx_operation_state | varchar(64) | YES | | NULL | |#事务当前操作状态
  14. | trx_tables_in_use | bigint(21) unsigned | NO | | 0 | |#事务中有多少个表被使用
  15. | trx_tables_locked | bigint(21) unsigned | NO | | 0 | |#事务拥有多少个锁
  16. | trx_lock_structs | bigint(21) unsigned | NO | | 0 | |#
  17. | trx_lock_memory_bytes | bigint(21) unsigned | NO | | 0 | |#事务锁住的内存大小(B
  18. | trx_rows_locked | bigint(21) unsigned | NO | | 0 | |#事务锁住的行数
  19. | trx_rows_modified | bigint(21) unsigned | NO | | 0 | |#事务更改的行数
  20. | trx_concurrency_tickets | bigint(21) unsigned | NO | | 0 | |#事务并发票数
  21. | trx_isolation_level | varchar(16) | NO | | | |#事务隔离级别
  22. | trx_unique_checks | int(1) | NO | | 0 | |#是否唯一性检查
  23. | trx_foreign_key_checks | int(1) | NO | | 0 | |#是否外键检查
  24. | trx_last_foreign_key_error | varchar(256) | YES | | NULL | |#最后的外键错误
  25. | trx_adaptive_hash_latched | int(1) | NO | | 0 | |#
  26. | trx_adaptive_hash_timeout | bigint(21) unsigned | NO | | 0 | |#
  27. +—————————-+———————+——+—–+———————+——-+

  • 当前出现的锁

  1. SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

  1. root@127.0.0.1 : information_schema 13:28:38> desc innodb_locks;
  2. +————-+———————+——+—–+———+——-+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +————-+———————+——+—–+———+——-+
  5. | lock_id | varchar(81) | NO | | | |#锁ID
  6. | lock_trx_id | varchar(18) | NO | | | |#拥有锁的事务ID
  7. | lock_mode | varchar(32) | NO | | | |#锁模式
  8. | lock_type | varchar(32) | NO | | | |#锁类型
  9. | lock_table | varchar(1024) | NO | | | |#被锁的表
  10. | lock_index | varchar(1024) | YES | | NULL | |#被锁的索引
  11. | lock_space | bigint(21) unsigned | YES | | NULL | |#被锁的表空间号
  12. | lock_page | bigint(21) unsigned | YES | | NULL | |#被锁的页号
  13. | lock_rec | bigint(21) unsigned | YES | | NULL | |#被锁的记录号
  14. | lock_data | varchar(8192) | YES | | NULL | |#被锁的数据
  15. +————-+———————+——+—–+———+——-+

  •  锁等待的对应关系

  1. SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

  1. root@127.0.0.1 : information_schema 13:28:56> desc innodb_lock_waits;
  2. +——————-+————-+——+—–+———+——-+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +——————-+————-+——+—–+———+——-+
  5. | requesting_trx_id | varchar(18) | NO | | | |#请求锁的事务ID
  6. | requested_lock_id | varchar(81) | NO | | | |#请求锁的锁ID
  7. | blocking_trx_id | varchar(18) | NO | | | |#当前拥有锁的事务ID
  8. | blocking_lock_id | varchar(81) | NO | | | |#当前拥有锁的锁ID
  9. +——————-+————-+——+—–+———+——-+


  • 查看正在被锁定的的表

  1. show OPEN TABLES where In_use > 0;

  • 查看进程状态,通过此命令可以查看哪些sql在等待锁
  1. show processlist;

  • 杀死进程

  1. kill 线程ID

参考来源: http://daizj.iteye.com/blog/2247725

原创粉丝点击