シェルで使用するときの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;"

今日から分割エラーが発生し始めましたが、今は原因がわかりません。数週間サーバーが起動しませんでした。最後のアップデートから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、、、。もっとあります。libjemalloc1libreadline5

sudo apt-get install -reinstall libaio1 libjemalloc1 libreadline5

ただし、ファイルシステムの他の部分が破損しないという保証はありません。データベースをバックアップし、OS/MySQLを最初から再インストールします。

良いニュースは、データベースへのアクセスについて述べた他の方法がうまく機能することです。これは、ほとんどの破損がmysqlバイナリクライアントに関連していることを意味します。

ただし、将来的にはMySQLを使用している場合は、SDカードでLinuxを実行することを再評価することもできます。

PS。 @casが指摘したように、「すでにインストールしている場合は、dlocatemd5sumファイルに対してパッケージのインストール済みファイルを実行または確認debsumsできます。」dlocate --md5check PKGNAMEdebsums PKGNAME

バラよりラズベリー:SDカードの代わりにUSBペンで起動

関連情報