问题描述
笔者使用docker start 启动mysql容器时,显示启动成功,但是1-2s以后mysql又会自动挂掉,很是奇怪。
以下是问题复现:
Unix socket lock file is empty /var/run/mysqld/mysqld.sock.lock. Unable to setup unix socket lock file. Aborting
1.启动并查看容器
docker start 容器id docker ps -a
解决过程
1.是否是磁盘已满
因为测试服务器本来磁盘就很有限,所以首先想到的是不是磁盘满了,然后就尝试去清理了磁盘,清理完成后再次进行重启发现容器依然还是异常的。
2.查看日志
docker logs 容器id
发现图中所示位置,提示mysqld.sock.lock是空的,这里有一点需要注意,这里报的这个路径“/var/run/mysqld/mysqld.sock.lock”这是容器内的路径,所以如果你在宿主机上搜索肯定不是这个路径
# 搜索上面的文件位置 find / -name mysqld.sock.lock
根据搜索到的路径去找到这个文件即可。
3.解决问题
解决的方式很简单,就是将这个文件mysqld.sock.lock删除即可,为甚么这个文件会异常呢,删除对其他地方有无影响呢?首先说下导致这个异常的方式多种多样,笔者碰到的是因为服务器非正常down机引起的,非正常宕机的情况下,mysql.sock.lock无法正常删除,所以有了这个问题。那这个文件删除了是否对mysql服务有影响呢,其实也没有,这个文件在mysql重新启动时会重新创建,而且mysql.sock.lock只是mysql.sock的锁文件,mysql.sock文件又有什么作用呢,这个文件主要用于客户端与服务端位于一台机子上的服务器,实现本地连接的也就是我们使用localhost可以直接连本地的服务时用的。所以删了这个文件对我们毫无影响。
总结
这个问题的产生原因其实是服务器非正常宕机引起的,导致了这个文件的异常。这里需要注意的是,若是容器没有数据卷,这个问题将很难处理,所以我们平时启动容器一定要做数据卷,不然容器内部的问题真的无法解决(容器无法启动时)。