日常业务中MySQL数据库锁表了怎么办,如何处理? 常见的有三种锁:表锁、行锁、页面锁 假如当线上环境遇到锁表后怎么办? 1)线上如果发现大量sql语句导致长时间锁表,可以通过show processlist命令找出锁表的进程号,然后执行kill 进程号命令,快速结束锁表语句。 2)根据上一步的锁表sql快速从程序中找出是哪个业务导致的,解决bug后紧急发版,如果是非核心业务导致,为了保证系统不被拖挂,可以将接口做降级处理。 3)可以写一检查锁表的运维脚本,每隔几分钟检查一次,出现长时间锁表的sql发出告警提醒。 事前设计避坑: 1)对于大表的操作,查询条件一定要保证命中索引,如果能命中唯一索引就更好了。 2)我们在程序开发的时候,尽可能将大事务拆分为小事务,减少锁表或回滚,比如:抽离部分业务逻辑异步发送消息队列处理。 3)更新很频繁的业务,尽量转为批量处理,另外尽可能减少单次处理的数据量,大数据量可以分批次处理。 4)不要通过select * from user for update显示锁表,特别是高并发的时候,这种操作会很骚,严重影响tps,我们可以通过乐观锁加版本号实现或者先写到缓存然后异步写表等方案解决。 5)业务高峰期,不要随便直接加字段或索引,尽量用户不活跃时执行,但是如果一定要在高峰期操作,可以复制旧表结构创建一个新表,然后在新表上加字段或索引,接着将原来旧表的数据复制到新表,再rename两个表,最后将rename期间旧表的增量数据迁移到新表。 6)采用读写分离架构。