Установка MySQL apt / chef завершается неудачно, если что-либо присутствует в / var / lib / mysql

Я использую 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 уже настроен как смонтированный диск?

0
задан 24 November 2016 в 00:22
1 ответ

Да, это вызвано (а) существованием /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

Надеюсь, я убедил вас, что ваше решение - лучшее.

2
ответ дан 4 December 2019 в 13:37

Теги

Похожие вопросы