Mysql segfaulting quando usado a partir do shell

3

Eu tenho um servidor Raspberry Pi com o sistema operacional Raspbian:

Kernel: Linux 4.9.35+ #1014 Fri Jun 30 14:34:49 BST 2017 armv6l GNU/Linux
Description:    Raspbian GNU/Linux 8.0 (jessie)
Release:        8.0
Codename:       jessie

Hoje percebi que tentativas de usar mysql terminam em uma falha de segmentação.

user@host~ $ mysql -u root -p
Enter password:
Segmentation fault

Isso acontece tanto para a senha errada quanto para a correta. Ou mesmo se eu inventei um nome de usuário. Na verdade, acontece que mesmo executar o comando mysql sem nenhum argumento tem o mesmo efeito.

O servidor Mysql ainda pode ser acessado via Python ( pymysql ) e Perl. Eu tenho scripts que escrevem e leem vários bancos de dados, todos eles estão funcionando sem problemas.

Scripts de shell que usam o comando mysql , todos eles falham. Por exemplo:

/home/user/example.sh: line 2: 27974 Segmentation fault      /usr/bin/mysql -u dbuser -p$dbpass dbname --execute="select * from example;"

As falhas de segmentação começaram a aparecer hoje e não consigo imaginar o que está causando isso agora. O servidor não foi inicializado em algumas semanas. Já faz mais de uma semana desde a última atualização.

Não consigo encontrar erros que possam parecer relevantes para esta situação nos logs ou syslog do Mysql.

Eu tentei:

  • Reiniciando o Mysql
  • Atualizando o sistema e reinicializando
  • Verificando o disco na reinicialização, nenhum erro encontrado

Como esses procedimentos não ajudaram, tentei usar gdb como sugerido aqui:

A execução da aplicação termina com "Falha de segmentação"

Isto é o que eu recebo ao depurar o comando mysql sem nenhum parâmetro:

gdb mysql corre corre Iniciando programa: / usr / bin / mysql

gdb mysql
run
Starting program: /usr/bin/mysql
Program received signal SIGSEGV, Segmentation fault.
elf_dynamic_do_Rel (skip_ifunc=<optimized out>, lazy=0, nrelative=<optimized out>, relsize=<optimized out>,
    reladdr=<optimized out>, map=0xb6fff968) at do-rel.h:112
112     do-rel.h: No such file or directory.

Eu me pergunto o que posso fazer para corrigir esse problema? (Além de fazer um relatório de bug sobre isso.)

    
por Madoc Comadrin 21.02.2018 / 18:03

1 resposta

4

Você provavelmente tem binários corrompidos / e / ou um sistema de arquivos / cartão SD corrompido.

Os cartões SD não se destinam ao uso pesado de I / O e degradam com o tempo; Framboesa (s) também são conhecidos por corromper dados em cartões SD ao desligar ocasionalmente devido a características de seu design (eletrônica não é minha área, não é possível entrar em detalhes).

Você pode muito bem ter uma corrupção nas bibliotecas binárias ou associadas a mysql . (na verdade, ter uma falha gdb em do-rel.h sugere a última opção).

Eu reinstalaria o mysql client e as bibliotecas associadas, como um comando semelhante a este (sua milhagem pode variar):

sudo apt-get install --reinstall default-mysql-client default-mysql-client-core

Eu usaria este comando para ver qual pacote está fornecendo o binário mysql e o reinstalaria:

dpkg -S /usr/bin/mysql

Então, eu também veria quais bibliotecas mysql está usando, se isso não corrigir o problema:

ldd /usr/bin/mysql
    linux-vdso.so.1 (0x00007ffc8903c000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5989c75000)
    libreadline.so.5 => /lib/x86_64-linux-gnu/libreadline.so.5 (0x00007f5989a33000)
    libncurses.so.5 => /lib/x86_64-linux-gnu/libncurses.so.5 (0x00007f5989810000)
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f59895e6000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f59893cc000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f59891c8000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5988e46000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5988b42000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f59887a3000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f598a4bc000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f598858c000)

Você pode ter como último recurso reinstalar cada pacote que suporta cada uma dessas bibliotecas até que seu erro seja corrigido. Alguns deles são: libaio1 , libjemalloc1 , libreadline5 . Existem mais.

sudo apt-get install -reinstall libaio1 libjemalloc1 libreadline5

No entanto, não há garantias de que você não tenha outros bits do seu sistema de arquivos corrompidos. Gostaria de fazer o backup do banco de dados e reinstalar o OS / MySQL a partir do zero.

A boa notícia é que você mencionou que outras formas de acessar o banco de dados estão funcionando bem, isso significa que a corrupção está relacionada principalmente ao cliente binário mysql .

No entanto, eu provavelmente reavaliaria a execução do Linux a partir de um cartão SD no futuro, especialmente se estiver usando o MySQL.

PS. Como @cas aponta bem, "se você tem dlocate ou debsums instalado, você pode executar dlocate --md5check PKGNAME ou debsums PKGNAME para verificar os arquivos instalados do pacote em seu arquivo md5sum"

Veja Framboesa: inicialização de uma caneta USB em vez de um cartão SD

    
por 21.02.2018 / 20:01