关于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 命令,来终止导致锁等待的会话,如下图:
|