MySQL 8.0 リファレンスマニュアル


5.1.9.3 永続化されるシステム変数

MySQL サーバーは、その操作を構成するシステム変数を保持します。 システム変数には、サーバー操作全体に影響するグローバル値、現在のセッションに影響するセッション値、またはその両方を指定できます。 多くのシステム変数は動的であり、SET ステートメントを使用して実行時に変更し、現在のサーバーインスタンスの操作に影響を与えることができます。 SET を使用して、特定のグローバルシステム変数をデータディレクトリ内の mysqld-auto.cnf ファイルに永続化し、後続の起動のためのサーバー操作に影響を与えることもできます。 RESET PERSIST は、永続化された設定を mysqld-auto.cnf から削除します。

次の説明では、システム変数の永続化の側面について説明します:

永続システム変数の概要

実行時にグローバルシステム変数を永続化する機能により、サーバーの起動後も保持されるサーバー構成が可能になります。 多くのシステム変数は、起動時に my.cnf オプションファイルから設定することも、実行時に SET ステートメントを使用して設定することもできますが、サーバーを構成するには、サーバーホストへのログインアクセスが必要になるか、実行時またはリモートでサーバーを永続的に構成する機能を提供しません:

  • オプションファイルを変更するには、そのファイルに直接アクセスする必要があります。これには、MySQL サーバーホストへのログインアクセスが必要です。 これは必ずしも便利ではありません。

  • SET GLOBAL を使用したシステム変数の変更は、ローカルまたはリモートホストから実行されるクライアントから実行できるランタイム機能ですが、変更は現在実行中のサーバーインスタンスにのみ影響します。 設定は永続的ではなく、後続のサーバー起動には引き継がれません。

オプションファイルを編集するか、SET GLOBAL を使用して達成可能なものを超えてサーバー構成の管理機能を強化するために、MySQL には、システム変数設定をデータディレクトリ内の mysqld-auto.cnf ファイルに永続化する SET 構文のバリアントが用意されています。 例:

SET PERSIST max_connections = 1000;
SET @@PERSIST.max_connections = 1000;

SET PERSIST_ONLY back_log = 100;
SET @@PERSIST_ONLY.back_log = 100;

MySQL には、mysqld-auto.cnf から永続システム変数を削除するための RESET PERSIST ステートメントも用意されています。

システム変数の永続化によって実行されるサーバー構成には、次の特性があります:

  • 永続化された設定は実行時に行われます。

  • 永続的な設定は永続的です。 これらはサーバーの再起動後に適用されます。

  • 永続的な設定は、ローカルクライアントまたはリモートホストから接続するクライアントから行うことができます。 これにより、中央クライアントホストから複数の MySQL サーバーをリモートで構成する際に便利です。

  • システム変数を永続化するには、MySQL サーバーホストへのログインアクセス権や、オプションファイルへのファイルシステムアクセス権は必要ありません。 設定を永続化する機能は、MySQL 権限システムを使用して制御されます。 セクション5.1.9.1「システム変数権限」を参照してください。

  • 十分な権限を持つ管理者は、システム変数を永続化してサーバーを再構成し、RESTART ステートメントを実行して変更された設定をすぐにサーバーで使用できます。

  • 永続化された設定では、エラーに関するフィードバックがすぐに提供されます。 手動で入力した設定のエラーは、後で検出される可能性があります。 構文エラーのある設定は成功せず、サーバー構成を変更しないため、システム変数を永続化する SET ステートメントを使用すると、不正な設定の可能性が回避されます。

システム変数を永続化するための構文

システム変数の永続化には、次の SET 構文オプションを使用できます:

  • グローバルシステム変数をデータディレクトリ内の mysqld-auto.cnf オプションファイルに永続化するには、変数名の前に PERSIST キーワードまたは@@PERSIST. 修飾子を付けます:

    SET PERSIST max_connections = 1000;
    SET @@PERSIST.max_connections = 1000;

    SET GLOBAL と同様に、SET PERSIST はグローバル変数のランタイム値を設定しますが、変数設定も mysqld-auto.cnf ファイルに書き込みます (既存の変数設定がある場合は置き換えます)。

  • グローバル変数のランタイム値を設定せずにグローバルシステム変数を mysqld-auto.cnf ファイルに永続化するには、変数名の前に PERSIST_ONLY キーワードまたは@@PERSIST_ONLY. 修飾子を付けます:

    SET PERSIST_ONLY back_log = 1000;
    SET @@PERSIST_ONLY.back_log = 1000;

    PERSIST と同様に、PERSIST_ONLY は変数設定を mysqld-auto.cnf に書き込みます。 ただし、PERSIST とは異なり、PERSIST_ONLY はグローバル変数のランタイム値を変更しません。 これにより、PERSIST_ONLY は、サーバーの起動時にのみ設定できる読取り専用システム変数の構成に適しています。

SET の詳細は、セクション13.7.6.1「変数代入の SET 構文」 を参照してください。

永続化されたシステム変数を削除するには、次の RESET PERSIST 構文オプションを使用できます:

  • mysqld-auto.cnf からすべての永続変数を削除するには、システム変数に名前を付けずに RESET PERSIST を使用します:

    RESET PERSIST;
  • mysqld-auto.cnf から特定の永続変数を削除するには、ステートメントで名前を付けます:

    RESET PERSIST system_var_name;

    これには、プラグインが現在インストールされていない場合でも、プラグインシステム変数が含まれます。 変数がファイルに存在しない場合は、エラーが発生します。

  • mysqld-auto.cnf から特定の永続変数を削除し、ファイルに変数が存在しない場合にエラーではなく警告を生成するには、前の構文に IF EXISTS 句を追加します:

    RESET PERSIST IF EXISTS system_var_name;

RESET PERSIST の詳細は、セクション13.7.8.7「RESET PERSIST ステートメント」 を参照してください。

SET を使用してグローバルシステム変数を DEFAULT の値またはリテラルのデフォルト値に永続化すると、変数のデフォルト値が割り当てられ、変数の設定が mysqld-auto.cnf に追加されます。 ファイルから変数を削除するには、RESET PERSIST を使用します。

一部のシステム変数は永続化できません。 セクション5.1.9.4「永続的で永続的に制限されないシステム変数」を参照してください。

プラグインによって実装されたシステム変数は、SET ステートメントの実行時にプラグインがインストールされた場合に永続化できます。 永続化されたプラグイン変数の割り当ては、プラグインがまだインストールされている場合、それ以降のサーバーの再起動で有効になります。 プラグインがインストールされなくなった場合、サーバーが mysqld-auto.cnf ファイルを読み取るときにプラグイン変数は存在しません。 この場合、サーバーはエラーログに警告を書き込み、続行します:

currently unknown variable 'var_name'
was read from the persisted config file
永続化されたシステム変数に関する情報の取得

パフォーマンススキーマ persisted_variables テーブルは、mysqld-auto.cnf ファイルへの SQL インタフェースを提供し、SELECT ステートメントを使用して実行時にその内容を検査できるようにします。 セクション27.12.14.1「パフォーマンススキーマ persisted_variables テーブル」を参照してください。

パフォーマンススキーマ variables_info テーブルには、各システム変数が最後に設定された時期とユーザーを示す情報が含まれています。 セクション27.12.14.2「パフォーマンススキーマ variables_info テーブル」を参照してください。

テーブルの内容は mysqld-auto.cnf ファイルの内容に対応しているため、RESET PERSISTpersisted_variables テーブルの内容に影響します。 一方、RESET PERSIST では変数値は変更されないため、サーバーが再起動されるまで variables_info テーブルの内容には影響しません。

mysqld-auto.cnf ファイルのフォーマットおよびサーバー処理

mysqld-auto.cnf ファイルでは、次のような JSON 形式が使用されます (読みやすくするために少し再フォーマットされています):

{
  "Version": 1,
  "mysql_server": {
    "max_connections": {
      "Value": "152",
      "Metadata": {
        "Timestamp": 1519921341372531,
        "User": "root",
        "Host": "localhost"
      }
    },
    "transaction_isolation": {
      "Value": "READ-COMMITTED",
      "Metadata": {
        "Timestamp": 1519921553880520,
        "User": "root",
        "Host": "localhost"
      }
    },
    "mysql_server_static_options": {
      "innodb_api_enable_mdl": {
        "Value": "0",
        "Metadata": {
          "Timestamp": 1519922873467872,
          "User": "root",
          "Host": "localhost"
        }
      },
      "log_slave_updates": {
        "Value": "1",
        "Metadata": {
          "Timestamp": 1519925628441588,
          "User": "root",
          "Host": "localhost"
        }
      }
    }
  }
}

起動時に、サーバーは他のすべてのオプションファイルの後に mysqld-auto.cnf ファイルを処理します (セクション4.2.2.2「オプションファイルの使用」 を参照)。 サーバーは、ファイルの内容を次のように処理します:

  • persisted_globals_load システム変数が無効な場合、サーバーは mysqld-auto.cnf ファイルを無視します。

  • SET PERSIST_ONLY を使用して永続化された読取り専用変数のみが"mysql_server_static_options"セクションに表示されます。 このセクション内にあるすべての変数はコマンド行に追加され、ほかのコマンド行オプションで処理されます。

  • 残りのすべての永続変数は、サーバーがクライアント接続のリスニングを開始する直前に、後で SET GLOBAL ステートメントと同等のものを実行することによって設定されます。 したがって、これらの設定は、起動プロセスが遅くなるまで有効になりません。これは、特定のシステム変数には適していない可能性があります。 このような変数は、mysqld-auto.cnf ではなく my.cnf で設定することをお薦めします。

mysqld-auto.cnf ファイルの管理はサーバーに残す必要があります。 ファイルの操作は、手動ではなく、SET および RESET PERSIST ステートメントを使用してのみ実行する必要があります:

  • ファイルを削除すると、次回のサーバー起動時にすべての永続設定が失われます。 (これは、これらの設定を使用せずにサーバーを再構成する場合に許可されます。) ファイル自体を削除せずにファイル内のすべての設定を削除するには、次のステートメントを使用します:

    RESET PERSIST;
  • ファイルを手動で変更すると、サーバーの起動時に解析エラーが発生する場合があります。 この場合、サーバーはエラーを報告して終了します。 この問題が発生した場合は、persisted_globals_load システム変数を無効にするか、--no-defaults オプションを指定してサーバーを起動します。 または、mysqld-auto.cnf ファイルを削除します。 ただし、前述のように、このファイルを削除すると、すべての永続設定が失われます。


関連キーワード:  変数, サーバー, 永続, PERSIST, 設定, mysqld, 実行, 構成, インストール, 起動