Chinaunix

标题: 怎么查看show innodb status的历史记录? [打印本页]

作者: suanmeilizhi    时间: 2013-10-10 17:32
标题: 怎么查看show innodb status的历史记录?
本帖最后由 suanmeilizhi 于 2013-10-10 17:43 编辑

存储过程压力测试过程中出现mysql死锁,压力测试完成之后,用
  1. show innodb status
复制代码
确是打印其他信息,要怎么找回之前的死锁信息呢?

EDIT:

现在的情况是存储过程里面有一条update语句,一条insert语句,之前看的死锁情况,是update语句申请锁失败了,具体的sql是:
  1. 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?
记得当时的错误日志还有:
  1. DEEP OR LONG SEARCH IN THE LOCK TABLE WAITS-FOR GRAPH, WE
  2. 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 编辑

版主都现身了。
来个简单版 的

  1. cat <<EOF >>getS.sh
  2. date "+%Y%m%d %H:%M:%S" >>/tmp/mysqlS.log
  3. mysql -uusername -pPassword -e "show show engine innodb status "  >>/tmp/mysqlS.log
  4. EOF
复制代码

作者: suanmeilizhi    时间: 2013-10-11 17:42
本帖最后由 suanmeilizhi 于 2013-10-11 17:49 编辑

回复 12# a.a



现在show innodb status显示的是:
  1. ---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