A atualização 16.04 quebrou o servidor mysql

127

Minha atualização geral correu bem, mas fiquei com um problema criticamente persistente de o mysql-server não poder se instalar, e nada do que estou tentando faz com que funcione.

Este é o erro que vejo ao tentar instalar / reinstalar:

Setting up mysql-server-5.7 (5.7.11-0ubuntu6) ...
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.
                   Processing triggers for systemd (229-4ubuntu4) ...
Processing triggers for ureadahead (0.100.0-19) ...
Errors were encountered while processing:
 mysql-server-5.7
 mysql-server
E: Sub-process /usr/bin/dpkg returned an error code (1)

Eu tentei removê-lo completamente, embora isso tente instalar o MariaDB devido a dependências (?). Qualquer sugestão sobre o que posso fazer para corrigir isso seria bem-vinda.

Edição: Parece que eu não sou o único: https://bugs.launchpad.net/ubuntu/+source/mysql-5.7/+bug/1573279

TheGremlyn
fonte
Eu tenho o mesmo problema aqui .
KernelPanic
11
Teve que desinstalar o phpmyadmin, que estava causando os problemas de dependência de alguma forma. Após a reinstalação, tudo está funcionando bem novamente.
precisa
11
do-release-upgrade do Ubuntu 14 para 16 executa uma atualização não suportada do MySQL 5.5 para 5.7, portanto, espera-se que o MySQL seja quebrado depois, conforme relatado aqui: bugs.launchpad.net/ubuntu/+source/ubuntu-release-upgrader/ + bug /…
Marco Marsala
11
@MarcoMarsala Não sei se podemos dizer que se espera que o MySQL seja quebrado após a atualização do Ubuntu 14 para 16, embora suponha que dependa da sua perspectiva. Para o usuário médio, certamente não é esperado que uma atualização do LTS interrompa algo como o MySQL. É surpreendente que não tenha sido pego durante o teste.
TheGremlyn
apt install phpmyadmin --reinstall corrigido o acima, sem a necessidade de tocar no mysql depois de ... go figure
Andy

Respostas:

119

As instruções publicadas por andrew-beerman estão no caminho certo, embora não sejam muito claras para mim e pareçam recomendar mais do que o necessário. Eu reuni a resposta acima e um post útil no tópico do bug.

Estas são as etapas que tomei para corrigir isso:

  1. Faça backup do seu my.cnf filein /etc/mysqle remova ou renomeie-o

    sudo mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
    
  2. Remova a pasta /etc/mysql/mysql.conf.d/usando

    sudo rm -r /etc/mysql/mysql.conf.d/
    
  3. Verifique se você não tem um my.cnfarquivo escondido em outro lugar (eu fiz no meu diretório pessoal!) Ou em /etc/alternatives/my.cnfuso

    sudo find / -name my.cnf
    
  4. Faça backup e remova /etc/mysql/debian.cnfarquivos (não tenho certeza se necessário, mas apenas no caso)

    sudo mv /etc/mysql/debian.cnf /etc/mysql/debian.cnf.bak
    sudo apt purge mysql-server mysql-server-5.7 mysql-server-core-5.7
    sudo apt install mysql-server
    
  5. Caso seu syslog mostre um erro como "mysqld: Não é possível ler o diretório '/etc/mysql/conf.d/'", crie um link simbólico:

    sudo ln -s /etc/mysql/mysql.conf.d /etc/mysql/conf.d
    

    Em seguida, o serviço deve poder começar sudo service mysql start.

Isso deu certo!

TheGremlyn
fonte
17
depois de todas essas operações (eu fiz isso antes) eu ainda tenho mesmas questões de erro ...
Serge
5
Você precisa remover todos os my.cnf. * Do diretório / etc / mysql. Procure my.cnf.backup, my.cnf.fallback e my.cnf.migrated - todos esses arquivos têm que ser removidos também (backup em primeiro lugar!)
hitzi
8
@SergiiP sudo find / -name "my.cnf"pode ser útil.
Starbeamrainbowlabs
11
mysql-server-core- deve ser mysql-server-core-5.7. Caso contrário, funcionou como um encanto. Obrigado!
David Tay
11
+1. Você fez o meu dia! Também de manhã e à noite! Eu estava travado.
precisa
56

Hoje eu tive o mesmo problema, depois de tentar muitas soluções, descobri que o problema era o comando sudo systemctl disable mysql.serviceusado para desativar a inicialização automática do MySQL. Para fazê-lo funcionar, reativei novamente o servidor MySQL usando o comando sudo systemctl enable mysql.servicee execute novamente o processo de atualização. terminou perfeitamente.

Naruto Biju Mode
fonte
5
Corri para esse mesmo problema e a mesma correção funcionou para mim.
Allen
5
Trabalhou para mim. Fez todas as soluções aqui, o mysql funcionou após esta.
Błażej Michalik
6
O mesmo aqui - este deve ser o post principal.
precisa saber é o seguinte
3
Trabalhou para mim também! Muito obrigado. Apenas para ser explícito, execute: sudo systemctl enable mysql.servicee depois disso sudo apt install -f.
Fernando Paladini 25/01
Isso é tudo que eu tinha que fazer. Eu havia desativado o início automático como descrito por @naruto. Ativei a inicialização automática e execute o "sudo apt upgrade". Agora consertado. Deve ser a melhor resposta. Esta é uma solução muito mais simples, mais padrão e menos propensa a problemas.
Jack Holt
20

Sua mensagem de erro contém esta linha:

subprocess installed post-installation script returned error exit status 1

No entanto, isso installed post-installation scriptnão é mencionado pelo nome. Depois de muitos ajustes, descobri que seu nome é (no meu caso) /var/lib/dpkg/info/mysql-server-5.7.postinst.

Abra este arquivo com sudo vi /var/lib/dpkg/info/mysql-server-5.7.postinstseu editor preferido ou com ele .

Na parte superior, altere a linha 3 (aproximadamente): set -epara set -x, salve o arquivo. (a opção -eé "sair com erros", -xsignifica "mostrar explicitamente o comando executado", presumivelmente)

Execute sudo dpkg --configure -a --log /tmp/dpkg.log (a opção --log é opcional). Você também pode simplesmente executar apt upgradese souber que será o único pacote que será atualizado.

Agora você obtém uma saída detalhada do mysql-server-5.7.postinstscript bash e pode descobrir o que está errado.

No meu caso, ele tentou (re) executar sem êxito mysql_upgrade, mas isso não era necessário para minha instalação personalizada do mysql. Eu tinha certeza de executá-lo manualmente antes, com sucesso, e tudo estava bem.

Então eu comentei a linha 321 (para versões mais antigas do mysqld, tente a linha 281),

#mysql_upgrade --defaults-file=/etc/mysql/debian.cnf || result=$?

e o comando que falhou antes sudo apt upgrade(execute novamente), foi concluído com êxito e o dpkg removeu o status de erro deste pacote.

Agora você pode voltar set -xao set -e(mencionado acima). E, opcionalmente, descomente a linha mysql-upgrade.

Pode ser necessário um trabalho extra se você tiver movido sua partição de dados mysql para um local fora do padrão. Mudei o meu /var/lib/mysql/datapara uma unidade diferente via link simbólico. Talvez seja necessário remover o link simbólico temporariamente, antes da postinstmanipulação do script. Em seguida, recrie-o após executar a atualização do pacote.

Após a próxima atualização da versão secundária do pacote debian mysqld, esse problema com o /var/lib/dpkg/info/mysql-server-5.7.postinstscript pode aparecer novamente.

knb
fonte
Acabei de purgar tudo e, em seguida, baixando a versão mysql-servidor da comunidade e instalar manualmente a partir daqui: dev.mysql.com/downloads/mysql
RyanNerd
Exatamente a mesma coisa aconteceu comigo, e seus passos resolveram isso. Mas para mim, minha chamada mysql_upgrade estava na linha 320. Você pode explicar por que ele retorna um valor diferente de zero quando chamado do script postinst?
Emileopedrollo
@emiliopedrollo Não, não posso explicar aqui. Mas acho que o número da linha agora é 320, porque recentemente os mantenedores de pacotes aumentaram o script pós-instalação, observei a mesma coisa outro dia, durante a última execução do atualizador de software (que incluía um novo pacote mysql-deb-package) .
knb
Obrigado! Com set -eeu consegui resolver o problema exato - o MySQL não tinha acesso ao usuário do sistema ubuntu especificado em /etc/mysql/debian.cnf . Então, eu adicionei esse usuário ao MySQL e concedi privilégios, corri dpkgnovamente e funcionou!
Allen Hamilton
17

As instruções aqui o corrigiram no meu servidor: https://bugs.mysql.com/bug.php?id=72722

Eu posso entender a dor de ter seu sistema inconsistente, mas não vamos nos preocupar com toda a situação e tomá-lo passo a passo para limpar o sistema.

Primeiro vamos ver o estado atual de todos os pacotes mysql na máquina usando: dpkg -l | grep mysql (cole o resultado excluindo a última coluna)

A primeira coluna indica o status atual do pacote. Aqui estão as opções possíveis:

ii) Instalação rc) Arquivos de configuração removidos mantidos (este deve ser o estado de todos os pacotes que você removeu com 'apt-get remove' que não remove os arquivos de configuração em / etc)

Para que isso funcione, você precisará executar 'apt-get purge <pkg-name>' até não encontrar nenhum pacote na lista acima.

Lembre-se de que alguns pacotes não-mysql-server, como python-mysql.connector e python-mysqldb, se instalados, não precisam ser removidos, pois não afetam essa situação, mas se removidos podem causar problemas aos aplicativos que os utilizam.

Definitivamente, tentaremos visitar novamente nossos documentos para ver como podemos proteger os usuários contra esse problema. Obrigado por compartilhar seus comentários em detalhes conosco.

Andrew Beeman
fonte
2
Obrigado por dpkg -l | grep mysql . Isso ajudou a entender a direção.
precisa
O comando estava errado para a limpeza. Deve ser sudo apt-get purge <pkg-name>corrigido com uma edição, mas: usei caracteres unicode para o <porque, caso contrário, ele não seria exibido. Ser avisado copiar colando este comando
Toskan 27/07
3

No meu caso, com strace, vi que / var / run / mysqld / não existia e o mysqld não pode criar o arquivo mysqld.sock.

Estes comandos resolveram o meu problema:

mkdir /var/run/mysqld
chown mysql.mysql /var/run/mysqld
chmod 700 /var/run/mysqld

Agora:

systemctl start mysql

E o mysql funciona novamente :)

Leonardo Catalinas
fonte
Sugiro que você adicione essas linhas em / usr / share / mysql / mysql-systemd-start a partir da linha 25, então você não precisará recriar esse diretório após cada reinicialização (desculpe a linha retornar não funcionar neste comentário) : E se [ ! -d / executar / msyqld]; então mkdir -p -m0755 / run / mysqld || {echo "Não foi possível criar / executar / mysqld"; saída 1; } chown mysql: mysql / run / mysqld || {echo "Não foi possível chown / run / mysqld"; saída 1; } fi
scoobydoo 30/06
3

No meu caso, eu poderia resolver o problema adicionando

# Allow log file access
/home/system/var/log/mysql.err rw,
/home/system/var/log/mysql.log rw,
/home/system/var/log/mysql/ r,
/home/system/var/log/mysql/** rw,

para /etc/apparmor.d/local/usr.sbin.mysqld

Para mais detalhes, dê uma olhada na minha resposta (de ChristophS) em stackoverflow.

ChristophS
fonte
0

Eu tive o mesmo problema. Tentei reinstalar o mysql várias vezes, mas não tive sucesso.

Eu descobri que o problema para mim era que outro processo mysql já estava em execução.

Em detalhes:

Depois de ler cuidadosamente, efetue login /var/log/mysql/error.loge descobri:

[ERRO] Não é possível iniciar o servidor: vincular na porta TCP / IP: endereço já em uso

[ERRO] Você já tem outro servidor mysqld em execução na porta: 3306?

Parece que outro aplicativo já estava usando a porta.

Eu verifiquei usando ps -aux | grep 3306:

$ ps -aux | grep 3306
milkovs+  6802  0.0  0.0  16336  1084 pts/19   S+   21:39   0:00 grep --color=auto 3306
mysql    14706  0.0  0.3 1270192 13916 pts/2   Sl   Aug19   0:29 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --skip-grant-tables --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 --log-syslog=1 --log-syslog-facility=daemon --log-syslog-tag=

E eu matei o processo em execução sudo kill -15 14706

Então eu iniciei o mysql: /etc/init.d/mysql start

Finalmente o mysql funciona para mim! Espero que ajude alguém.

milkovsky
fonte
0

Nenhuma das respostas nesta página funcionou para mim.

Acabei indo para a página de downloads do Oracle , baixando mysql-apt-config_0.8.8-1_all.debe instalando o MySQL a partir do Oracle repo:

sudo dpkg -i mysql-apt-config_0.8.8-1_all.deb
sudo apt update
sudo apt install mysql-server
ostrokach
fonte
2
isntall-> installerro de digitação. O estúpido SO não me permite corrigir um caractere.
Csaba Toth
Por que você foi ao oracle para baixar o mysql
Sinscary
@ Sinscary Esta resposta é de algum tempo atrás, mas provavelmente foi porque eles tinham uma versão mais nova que o gerenciador de pacotes do sistema?
ostrokach
0

Eu tive o problema em alguns servidores agora A correção era executar o apt install phpmyadmin --reinstall

que resolveu o problema acima (sem precisar tocar no mysql depois)

Andy
fonte