MySQL が自動的に再起動する問題の解決方法

MySQL が自動的に再起動する問題の解決方法

序文

最近、テスト環境で MySQL データベースが自動的に再起動し続ける問題が発生しました。原因は、データベース プロセスが kill -9 によって強制終了されたことです。エラー メッセージは次のとおりでした。

2019-07-24T01:14:53.769512Z 0 [注記] 非推奨のパーティション エンジンを使用しているテーブルのリストを取得するには、「SELECT * FROM INFORMATION_SCHEMA.TABLES;」を実行します。このチェックをスキップするには、起動オプション「--disable-partition-engine-check」を使用できます。
2019-07-24T01:14:53.769516Z 0 [注記] ネイティブにパーティション分割されていないテーブルのリストの始まり
01:14:53 UTC - mysqld はシグナル 11 を取得しました。
これはバグに遭遇したためかもしれません。また、このバイナリが
または、リンクされているライブラリの1つが破損しているか、不適切に構築されているか、
または構成が誤っています。このエラーは、ハードウェアの故障によっても発生する可能性があります。
問題の診断に役立つ情報を収集しようとしています。
これは事故であり、何かが間違いなく間違っているので、情報は
収集プロセスが失敗する可能性があります。
Percona Serverの改善にご協力ください。
バグについては http://bugs.percona.com/ をご覧ください

キーバッファサイズ=33554432
読み取りバッファサイズ=8388608
最大使用接続数=0
最大スレッド数=501
スレッド数=4
接続数=0
mysqldは最大で
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 4478400 K バイトのメモリ
大丈夫だと思いますが、そうでない場合は、方程式内のいくつかの変数を減らしてください。

スレッド ポインタ: 0x7f486900e000
バックトレースを試行しています。次の情報を使用して調べることができます。
mysqldが死んだ。その後にメッセージが表示されない場合は、何かが起こった可能性があります。
ひどく間違っています...
スタックボトム = 7f4846172820 スレッドスタック 0x80000
/usr/local/mysql5.7/bin/mysqld(my_print_stacktrace+0x2c)[0xed481c]
/usr/local/mysql5.7/bin/mysqld(ハンドル致命的シグナル+0x461)[0x7a15a1]
libpthread.so.0(+0xf7e0)[0x7f498697c7e0] の続きを読む
/usr/local/mysql5.7/bin/mysqld(_ZN12ha_federated7rnd_posEPhS0_+0x2f)[0x12bcc3f]
/usr/local/mysql5.7/bin/mysqld(_ZN7handler10ha_rnd_posEPhS0_+0x172)[0x804a12]
/usr/local/mysql5.7/bin/mysqld(_ZN14Rows_log_event24do_index_scan_and_updateEPK14Relay_log_info+0​​x1e3)[0xe50e23]
/usr/local/mysql5.7/bin/mysqld(_ZN14Rows_log_event14do_apply_eventEPK14Relay_log_info+0​​x716)[0xe50196]
/usr/local/mysql5.7/bin/mysqld(_ZN9Log_event11apply_eventEP14Relay_log_info+0​​x6e)[0xe48fde]
/usr/local/mysql5.7/bin/mysqld(_Z26apply_event_and_update_posPP9Log_eventP3THDP14Relay_log_info+0​​x1f0)[0xe8d6f0]
/usr/local/mysql5.7/bin/mysqld(handle_slave_sql+0x163d)[0xe9a0fd]
/usr/local/mysql5.7/bin/mysqld(pfs_spawn_thread+0x1b4)[0x1209414]
libpthread.so.0(+0x7aa1)[0x7f4986974aa1] の続きを読む
/lib64/libc.so.6(クローン+0x6d)[0x7f4984c6bc4d]

いくつかの変数を取得しようとしています。
一部のポインタが無効になり、ダンプが中止される可能性があります。
クエリ(0):無効なポインタです
接続ID(スレッドID):2
ステータス: NOT_KILLED

Percona Serverの操作マニュアルは、次のサイトからダウンロードできます。
http://www.percona.com/software/percona-server/ で情報を見つけることができます
クラッシュの原因を特定するのに役立ちます。

1. 初期探索プロセス

以前同様の状況が発生したときは、ログに対応するプロンプトがあったため、メモリ不足が原因でした。

キーバッファサイズ=33554432
読み取りバッファサイズ=8388608
最大使用接続数=0
最大スレッド数=501
スレッド数=4
接続数=0
mysqldは最大で
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 4478400 K バイトのメモリ
大丈夫だと思いますが、そうでない場合は、方程式内のいくつかの変数を減らしてください。

このテスト環境の物理メモリは確かに大きくなく、残りメモリが不足しています。また、別のテスト環境のスレーブライブラリなので、メモリ割り当ても小さいです。

以前にも、同様の状況がいくつかの環境で発生しました。パラメータを調整してメモリを解放すると、システムは正常に起動できます。そこで、いくつかの一時プログラムを閉じて、MySQL の上記のパラメータの値を調整してみました。

[mysqld]
最大接続数 = 50

その後、MySQL を再起動すると、再起動が続行されます。

初期治療は失敗に終わった。

2. 連続再起動の問題を解決するためにinnodb_force_recoveryを追加する

まず、連続再起動の問題に対処するために、設定ファイルmy.cnfにinnodb_force_recoveryを追加します。

[mysqld]
innodb_force_recovery = 4

追加後、MySQL を再度起動すると、繰り返しの再起動は発生しなくなります。

データベース ログを確認すると、次のようにプロンプ​​ト [Note] InnoDB: !!! innodb_force_recovery が 4 に設定されています !!! が表示されます。

この時点でデータベースを開くことができるため、スレーブ ライブラリを起動しようとしますが、「Table 'mysql.slave_relay_log_info' is read only」というエラーが報告されます。

次にエラーログを見てみましょう。

そのため、この起動時には innodb_force_recovery は 4 に設定されます。MySQL 5.6.15 以降では、innodb_force_recovery の値が 4 以上の場合、InnoDB テーブルは読み取り専用モードになります。レプリケーション開始時にテーブルに情報を書き込む必要があるため、このときにエラーが報告されます。

注: 1-3 に設定してもまだ動作しないため、処理時に 4 に設定しました (4 を超える値はデータ ファイルを永久に破損する可能性があります。本番環境で同様の問題が発生する場合は、必ず最初にテストをコピーし、テストが合格した後に本番環境で処理してください)。この時点ですべてのデータをダンプし、後で復元することができます。

3. innodb_force_recoveryパラメータ

innodb_force_recovery は 1 ~ 6 に設定でき、値が大きいほど、それより小さい以前の値の影響がすべて含まれます。

1 (SRV_FORCE_IGNORE_CORRUPT): 検出された破損ページを無視します。破損したページが検出されてもサービスを強制的に実行します。通常、この値に設定してから、テーブルをダンプして再構築することができます。

2 (SRV_FORCE_NO_BACKGROUND): メイン スレッドの実行を防止します。メイン スレッドが完全なパージ操作を実行する必要がある場合、クラッシュが発生します。 マスター スレッドとパージ スレッドの実行を防止します。この値は、パージ フェーズ中にクラッシュが発生した場合に使用されます。

3 (SRV_FORCE_NO_TRX_UNDO): トランザクションのロールバックを実行しません。

4 (SRV_FORCE_NO_IBUF_MERGE): 挿入バッファのマージを実行しません。クラッシュを引き起こす可能性がある場合は、これらの操作を実行しないでください。統計演算を実行しないでください。この値により、データ ファイルが永久に破損する可能性があります。この値を使用すると、将来的にセカンダリ インデックスを削除して再作成する必要があります。

5 (SRV_FORCE_NO_UNDO_LOG_SCAN): InnoDB ストレージ エンジンは、REDO ログを参照せずに、コミットされていないトランザクションをコミット済みとして扱います。この時点で、InnoDB は未完了のトランザクションもコミット済みとして扱います。この値により、データ ファイルが永久に破損する可能性があります。

6 (SRV_FORCE_NO_LOG_REDO): ロールフォワード操作を実行しません。リカバリ中にREDOログのロールフォワードは実行されません。これにより、データベース ページが無効な状態になり、B ツリーやその他のデータベース構造にさらなる損傷が発生する可能性があります。

知らせ:

  1. 安全上の理由から、パラメータ値が 0 より大きい値に設定されている場合、テーブルに対して選択、作成、およびドロップ操作は実行できますが、挿入、更新、または削除操作は実行できません。
  2. MySQL 5.6.15 以降では、innodb_force_recovery の値が 4 以上の場合、InnoDB テーブルは読み取り専用モードになります。
  3. 値が 3 以下の場合、テーブルを選択、削除、または作成することでテーブルをダンプできます。
  4. MySQL 5.6.27 以降では、3 より大きい値に対する DROP TABLE もサポートされています。クラッシュの原因となったテーブルが事前にわかっている場合は、そのテーブルを削除できます。
  5. 大規模なインポートの失敗や大量の ALTER TABLE 操作によってロールバックが暴走した場合は、mysqld スレッドを強制終了し、innodb_force_recovery = 3 を設定して、再起動後にデータベースがロールバックしないようにすることができます。次に、暴走ロールバックの原因となったテーブルを削除します。テーブル内のデータが破損している場合は、テーブルの内容全体をダンプすることはできません。次に、order by primary_key desc 句を含むクエリを実行すると、破損した部分の後のデータの一部をダンプできる可能性があります。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • MySQL自動停止プラグインFEDERATEDが無効になっている場合の完璧なソリューション
  • MySQLサービスの自動停止の解決策
  • MySQL自動シャットダウン問題への対処の実践記録

<<:  WeChat アプレット wxs 日付と時刻処理の実装例

>>:  モバイル端末の水平および垂直画面ビューポート検出を決定するための js のいくつかの方法

推薦する

記事では、js を使用して弾幕効果を実現する方法を説明します

目次新しい HTML ファイルを作成します。初期テンプレートを作成するHTML の追加CSS パディ...

mysql5.6.zip形式の圧縮版インストールグラフィックチュートリアル

はじめに: MySQL は、スウェーデンの MySQL AB によって開発されたリレーショナル デー...

MySQL の自動増分主キーが使い果たされた場合の対処方法

面接では、次のようなシナリオを経験する必要があります。インタビュアー: 「MySQL を使用したこと...

WindowsにOpenSSHをインストールし、SSHキーを生成してLinuxサーバーにログインします。

SSH の正式名称は Secure SHell です。 SSH を使用すると、送信されるすべてのデ...

Dockerのインストール、イメージの作成、NodeJSプログラムの読み込みと実行の詳細なプロセス

システム環境: Windows 7 1. DockerをインストールするDocker公式サイトからd...

ゲームの Node.JS バージョンを作成する方法

目次概要ビルドプロセス関連APIリードライン基本的な使い方チョーククリア手順に関する追加情報完全なコ...

nginx + php の「入力ファイルが指定されていません」の解決策

本日、ローカル開発環境で突然「入力ファイルが指定されていません」というエラーが発生してしまいました。...

HTMLテキストオーバーフローの2つの一般的な解決策は省略記号を表示することです

方法1: CSSオーバーフロー省略を使用して解決する解決策は次のとおりです。 CSSコード: ディス...

MySQL データベースのホットスタンバイにおける問題点の分析

以前、MySQL データベースのデュアルマシン ホット スタンバイの設定方法を紹介しました。ご興味の...

ES6実装クラスのプライベート変数の書き方をいくつか詳しく説明します

プライベート変数のクロージャ実装プライベート変数は共有されないnew キーワードにより、 perso...

MySQL 5.7.19 インストールディレクトリに my.ini ファイルを作成する方法

前回の記事では、MySQL 5.7.19 無償インストール版 (64 ビット) の設定方法についての...

Youku 動画から 30 秒の広告コードを削除する 2 つの方法

誰もがこんな気持ちになったことがあると思います。30 秒の広告が入った動画を見ると、とても不快に感じ...

CSS でより美しいリンクプロンプト効果をカスタマイズする方法

提案: コードをできるだけ手書きすると、学習の効率と深さを効果的に向上できます。デフォルトでは、&l...

Excelアップロード機能を実現するVue + iViewの完全コード

1. HTML部分 <Col span="2">ファイルをアップロー...

IIS7 IIS8 http は自動的に HTTPS にジャンプします (ポート 80 はポート 443 にジャンプします)

IIS7 では、「URL REWRITE2」疑似静的モジュールがインストールされているかどうかを確...