本記事は Enhancing systemd notifications in MySQL の翻訳版です。

1. はじめに

本記事ではまず、機能強化される前のMySQLのsystemd通知をご紹介します。次にsystemd通知の使用方法について詳しく説明します。そしてサーバーの初期化、起動、およびシャットダウンの各ワークフローに新たに追加されたsystemd通知ついて説明し、またsystemd通知のエラーログへの記録についても言及します。

2. 基本情報

MySQLはLinuxのsystemd通知サービスを利用して「systemd通知」または単に「通知」と呼ばれる、ステータス更新を発行します。これは、systemctlユーティリティを使用してOSのShellから外部的に取得します。

MySQL 8.2より前のバージョンでは、systemd通知はMySQL Serverの起動、アップグレード、シャットダウンのワークフローにおいてのみ利用可能で、MySQL Server起動時に–initializeオプションを使用して初期化した場合には通知がありませんでした。これらのワークフローはフローの中間段階での遅延により、長時間かかる場合がありました。例えば、InnoDBのクラッシュ・リカバリによりサーバの起動が大幅に遅くなったときなどです。従来の通知では詳しい進行状況が得られず、ユーザが分かるのは一般的な「サーバー起動中」という情報のみなので、サーバーが応答していないように見えることがありました。

また、自動化されたデータベース管理ツールはMySQL Serverの初期化、起動、またはシャットダウンのプロセスを実行しますが、通常ワークフローごとにタイムアウトが定義されているので、場合によっては正確な情報が得られないことがありました。詳しい進行状況を得られるようになれば、先述のような自動管理ツールにおいても、サーバの各実行段階に基づいて条件付きロジックを実装できるようになります。

 

3. systemdとは

systemd通知は下の実行例の Status: 行に示される通り、サーバーの瞬間的なステータスや状況のように、サーバーが現在何を実行しているかをユーザに正確に知らせます。MySQLをsystemdで動作するよう設定し、先述のような自動データベース管理ツールなどがsystemd通知を受け取るようにするには、公式Webマニュアルをご覧下さい。以下はOSでsystemd通知を表示する際の実行例です。 

訳者注: イノベーション・リリースであるMySQL 8.2のサポートは既に終了しています。本記事でご紹介した機能の確認の際は、最新版のMySQL 8.4をご利用下さい(2024年6月現在)。

$ sudo systemctl status mysqld

● mysqld.service – MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2024-06-12 06:11:22 GMT; 14s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 388900 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
  Main PID: 388971 (mysqld)
   Status: “Server is operational
    Tasks: 36 (limit: 22531)
   Memory: 486.6M
   CGroup: /system.slice/mysqld.service
           └─388971 /usr/sbin/mysqld

Jun 12 06:11:13 instance01 systemd[1]: Starting MySQL Server…
Jun 12 06:11:22 instance01 systemd[1]: Started MySQL Server.

 

4. 主な変更点

4.1.  新たに追加されたsystemd通知

MySQL 8.2における機能強化によって、MySQL Serverの初期化、起動、シャットダウンのワークフローにおける重要な段階を特定し、より詳しい進行状況を知らせるsystemd通知が追加されました。下記の新しく追加された通知によって、データベース管理の際にMySQL Serverの状態をより正確に把握できるようになります。

4.1.1. 初期化中の通知

MySQL 8.2 より前のバージョンでは、MySQL Server初期化フローに関するsystemd通知はありませんでした。機能強化で新しく追加された通知を、表示される順序で以下にご紹介します。

  1. “Server Initialization in progress”「サーバー初期化中」
    サーバー初期化の開始を知らせます。 
     
  2. “InnoDB Initialization in progress”, “InnoDB Initialization [unsuccessful/successful]”
    「InnoDB初期化中」、「InnoDB初期化 [失敗/成功]」
    MySQLにおけるデフォルトのストレージ・エンジンInnoDB初期化の開始と終了を示します。
     
  3. “Initialization of MySQL system tables in progress”, “Initialization of MySQL system tables [unsuccessful/successful]”
    「MySQLシステム・テーブル初期化中」、「MySQL システム・テーブル初期化 [失敗/成功]」
    MySQL ServerがMySQLシステム・テーブルを作成しデータ入力する段階の開始と終了を表します。
     
  4. “Execution of SQL Commands from Init-file in progress”, “Execution of SQL Commands from Init-file [unsucccessful/successful]”
    「Init-fileからのSQLコマンド実行中」、「Init-fileからのSQLコマンド実行 [失敗/成功]」
    MySQL Serverがinit-fileからSQLコマンドを実行する段階の開始と終了を表します。MySQL Serverが –init-file オプションを使用して起動された場合にのみ送信される通知です。 
     
  5. “Server Initialization complete [1/0]「MySQL Server初期化完了(戻り値 = [1/0])」
    MySQL Serverの初期化が終了したことを知らせます。
     

 

4.1.2.  起動中の通知

MySQL 8.2より前のバージョンでは、MySQL Server起動時に表示されるsystemd通知は “Server startup in progress” (サーバー起動中)、”Server upgrade in progress” (サーバーのアップグレード中: アップグレードが行われている場合にのみ表示)、”Server upgrade complete” (サーバーのアップグレード完了)、および “Server is operational” (サーバー動作中)など、限られた情報のみ提供していました。今回新しく追加された通知を表示される順序で以下にご紹介します。

  1. “InnoDB Initialization in progress”, “InnoDB Initialization [unsuccessful/successful]”
    「InnoDB 初期化中」、「InnoDB 初期化 [失敗/成功]」
    InnoDB初期化の開始と終了を知らせます。
     
  2. “InnoDB crash recovery in progress”, “InnoDB crash recovery [unsuccessful/successful]”
    「InnoDBクラッシュ・リカバリ中」、「InnoDBクラッシュ・リカバリ [失敗/成功]」
    InnoDB クラッシュ・リカバリの進捗を表します。リカバリ対象データの大きさによっては、時間がかかることがあります。
     
  3. “Initialization of dynamic plugins in progress”, “Initialization of dynamic plugins [unsuccessful/successful]”
    「動的プラグイン初期化中」、「動的プラグイン初期化 [失敗/成功]」
    外部からロードされる動的プラグインの初期化開始と終了を知らせます。この動作にかかる時間は、ロードされる外部プラグインの数や、各プラグインの初期化に要する時間によって異なります。
     
  4. “Components initialization in progress”, “Components initialization [unsuccessful/successful]”
    「コンポーネント初期化中」、「コンポーネント初期化 [失敗/成功]」
    MySQL Serverによるコンポーネント初期化の開始と終了を知らせます。

 

4.1.3. シャットダウン中の通知

MySQL 8.2より前のバージョンでは、MySQL Serverシャットダウンの際ににsystemdによって送られる通知は、MySQL Serverシャットダウン開始時の”Server shutdown in progress”(シャットダウン中)と、シャットダウン完了時の”Server shutdown complete”(シャットダウン完了)のみでした。今回新しく追加された通知を表示される順序で以下にご紹介します。

  1. “Graceful shutdown of connections in progress”, “Shutdown of replica threads in progress”, “Forceful shutdown of connections in progress”
    「接続を正常にシャットダウン中」、「レプリカのスレッドのシャットダウン中」、「接続の強制シャットダウン中」
    接続スレッドの正常なシャットダウン、レプリカのスレッドのシャットダウン、および接続スレッドの強制シャットダウンを示します。接続スレッド数やレプリカのスレッド数によっては、時間がかかることがあります。また、接続シャットダウン終了を知らせる “Connection shutdown complete”(接続のシャットダウン完了)も追加されました。
  2. “Shutdown of plugins in progress”, “Shutdown of plugins complete”
    「プラグインのシャットダウン中」、「プラグインのシャットダウン完了」
    MySQL Serverによるプラグインのシャットダウンの開始と終了を知らせます。
     
  3. “Shutdown of components in progress”, “Shutdown of components complete”
    「コンポーネントのシャットダウン中」、「コンポーネントのシャットダウン完了」
    MySQL Serverによるコンポーネントのシャットダウンの開始と終了を表します。
     

 

4.2. systemd通知の相対的な順番

機能強化で新たに追加されたsystemd通知と、既存のsystemd通知が各々送信される相対的な順序について、詳しくは下記のフローチャートをご覧下さい(大きい画像で表示)。

Systemd Notification Flow Chart
 

 

4.3. systemd通知のエラーログへの記録

MySQL 8.2以降のバージョンでは、すべてのsystemd通知がエラーログに記録されます。指定されたログ・ファイルを確認するか、以下のようにパフォーマンス・スキーマの error_logテーブルで表示できます。
 

mysql> SELECT DATA FROM performance_schema.error_log WHERE ERROR_CODE=”MY-013930″ LIMIT 10\G

*************************** 1. row ***************************
DATA: systemd notify: STATUS=Server startup in progress
*************************** 2. row ***************************
DATA: systemd notify: STATUS=InnoDB initialization in progress
*************************** 3. row ***************************
DATA: systemd notify: STATUS=InnoDB initialization successful
*************************** 4. row ***************************
DATA: systemd notify: STATUS=InnoDB crash recovery in progress
*************************** 5. row ***************************
DATA: systemd notify: STATUS=InnoDB crash recovery successful
*************************** 6. row ***************************
DATA: systemd notify: STATUS=Initialization of dynamic plugins in progress
*************************** 7. row ***************************
DATA: systemd notify: STATUS=Initialization of dynamic plugins successful
*************************** 8. row ***************************
DATA: systemd notify: STATUS=Components initialization in progress
*************************** 9. row ***************************
DATA: systemd notify: STATUS=Components initialization successful
*************************** 10. row ***************************
DATA: systemd notify: READY=1 STATUS=Server is operational MAIN_PID=6891

10 rows in set (0.00 sec)

 

5. まとめ

MySQL 8.2より前のバージョンでは、実行速度が遅くなっているMySQL Serverをトラブルシューティングするといった場合に、データベース管理者がサーバー・ログを手動で調べることによって、どの段階でMySQL Serverが性能のボトルネックを起こしているか特定しなければなりませんでした。この手法は時間がかかるだけでなく、膨大な量のログ・データを解釈・分析するデータベース管理者の能力に大きく依存していたため、ヒューマン・エラーが生じるおそれがありました。

MySQL 8.2で強化されたsystemd通知によって、データベース管理者はsystemdが知らせるMySQL Serverのステータスを使用することで、MySQL Serverの動作状況に関する詳しい進行状況を収集することが可能です。またこの機能強化により、MySQL Serverの最新の実行コンテクストに関する情報がすぐに取得できるので、データベース管理者はトラブルシューティングの作業を効率的に行うことができるようになり、また性能ボトルネックの原因特定を早く正確に行うことが可能です。なおイノベーション・リリースであるMySQL 8.2のサポートは既に終了しています。本記事でご紹介した機能の確認の際は、最新版のMySQL 8.4をご利用下さい(2024年6月現在)。

本機能に限らずMySQLについてご意見などございましたら、MySQLお問い合わせ窓口までお寄せ下さい。

今後ともMySQLへの変わらぬご愛顧のほどお願い申し上げます。