mysql
サーバは、様々なシステム変数を保有し、その変数をどのように設定したかを示します
(項4.2.3. 「システム変数」
を参照のこと)。それぞれのシステム変数にはデフォルト値があります。システム変数はサーバ起動時に、コマンドラインまたはオプション
ファイルなどを使用してセットできます。大抵の場合、SET
コマンドを使用して実行中のサーバで動的に変更できます。つまり、サーバを停止または再起動せずに変更できます。プログラミング式でシステム変数の値を参考にしてください。
サーバには 2 種類のシステム変数があります。グローバル変数はサーバの全体的なオペレーションに影響し、セッション変数はそれぞれのクライアント接続でのオペレーションに影響します。与えられた変数はグローバルとセッション、両方の値を持つこともあります。グローバルおよびセッション変数は次のように関係しています。
サーバが起動するとき、すべてのグローバル変数をデフォルト値に初期化する。このデフォルト値はコマンド ラインまたはオプション ファイルなどで指定できる。オプションに関しては、項3.3. 「プログラム・オプションの指定」 を参照のこと。
サーバにはクライアントが接続するセッション変数の組み合わせがある。クライアントのセッション変数は、グローバル変数に呼応するカレント値を使用して接続タイムで初期化する。たとえば、クライアントの
SQL モードは、セッション
sql_mode
値で制御し、クライアントが
sql_mode
のグローバル値に接続するときに初期化する。
システム変数はサーバ起動時にコマンドラインまたはオプションファイルを使用してグローバル設定できます。起動オプションを使用して値を設定するときは、数値を使用し、値には
K
(キロバイト)、M
(メガバイト)、G
(ギガバイト)
などのサフィックスで与えます
(大文字あるは小文字)。これらは、1024、10242
または 10243
の倍数を示します。これにより、次のコマンドは、クエリ
キャッシュ サイズが 16
メガバイト、最大パケット サイズが 1
ギガバイトでサーバが起動することを示します。
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
の値がラインライムで 32 MB
を超えないようにするには、--maximum-query_cache_size=32M
とします。
システム変数は動的で、SET
ステートメントでサーバ稼動中に変更できます。リストは
項4.2.4.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;
システム変数に値を SET
で指定するときには、変数にスフィックス文字は使用しません。(起動オプションのときは使用する。)
ただし、この値は例示のようにプログラミング形式にできます。
SET sort_buffer_size = 10 * 1024 * 1024;
システム変数の
@@
.
var_name
シンタックスは、別のデータベース
システムによっては互換性があります。
セッション システム変数を変更する場合には、そのセッションが済むまで、または別の値に変更するまで、値の効力を維持します。この変更は別のクライアントには公開しません。
グローバル
システム変数を変更すると、サーバが再起動するまで、値を新規接続で使用するものとして記憶します。(グローバル変数の設定を永続的にするには、オプション
ファイルで設定する必要があります。)
この変更は、そのグローバル変数にアクセスするすべてのクライアントに公開することになりますが、関連しているセッション変数への変更は、変更後に接続するクライアントに対してだけ反映します。グローバル変数の変更は、その時点で接続しているクライアントのセッション変数には反映しません。SET
GLOBAL
ステートメントを発行するクライアントからのイベントにも反映しません。
SET SESSION
とだけ使用できる変数と SET
GLOBAL
を使用する場合、または
GLOBAL
(@@global.
)
をグローバル変数設定時に指定しない場合には、MySQL
がエラー
メッセージを出し、不正使用を防ぐことができます。
SESSION
変数を GLOBAL
値に、または GLOBAL
値をコンパイルされた MySQL
のデフォルト値に設定するには、DEFAULT
キーワードを使用します。たとえば、次の二つのステートメントは
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
ノート:システム変数によっては、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_awe_mem_mb | 0 |
| 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%';
ワイルドカード文字は、一致させるパターン内に入れます。厳密には、‘_
’
シングル文字と一致するワイルドカードであるため、‘\_
’
でエスケープして、文字通りに一致させます。実際には、これほどの厳密さは要求することはあまりありません。
SHOW VARIABLES では、
GLOBAL
または
SESSION
のいずれも指定しない場合、MySQL は
SESSION 値を返します。
GLOBAL
オンリーの変数を読み取るときではなく、設定するときに
GLOBAL
キーワードを必要とする理由は、今後の問題を防ぐためです。GLOBAL
変数と同じ名前を持つ SESSION
変数を取り除いた場合、SUPER
権限を持つクライアントが、接続時に
SESSION
変数だけでなく、偶発的に GLOBAL
変数も変更してしまう可能性があります。SESSION
変数を GLOBAL
と同じ名前で追加する場合、GLOBAL
変数を意図的に変更するクライアントで、クライアント自体の
SESSION
変数だけが変更したと見なす可能性があります。