事象
Grailsのapplication.yml
にMySQLへの接続設定を記載した上で grails run-app
すると、以下のようなエラーが出て起動に失敗する。
PS C:\Users\KKZ\Git\SampleApp> grails run-app
| Running application...
2017-04-13 10:37:39.630 ERROR --- [ost-startStop-1] o.a.tomcat.jdbc.pool.ConnectionPool : Unable to create initial connections of pool.
java.sql.SQLException: The server time zone value '?ソス?ソス?ソス?ソス (?ソスW?ソス?ソス?ソス?ソス)' is unrecognized or represents more than one time zone. You must co
nfigure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize
time zone support.
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:545)
使用環境
- Windows7 64bit
- posh-gvm
- Grails 3.2.7
- Groovy 2.4.9
- MySQL 5.7.17
- mysql-connector-java 6.0.6
原因
Windows環境だと文字化けしてて読めないのですが、おそらくマシンの環境からタイムゾーンを取得して、**Asia/東京(UTC+9:00)**のような文字列をサーバー標準時としてMySQLに渡そうとしているのですが、MySQL側でこのタイムゾーン設定を受け付けていないのでエラーになっている、という事象かと思われます。
対処
一番楽なのは、MySQL側のデフォルトタイムゾーンに明確な指定を入れてしまうことです。
my.ini
に default-time-zone
の設定を加えて、プロセス再起動。
[mysqld]
default-time-zone = +9:00
試してませんが、たぶんmysqlのコンソールからのSET GLOBALでも直せそう。
SET GLOBAL default-time-zone = `+3:00`;
さらに別解としては、JDBCの接続文字列を
jdbc:mysql://localhost:3306/myschema
じゃなくて
jdbc:mysql://localhost:3306/myschema?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
みたいな感じでJDBC接続文字列のオプションとして渡すやり方でも直せそうな気はします。serverTimezoneで指定できるようなので。(未検証)