问题:在rds的mysql生产库中,有表进行ddl操作100%会出现锁表情况。进行select查询不会出现锁表问题。
问题探究:常见的锁表原因有慢sql和未提交的任务。
问题展开说明:上述的原因本身没有遇到过,是查询了一些资料看到的结论。自身遇到的问题其实也属于其中之一。具体原因是有项目组在使用mysql数据库时,开发web服务接口,将筛选操作放在了数据库端,而且不知道他们的服务是如何写的。发现查询操作几乎常驻数据库端了,将数据库端的cpu给打满了。这样就导致了其他的所有命令在运行时都会阻塞。会需要进行等待。
问题排查:使用show full processlist来查看被锁表等待资源的执行命令进程。使用select trx_state, trx_started, trx_mysql_thread_id, trx_query from information_schema.innodb_trx;命令来查看当前有没有未提交的事务。
问题结论:数据库资源被打满,导致出现锁表情况。
问题解决方案:控制所有使用数据库资源,保证在使用命令时cpu不被打满。
问题总结:其实有些问题在没有接触过前会觉得神秘。就单以锁表来看。查询资料发现问题原因很多。但是发现都只是一个问题的多种不同表现形式。就拿锁表来说。锁表本身的介绍就是执行命令进程在等待表执行完或等待资源分配。所以所有的问题分析就应该往资源和表当前被其他的事务占用上去靠。这两个问题才是问题的核心。