如果/ var / lib / mysql中有任何内容,则MySQL apt / chef安装将失败

我正在使用大厨在Ubuntu 16.04上安装默认的mysql-server软件包。 我在一个没有安装MySQL的服务器上执行,但是已经/var/lib/mysql设置为已安装的驱动器。

因此, /var/lib/mysql有一个lost+found目录。

如果我使用非常基本的厨师安装MySQL:

 package 'mysql-server' 

/var/lib/mysql/lost+found存在时,出现错误:

 Job for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details. invoke-rc.d: initscript mysql, action "start" failed. dpkg: error processing package mysql-server-5.7 (--configure): subprocess installed post-installation script returned error exit status 1 dpkg: dependency problems prevent configuration of mysql-server: mysql-server depends on mysql-server-5.7; however: Package mysql-server-5.7 is not configured yet. dpkg: error processing package mysql-server (--configure): dependency problems - leaving unconfigured No apport report written because the error message indicates its a followup error from a previous failure. Errors were encountered while processing: mysql-server-5.7 mysql-server E: Sub-process /usr/bin/dpkg returned an error code (1) 

(如果我只是apt-get install mysql-server这个错误也会发生。)

但是,如果我在安装之前删除lost+found目录,一切工作正常。

想象一下 ,mysql的安装过程就像是假设lost+found目录实际上是一个数据库,并且在安装过程中尝试升级它,或者同样奇怪的事情。

现在我已经解决了这个问题(也certificate了自己, lost+found目录肯定是原因),删除在安装之前lost+found ,然后重新创build它:

 directory '/var/lib/mysql/lost+found' do action :delete end package 'mysql-server' package 'mysql-client' execute 'mklost+found' do command 'mklost+found' cwd '/var/lib/mysql' end 

这工作正常,但我相信专家可能会在标准的Kludge-o-Rama标准上评估它在8.2左右。

在/ var / lib / mysql已经设置为挂载驱动器时,有没有更好的方法在Ubuntu上使用chef来执行MySQL服务器的基本,软件包默认安装?

是的,这是由(a)存在/var/lib/mysql/lost+found ,(b) /var/lib/dpkg/info/mysql-server-5.7.postinst这一部分造成的:

 216 # If database doesn't exist we create it. 217 if [ ! "$(ls -A "${mysql_statedir}")" ] && [ -d "${mysql_filesdir}" ]; then 218 existingdatabase=0 

其中mysql_statedir/var/lib/mysql ,以及(c)Ubuntu(Debian's)在安装软件包(但可能未configuration)时启动服务的大脑死亡策略

因此无法启动mysql:

 Job for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details. invoke-rc.d: initscript mysql, action "start" failed. 

导致dpkg出错。

所以你通过使(a)为假来修复它。 让我们来看看你可能如何使(b)或(c)是错误的。

对于(b),当/var/lib/mysql是一个单独的文件系统时,你可以提交一个bug报告,说明/var/lib/dpkg/info/mysql-server-5.7.postinst的第217行是非最优的, lost+found 。 也许它会得到修复。

对于(c)你可以说服Ubuntu的权力,那是开始包安装服务是一个坏主意。 他们的反驳将是:使用policy-rc.d。 那会怎么样?

创build一个/usr/sbin/policy-rc.d文件,当init脚本是mysql-server时,该文件什么也不做,只返回0。 请参阅invokerc.d规范 。 然而,脚本的其他部分依赖于mysql实际启动。 正确的代码返回不是0; 也许101? 但是,任何非零返回码都会导致您现在正在体验的相同结果。 所以policy-rc.d对你没有帮助。 /耸肩

我希望我已经说服你,你的解决scheme是最好的。