クローズプロセス:
シャットダウンがクライアントによって開始された場合、専用のシャットダウンが行われます。スレッドが作成されます
シャットダウンのために SIGTERM シグナルが直接受信された場合、信号処理を特に担当するスレッドがシャットダウン作業を担当するか、この問題を担当する新しい独立したスレッドが作成されます
シャットダウン スレッドを作成できない場合 (メモリ不足など)、MySQL サーバーは次のような警告メッセージを発行します:
エラー: サーバーを強制終了するスレッドを作成できません
TCP /IP ネットワーク監視を閉じ、Unix ソケットとその他のチャネルを閉じます
現在、トランザクションとトランザクションが存在します。 SQL アクティブ接続。強制終了としてマークされ、次回チェックされたときに閉じられるように定期的にステータスをチェックします (KILL 構文を参照)
現在アクティブなトランザクションがある場合、トランザクションはロールされます。トランザクション内で非トランザクション テーブルも変更された場合、変更されたデータはロールバックできず、変更の一部のみが完了する可能性があります。
マスター/スレーブ レプリケーション シナリオの場合、処理は完了します。レプリケーション スレッドのスレッドは通常のスレッドと同じです。
マスター/スレーブの場合、レプリケーション シナリオのスレーブは、これら 2 つのスレッドが現在アクティブである場合、順番にシャットダウンします。また、kill マークを付けてシャットダウンします。
スレーブ サーバーでは、SQL スレッドは (レプリケーションの問題を回避するために) SQL 操作を直接停止してから、スレッドを閉じることができます。 5.0.80 以前のバージョンでは、SQL スレッドが途中でトランザクションを実行している場合、トランザクションは 5.0 からロールバックされます。81 以降では、ユーザーが KILL 操作を開始しない限り、すべての操作が終了するまで待機します。 。
非トランザクション テーブルで操作を実行するときにスレーブの SQL スレッドが強制的に KILL されると、マスター データとスレーブ データの間で不整合が発生する可能性があります。
5. MySQL サーバー プロセスはすべてのスレッドとすべてのストレージ エンジンを閉じます。
- すべてのテーブル キャッシュを更新し、開いているすべてのテーブルを閉じます。 各ストレージ エンジンは、書き込みを待機しているすべての操作をディスクに更新します (MySQL から)。 5.0.5 innodb_fast_shutdown が 2 に設定されていない場合は開始し、現在の LSN を表スペースに記録し、すべての内部スレッドを閉じます。
6. MySQL サーバープロセスが終了します
- KILL コマンドについて5.0 以降、KILL は 2 つのオプション CONNECTION | QUERY の指定をサポートします:
KILL CONNECTION は元のオプションと同じで、ロールバックを停止します。トランザクションを閉じ、関連リソースを解放します。
- KILL QUERY は、スレッドによって現在送信されている操作のみを停止し、他の操作は変更されません。
- KILL 操作を送信した後、特別な Kill マークが設定されます。スレッド上のビット。 Kill フラグ ビットは特定の状況下でのみチェックされるため、通常、スレッドを実際にシャットダウンするには時間がかかります:
1. SELECT クエリを実行するとき、ORDER BY または GROUP BY ループでそれぞれいくつかの行レコードを読み取ります。 time ブロックの後にキル マーク ビットがチェックされ、存在することが判明した場合、ステートメントは終了します。
2. ALTER TABLE を実行すると、各行レコード ブロックが読み取られた後にキル マーク ビットがチェックされます。元のテーブルが存在することが判明した場合、ステートメントは終了し、一時テーブルを削除します。 3. UPDATE および DELETE を実行すると、行レコード ブロックが読み取られて更新されるたびにキル マーク ビットがチェックされます。存在することが判明した場合、ステートメントは終了し、ロール トランザクションを返します。 操作が非トランザクション テーブル上で行われた場合、GET_LOCK() 関数は NULL を返します。 ; 5. INSERT DELAY スレッドはすぐに新しいレコードを追加して終了します 6. 現在のスレッドがテーブルレベルのロックを保持している場合は、解放されて終了します。スレッドの書き込み操作呼び出しがディスク領域が解放されるのを待っている場合、REPAIR TABLE または MyISAM テーブルが KILL されると、直接「ディスク領域がいっぱいです」エラーがスローされ、終了します。テーブルを最適化すると、テーブルが損傷して使用できなくなり、ガイドが再度修復されます。 MySQL を安全にシャットダウンするためのいくつかの提案 mysqld サービス プロセスを安全にシャットダウンしたい場合は、次の手順に従うことをお勧めします:
0 などの最高の権限を持つアカウントを使用します。 MySQL に接続するには ALL、できれば Unix ソケットを使用して接続します。バージョン 5.0 以降では、InnoDB の迅速なシャットダウンを許可します (完全なパージとバッファのマージを行わない)。 MySQL バージョンをアップグレードまたはダウングレードします。設定しないでください ;
2. InnoDB がすべてのダーティ ページをディスクにフラッシュするようにするには、innodb_max_dirty_pages_pct = 0 を設定します。
3. max_connections と max_user_connections を 1 に設定します。これは、最終的に、現在の接続以外の新しい接続の作成が許可されないことを意味します。
- 4. ステータスは次のとおりです。 Sleep と Time が 1 より大きいスレッド ID。
- 5. SHOW PROCESSLIST を実行して、アクティブなスレッド、特に大きなデータ セットを含む SELECT や大きな範囲を含む UPDATE を生成するスレッドがあるかどうかを確認します。または DDL を実行する場合は、特に注意してください。
- 6. SHOW ENGINE INNODB STATUS を実行して、履歴リストの長さの値が低いこと、つまりパージされていないトランザクションが非常に少ないことを確認します。ログのシーケンス番号、ログのフラッシュされた時点と最後のチェックポイントの 3 つの状態の値は同じです。つまり、すべての LSN がチェックポイントされています
- 7 次に、FLUSH LOCKAL TABLES 操作を実行してリフレッシュします。すべてのテーブルのキャッシュを削除し、開いているテーブルを閉じます (LOCAL の機能は、この操作で BINLOG が記録されないことです)。SLAVE サーバーの場合は、最初に IO_THREAD を閉じて、すべての RELAY を待つのが最善です。ログを使い切ってから SQL_THREAD を閉じて、SQL_THREAD による大規模なトランザクションの実行を回避します。終了する場合は、すべてのアプリケーションが完了するまで辛抱強く待ちます。強制的にシャットダウンする必要がある場合は、大規模なトランザクションの終了を待ってから SQL_THREAD を閉じることをお勧めします。 ;
- 9. 最後に、mysqladmin のシャットダウンを実行します。
- 10. 緊急時には、innodb_fast_shutdown = 1 に設定して、mysqladmin shutdown を直接実行することも、オペレーティング システム層で kill または kill -9 を直接呼び出して mysqld プロセスを強制終了することもできます (innodb_flush_log_at_trx_commit 時に失われる可能性があります)。 = 0 部分的なトランザクション)、ただし、mysqld プロセスが再度開始されると、CRASH RECOVERY が実行されるため、比較検討する必要があります。
- ここまで述べましたが、実際には、通常の状況では、ブロックが発生した場合は、mysqladmin のシャットダウンを実行するだけで十分です。分析と解決策については、上記の内容を参照してください。
以上がMySQL の最適化 - MySQL インスタンスを安全にシャットダウンする方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。