MySQL Server には、その構成方法を指示する多くのシステム変数が保持されています。セクション5.1.4「サーバーシステム変数」に、これらの変数の意味が記載されています。各システム変数にはデフォルト値があります。システム変数は、コマンド行のオプションを使用するか、オプションファイルでサーバー起動時に設定できます。これらのほとんどは、SET
ステートメントを使用してサーバーの実行中に動的に変更でき、これによりサーバーを停止して再起動することなくサーバーの動作を変更できます。システム変数値を式によって参照できます。
サーバーには 2 種類のシステム変数が保持されています。グローバル変数は、サーバーの操作全体に影響します。セッション変数は、個々のクライアント接続の操作に影響します。所定のシステム変数は、グローバル値とセッション値の両方を持つことができます。グローバルシステム変数とセッションシステム変数は、次のように関連しています。
サーバーが開始すると、サーバーはすべてのグローバル変数をデフォルト値に初期化します。これらのデフォルトは、コマンド行で指定されるオプションまたはオプションファイルで変更できます。(セクション4.2.3「プログラムオプションの指定」を参照してください。)
サーバーは、接続する各クライアントのセッション変数のセットも保持しています。クライアントのセッション変数は、対応するグローバル変数の現在の値を使用して、接続時に初期化されます。たとえば、クライアントの SQL モードはセッション
sql_mode
値で制御されますが、この値はクライアントがsql_mode
のグローバル値に接続するときに初期化されます。
システム変数値は、コマンド行のオプションまたはオプションファイルを使用すると、サーバー起動時にグローバルに設定できます。起動オプションを使用して、数値を取る値を設定するとき、値には 1024、10242 または 10243 の倍数を示す、K
、M
、または G
のサフィクス (大文字あるは小文字) を付けて指定でき、それぞれがキロバイト、メガバイト、またはギガバイトの単位を示します。これにより、次のコマンドは 16M バイトのクエリーキャッシュサイズと、1G バイトの最大パケットサイズでサーバーを開始します。
mysqld --query_cache_size=16M --max_allowed_packet=1G
オプションファイル内で、これらの変数は次のように設定されます。
[mysqld]
query_cache_size=16M
max_allowed_packet=1G
サフィクスの大文字、小文字の区別は問わず、16M
と 16m
、1G
と 1g
を同等とします。
SET
ステートメントを使用して、実行時にシステム変数に設定できる最大値を制限するには、サーバー起動時に --maximum-
の形式のオプションを使用すると、この最大値を指定できます。たとえば、var_name
=value
query_cache_size
の値が実行時に 32M バイトを超えないようにするには、オプション --maximum-query_cache_size=32M
を使用します。
多くのシステム変数は動的であり、SET
ステートメントを利用してサーバーが実行している間に変更できます。リストついては、セクション5.1.5.2「動的システム変数」を参照してください。SET
を利用してシステム変数を変更するには、任意で修飾子が先行する var_name
としてシステム変数を参照してください。
変数がグローバル変数であることを明示的に指示するためには、その名前の前に
GLOBAL
または@@GLOBAL.
を付けます。グローバル変数を設定するにはSUPER
権限が必要です。変数がセッション変数であることを明示的に指示するには、その名前の前に
SESSION
、@@SESSION.
、または@@
を付けます。セッション変数を設定するのに特別な権限は必要ありませんが、クライアントは自分自身のセッション変数のみ変更でき、別のクライアントの変数は変更できません。LOCAL
と@@LOCAL.
はSESSION
と@@SESSION.
のシノニムです。修飾子が何もなければ、
SET
はセッション変数を変更します。
SET
ステートメントは、カンマで区切られた複数の変数割り当てを含むことができます。複数のシステム変数を設定した場合、ステートメント内のいちばん最近の GLOBAL
または SESSION
修飾子が、指定された修飾子を持たない後続の変数に利用されます。
例:
SET sort_buffer_size=10000;
SET @@LOCAL.sort_buffer_size=10000;
SET GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000;
SET @@sort_buffer_size=1000000;
SET @@GLOBAL.sort_buffer_size=1000000, @@LOCAL.sort_buffer_size=1000000;
システム変数の @@
構文では、ほかの一部のデータベースシステムとの互換性をサポートしています。
var_name
セッションシステム変数を変更すると、セッションが終了するまで、または変数を異なる値に変更するまではその値は有効になります。別のクライアントは変更を見ることができません。
グローバルシステム変数を変更すると、その値はサーバーが再起動するまでの間記憶され、新しい接続に利用されます。(グローバルシステム変数を永続的に設定するには、オプションファイルに設定する必要があります。)そのグローバル変数にアクセスするすべてのクライアントが変更を確認できます。ただし変更は、変更後に接続するクライアントの対応するセッション変数にのみ影響を与えます。グローバル変数の変更は、現在接続中のクライアントのセッション変数に影響を与えません (SET GLOBAL
ステートメントを発行するクライアントのセッション変数にも影響を与えません)。
誤用を防ぐために、SET SESSION
とのみ利用できる変数とともに SET GLOBAL
を使用したり、グローバル変数の設定時に GLOBAL
(または @@GLOBAL.
) を指定しなかったりした場合に、MySQL でエラーが生じます。
SESSION
変数を GLOBAL
値に設定したり、GLOBAL
値をコンパイル時の MySQL のデフォルト値に設定したりするには、DEFAULT
キーワードを使用します。たとえば、次の 2 つのステートメントは、max_join_size
のセッション値をグローバル値に設定する上で同一です。
SET max_join_size=DEFAULT;
SET @@SESSION.max_join_size=@@GLOBAL.max_join_size;
すべてのシステム変数を DEFAULT
に設定できるわけではありません。そのような場合、DEFAULT
を使用するとエラーが発生します。
いずれかの @@
修飾子を使用することによって、特定のグローバルシステム変数またはセッションシステム変数の値を式で参照できます。たとえば、次のようにして SELECT
ステートメントで値を取得できます。
SELECT @@GLOBAL.sql_mode, @@SESSION.sql_mode, @@sql_mode;
@@
のような式でシステム変数を参照するとき (つまり、var_name
@@GLOBAL.
または @@SESSION.
を指定しない場合)、MySQL はセッション値が存在すればそれを返し、それ以外の場合はグローバル値を返します。(これは、常にセッション値を参照する SET @@
とは異なります。)
var_name
= value
SHOW VARIABLES
によって表示される一部の変数は、SELECT @@
構文で使用できない場合があり、var_name
「不明なシステム変数です」
と表示されます。その場合の回避方法として、SHOW VARIABLES LIKE '
を使用できます。
var_name
'
値乗数を指定するサフィクスは、サーバーの起動時に変数を設定するときに使用できますが、実行時に 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 | 50 |
| basedir | /home/mysql/ |
| binlog_cache_size | 32768 |
| bulk_insert_buffer_size | 8388608 |
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /home/mysql/share/mysql/charsets/ |
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
...
| innodb_additional_mem_pool_size | 1048576 |
| innodb_autoextend_increment | 8 |
| innodb_buffer_pool_size | 8388608 |
| innodb_checksums | ON |
| innodb_commit_concurrency | 0 |
| innodb_concurrency_tickets | 500 |
| innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
...
| version | 5.1.6-alpha-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%';
ワイルドカード文字は、照合されるパターン内のどの場所でも利用できます。厳密には、「_
」 は任意の 1 文字と一致するワイルドカードであるため、文字どおりに照合するには 「\_
」 としてエスケープしてください。実際には、これはほとんど必要ありません。
SHOW VARIABLES
で GLOBAL
および SESSION
をいずれも指定しない場合、MySQL は SESSION
値を返します。
GLOBAL
専用の変数を設定するときに GLOBAL
キーワードが必要であるのに、それらを取得するときにキーワードが不要である理由は、今後の問題を防ぐためです。GLOBAL
変数と同じ名前を持つ SESSION
変数を削除した場合、SUPER
権限を持つクライアントが、その接続に対する SESSION
変数だけでなく、誤って GLOBAL
変数も変更してしまう可能性があります。SESSION
変数を GLOBAL
変数と同じ名前で追加する場合、クライアントが GLOBAL
変数を変更しようとしたが、クライアントの SESSION
変数のみが変更されてしまう可能性があります。