因为我docker使用的是pipework的那种方式,所以我一台宿主机上搭了很多台服务器,也有了几个mysql,今天再装mysql就一直启动不起来,然后报错如下,找了半天终于找到了解决方案。
原博主链接
### tail -f /var/log/mysqld.log
2019-10-22T09:20:42.695040Z 0 [ERROR] InnoDB: io_setup() failed with EAGAIN after 5 attempts.
2019-10-22T09:20:42.695064Z 0 [Note] InnoDB: You can disable Linux Native AIO by setting innodb_use_native_aio = 0 in my.cnf
2019-10-22T09:20:42.695111Z 0 [ERROR] InnoDB: Cannot initialize AIO sub-system
2019-10-22T09:20:42.695122Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2019-10-22T09:20:42.695132Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2019-10-22T09:20:42.695144Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2019-10-22T09:20:42.695151Z 0 [ERROR] Failed to initialize builtin plugins.
2019-10-22T09:20:42.695155Z 0 [ERROR] Aborting
通过错误日志了解到最早发生错误的地方为 InnoDB: Error: io_setup() failed with EAGAIN after 5 attempts。
这个io_setup() failed with EAGAIN是关键。
看到io_setup用来创建异步I/O上下文环境用于特定目的,错误代码EAGAIN意为指定的maxevents 超出了用户可用events的限制。
该服务器上已经运行了较多的MySQL实例,创建异步I/O的资源已经达到了临界,所以新的实例启动失败。
最后通过在启动MySQL实例时加入 --innodb_use_native_aio = 0解决了问题。
也有通过更改系统设置来解决此问题的(待验证)。
cat /proc/sys/fs/aio-max-nr可以查看到当前的aio-max-nr的值一般为65536(64k个)
可通过下述步骤改变该文件中的值(上述文件不能直接编辑)
sudo vim /etc/sysctl.conf
修改或加入
fs.aio-max-nr=262144(256k个)
执行命令修改/proc/sys/fs/aio-max-nr
sysctl -p
可以看到/proc/sys/fs/aio-max-nr中的值发生了变化
cat /proc/sys/fs/aio-max-nr