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 は次の 2 つのオプションを使用して CONNECTION | QUERY を指定することをサポートします。

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 テーブルが削除されると、テーブルは破損して使用できなくなります。このガイドでは、テーブルを再度修復する方法について説明します。

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 セキュリティ管理の詳細

<<:  Vueプロジェクトでlessを使用するためのヒント

>>:  HttpとHttpsの両方をサポートするNginxの詳細な設定

推薦する

Linux でパスワードの有効期限を表示および設定する方法

適切な設定を行うことで、Linux ユーザーにパスワードを定期的に変更させることができます。パスワー...

Ubuntu 18.04 のsources.listをAlibabaまたはTsinghuaミラーに変更する方法

1. バックアップソースリストUbuntu のデフォルトのソースは国内サーバーではないため、更新され...

XHTML 2.0 新機能プレビュー

<br />ブラウザが次世代のXHTMLを処理できるようになる前に、このよりリッチなコン...

CSS の両端揃えを実現する div+css レイアウトの 4 つの方法の概要

2 端揃えを実現する div+css レイアウトは、Web ページの組版でよく使用されます。この記事...

Docker Compose で環境変数を参照する方法の例

プロジェクトでは、さまざまな条件や使用シナリオを制御するために、docker-compose.yml...

MySQL ストレージ エンジンの基礎

前回の記事では、MySQL トランザクションについて説明しました。これで、MySQL トランザクショ...

CSS の Display、Visibility、Opacity、rgba、z-index: -1 の違い

ウェブページ上のいくつかの要素の非表示、透明、その他のプロパティを制御する必要があることがよくありま...

MySQL 5.7.17 のインストールと設定方法のグラフィックチュートリアル (Win7 の場合)

Windows 7 で MySQL 5.7.17 をインストールする方法についてのグラフィック チ...

Dockerのセキュリティについて Docker-TLS暗号化通信の問題

目次1. Dockerのセキュリティ問題2. Dockerアーキテクチャの欠陥とセキュリティメカニズ...

MySQLでテーブルデータを削除する方法

MySQL でデータを削除する方法は 2 つあります。1 つは DELETE ステートメント、もう ...

CSS エラスティック ボックス flex-grow、flex-shrink、flex-basis の詳細な説明

3 つの属性 flex-grow、flex-shrink、flex-basis の機能は次のとおりで...

HTMLとリソースがどのように読み込まれるかを理解します

このブログのすべてのコンテンツは、クリエイティブ コモンズ ライセンスの下でライセンスされています。...

geo モジュールを使用して Nginx でホワイトリストを設定する例

元の構成: http { ...... limit_conn_zone $binary_remote...

vue+echartsチャートの使用に関する問題記録

序文echarts は私が最もよく使用するチャート作成ツールであり、非常に完全なエコシステムとコンテ...

Tomcatのデフォルトプログラム公開パスの使用と変更についての説明

tomcat7 のデフォルトのプログラム公開パスは tomcat/webapps/ROOT/ です。...