Я использую chef для установки mysql по умолчанию -server
в Ubuntu 16.04. Я делаю это на сервере, на котором не установлен 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
на самом деле является базой данных, и пытается обновить его во время установки, или что-то в этом роде столь же странно.
Я пока работал над этим (а также доказал себе, что каталог 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
Это работает нормально, но я полагаю, что эксперты, вероятно, оценили бы его примерно на 8,2 по стандартной шкале Клуджа-о-Рамы.
Есть ли лучший способ сделать основной, установка по умолчанию MySQL Server в Ubuntu с помощью chef, когда / var / lib / mysql уже настроен как смонтированный диск?
Да, это вызвано (а) существованием /var/lib/mysql/lost+found
, (б) этой части /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) brain-dead , когда пакет установлен (но, возможно, не сконфигурирован).
Таким образом, ошибка при запуске 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) вы можете подать сообщение об ошибке, в котором сказано, что строка 217 раздела /var/lib/dpkg/info/mysql-server-5.7.postinst не являетсяоптимально, когда /var/lib/mysql
является отдельной файловой системой, поэтому она содержит lost+found
. Возможно, она будет исправлена.
For (c) вы можете убедить Ubuntu powers-что запуск служб при установке пакетов - плохая идея. Их ретортом будет: используйте policy-rc.d. Как это сделать?
Создайте файл /usr/sbin/policy-rc.d
, который ничего не делает, кроме возврата 0, когда init-скрипт является mysql-сервером
. Смотрите спецификацию файла invokerc.d. Тем не менее, есть и другие части скрипта, которые полагаются на mysql фактически начинаются. Правильный код для возврата - не 0; может быть 101? Тем не менее, любой ненулевой код возврата приведет к тому же результату, который вы испытываете сейчас. Таким образом, полис-rc.d не поможет вам. /shrug
Надеюсь, я убедил вас, что ваше решение - лучшее.