falha de segmentação mydumper em g_ascii_strtoull

0

Estou tentando usar o mydumper para gerar um despejo dos meus bancos de dados mysql, que eu poderia usar para restaurar os bancos de dados mais tarde em caso de desastre.

No entanto, isso simplesmente não funciona. Eu uso esta linha de comando:

mydumper --user remote-backup --password ******

Não produz nada além de uma mensagem Segmentation fault , após um atraso de aproximadamente 1 s.

Eu o instalei com apt install mydumper em uma máquina debian 8.5 (jessie), que instalou mydumper 0.6.1, built against MySQL 5.5.35 . Estou usando mysqld Ver 5.7.14 for Linux on i686 (MySQL Community Server (GPL)) . Preciso reconstruir o mydumper contra o mysql 5.7?

Aqui está o backtrace do gdb:

(gdb) run
Starting program: /usr/bin/mydumper --user remote-backup --password ******
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/i386-linux-gnu/i686/cmov/libthread_db.so.1".
[New Thread 0xb77aab40 (LWP 3189)]
[Thread 0xb77aab40 (LWP 3189) exited]
[New Thread 0xb77aab40 (LWP 3190)]
[New Thread 0xb6dffb40 (LWP 3191)]
[New Thread 0xb63ffb40 (LWP 3192)]
[New Thread 0xb5bfeb40 (LWP 3194)]

Program received signal SIGSEGV, Segmentation fault.
0xb7912bf8 in __GI_____strtoull_l_internal (nptr=nptr@entry=0x0,
    endptr=endptr@entry=0x0, base=base@entry=10, group=group@entry=0,
    loc=loc@entry=0xb7a87400 <_nl_C_locobj>) at ./strtol_l.c:298
298     ./strtol_l.c: No such file or directory.
(gdb) backtrace
#0  0xb7912bf8 in __GI_____strtoull_l_internal (nptr=nptr@entry=0x0,
    endptr=endptr@entry=0x0, base=base@entry=10, group=group@entry=0,
    loc=loc@entry=0xb7a87400 <_nl_C_locobj>) at ./strtol_l.c:298
#1  0xb791321f in __GI___strtoull_l (nptr=0x0, endptr=0x0, base=10,
    loc=0xb7a87400 <_nl_C_locobj>) at ./strtol_l.c:556
#2  0xb7bcbdc6 in g_ascii_strtoull () from /lib/i386-linux-gnu/libglib-2.0.so.0
#3  0x0804cf6a in dump_database ()
#4  0x0804ede1 in start_dump ()
#5  0x0804b595 in main ()
    
por youen 29.08.2017 / 13:02

1 resposta

0

Eu resolvi esse problema reconstruindo o mydumper a partir de fontes.

Acontece que eu estava usando uma versão mais recente do mysqld do que a fornecida pelo debian (jessie), e aparentemente o executável mydumper fornecido pelo debian não é compatível com ele (embora isso seja apenas um palpite, talvez seja não a razão em tudo).

Para criar o mydumper, você precisa:

  1. Clone link
  2. Instale dependências com o apt-get (veja mydumper readme no github, no momento de escrever esta resposta você precisa de sudo apt-get install libglib2.0-dev zlib1g-dev libpcre3-dev libssl-dev )
  3. Instale o pacote libmysqlclient-dev correspondente à versão do mysqld que você está usando. Como neste caso não estou usando o fornecido pelo debian, também não posso instalar os arquivos de desenvolvimento fornecidos pelo debian. O que funcionou para mim foi baixar os pacotes .deb do repositório debian sid (diretamente do ftp): libmysqlclient -dev que depende do libmysqlclient20 . Faça o download desses arquivos e, em seguida, sudo dpkg -i libmysqlclient20_5.7.18-1_i386.deb libmysqlclient-dev_5.7.18-1_i386.deb
  4. Construa mydumper (que também construirá myloader) como explicado no readme:

    cd mydumper
    cmake .
    make
    

    Talvez seja necessário instalar ferramentas de criação, como sudo apt-get install build-essential cmake

Agora você deve ter os dois executáveis no diretório atual. A partir desse ponto, tudo funcionou bem para eu gerar o backup.

Eu também precisava construir myloader da fonte no servidor de destino, já que a versão fornecida pelo debian também seria segfault, mas desta vez não era uma incompatibilidade de versão do mysql; então na verdade eu não tenho ideia do porque o executável debian não funcionou.

    
por 29.08.2017 / 19:12