Raspberry-Pi

從 shell 使用時 Mysql 段錯誤

  • February 22, 2018

我有一個帶有 Raspbian OS 的 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沒有任何參數的情況下執行命令也具有相同的效果。

Mysql 伺服器仍然可以通過 Python ( pymysql) 和 Perl 訪問。我有編寫和讀取各種數據庫的腳本,它們都可以正常工作。

使用該mysql命令的 shell 腳本,它們都失敗了。例如:

/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 run run 啟動程序:/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.

我想知道我能做些什麼來解決這個問題?(除了對此進行錯誤報告。)

您很可能已經損壞了二進製文件/和/或損壞的文件系統/SD 卡。

SD 卡不適合大量 I/O 使用,並且會隨著時間的推移而退化;眾所周知,覆盆子在偶爾關閉時會破壞 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二進制客戶端有關。

儘管如此,我將來可能會重新評估從 SD 卡執行 Linux,尤其是在使用 MySQL 的情況下。

PS。正如@cas 指出的那樣,“如果您已經安裝dlocatedebsums安裝,您可以執行dlocate --md5check PKGNAMEdebsums PKGNAME驗證軟體包的安裝文件是否與其 md5sum 文件”

請參閱Raspberry:從 USB 筆而不是 SD 卡啟動

引用自:https://unix.stackexchange.com/questions/425706