g_ascii_strtoull의 mydumper 분할 오류

g_ascii_strtoull의 mydumper 분할 오류

재해 발생 시 데이터베이스를 복원하는 데 사용할 수 있도록 mydumper를 사용하여 mysql 데이터베이스 덤프를 생성하려고 합니다.

그러나 그것은 작동하지 않습니다. 나는 다음 명령줄을 사용합니다.

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

약 1초 정도 지연된 후 Segmentation fault메시지가 출력됩니다.

apt install mydumper나는 그것을 설치된 debian 8.5 (jessie) 컴퓨터에 설치했습니다 mydumper 0.6.1, built against MySQL 5.5.35. mysqld Ver 5.7.14 for Linux on i686 (MySQL Community Server (GPL))mysql 5.7용 mydumper를 다시 빌드해야 합니까?

다음은 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 ()

답변1

소스에서 mydumper를 다시 빌드하여 이 문제를 해결했습니다.

제가 사용하고 있던 mysqld 버전은 debian(jessie)에서 제공한 버전보다 최신 버전인 것으로 나타났습니다. 따라서 debian에서 제공하는 mydumper 실행 파일은 해당 버전과 호환되지 않는 것 같습니다(비록 이는 단지 추측일 뿐이며 전혀 이유가 아닐 수도 있습니다). .

mydumper를 빌드하려면 다음이 필요합니다.

  1. 클론https://github.com/maxbube/mydumper.git
  2. apt-get을 사용하여 종속성을 설치합니다(이 답변을 작성하는 동안 필요한 github의 mydumper 추가 정보 참조 sudo apt-get install libglib2.0-dev zlib1g-dev libpcre3-dev libssl-dev).
  3. 사용 중인 mysqld 버전에 해당하는 libmysqlclient-dev 패키지를 설치합니다. 이번 예제에서는 데비안에서 제공하는 개발 파일을 사용하지 않았기 때문에 데비안에서 제공하는 개발 파일을 설치할 수 없습니다. 나에게 도움이 된 것은 debian sid저장소에서 (ftp에서 직접) .deb 패키지를 다운로드하는 것이었습니다.libmysql클라이언트-dev때에 따라 다르지libmysqlclient20. 이 파일들을 다운로드한 후sudo dpkg -i libmysqlclient20_5.7.18-1_i386.deb libmysqlclient-dev_5.7.18-1_i386.deb
  4. mydumper를 빌드하려면 readme의 지침을 따르십시오(myloader도 빌드됨).

    cd mydumper
    cmake .
    make
    

    다음과 같은 빌드 도구를 설치해야 할 수도 있습니다.sudo apt-get install build-essential cmake

이제 현재 디렉터리에 두 개의 실행 파일이 있어야 합니다. 이 시점부터 백업을 생성하는 데 모든 것이 순조롭게 진행되었습니다.

Debian에서 제공하는 버전도 segfault이므로 대상 서버의 소스에서 빌드 해야 myloader하지만 이번에는 mysql 버전이 일치하지 않으므로 실제로 debian 실행 파일이 작동하지 않는 이유를 모르겠습니다.

관련 정보