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 PERSIST
は persisted_variables
テーブルの内容に影響します。 一方、RESET PERSIST
では変数値は変更されないため、サーバーが再起動されるまで variables_info
テーブルの内容には影響しません。
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
ファイルを削除します。 ただし、前述のように、このファイルを削除すると、すべての永続設定が失われます。