放置在NFS存储上的MySQL数据库无法正常启动的问题

Posted on

对放置在NFS存储上的MySQL数据库,在启动时有概率失败,提示文件无法锁定。

问题描述

启动MySQL失败,查看错误日志如下:

InnoDB: Unable to lock ./ib_logfile0, error: 11
InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.

通过lsof命令查询上述文件,并未发现有任何进程对其锁定。

出现该问题的数据库都使用了NFS存储,且使用了v3版本进行的挂载。

问题分析与处理

在NFS v3版本中存在延迟锁(Lazy Locking)特性,该特性会导致若NFS服务端上的MySQL数据库日志和socks文件锁未及时释放,此时MySQL启动时尝试对文件上锁失败,进而造成数据库无法启动。

因为锁机制为NFS协议的一种特性,可以通过更换NFS v4版本协议连接解决。在v4版本中,NFS锁检查会更加频繁,会主动释放锁。

如果NFS服务端或客户端只支持v3版本,这可以通过加nolock参数,来让NFS服务端不保持文件的锁状态(即客户端断开后,文件锁状态即丢失)。

挂载命令的范例如下:

mount -o nolock,rw,bg,hard,intr,suid,proto=tcp,vers=3,rsize=65536,wsize=65536,timeo=600 192.168.XXX.XXX:/nas /mysql_data

不过使用该参数时需要注意,若存储同时被更多的客户端连接,则可能产生文件写冲突(因为此时服务器端的锁状态无法判断)。

END