MySQL サーバーは、その操作を構成する多くのシステム変数を保持します。セクション5.1.8「サーバーシステム変数」 では、これらの変数の意味について説明します。 各システム変数にはデフォルト値があります。 システム変数は、コマンド行のオプションを使用するか、オプションファイルでサーバー起動時に設定できます。 これらのほとんどは、SET
ステートメントを使用してサーバーの実行中に動的に変更でき、これによりサーバーを停止して再起動することなくサーバーの動作を変更できます。 式でシステム変数値を使用することもできます。
多くのシステム変数が組み込まれています。 システム変数は、サーバープラグインまたはコンポーネントによってインストールすることもできます:
サーバープラグインによって実装されたシステム変数は、プラグインのインストール時に公開され、プラグイン名で始まる名前を持ちます。 たとえば、
audit_log
プラグインはaudit_log_policy
という名前のシステム変数を実装します。コンポーネントによって実装されたシステム変数は、コンポーネントのインストール時に公開され、コンポーネント固有の接頭辞で始まる名前を持ちます。 たとえば、
log_filter_dragnet
エラーログフィルタコンポーネントは、log_error_filter_rules
というシステム変数を実装します。このシステム変数のフルネームはdragnet.log_error_filter_rules
です。 この変数を参照するには、フルネームを使用します。
システム変数が存在するスコープは 2 つあります。 グローバル変数は、サーバーの操作全体に影響します。 セッション変数は、個々のクライアント接続の操作に影響します。 所定のシステム変数は、グローバル値とセッション値の両方を持つことができます。 グローバルシステム変数とセッションシステム変数は、次のように関連しています。
サーバーが起動すると、各グローバル変数がデフォルト値に初期化されます。 これらのデフォルトは、コマンド行で指定されるオプションまたはオプションファイルで変更できます。 (セクション4.2.2「プログラムオプションの指定」を参照してください。)
-
サーバーは、接続する各クライアントのセッション変数のセットも保持しています。 クライアントのセッション変数は、対応するグローバル変数の現在の値を使用して、接続時に初期化されます。 たとえば、クライアント SQL モードは、クライアントがグローバル
sql_mode
値の値に接続するときに初期化されるセッションsql_mode
値によって制御されます。一部のシステム変数では、対応するグローバル値からセッション値が初期化されません。初期化されている場合は、変数の説明に示されます。
システム変数値は、コマンド行のオプションまたはオプションファイルを使用すると、サーバー起動時にグローバルに設定できます。 起動時のシステム変数の構文はコマンドオプションの構文と同じであるため、変数名内ではダッシュおよびアンダースコアを同じ意味で使用できます。 たとえば、--general_log=ON
と --general-log=ON
は同等です。
起動オプションを使用して、数値を取る値を設定するとき、値には 1024、10242 または 10243 の倍数を示す、K
、M
、または G
のサフィクス (大文字あるは小文字) を付けて指定でき、それぞれがキロバイト、メガバイト、またはギガバイトの単位を示します。 MySQL 8.0.14 の時点では、1024 4、1024 5 または 1024 6 の乗数を示すために、T
、P
および E
も使用できます。 したがって、次のコマンドは、16 メガバイトの InnoDB
ログファイルサイズと最大パケットサイズを 1 ギガバイトにしてサーバーを起動します:
mysqld --innodb-log-file-size=16M --max-allowed-packet=1G
オプションファイル内で、これらの変数は次のように設定されます。
[mysqld]
innodb_log_file_size=16M
max_allowed_packet=1G
サフィクスの大文字、小文字の区別は問わず、16M
と 16m
、1G
と 1g
を同等とします。
SET
ステートメントを使用してシステム変数を実行時に設定できる最大値を制限するには、サーバー起動時に --maximum-
形式のオプションを使用して、この最大値を指定します。 たとえば、実行時に var_name
=value
innodb_log_file_size
の値が 32MB を超えないようにするには、--maximum-innodb-log-file-size=32M
オプションを使用します。
多くのシステム変数は動的であり、実行時に SET
ステートメントを使用して変更できます。 リストついては、セクション5.1.9.2「動的システム変数」を参照してください。 SET
を使用してシステム変数を変更するには、その前に修飾子を付けて名前を参照します (オプション)。 実行時に、システム変数名はダッシュではなくアンダースコアを使用して記述する必要があります。 次の例は、この構文を簡単に示しています:
-
グローバルシステム変数を設定します:
SET GLOBAL max_connections = 1000; SET @@GLOBAL.max_connections = 1000;
-
グローバルシステム変数を
mysqld-auto.cnf
ファイルに永続化 (およびランタイム値を設定) します:SET PERSIST max_connections = 1000; SET @@PERSIST.max_connections = 1000;
-
グローバルシステム変数を (ランタイム値を設定せずに)
mysqld-auto.cnf
ファイルに永続化します:SET PERSIST_ONLY back_log = 1000; SET @@PERSIST_ONLY.back_log = 1000;
-
セッションシステム変数を設定します:
SET SESSION sql_mode = 'TRADITIONAL'; SET @@SESSION.sql_mode = 'TRADITIONAL'; SET @@sql_mode = 'TRADITIONAL';
SET
構文の詳細は、セクション13.7.6.1「変数代入の SET 構文」 を参照してください。 システム変数を設定および永続化するための権限要件の詳細は、セクション5.1.9.1「システム変数権限」 を参照してください
値乗数を指定するサフィクスは、サーバーの起動時に変数を設定するときに使用できますが、実行時に SET
で値を設定するためには使用できません。 一方、SET
を使用すると、式を使用して変数の値を割り当てることができますが、サーバーの起動時に変数を設定するときには使用できません。 たとえば、サーバーの起動時に次の 1 行目は有効ですが 2 行目は無効です。
shell> mysql --max_allowed_packet=16M
shell> mysql --max_allowed_packet=16*1024*1024
逆に、実行時に次の 2 行目は有効ですが 1 行目は無効です。
mysql> SET GLOBAL max_allowed_packet=16M;
mysql> SET GLOBAL max_allowed_packet=16*1024*1024;
一部のシステム変数は、SET
ステートメントで ON
または 1
に設定することで有効化され、OFF
または 0
に設定することで無効化されます。 ただし、このような変数をコマンドラインまたはオプションファイルで設定するには、1
または 0
に設定する必要があります。ON
または OFF
に設定しても機能しません。 たとえば、コマンド行において、--delay_key_write=1
は機能しますが、--delay_key_write=ON
は機能しません。
システム変数名と値を表示するには、SHOW VARIABLES
ステートメントを使用します。
mysql> SHOW VARIABLES;
+---------------------------------+-----------------------------------+
| Variable_name | Value |
+---------------------------------+-----------------------------------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
| automatic_sp_privileges | ON |
| back_log | 151 |
| basedir | /home/mysql/ |
| binlog_cache_size | 32768 |
| bulk_insert_buffer_size | 8388608 |
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /home/mysql/share/mysql/charsets/ |
| collation_connection | utf8_general_ci |
| collation_database | utf8mb4_0900_ai_ci |
| collation_server | utf8mb4_0900_ai_ci |
...
| innodb_autoextend_increment | 8 |
| innodb_buffer_pool_size | 8388608 |
| innodb_commit_concurrency | 0 |
| innodb_concurrency_tickets | 500 |
| innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
...
| version | 8.0.1-dmr-log |
| version_comment | Source distribution |
| version_compile_machine | i686 |
| version_compile_os | suse-linux |
| wait_timeout | 28800 |
+---------------------------------+-----------------------------------+
LIKE
句では、ステートメントはパターンに一致する変数のみを表示します。 特定の変数名を取得するには、LIKE
句を次のように使用します。
SHOW VARIABLES LIKE 'max_join_size';
SHOW SESSION VARIABLES LIKE 'max_join_size';
名前がパターンと一致する変数のリストを取得するには、LIKE
句の中で %
のワイルドカード文字を使用します。
SHOW VARIABLES LIKE '%size%';
SHOW GLOBAL VARIABLES LIKE '%size%';
ワイルドカード文字は、照合されるパターン内のどの場所でも利用できます。 厳密に言えば、_
は単一の文字と一致するワイルドカードであるため、文字どおりに一致するように\_
としてエスケープする必要があります。 実際には、これはほとんど必要ありません。
SHOW VARIABLES
で GLOBAL
および SESSION
をいずれも指定しない場合、MySQL は SESSION
値を返します。
GLOBAL
のみの変数を設定するときに GLOBAL
キーワードを要求するが、取得時には要求しない理由は、将来の問題を回避するためです:
GLOBAL
変数と同じ名前のSESSION
変数を削除しようとしましたが、グローバル変数を変更するのに十分な権限を持つクライアントが、独自のセッションのSESSION
変数だけでなく、誤ってGLOBAL
変数を変更する可能性があります。GLOBAL
変数と同じ名前でSESSION
変数を追加した場合、GLOBAL
変数を変更しようとしているクライアントでは、独自のSESSION
変数のみが変更されている可能性があります。