MySQLのtime_zoneを設定する方法




Windows以外はいつかやった時に書く・・・つもり

# Windows
- 環境
    - Windows10 Pro バージョン1909
    - Server version: 8.0.19 MySQL Community Server - GPL
- 参考 : [MariaDB (MySQL)  のタイムゾーン、タイムゾーンテーブルを設定する](https://www.ipentec.com/document/mariadb-set-time-zone)

本当は`system_time_zone`をJSTに設定したかったがわからず・・・


## 設定前
```sql
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone |        |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set, 1 warning (0.03 sec)

```

## 方法
1. [MySQL :: Time zone description tables](https://dev.mysql.com/downloads/timezones.html)を表示する
1. [POSIX standard]のzipファイルをダウンロードする
    - 今回ダウンロードしたのはtimezone_2020b_posix_sql.zip
1. zipファイルを任意の場所に解凍する
1. zipから出てきた`timezone_posix.sql`をデータベース`mysql`に対して実行する
    - うっかり自分が使っているDBを指定すると`ERROR 1146 (42S02) at line 1: Table 'mydb.time_zone' doesn't exist`と怒られる
1. my.iniの`[mysqld]`に`default-time-zone = 'Asia/Tokyo'`を追記する
1. MySQLを再起動する

```bash
# zipファイルを任意の場所に解凍する
$ unzip /c/Users/ponsuke/Downloads/timezone_2020b_posix_sql.zip -d /c/apps/mysql-8.0.19-winx64/
Archive:  /c/Users/ponsuke/Downloads/timezone_2020b_posix_sql.zip
   creating: /c/apps/mysql-8.0.19-winx64/timezone_2020b_posix_sql/
  inflating: /c/apps/mysql-8.0.19-winx64/timezone_2020b_posix_sql/timezone_posix.sql

# zipから出てきたtimezone_posix.sqlを実行する(GitBashは対話できないのでパスワードを直指定)
$ mysql -u root -D mysql -ppassword < /c/apps/mysql-8.0.19-winx64/timezone_2020b_posix_sql/timezone_posix.sql
mysql: [Warning] Using a password on the command line interface can be insecure.

# my.iniに追記する
$ cat /c/apps/mysql-8.0.19-winx64/my.ini
[mysqld]
default-time-zone = 'Asia/Tokyo'
# ...省略...

# MySQLを再起動する
$ sc stop MySQL80
SERVICE_NAME: MySQL80
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 3  STOP_PENDING
                                (STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x1
        WAIT_HINT          : 0x5265c00
$ sc start MySQL80
SERVICE_NAME: MySQL80
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 2  START_PENDING
                                (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x3
        WAIT_HINT          : 0x3a98
        PID                : 7756
        FLAGS              :

# GitBashを使っているのでwinptyをつけて接続
$ winpty mysql -u ponsuke -D mydb -p
Enter password: *******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.19 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show variables like '%time_zone%';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone |            |
| time_zone        | Asia/Tokyo |
+------------------+------------+
2 rows in set, 1 warning (0.01 sec)
```