쉘에서 사용할 때 MySQL segfault

쉘에서 사용할 때 MySQL segfault

Raspbian 운영 체제가 설치된 Raspberry Pi 서버가 있습니다.

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

mysql오늘 나는 분할 오류에서 end를 사용하려고 시도하는 것을 발견했습니다.

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

이는 잘못된 비밀번호와 올바른 비밀번호 모두에서 발생합니다. 아니면 사용자 이름을 만들어도 마찬가지입니다. 실제로 mysql매개변수 없이 명령을 실행해도 동일한 효과가 나타나는 것으로 나타났습니다.

pymysqlMysql 서버는 여전히 Python( ) 및 Perl을 통해 액세스할 수 있습니다. 다양한 데이터베이스에서 쓰고 읽는 스크립트가 있는데 모두 잘 작동합니다.

mysql명령을 사용하는 쉘 스크립트는 모두 실패합니다. 예를 들어:

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

오늘부터 분할 오류가 발생하기 시작했는데 지금은 원인을 알 수 없습니다. 몇 주 동안 서버가 시작되지 않았습니다. 마지막 업데이트 이후 일주일이 넘었습니다.

이 상황과 관련이 있을 수 있는 Mysql 로그 또는 syslog에서 오류를 찾을 수 없습니다.

나는 시도했다:

  • MySQL을 다시 시작
  • 시스템을 업그레이드하고 다시 시작하세요.
  • 다시 시작한 후 디스크를 확인하면 오류가 발견되지 않습니다.

gdb이러한 절차가 도움이 되지 않았기 때문에 여기에 제안된 대로 사용해 보았습니다 .

실행 중인 애플리케이션이 "세그먼테이션 오류"로 종료됩니다.

mysql인수 없이 명령을 디버깅할 때 얻는 결과는 다음과 같습니다.

gdb mysql 실행 시작 프로그램 실행: /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.

이 문제를 해결하기 위해 무엇을 할 수 있는지 알고 싶습니다. (버그 보고와는 별도로)

답변1

손상된 바이너리/및/또는 손상된 파일 시스템/SD 카드가 있을 가능성이 높습니다.

SD 카드는 과도한 I/O 사용을 위해 설계되지 않았으며 설계 기능으로 인해 시간이 지남에 따라 성능이 저하됩니다. Raspberry(es)는 때때로 종료될 때 SD 카드의 데이터를 손상시키는 것으로 알려져 있습니다(전자 제품은 제 분야가 아닙니다. 자세히 설명할 수 없습니다.)

mysql바이너리나 관련 라이브러리가 손상되었을 가능성이 높습니다. (실제 실패는 후자를 gdb암시합니다 ).do-rel.h

mysql다음과 유사한 명령으로 클라이언트 및 관련 라이브러리를 다시 설치합니다 (상황은 다를 수 있음).

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

이 명령을 사용하여 어떤 패키지가 mysql바이너리를 제공했는지 확인하고 다시 설치합니다.

dpkg -S /usr/bin/mysql

mysql그런 다음 문제가 해결되지 않으면 어떤 라이브러리가 사용되고 있는지 살펴보겠습니다 .

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)

최후의 수단으로 오류가 수정될 때까지 모든 라이브러리를 지원하는 모든 패키지를 다시 설치할 수 있습니다. 그 중 일부는 다음과 같습니다: libaio1, libjemalloc1, libreadline5. 더있다.

sudo apt-get install -reinstall libaio1 libjemalloc1 libreadline5

그러나 파일 시스템의 다른 부분이 손상되지 않는다는 보장은 없습니다. 데이터베이스를 백업하고 OS/MySQL을 처음부터 다시 설치하겠습니다.

좋은 소식은 데이터베이스 액세스에 대해 언급한 다른 방법이 잘 작동한다는 것입니다. 이는 손상이 대부분 mysql바이너리 클라이언트와 관련되어 있음을 의미합니다.

하지만 앞으로 특히 MySQL을 사용하는 경우 SD 카드에서 Linux를 실행하는 것을 재평가할 수도 있습니다.

추신. @cas가 지적했듯이 "이미 설치한 경우 dlocatemd5sum 파일에 대해 패키지의 설치된 파일을 실행 하거나 확인할 debsums수 있습니다 ."dlocate --md5check PKGNAMEdebsums PKGNAME

바라보다라즈베리: SD 카드 대신 USB 펜으로 부팅

관련 정보