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
パラメータなしでコマンドを実行しても同じ効果が現れることがわかりました。
pymysql
MysqlサーバーはまだPython()とPerlを介してアクセスできます。さまざまなデータベースから書き込んで読み取るスクリプトがあり、すべてうまく機能します。
このmysql
コマンドを使用するシェルスクリプトはすべて失敗します。たとえば、
/home/user/example.sh: line 2: 27974 Segmentation fault /usr/bin/mysql -u dbuser -p$dbpass dbname --execute="select * from example;"
今日から分割エラーが発生し始めましたが、今は原因がわかりません。数週間サーバーが起動しませんでした。最後のアップデートから1週間を超えました。
この状況に関連する可能性がある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を実行することを再評価することもできます。
PS。 @casが指摘したように、「すでにインストールしている場合は、dlocate
md5sumファイルに対してパッケージのインストール済みファイルを実行または確認debsums
できます。」dlocate --md5check PKGNAME
debsums PKGNAME