我们面临的问题可能是由于 AWS RDS 上的资源耗尽造成的。 当我们检查AWS RDS性能洞察时,我们得到了几个具有非常高延迟的sql(甚至超过1小时),然后我们通过执行下面的sql查询来检查RDS的详细信息
SELECT
r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_thread,
r.trx_query waiting_query,
b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_thread,
b.trx_query blocking_query
FROM information_schema.innodb_lock_waits w
INNER JOIN information_schema.innodb_trx b
ON b.trx_id = w.blocking_trx_id
INNER JOIN information_schema.innodb_trx r
ON r.trx_id = w.requesting_trx_id;
我们发现可能是死锁导致的,发现了一些类似的sql语句
select *** from table where id = *** for update
这个被屏蔽了
update *** where id= ***
并且更新查询被另一个具有相同 id 的更新查询阻止。
当我们检查源代码时,没有像我们使用 select ** for update 语句那样的定义。
对于我们接下来的调查有什么建议吗?
使用慢日志查找耗时较长的查询。
使用
SHOW ENGINE=INNODB STATUS;
查看最新的死锁(如果确实死锁)。
与
SHOW CREATE TABLE
一起呈现结果。然后我们可以进一步讨论。