從 shell 使用時 Mysql 段錯誤
我有一個帶有 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 指出的那樣,“如果您已經安裝
dlocate
或debsums
安裝,您可以執行dlocate --md5check PKGNAME
或debsums PKGNAME
驗證軟體包的安裝文件是否與其 md5sum 文件”