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

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

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

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

如果我使用非常基本的 chef 安装 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目录实际上是一个数据库,并尝试在安装过程中升级它,或者做一些同样奇怪的事情。

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

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 已设置为挂载驱动器时,是否有更好的方法使用 chef 在 Ubuntu 上执行 MySQL 服务器的基本包默认安装?

答案1

是的,这是由于(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 的)脑死亡政策在包安装(但可能未配置)时启动服务。

因此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) 为假。

/var/lib/mysql对于 (b),您可以提交错误报告,指出 /var/lib/dpkg/info/mysql-server-5.7.postinst 的第 217 行在单独的文件系统中不是最佳的,因此它包含lost+found。也许它会得到修复。

对于 (c),您可以说服 Ubuntu 的权威人士,在安装软件包时启动服务不是一个好主意。他们的反驳是:使用 policy-rc.d。那会怎样?

创建一个/usr/sbin/policy-rc.d文件,该文件在初始化脚本执行时不执行任何操作,只返回 0。mysql-server请参阅invoker.d 规范。但是,脚本的其他部分依赖于 mysql 的实际启动。返回的正确代码不是 0;也许是 101?。但是,任何非零返回代码都会导致您现在遇到的相同结果。所以 policy-rc.d 对您没有帮助。/耸耸肩

我希望我已经让你相信你的解决方案是最好的。

相关内容