MySQL 8.0 を 5.7 感覚で触っていたらハマった my.cnf の設定問題

## 概要

![スクリーンショット 2020-10-22 12.39.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/2156a4f2-1d91-c72e-2d69-4961735ae0bb.png)

ここではRailsアプリの開発ではありますが、Webアプリを開発しているとこのエラーに引っかかった方はわかると思います。

> this is incompatible with sql_mode=only_full_group_by

問題の詳細はいろんな記事で解説されているので以下の記事などを読んでいただければなと。
今回は、**MySQL 8.0 を 5.7 感覚で触っていたらハマった**内容となります。

- [MySQL5.7にアップデートしたらonly_full_group_byでエラーになった « MySQL « 技術ブログ « 株式会社プロネット](https://www.p-nt.com/s/technicblog/archives/204)
- [MySQLのsql_mode正しく設定されていますか？ – エンジニアリング  入りました！](https://econosys-system.com/blog/archives/201)


## 環境

```shell
$ mysql --version
mysql  Ver 8.0.21 for Linux on x86_64 (MySQL Community Server - GPL)
```


## 現象

mysqldの設定は、上記の記事を参考に設定した内容です。
そうすると以下のエラーが発生しました。

```shell
$ mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
$ sudo vi /etc/my.cnf

---
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
---

$ systemctl restart mysqld.service
Failed to restart mysqld.service: The name org.freedesktop.PolicyKit1 was not provided by any .service files

$ sudo systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 木 2020-10-22 03:50:33 UTC; 27s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 8909 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS (code=exited, status=1/FAILURE)
  Process: 8885 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 8909 (code=exited, status=1/FAILURE)
   Status: "Server startup in progress"
    Error: 2 (No such file or directory)
10月 22 03:50:32 xxx-xxx-xxx-xxx.yyyyy.zzz systemd[1]: Starting MySQL Server...
10月 22 03:50:33 xxx-xxx-xxx-xxx.yyyyy.zzz systemd[1]: mysqld.service: main process exited, code=exited, status=1/FAILURE
10月 22 03:50:33 xxx-xxx-xxx-xxx.yyyyy.zzz systemd[1]: Failed to start MySQL Server.
10月 22 03:50:33 xxx-xxx-xxx-xxx.yyyyy.zzz systemd[1]: Unit mysqld.service entered failed state.
10月 22 03:50:33 xxx-xxx-xxx-xxx.yyyyy.zzz systemd[1]: mysqld.service failed.

$ sudo less /var/log/mysqld.log
...
2020-10-22T03:50:33.416784Z 0 [ERROR] [MY-000077] [Server] /usr/sbin/mysqld: Error while setting value 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' to 'sql_mode'.
2020-10-22T03:50:33.416979Z 0 [ERROR] [MY-010119] [Server] Aborting
```


## 原因

使用していたMySQLは 8.0 で特に意味もなく 5.7 感覚で使用していたことで起きた問題でした汗
MySQL 8.0 では、 `sql_mode` の内容が 5.7 から一部変更があり、今回は `NO_AUTO_CREATE_USER` が削除されていたことでハマりました。

- [MySQL :: MySQL 5.7 Reference Manual :: 5.1.7 Server System Variables](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_sql_mode)
    - Default Value
        - ONLY_FULL_GROUP_BY / STRICT_TRANS_TABLES / NO_ZERO_IN_DATE / NO_ZERO_DATE / ERROR_FOR_DIVISION_BY_ZERO / NO_AUTO_CREATE_USER / NO_ENGINE_SUBSTITUTION
- [MySQL :: MySQL 8.0 Reference Manual :: 5.1.8 Server System Variables](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_sql_mode)
    - Default Value
        - ONLY_FULL_GROUP_BY / STRICT_TRANS_TABLES / NO_ZERO_IN_DATE / NO_ZERO_DATE / ERROR_FOR_DIVISION_BY_ZERO / NO_ENGINE_SUBSTITUTION

## 対処

`NO_AUTO_CREATE_USER`を削除した以下の設定で無事にMySQLが起動して、概要のエラーが解消できました。

```shell
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
```