序文 この記事では、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 は次の 2 つのオプションを使用して CONNECTION | QUERY を指定することをサポートします。 KILL CONNECTION は元のものと同じで、ロールバック トランザクションを停止し、スレッド接続を閉じ、関連するリソースを解放します。 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 テーブルが削除されると、テーブルは破損して使用できなくなります。このガイドでは、テーブルを再度修復する方法について説明します。 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 をすべて閉じます。 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 の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
>>: HttpとHttpsの両方をサポートするNginxの詳細な設定
前面に書かれたfilter:blur と filter:contrast がこのような素晴らしい化学...
まず、「LISTENING」状態の TCP ソケットには 2 つの独立したキューがあることを理解する...
1. ブロックレベル要素: 独立して存在できる能力を指します。通常、ブロックレベル要素は改行によって...
目次1. 部分文字列() 2. サブストラクチャ() 3.インデックス() 4.最後のインデックス(...
序文トランザクション データ ディクショナリとアトミック DDL は、MySQL 8.0 で導入され...
序文要素がビューポート内にあるかどうかを監視する2つの方法を共有する1. 位置計算Element.g...
DNMP の紹介DNMP (Docker + Nginx + MySQL + PHP7/5 + Re...
MySQL でデータを削除するには 2 つの方法があります。切り詰めは大まかな伐採の一種である削除は...
ログインインターフェースの解像度が特に大きい場合、グラフィカルインターフェース全体が特に大きくなり、...
Docker は、あらゆるアプリケーション用の軽量でポータブルな自己完結型コンテナーを簡単に作成で...
【質問】 HP サーバーを使用しています。SSD が IOPS 約 5000 を書き込むと、%uti...
1. インデックス不足または無効なインデックスによるクエリの遅延数千万件のデータを含むテーブルで、イ...
序文世界最高の Web サーバーの 1 つである Nginx の利点は明らかです。 Nginx がリ...
1. 要件:データベースのバックアップは、実稼働環境にとって特に重要です。データベースのバックアップ...
目次アポロ コンフィギュレーション センターとは何ですか?アポロの特徴クライアントアーキテクチャアー...