MySQLインスタンスを安全にシャットダウンする方法

MySQLインスタンスを安全にシャットダウンする方法

この記事では、mysqld プロセスをシャットダウンするプロセスと、MySQL インスタンスを安全かつスムーズにシャットダウンする方法について分析します。このプロセスについてよくわからない学生は、これを参考にしてください。

終了プロセス:

1. シャットダウンを開始し、SIGTERM信号を送信する

2. 必要に応じてシャットダウンスレッドを作成する

シャットダウンがクライアントによって開始された場合、専用のシャットダウンスレッドが作成されます。

SIGTERM シグナルを直接受信してシャットダウンする場合は、シグナル処理を担当するスレッドがシャットダウン作業を担当するか、またはこれを行うために新しい独立したスレッドが作成されます。

別のシャットダウン スレッドを作成できない場合 (たとえば、メモリ不足のため)、MySQL Server は次のような警告メッセージを発行します。

エラー: サーバーを強制終了するスレッドを作成できません

3. MySQLサーバーが新しい接続要求に応答しなくなった

TCP/IPネットワーク監視を閉じ、Unixソケットおよびその他のチャネルを閉じます

4. 現在の接続とトランザクションを徐々に閉じる

アイドル接続は直ちに終了します。

現在トランザクションと SQL アクティビティがある接続は強制終了としてマークされ、そのステータスは定期的にチェックされ、次回のチェック時に閉じられるようになります (KILL 構文を参照)。

アクティブなトランザクションがある場合、トランザクションはロールバックされます。トランザクション内で非トランザクション テーブルが変更された場合、変更されたデータはロールバックできず、変更の一部しか完了しない可能性があります。

マスター/スレーブ レプリケーション シナリオでマスターの場合、レプリケーション スレッドの処理は通常のスレッドと同じです。

マスター/スレーブ レプリケーション シナリオのスレーブの場合、IO スレッドと SQL スレッドは順番に閉じられます。これらの 2 つのスレッドが現在アクティブな場合は、それらも強制終了としてマークされ、閉じられます。

スレーブ サーバーでは、SQL スレッドは現在の SQL 操作を直接停止し (レプリケーションの問題を回避するため)、スレッドを閉じることができます。

MySQL 5.0.80 以前のバージョンでは、SQL スレッドがトランザクションの実行中の場合、トランザクションはロールバックされます。5.0.81 以降では、ユーザーが KILL 操作を開始しない限り、すべての操作が完了するまで待機します。

非トランザクション テーブルに対する操作の実行中にスレーブの SQL スレッドが強制的に終了されると、マスターとスレーブ間でデータの不整合が発生する可能性があります。

5. MySQL サーバー プロセスはすべてのスレッドとすべてのストレージ エンジンを閉じます。

すべてのテーブル キャッシュを更新し、開いているテーブルをすべて閉じます。

各ストレージ エンジンは、独自のシャットダウン操作を担当します。たとえば、MyISAM は書き込みを待機しているすべての操作をフラッシュします。InnoDB は、バッファ プールをディスクにフラッシュし (MySQL 5.0.5 以降、innodb_fast_shutdown が 2 に設定されていない場合)、現在の LSN をテーブルスペースに記録してから、すべての内部スレッドを閉じます。

6. MySQLサーバープロセスが終了する

KILLコマンドについて

5.0 以降、KILL は CONNECTION | QUERY の 2 つのオプションの指定をサポートします。

KILL CONNECTION は元のものと同じで、トランザクションのロールバックを停止し、スレッド接続を閉じ、関連するリソースを解放します。
KILL QUERY は、スレッドによって現在送信されている操作のみを停止し、残りは変更しません。
KILL 操作を送信すると、スレッドに特別な kill フラグが設定されます。キルフラグは特定の状況でのみチェックされるため、スレッドを実際にシャットダウンするには通常、ある程度の時間がかかります。

1. SELECT クエリを実行する際、ORDER BY または GROUP BY ループでは、各行ブロックが読み取られた後に kill フラグがチェックされます。見つかった場合、ステートメントは終了します。

2. ALTER TABLE を実行すると、元のテーブルからいくつかの行レコード ブロックを読み取った後、kill フラグがチェックされます。見つかった場合、ステートメントは終了し、一時テーブルは削除されます。

3. UPDATE および DELETE を実行する場合、いくつかの行レコード ブロックを読み取って更新または削除した後に、kill フラグがチェックされます。見つかった場合は、ステートメントが終了し、トランザクションがロールバックされます。操作が非トランザクション テーブルで実行された場合、変更されたデータはロールバックされません。

4. GET_LOCK() 関数は NULL を返します。

5. INSERT DELAY スレッドは新しいレコードをすぐにメモリに追加して終了します。

6. 現在のスレッドがテーブルレベルのロックを保持している場合は、そのロックが解放されて終了します。

7. スレッドの書き込み操作呼び出しがディスク領域の解放を待機している場合、直接「ディスク領域がいっぱいです」というエラーをスローして終了します。

8. REPAIR TABLE または OPTIMIZE TABLE の実行時に MyISAM テーブルが KILL されると、テーブルは破損して使用できなくなります。指示に従って再度修復することができます。

MySQLを安全にシャットダウンするための提案

mysqld サービス プロセスを安全にシャットダウンするには、次の手順に従うことをお勧めします。

0. SUPER、ALL などの最高の権限を持つアカウントを使用して MySQL に接続します。UNIX ソケットを使用して接続するのが最適です。

1. バージョン 5.0 以降では、innodb_fast_shutdown = 1 を設定すると、InnoDB をすぐにシャットダウンできます (完全なパージや挿入バッファのマージなし)。MySQL バージョンをアップグレードまたはダウングレードする場合は、これを設定しないでください。

2. innodb_max_dirty_pages_pct = 0 に設定して、InnoDB がすべてのダーティ ページをディスクにフラッシュできるようにします。

3. max_connections と max_user_connections を 1 に設定します。これは、現在の接続以外に新しい接続を作成できないことを意味します。

4. 非アクティブなスレッド、つまりステータスが Sleep で、Time が 1 より大きいスレッド ID をすべて閉じます。

5. SHOW PROCESSLIST を実行して、アクティブなスレッド、特に大きなデータ セットの SELECT、大きな範囲の UPDATE、DDL 実行など、テーブル ロックを生成する可能性のあるスレッドがあるかどうかを確認します。特に注意してください。

6. SHOW ENGINE INNODB STATUS を実行して、History list length の値が低い (通常は 500 未満) ことを確認します。これは、パージされていないトランザクションが少ないことを意味します。また、Log sequence number、Log flushed up to、Last checkpoint at の値が同じであることを確認します。これは、すべての LSN がチェックポイントされていることを意味します。

7. 次に、FLUSH LOCKAL TABLES 操作を実行してすべてのテーブル キャッシュを更新し、開いているテーブルを閉じます (LOCAL の機能は、BINLOG がこの操作を記録しないようにすることです)。

8. SLAVE サーバーの場合は、大規模なトランザクションを実行するときに SQL_THREAD が終了しないように、まず IO_THREAD を閉じ、すべての RELAY LOG が適用されるまで待ってから SQL_THREAD を閉じるのが最適です。すべてが適用されるまで辛抱強く待ちます。強制的に閉じる必要がある場合は、大規模なトランザクションが完了するまで待ってから SQL_THREAD を閉じるのが最適です。

9. 最後に、mysqladmin shut down を実行します。

10. 緊急時には、innodb_fast_shutdown = 1 に設定してから、mysqladmin shutdown を直接実行するか、オペレーティングシステム層で kill または kill -9 を直接呼び出して、mysqld プロセスを強制終了することもできます (innodb_flush_log_at_trx_commit = 0 の場合、一部のトランザクションが失われる可能性があります)。ただし、mysqld プロセスを再度起動すると、CRASH RECOVERY 作業が実行されるため、トレードオフを行う必要があります。

結局、通常の状況では、mysqladmin シャットダウンを実行するだけで十分です。ブロッキングが発生した場合は、上記の内容を参照して分析と解決を行ってください。笑:)

上記は、MySQL インスタンスを安全にシャットダウンする方法の詳細です。MySQL インスタンスのシャットダウンの詳細については、123WORDPRESS.COM の他の関連記事に注意してください。

以下もご興味があるかもしれません:
  • 年末ですが、MySQL パスワードは安全ですか?
  • MySQLを安全にシャットダウンする方法
  • MySQLデータベースの名前を高速かつ安全に変更する方法(3種類)
  • MySQLプロセスを安全かつ適切にシャットダウンする方法
  • MySQLデータのセキュリティを確保するための提案
  • MySQL セキュリティ管理の詳細

<<:  Win10 + Ubuntu20.04 LTS デュアルシステムブートインターフェースの美化

>>:  JavaScriptイベント実行メカニズムの深い理解

推薦する

Java+Tomcat 環境の展開とインストールのプロセス図

次に、Centos7 に Java+Tomcat をインストールします。インターネット上には多くの記...

Nginx シグナル制御

Nginx の紹介Nginx は、高性能な HTTP およびリバース プロキシ サーバーであり、IM...

IE における条件付きコメントの利点と欠点

IE の条件付きコメントは、通常の (X)HTML コメントに対する Microsoft 独自の (...

MySQL は、元のデータと同じデータがある場合、更新ステートメントを再度実行しますか?

背景この記事では主に、MySQL が更新ステートメントを実行するときに、元のデータと同一の (つまり...

Linux での mysql-5.7.28 インストール チュートリアル

1. 公式ウェブサイトから Linux バージョンをダウンロードします: https://dev.m...

MySQL の遅いクエリとクエリ再構築方法の記録

序文スロークエリとは何か、またスロークエリを最適化するにはどうすればよいか。以下では、これら 2 つ...

Vueパンくずコンポーネントのカプセル化方法

Vueはパンくずコンポーネントをカプセル化して参照します。具体的な内容は次のとおりです。効果を達成す...

左右の幅を固定し、中央の幅を適応させたHTMLレイアウトのソリューションの詳細な説明

この記事では、次のように、誰にでも共有できる左右幅固定のミドルアダプティブ HTML レイアウトソリ...

Vue プロジェクトのパッケージ化、マージ、圧縮により、Web ページの応答速度を最適化します。

目次序文1. リクエスト内容が大きすぎる解決: CDN の紹介リクエストリソースを圧縮する1. HT...

フォーム送信時に追加のパラメータを渡すためのいくつかの一般的な方法

フォームを送信するときに、送信前に追加のパラメータが追加される状況が発生する場合があります。この問題...

Vue での親子コンポーネント通信と、sync を使用して親子コンポーネント データを同期する

目次序文子コンポーネントは親コンポーネントにデータを渡す1. 親コンポーネントから子コンポーネントに...

JavaScriptを使用してSMS認証コード間隔を送信する機能を実装する

多くのアプリやウェブサイトでは、ログインやアカウント登録の際にSMS認証コード1を送信する場所があり...

MySQLのどのフィールドがインデックスに適しているかについての簡単な説明

目次1 データベース インデックスを作成するための一般的なルールは次のとおりです。 2. 数千万件の...

MySQLでテーブルインデックスを構築する方法

目次複数の種類のフィルタリングをサポート複数の範囲のクエリを避ける並べ替えを最適化するインデックスの...

MySQL マスタースレーブ構築(複数のマスターと 1 つのスレーブ)の実装アイデアと手順

背景:最近、同社のプロジェクトは同時実行のプレッシャーに耐えられないようなので、最適化が差し迫ってい...