Chinaunix
标题:
怎么查看show innodb status的历史记录?
[打印本页]
作者:
suanmeilizhi
时间:
2013-10-10 17:32
标题:
怎么查看show innodb status的历史记录?
本帖最后由 suanmeilizhi 于 2013-10-10 17:43 编辑
存储过程压力测试过程中出现mysql死锁,压力测试完成之后,用
show innodb status
复制代码
确是打印其他信息,要怎么找回之前的死锁信息呢?
EDIT:
现在的情况是存储过程里面有一条update语句,一条insert语句,之前看的死锁情况,是update语句申请锁失败了,具体的sql是:
update userinfo set balance = balance - r_to_pay, givebalance = givebalance - g_to_pay where balance - r_to_pay>=0 and givebalance - g_to_pay>=0 and ssoid = p_ssoid;
复制代码
ssoid是unique索引,主键是一个无意义的id,没想明白怎么会死锁?
作者:
a.a
时间:
2013-10-10 18:14
写个脚本,定期将status信息写到文件。典线救国。
作者:
suanmeilizhi
时间:
2013-10-10 18:15
回复
2#
a.a
救不了了,已经跑过了
作者:
suanmeilizhi
时间:
2013-10-10 18:16
回复
2#
a.a
现在的问题是,找出死锁的原因
作者:
a.a
时间:
2013-10-10 18:18
本帖最后由 a.a 于 2013-10-10 18:19 编辑
出现死可以从多个角度进行分析,比如说你可以打开数据库 general 及slow-qeruy-log
这样就可以看到在死锁的时候数据库发在干什么,是什么样的操作制了死锁。
作者:
suanmeilizhi
时间:
2013-10-10 18:27
回复
5#
a.a
是我上面的update语句导致死锁,但是我不明白为啥这句update会死锁,不满足死锁的条件啊
作者:
a.a
时间:
2013-10-10 19:20
本帖最后由 a.a 于 2013-10-10 19:30 编辑
表的记录多少?index如何?update 多少条记录?什么是引擎?
作者:
suanmeilizhi
时间:
2013-10-10 22:29
本帖最后由 suanmeilizhi 于 2013-10-10 23:36 编辑
回复
7#
a.a
记录并不多,测试环境做压力测试的时候出现的,并发估计比平时高点,存储引擎是InnoDB,压力测试的时候,ssoid一直没变,并且ssoid又是unique索引。
有没有可能是因为并发量太大,超过LOCK_MAX_DEPTH_IN_DEADLOCK_CHECK?
记得当时的错误日志还有:
DEEP OR LONG SEARCH IN THE LOCK TABLE WAITS-FOR GRAPH, WE
WILL ROLL BACK FOLLOWING TRANSACTION
复制代码
作者:
chinafenghao
时间:
2013-10-11 11:18
@a.a
@suanmeilizhi
show engine ionnodb status\G 是会记录最后一个死锁记录。
如果你在这里看不出信息,那么就是说你还存在其他死锁?
如果是这样,那么就请按照aa兄的说法,循环记录engine innodb status的状态。
如果这种死锁的几率很低(99.99%一下),基本可以忽略。
作者:
suanmeilizhi
时间:
2013-10-11 11:38
回复
9#
chinafenghao
怎么循环记录死锁日志???
几率很大啊,压力测试经常出现
作者:
chinafenghao
时间:
2013-10-11 12:38
@suanmeilizhi
写脚本,循环去取show engine innodb status的状态。
作者:
a.a
时间:
2013-10-11 15:03
本帖最后由 a.a 于 2013-10-11 15:04 编辑
版主都现身了。
来个简单版 的
cat <<EOF >>getS.sh
date "+%Y%m%d %H:%M:%S" >>/tmp/mysqlS.log
mysql -uusername -pPassword -e "show show engine innodb status " >>/tmp/mysqlS.log
EOF
复制代码
作者:
suanmeilizhi
时间:
2013-10-11 17:42
本帖最后由 suanmeilizhi 于 2013-10-11 17:49 编辑
回复
12#
a.a
现在show innodb status显示的是:
---TRANSACTION 0 949933, not started, process no 12866, OS thread id 1169987904
复制代码
我怀疑是不是同一条记录的index锁超过200之后,mysql就不在处理,默认当做死锁处理了。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2