记一次mysql服务不可用事件

148 阅读1分钟

事情的发生经过大致是这样的:

通过客户端连测试环境做数据修改的时候,卡死执行不成功。

锁表?

第一时间想的会不会是锁表了。可以通过以下命令进行查看:

SHOW OPEN TABLES WHERE In_use >0;

该命令会显示所有正在被使用的MySQL表。如果结果中的In_use大于0,说明这个表被锁住了。

如果需要查看更具体的锁信息,例如表被哪个用户锁住了,可以使用以下命令:

SELECT 
t.TABLE_SCHEMA,t.TABLE_NAME,p.ID,p.USER,p.HOST,p.DB,p.COMMAND,p.TIME,p.STATE,
l.RETRIES,l.TIMEOUT,l.SLEEP,l.TYPE 
FROM 
information_schema.TABLES AS t 
INNER JOIN INFORMATION_SCHEMA.PROCESSLIST AS p ON p.DB = t.TABLE_SCHEMA 
LEFT JOIN INFORMATION_SCHEMA.LOCKS AS l ON l.ID = p.ID 
WHERE 
t.TABLE_SCHEMA NOT IN ('information_schema','mysql','performance_schema') 
AND p.COMMAND='Sleep' 
AND l.TYPE IS NOT NULL;

该命令会列出所有被锁住的表,以及锁住表的进程信息和锁的详细信息。

也可以通过命令:

show full processlist;

查看进程。 找到锁表的进程,杀掉进程 假设进程id为46286

kill 46286;

binlog磁盘空间不足

此次我们遇到的情况并没有出现锁表的情况,并且测试环境的应用服务开始出现大量连接失败的情况。经过排查最终发现binlog的磁盘目录空间使用率达到100%,这就意味着后续的dml操作写binlog失败,导致程序卡死,资源不足。

binlog暴涨的原因是后端同步了一批300多万的数据。。。

我们决定删除部分binlog文件并重启数据库

#停止
service mysqld stop
#启动
service mysqld start