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


前提

GCP無料枠でLAMP環境を作りたかったので、Always Freeが適用されるf1-microのGCEインスタンスを1つ作った。
Apache, PHPと順調だったがMySQLが起動しない問題が発生。

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

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

$ 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.
/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

メモリが足りてないのか。

無料枠なのでメモリが0.6GBなんだよね。。
そりゃMySQL起動しないわ。

スワップ領域を作成する

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

$ 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)

$ 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にしないと警告が出るもよう。

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

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

vim /etc/fstab

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

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

$ 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を動かすときは注意しましょうというお話でした。