问题原因:
今天线上环境,突然出现一个问题,追踪原因是数据库中的一条语句报错,错误内容:
lock wait timeout exceeded; try restarting transactio
执行update table set status = 1 where id = 10002;是可以的。
而执行update table set status = 1 where id = 10001;这条语句执行失败。
错误提示的意思,很明显,是因为这条语句被锁住了。所以释放这个锁。
解决方案:
新创建的数据库,是这样子的:
现在我们要查test库中使用情况,我们可以到information_schema中查询
解释:information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。再简单点,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息都保存在information_schema表里面。
我们可以用下面三张表来查原因:
innodb_trx ## 当前运行的所有事务
innodb_locks ## 当前出现的锁
innodb_lock_waits ## 锁等待的对应关系
如果数据库中有锁的话,那么在
图中红色语句为占用系统资源的语句,我们需要杀掉这个锁,执行 kill 线程id号。上面这条记录的id为319618246
所以我们执行:kill 319618246
即可
执行之后:
其他的记录不需要关注,因为其他的记录状态为“RUNNING” 即正在执行的事务,并没有锁。。
我们可以进一步了解一下 那三张表的表结构:
desc information_schema.innodb_locks;
Field | Type | Null | Key | Default | Remark |
---|---|---|---|---|---|
lock_id | varchar(81) | NO | 锁ID | ||
lock_trx_id | varchar(18) | NO | 拥有锁的事务ID | ||
lock_mode | varchar(32) | NO | 锁模式 | ||
lock_type | varchar(32) | NO | 锁类型 | ||
lock_table | varchar(1024) | NO | 被锁的表 | ||
lock_index | varchar(1024) | YES | NULL | 被锁的索引 | |
lock_space | bigint(21) unsigned | YES | NULL | 被锁的表空间号 | |
lock_page | bigint(21) unsigned | YES | NULL | 被锁的页号 | |
lock_rec | bigint(21) unsigned | YES | NULL | 被锁的记录号 | |
lock_data | varchar(8192) | YES | NULL | 被锁的数据 |
desc information_schema.innodb_lock_waits
Field | Type | Null | Key | Default | Remark |
---|---|---|---|---|---|
requesting_trx_id | varchar(18) | NO | 请求锁的事务ID | ||
requested_lock_id | varchar(81) | NO | 请求锁的锁ID | ||
blocking_trx_id | varchar(18) | NO | 当前拥有锁的事务ID | ||
blocking_lock_id | varchar(81) | NO | 当前拥有锁的锁ID |
desc information_schema.innodb_trx ;
Field | Type | Null | Key | Default | Extra | Remark |
---|---|---|---|---|---|---|
trx_id | varchar(18) | NO | 事务ID | |||
trx_state | varchar(13) | NO | 事务状态: | |||
trx_started | datetime | NO | 0000-00-00 00:00:00 | 事务开始时间; | ||
trx_requested_lock_id | varchar(81) | YES | NULL | innodb_locks.lock_id | ||
trx_wait_started | datetime | YES | NULL | 事务开始等待的时间 | ||
trx_weight | bigint(21) unsigned | NO | 0 | # | ||
trx_mysql_thread_id | bigint(21) unsigned | NO | 0 | 事务线程ID | ||
trx_query | varchar(1024) | YES | NULL | 具体SQL语句 | ||
trx_operation_state | varchar(64) | YES | NULL | 事务当前操作状态 | ||
trx_tables_in_use | bigint(21) unsigned | NO | 0 | 事务中有多少个表被使用 | ||
trx_tables_locked | bigint(21) unsigned | NO | 0 | 事务拥有多少个锁 | ||
trx_lock_structs | bigint(21) unsigned | NO | 0 | # | ||
trx_lock_memory_bytes | bigint(21) unsigned | NO | 0 | 事务锁住的内存大小(B) | ||
trx_rows_locked | bigint(21) unsigned | NO | 0 | 事务锁住的行数 | ||
trx_rows_modified | bigint(21) unsigned | NO | 0 | 事务更改的行数 | ||
trx_concurrency_tickets | bigint(21) unsigned | NO | 0 | 事务并发票数 | ||
trx_isolation_level | varchar(16) | NO | 事务隔离级别 | |||
trx_unique_checks | int(1) | NO | 0 | 是否唯一性检查 | ||
trx_foreign_key_checks | int(1) | NO | 0 | 是否外键检查 | ||
trx_last_foreign_key_error | varchar(256) | YES | NULL | 最后的外键错误 | ||
trx_adaptive_hash_latched | int(1) | NO | 0 | # | ||
trx_adaptive_hash_timeout | bigint(21) unsigned | NO | 0 | # |