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 のいくつかの方法

推薦する

MySQLへの外部ネットワークアクセスを許可し、MySQLアカウントのパスワードを変更する方法

mysqlのrootアカウント、普段はlocalhostか127.0.0.1で接続しています。会社の...

MySQL 5.7.21 のインストールとパスワード設定のチュートリアル

MySQL5.7.21のインストールとパスワード設定のチュートリアルは次のとおりです。公式リファレン...

Visual Studio Code + Reactをベースに開発環境を構築するプロセス

開発環境ウィンドウ開発ツール Visual Studio Codeノードのインストールとnpm Wi...

Web プロジェクト開発 VUE の混合と継承の原則

目次ミキシンMixin ノート (重複名)ローカルミックスイングローバル ミックスイン定義とグローバ...

0.1秒の価値!フロントエンドのウェブページの高速化の問題について簡単に説明します

私が現在の仕事の面接を受けたとき、リーダーが真剣にこう言っていたのを覚えています。「今の世の中はイン...

Docker Compose ワンクリック ELK デプロイ方式の実装

インストールFilebeat は、より軽量でより安全なため、Logstash-Forwarder に...

Vue-pdfはPDFファイルのオンラインプレビューを実装します

序文ほとんどのプロジェクトでは、PDF ファイルのオンライン プレビューに遭遇するでしょう。このプロ...

MySQL パスワード変更方法の概要

MySQL 5.7 より前のバージョンのパスワードを変更する方法:方法1: SET PASSWORD...

SQL IDENTITY_INSERT ケーススタディ

一般的に、データ テーブル内の列を ID 列として設定すると、ID 列の表示値を手動で ID 列に挿...

VirtualBox Centos7 の NAT+ホストオンリーネットワークの落とし穴のまとめ

目次1. 問題の背景2. 仮想マシン ネットワーク カードの接続方法は何ですか? 2.1 NAT 2...

Linux でリモート MySQL データベースを手動で展開する方法の詳細な説明

1. mysql をインストールします。次のコマンドを実行して、YUM ソースを更新します。 rpm...

ウェブデザイナーが知っておくべき効率的なナビゲーションデザインの3つの原則

ウェブサイトのナビゲーションを設計することは、家の基礎を築くようなものです。基礎がしっかりしていなけ...

JavaScript で円形のプログレスバー効果を実装する

この記事では、円形のプログレスバー効果を実現するためのJavaScriptの具体的なコードを参考まで...

Centos7 システムでの .NET Core 2.0 + Nginx + Supervisor 環境の構築

1. Linux .NET Core の紹介Microsoft は常に自社のプラットフォームに対して...

Firefox で英語の文字が折り返されない問題の解決方法

テキストのレイアウトには、言語に応じていくつかの書式設定要件があります。たとえば、簡体字中国語では、...