さくらのVPSにMySQLをインストール

環境は以下の記事をご参照ください。centOs7です。
[さくらのVPSにSSH接続+最低限のセキュリティ対策](https://qiita.com/d0ne1s/items/6d205744588e0f2c5d62)

## ルートユーザーに切り替え
毎回sudoつけるの面倒なので

```
$ su -
```

## MariaDBの削除
centOsにはデフォルトでMariaDBがインストールされています。不要なので削除。

```zsh
$ yum remove mariadb-libs
$ rm -rf /var/lib/mysql
```

## yumにMySQLのリポジトリを登録
npmなどと違い、yumにはデフォルトで登録されていないリポジトリが結構あります。
MySQLはデフォルトで登録されていない(or 古いバージョンしか登録されていない)ので、リポジトリを追加します。
ここではバージョン5.7系を追加しています。(たぶん57の部分を他の数字に変えれば他のバージョンを追加できるはず)

```zsh
$ rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
```

## インストール
```zsh
$ yum install -y mysql-community-server mysql-devel
$ mysqld --version
```

## 起動設定
```zsh
$ systemctl start mysqld.service # 起動
$ systemctl enable mysqld.service # 自動起動設定
```

## 初期設定
まずは初期パスワードを確認。(lCCqZ>=Q!9Yo)

```zsh
$ cat /var/log/mysqld.log | grep password
[Note] A temporary password is generated for root@localhost: lCCqZ>=Q!9Yo
```

対話形式で初期設定

```zsh
$ mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root: # ログファイルから取得した初期パスワードを入力

The existing password for the user account root has expired. Please set a new password.

New password: # rootユーザの新規パスワードを入力(大文字小文字英数字＋特殊文字で8文字以上で設定)

Re-enter new password: # 確認用にもう一度入力
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y # 本当にパスワードを変更して良いかの確認

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y # 匿名ユーザー(名前もパスワードも設定されていないユーザー。デフォルトで設定されているけどセキュリティ上消した方が良い)を削除
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y # localhost以外からrootアカウントでログインできないようにする
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y # testデータベースを削除
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y # リロードして設定を反映する
Success.

All done!
```

## 日本語対応
mysqlにログイン

```zsh
$ mysql -u root -p
```
文字コードを確認。latin1のところをutf8に変更したい。

```zsh
mysql> show variables like "chara%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
mysql> exit;
```
```zsh
$ vi /etc/my.cnf
```
```/etc/my.cnf
# ファイル末尾に以下を追記
character-set-server=utf8

[client]
default-character-set=utf8
```
再起動してlatin1→utf8に変更されていることを確認

```zsh
$ systemctl restart mysqld.service
$ mysql -u root -p
mysql> show variables like "chara%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

## タイムゾーン設定
デフォルトのタイムゾーンを確認。SYSTEM→Asia/Tokyoに変更したい。

```zsh
$ mysql -u root -p
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+
```
```zsh
$ /usr/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo > ~/timezone.sql 
# タイムゾーンのインポート。↑が失敗したら↓を試す
$ mysql_tzinfo_to_sql /usr/share/zoneinfo

$ mysql -u root -p -Dmysql < ~/timezone.sql
$ vi /etc/my.cnf
```
```/etc/my.cnf
末尾に以下を追記
[mysqld]
default-time-zone = 'Asia/Tokyo'
```
```zsh
$ systemctl restart mysqld.service
$ mysql -u root -p
mysql > show variables like '%time_zone%';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | JST        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
2 rows in set (0.00 sec)
```

## データベースと専用ユーザーを作成
```zsh
$ mysql -u root -p
```
```sql
-- データベースを作成
CREATE DATABASE database_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- ユーザーを作成
CREATE USER 'your_name'@'localhost' IDENTIFIED BY 'your_password';
-- 作成したユーザーに作成したデータベースの操作権限を付与
GRANT ALL PRIVILEGES ON database_name.* TO 'your_name'@'localhost';
-- 設定を反映
FLUSH PRIVILEGES;
-- データベース一覧を表示
SHOW DATABASES;
-- ユーザー一覧を表示
SELECT host, user, password FROM mysql.user;
```

## 参考
- [(初心者向け）vpsを契約して、capistrano3でRailsアプリをデプロイするまで [その1 サーバー設定編]](https://qiita.com/ryo2132/items/f62690f0b16ec11270fe#3-ruby%E3%81%AE%E8%A8%AD%E5%AE%9A)
- [MySQLインストール時にやること（DBとユーザーの作成等） - Qiita](https://qiita.com/daichi87gi/items/f9dac6cd8acc3ad4330d#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%A8%E5%B0%82%E7%94%A8%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92%E4%B8%80%E3%81%A4%E3%81%9A%E3%81%A4%E4%BD%9C%E6%88%90)