• 1
  • 2
  • 3
  • 4
  • 5
mysql数据库问题 首 页  »  帮助中心  »  数据库  »  mysql数据库问题
关于RDS MySQL InnoDB 锁等待和锁等待超时的处理的相关问题
发布日期:2015-11-6 14:11:51

  关于RDS MySQL InnoDB 锁等待和锁等待超时的处理的相关问题

  a、RDS MySQL InnoDB 什么时候会出现锁等待?

        当一个RDS MySQL连接会话等待另外一个会话持有的互斥锁时,会发生Innodb锁等待情况。

  一般来说,持有该互斥锁的连接(会话)会迅速的执行完相关操作并释放掉持有的互斥锁,然后等待的会话在锁等待超时时间到来前获得该互斥锁,进行下一步操作。

  注意!!!在某些情况下,比如一个实例未感知到的RDS中断会话,持有该互斥锁的会话长时间不释放该互斥锁,可能会导致大量的锁等待与锁等待超时。

  Innodb锁等待情况的处理如下:

  1. Innodb锁等待超时参数innodb_lock_wait_timeout

  这个参数控制Innodb锁等待的超时时间,单位是秒,在RDS实例中该参数默认的值为50(秒)。

  等待互斥锁的会话在等待50秒后会退出锁等待状态然后返回这样的语句: ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 错误,如下图:

  这个参数支持在会话级别修改,方便应用在会话级别单独设置某些特殊操作的锁等待超时时间,如下图:

  2. 大量锁等待和锁等待超时的处理

  2.1 检查导致锁等待和锁超时的会话

  2.1.1 选择 IDB Cloud =》实例信息 =》 Innodb 锁等待 查看,如下图:

  2.1.2 选择 IDB Cloud => 实例信息 =》实例会话查看,如下图:

  2.1.3 当遇到IDB CLOUD 不能登陆的情况时,可以通过MySQL命令行工具运行下面的代码,从而获得导致锁等待和锁超时的会话。

  select

  'Blocker' role,

  p.id,

  p.user,

  left(p.host, locate(':', p.host) - 1) host,

  tx.trx_id,

  tx.trx_state,

  tx.trx_started,

  timestampdiff(second, tx.trx_started, now()) duration,

  lo.lock_mode,

  lo.lock_type,

  lo.lock_table,

  lo.lock_index,

  tx.trx_query,

  tx.trx_tables_in_use,

  tx.trx_tables_locked,

  tx.trx_rows_locked

  from

  information_schema.innodb_trx tx,

  information_schema.innodb_lock_waits lw,

  information_schema.innodb_locks lo,

  information_schema.processlist p

  where

  lw.blocking_trx_id = tx.trx_id

  and p.id = tx.trx_mysql_thread_id

  and lo.lock_trx_id = tx.trx_id

  union all

  select

  'Blockee' role,

  p.id,

  p.user,

  left(p.host, locate(':', p.host) - 1) host,

  tx.trx_id,

  tx.trx_state,

  tx.trx_started,

  timestampdiff(second, tx.trx_started, now()) duration,

  lo.lock_mode,

  lo.lock_type,

  lo.lock_table,

  lo.lock_index,

  tx.trx_query,

  tx.trx_tables_in_use,

  tx.trx_tables_locked,

  tx.trx_rows_locked

  from

  information_schema.innodb_trx tx,

  information_schema.innodb_lock_waits lw,

  information_schema.innodb_locks lo,

  information_schema.processlist p

  where

  lw.requesting_trx_id = tx.trx_id

  and p.id = tx.trx_mysql_thread_id

  and lo.lock_trx_id = tx.trx_id \G

  比如:

  2.2 解决导致锁等待和锁超时的会话

  2.2.1依靠 IDB Cloud =》实例信息 =》 实例会话 kill 掉导致锁等待的会话

  2.2.2 在IDB CLOUD 不能登陆的情况下,可以通过MySQl命令行工具执行 kill 命令,来终止导致锁等待的会话,如下图: