unrealMan’s blog

IT関連の奮闘記を備忘録がてら記載していきます!

MySQLのタイムゾーンの設定について

MySQLタイムゾーンの種類

システムタイムゾーン

ホストマシンのタイムゾーンです。
サーバ起動時にホストマシンのタイムゾーンを特定して、system_time_zone システム変数に設定されます。

サーバタイムゾーン

MySQLサーバの現在のタイムゾーンです。
time_zone システム変数に設定され、現在動作しているタイムゾーンを示します。time_zone の初期値は 'SYSTEM' となっており、サーバーのタイムゾーンがシステムタイムゾーンと同じであることを示します。

タイムゾーンの確認方法

SHOW VARIABLES LIKE '%time_zone%';

SHOW VARIABLES は、MySQL システム変数の値を表示するので、MySQLの設定値を確認するときに使います。今回は、time_zoneを確認したいので、LIKE構文で指定しています。

以下のように表示されました。
ホストマシンの設定(system_time_zone)がUTC時刻で、MySQLサーバの現在の設定(time_zone)がデフォルトの'SYSTEM'でUTC時刻となっています。

Variable_name Value
system_time_zone UTC
time_zone SYSTEM
SELECT now();
now()
2019-11-26 02:58:47

コマンド実行時が日本時間(+9:00)の11:58:47だったので、UTC時刻が表示されています。

セッション変数とグローバル変数

セッション変数

⇒現在の接続のみに影響します。

設定方法

 SET (SESSION) [変数名] = [値];

グローバル変数

⇒全接続に影響する設定です。

設定方法

 SET GLOBAL [変数名] = [値];
※ただし、サーバ自体を再起動してしまうとSET文での設定内容は失われるため、永続的な変更であれば設定ファイルを変更する必要があります。

実際にセッションを変えて確認してみます。

SET SESSION time_zone = "Asia/Tokyo";
SHOW VARIABLES LIKE '%time_zone%';
Variable_name Value
system_time_zone UTC
time_zone Asia/Tokyo
select now();
now()
2019-11-26 12:06:12

コマンド実行時が日本時間(+9:00)の12:06:12だったので、日本時刻が表示されています。

ちなみにこのタイミングでグローバル変数を確認すると、設定が変わっていないため、全接続の設定(グローバル)には影響を与えておらず、現在の接続(セッション)のみに影響を与えていることが分かります。

SHOW GLOBAL VARIABLES LIKE '%time_zone%';
Variable_name Value
system_time_zone UTC
time_zone SYSTEM


新たな接続(セッション)で確認すると、先ほどはセッションの設定だったためにUTC時刻に戻っていることが分かります。

select now();
now()
2019-11-26 03:07:38


以上です。