GCP無料枠で作成したGCEでMySQL8が起動しない

# 前提

GCP無料枠でLAMP環境を作りたかったので、[Always Free](https://cloud.google.com/free/?hl=ja)が適用されるf1-microのGCEインスタンスを1つ作った。
Apache, PHPと順調だったがMySQLが起動しない問題が発生。

- Apache2.4→OK
- PHP7.3→OK
- MySQL8→NG

ステータスとログを見るとこんな。

```sh
$ 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 水 2019-03-27 17:20:32 JST; 3min 44s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 5380 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS (code=exited, status=1/FAILURE)
  Process: 5359 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 5380 (code=exited, status=1/FAILURE)
   Status: "SERVER_BOOTING"
    Error: 2 (そのようなファイルやディレクトリはありません)

 3月 27 17:20:27 foo systemd[1]: Starting MySQL Server...
 3月 27 17:20:32 foo systemd[1]: mysqld.service: main process exited, code=exited, status=1/FAILURE
 3月 27 17:20:32 foo systemd[1]: Failed to start MySQL Server.
 3月 27 17:20:32 foo systemd[1]: Unit mysqld.service entered failed state.
 3月 27 17:20:32 foo systemd[1]: mysqld.service failed.
```

```text:/var/log/mysqld.log
2019-03-27T08:20:30.330935Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.15) starting as process 5380
2019-03-27T08:20:32.149509Z 0 [ERROR] [MY-012681] [InnoDB] mmap(137428992 bytes) failed; errno 12
2019-03-27T08:20:32.149575Z 1 [ERROR] [MY-012956] [InnoDB] Cannot allocate memory for the buffer pool
2019-03-27T08:20:32.149603Z 1 [ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error.
2019-03-27T08:20:32.149649Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
2019-03-27T08:20:32.149842Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2019-03-27T08:20:32.162764Z 0 [ERROR] [MY-010119] [Server] Aborting
2019-03-27T08:20:32.164035Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.15)  MySQL Community Server - GPL.
```

あーこれは、、
> Cannot allocate memory for the buffer pool

メモリが足りてないのか。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/54083/5aad1c87-0f08-70f8-0b10-2655a1c5136f.png)
無料枠なのでメモリが0.6GBなんだよね。。
そりゃMySQL起動しないわ。

# スワップ領域を作成する

とりあえず今の状態。
初期状態では何も設定されていません。

```sh
$ free -m
              total        used        free      shared  buff/cache   available
Mem:            587         174         246           4         166         302
Swap:             0           0           0
```

スワップ領域はデバイスもしくはファイルに対して設定できる。
今回はファイル方式を選択。2GBもあれば十分だろう。

ちなオプションの意味。↓

- if=NUL(0x00)で埋める
- of=スワップファイルのパス
- bs=ブロックサイズ
- count=個数 (スワップサイズ=bs*count)

https://www.atmarkit.co.jp/ait/articles/1711/30/news027.html


```sh
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
2048+0 レコード入力
2048+0 レコード出力
2147483648 バイト (2.1 GB) コピーされました、 55.3209 秒、 38.8 MB/秒

$ sudo mkswap /swapfile
スワップ空間バージョン1を設定します、サイズ = 2097148 KiB
ラベルはありません, UUID=e5fe830c-15f5-42d6-9207-806b8e261e74

$ sudo swapon /swapfile
swapon: /swapfile: 安全でない権限 0644 を持ちます。 0600 がお勧めです。

$ sudo chmod 600 /swapfile

$ swapon -s
Filename				Type		Size	Used	Priority
/swapfile                              	file	2097148	0	-2
```

パーミッション600にしないと警告が出るもよう。

```sh
$ free -m
              total        used        free      shared  buff/cache   available
Mem:            587         170          46           4         370         303
Swap:          2047           0        2047
```

スワップが設定されたことを確認。
永続化する。

```sh
vim /etc/fstab

# 以下の行を追加
/swapfile swap swap defaults 0 0
```

# もう一度MySQLを起動してみる

```sh
$ sudo systemctl start mysqld.service
$ sudo systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since 水 2019-03-27 18:27:22 JST; 13s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 6497 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 6519 (mysqld)
   Status: "SERVER_OPERATING"
   CGroup: /system.slice/mysqld.service
           └─6519 /usr/sbin/mysqld

 3月 27 18:27:09 foo systemd[1]: Starting MySQL Server...
 3月 27 18:27:22 foo systemd[1]: Started MySQL Server.
```

ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!



以上、無料枠のGCEでMySQLを動かすときは注意しましょうというお話でした。