文章目录
数据库锁表「 Lock wait timeout exceeded; try restarting transaction 」
前言
` 还是前段时间的那个老项目 : 客户要给服务器系统升级,当时的服务器部署手册,
以及宕机处理方案也在里面,于是客户的IT部门自己重启了相关服务后,发现操作部分功能时发现锁表了,
于是勇敢的小齐又被老板安排了
经过排查发现实际上是因为操作不规范,导致多启动了一个sleuth服务,但是这个服务,项目不需要
出现了数据库锁表,就下面这张图
后面赶紧通知对方IT部门停掉sleuth容器
下面就是处理锁表问题的步骤
`
操作数据库的时候发现,锁表了
information_schema 库中有三个关于锁的表(存储引擎)
innodb_trx ## 当前运行的所有事务
innodb_locks ## 当前出现的锁
innodb_lock_waits ## 锁等待的对应关系
innodb_trx
`trx_id` varchar(18) NOT NULL DEFAULT '', #事务ID
`trx_state` varchar(13) NOT NULL DEFAULT '',`#事务状态
`trx_started` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', #事务开始时间
`trx_requested_lock_id` varchar(81) DEFAULT NULL, #innodb_locks.lock_id
`trx_wait_started` datetime DEFAULT NULL, #事务开始等待的时间
`trx_weight` bigint(21) unsigned NOT NULL DEFAULT '0',
`trx_mysql_thread_id` bigint(21) unsigned NOT NULL DEFAULT '0', #事务线程ID
`trx_query` varchar(1024) DEFAULT NULL, #具体SQL语句
`trx_operation_state` varchar(64) DEFAULT NULL, #事务当前操作状态
`trx_tables_in_use` bigint(21) unsigned NOT NULL DEFAULT '0',#事务中有多少个表被使用
`trx_tables_locked` bigint(21) unsigned NOT NULL DEFAULT '0', #事务拥有多少个锁
`trx_lock_structs` bigint(21) unsigned NOT NULL DEFAULT '0',
`trx_lock_memory_bytes` bigint(21) unsigned NOT NULL DEFAULT '0',#事务锁住的内存大小(B)
`trx_rows_locked` bigint(21) unsigned NOT NULL DEFAULT '0',#事务锁住的行数
`trx_rows_modified` bigint(21) unsigned NOT NULL DEFAULT '0',#事务更改的行数
`trx_concurrency_tickets` bigint(21) unsigned NOT NULL DEFAULT '0',#事务并发票数
`trx_isolation_level` varchar(16) NOT NULL DEFAULT '',#事务隔离级别
`trx_unique_checks` int(1) NOT NULL DEFAULT '0',#是否唯一性检查
`trx_foreign_key_checks` int(1) NOT NULL DEFAULT '0',#是否外键检查
`trx_last_foreign_key_error` varchar(256) DEFAULT NULL,#最后的外键错误
`trx_adaptive_hash_latched` int(1) NOT NULL DEFAULT '0',
`trx_adaptive_hash_timeout` bigint(21) unsigned NOT NULL DEFAULT '0',
`trx_is_read_only` int(1) NOT NULL DEFAULT '0',
`trx_autocommit_non_locking` int(1) NOT NULL DEFAULT '0'
innodb_locks
`lock_id` varchar(81) NOT NULL DEFAULT '',#锁ID
`lock_trx_id` varchar(18) NOT NULL DEFAULT '',#拥有锁的事务ID
`lock_mode` varchar(32) NOT NULL DEFAULT '',#锁模式
`lock_type` varchar(32) NOT NULL DEFAULT '',#锁类型
`lock_table` varchar(1024) NOT NULL DEFAULT '',#被锁的表
`lock_index` varchar(1024) DEFAULT NULL,#被锁的索引
`lock_space` bigint(21) unsigned DEFAULT NULL,#被锁的表空间号
`lock_page` bigint(21) unsigned DEFAULT NULL,#被锁的页号
`lock_rec` bigint(21) unsigned DEFAULT NULL,#被锁的记录号
`lock_data` varchar(8192) DEFAULT NULL #被锁的数据
innodb_lock_waits
`requesting_trx_id` varchar(18) NOT NULL DEFAULT '',#请求锁的事务ID
`requested_lock_id` varchar(81) NOT NULL DEFAULT '',#请求锁的锁ID
`blocking_trx_id` varchar(18) NOT NULL DEFAULT '',#当前拥有锁的事务ID
`blocking_lock_id` varchar(81) NOT NULL DEFAULT ''#当前拥有锁的锁ID
select * from INNODB_TRX ;
select * from innodb_lock_waits ;
select * from INNODB_LOCKS ;
kill 进程号
上面的进程号指的是:innodb_trx表的trx_mysql_thread_id字段的值
至此问题解决
分享一句我特别喜欢的话:每一天都是一个新的日子,走运当然是好的,不过我情愿做到分毫不差。这样,运气来的时候,你就有准备了。 ————海明威《老人与海》