记录一次mysql宕机 Lock wait timeout exceeded,No space left on device

起因:

centos+docker 测试环境用着用着,突然项目请求都变成了pending

项目日志如下

### Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction;

查了一下是锁表了,所以我自然认为是事务导致的锁表,改了半天也没见半点起色
然后决定重启一下服务器,重启之后,docker的mysql 陷入restarting 状态

日志如下:

2022-09-01T08:54:35.972932Z 1 [ERROR] [MY-012640] [InnoDB] Error number 28 means 'No space left on device'
2022-09-01T08:54:35.972964Z 1 [ERROR] [MY-012267] [InnoDB] Could not set the file size of './ibtmp1'. Probably out of disk space
2022-09-01T08:54:35.972981Z 1 [ERROR] [MY-012926] [InnoDB] Unable to create the shared innodb_temporary.
2022-09-01T08:54:35.973004Z 1 [ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error.
2022-09-01T08:54:36.368258Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
2022-09-01T08:54:36.368572Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2022-09-01T08:54:36.368838Z 0 [ERROR] [MY-010119] [Server] Aborting
2022-09-01T08:54:36.369560Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.27)  MySQL Community Server - GPL.

简单来说就是 磁盘满了,我想一般也不往里面放东西啊,一查发现,内存全堆在 /var/lib/docker/overlay2路径下,也就是说都是docker里的东西占的内存,那除了容器就是镜像了,容器就那么几个,一看镜像,好家伙,一大片都是几百 m 的。
并且都是 标签的,确定这些没用之后,批量删掉,好了,几十个G的内存回来了,一切如新。

docker rmi $(docker images | grep "none" | awk '{print $3}') 

总结:

我是使用 dockerfile 创建的容器,在不断更新迭代的过程中,产生了大量无用镜像,所以导致docker内存区爆满,导致mysql没有存储空间,进而mysql和项目都奔溃了,所以要定期清理无用镜像,以上。

文章参考:

https://blog.csdn.net/qq_20967969/article/details/122256722

你可能感兴趣的:(mysql,docker,java)