MySQL 5.6 リファレンスマニュアル  /  ...  /  システム変数の使用

5.1.5 システム変数の使用

MySQL Server には、その構成方法を指示する多くのシステム変数が保持されています。セクション5.1.4「サーバーシステム変数」に、これらの変数の意味が記載されています。各システム変数にはデフォルト値があります。システム変数は、コマンド行のオプションを使用するか、オプションファイルでサーバー起動時に設定できます。これらのほとんどは、SET ステートメントを使用してサーバーの実行中に動的に変更でき、これによりサーバーを停止して再起動することなくサーバーの動作を変更できます。システム変数値を式によって参照できます。

サーバーには 2 種類のシステム変数が保持されています。グローバル変数は、サーバーの操作全体に影響します。セッション変数は、個々のクライアント接続の操作に影響します。所定のシステム変数は、グローバル値とセッション値の両方を持つことができます。グローバルシステム変数とセッションシステム変数は、次のように関連しています。

  • サーバーが開始すると、サーバーはすべてのグローバル変数をデフォルト値に初期化します。これらのデフォルトは、コマンド行で指定されるオプションまたはオプションファイルで変更できます。(セクション4.2.3「プログラムオプションの指定」を参照してください。)

  • サーバーは、接続する各クライアントのセッション変数のセットも保持しています。クライアントのセッション変数は、対応するグローバル変数の現在の値を使用して、接続時に初期化されます。たとえば、クライアントの SQL モードはセッション sql_mode 値で制御されますが、この値はクライアントが sql_mode のグローバル値に接続するときに初期化されます。

システム変数値は、コマンド行のオプションまたはオプションファイルを使用すると、サーバー起動時にグローバルに設定できます。起動オプションを使用して、数値を取る値を設定するとき、値には 1024、10242 または 10243 の倍数を示す、KM、または G のサフィクス (大文字あるは小文字) を付けて指定でき、それぞれがキロバイト、メガバイト、またはギガバイトの単位を示します。これにより、次のコマンドは 16M バイトのクエリーキャッシュサイズと、1G バイトの最大パケットサイズでサーバーを開始します。

mysqld --query_cache_size=16M --max_allowed_packet=1G

オプションファイル内で、これらの変数は次のように設定されます。

[mysqld]
query_cache_size=16M
max_allowed_packet=1G

サフィクスの大文字、小文字の区別は問わず、16M16m1G1g を同等とします。

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 VARIABLESGLOBAL および SESSION をいずれも指定しない場合、MySQL は SESSION 値を返します。

GLOBAL 専用の変数を設定するときに GLOBAL キーワードが必要であるのに、それらを取得するときにキーワードが不要である理由は、今後の問題を防ぐためです。GLOBAL 変数と同じ名前を持つ SESSION 変数を削除した場合、SUPER 権限を持つクライアントが、その接続に対する SESSION 変数だけでなく、誤って GLOBAL 変数も変更してしまう可能性があります。SESSION 変数を GLOBAL 変数と同じ名前で追加する場合、クライアントが GLOBAL 変数を変更しようとしたが、クライアントの SESSION 変数のみが変更されてしまう可能性があります。


User Comments
  Posted by Rajesh K on June 30, 2011
There is a slight difference in behavior of some session variables like character_set_client. It doesn't take the value from global variable

Source: http://bugs.mysql.com/bug.php?id=35372 which says

Updated the description for character_set_client:

The character set for statements that arrive from the client. The
session value of this variable is set using the character set
requested by the client when the client connects to the server. (Many
clients support a --default-character-set option to enable this
character set to be specified explicitly.) The global
value of the variable is used to set the session value in cases when
the client-requested value is unknown or not available, or the server
is configured to ignore client requests:

* The client is from a version of MySQL older than MySQL 4.1, and thus
does not request a character set.

* The client requests a character set not known to the server. For
example, a Japanese-enabled client requests sjis when connecting to a
server not configured with sjis support.

* mysqld was started with the --skip-character-set-client-handshake
option, which causes it to ignore client character set configuration.
This reproduces MySQL 4.0 behavior and is useful should you wish to
upgrade the server without upgrading all the clients.

Sign Up Login You must be logged in to post a comment.