Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

前提

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

メモリが足りてないのか。
image.png
無料枠なのでメモリが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)

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

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

mimizq
Javaを7年やってPHP2年生。Node.jsもちょっと。PHPのぬるさにびっくりしている。わりと有名なサービスやってる会社のあんまり有名じゃないほうのサービス担当。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした