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

LaradockでMySQLが立ち上がらない時は

はじめに

今回dockerを用いてMySQLを立ち上げる際にハマったところをメモしておきます。

環境

マシン : Windows10 Home
Docker version : 18.03.0-ce, build 0520e24302
docker-compose version : 1.20.1, build 5d8c71b2
MySQL version : 5.7

前提条件

  • 既にdocker,docker-compose,mysqlのイメージなどの環境が構築済みであること。

エラーとの格闘

初期エラー

とりあえずシンプルな起動コマンドを叩く

> docker-compose up -d mysql

とりあえず立ち上がってくれない(いつもどおり、、)

      Name                   Command             State    Ports
---------------------------------------------------------------
laradock_mysql_1   docker-entrypoint.sh mysqld   Exit 3

次に細かくエラー内容を見に行く

> docker-compose up mysql

すると以下のエラー内容が表示される

Attaching to laradock_mysql_1
mysql_1                | 2019-07-24T20:22:43.160459Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
mysql_1                | 2019-07-24T20:22:43.160506Z 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
mysql_1                | 2019-07-24T20:22:43.160510Z 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
mysql_1                | 2019-07-24T20:22:43.164650Z 0 [Note] mysqld (mysqld 5.7.26) starting as process 1 ...
mysql_1                | 2019-07-24T20:22:43.169111Z 0 [Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
mysql_1                | 2019-07-24T20:22:43.170378Z 0 [Note] InnoDB: PUNCH HOLE support available
mysql_1                | 2019-07-24T20:22:43.170491Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
mysql_1                | 2019-07-24T20:22:43.170705Z 0 [Note] InnoDB: Uses event mutexes
mysql_1                | 2019-07-24T20:22:43.170896Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
mysql_1                | 2019-07-24T20:22:43.171142Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
mysql_1                | 2019-07-24T20:22:43.171263Z 0 [Note] InnoDB: Using Linux native AIO
mysql_1                | 2019-07-24T20:22:43.172082Z 0 [Note] InnoDB: Number of pools: 1
mysql_1                | 2019-07-24T20:22:43.172468Z 0 [Note] InnoDB: Using CPU crc32 instructions
mysql_1                | 2019-07-24T20:22:43.174617Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
mysql_1                | 2019-07-24T20:22:43.188484Z 0 [Note] InnoDB: Completed initialization of buffer pool
mysql_1                | 2019-07-24T20:22:43.190874Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
mysql_1                | 2019-07-24T20:22:43.219977Z 0 [Note] InnoDB: Highest supported file format is Barracuda.
mysql_1                | 2019-07-24T20:22:43.228388Z 0 [ERROR] InnoDB: Operating system error number 22 in a file operation.
mysql_1                | 2019-07-24T20:22:43.228697Z 0 [ERROR] InnoDB: Error number 22 means 'Invalid argument'
mysql_1                | 2019-07-24T20:22:43.228943Z 0 [Note] InnoDB: Some operating system error numbers are described at http://dev.mysql.com/doc/refman/5.7/en/operating-system-error-codes.html
mysql_1                | 2019-07-24T20:22:43.229187Z 0 [ERROR] InnoDB: File ./ib_logfile0: 'aio write' returned OS error 122. Cannot continue operation
mysql_1                | 2019-07-24T20:22:43.229370Z 0 [ERROR] InnoDB: Cannot continue operation.
laradock_mysql_1 exited with code 3

わかったこと

  • とりあえずよくわからないこと(大丈夫か?)
  • ファイル読み込みと書き込みが行えないとシステムエラーが出ているっぽいこと
  • DBエンジン(InnoDB)が「コマンドの引数が無効になってるよ」と指摘しているっぽいこと ←あやしい、、

解決までの道のり

とりあえずdocker-compose.ymlファイルを見に行く

MySQL箇所のみ抜粋

### MySQL ################################################
    mysql:
      build:
        context: ./mysql
        args:
          - MYSQL_VERSION=${MYSQL_VERSION}
      environment:
        - MYSQL_DATABASE=${MYSQL_DATABASE}
        - MYSQL_USER=${MYSQL_USER}
        - MYSQL_PASSWORD=${MYSQL_PASSWORD}
        - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
        - TZ=${WORKSPACE_TIMEZONE}
      volumes:
        - ${DATA_PATH_HOST}/mysql:/var/lib/mysql
        - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
      ports:
        - "${MYSQL_PORT}:3306"
      networks:
        - backend

エラー内容と照合してみると、volumesで指定しているファイルへの操作が正常に行えていないっぽい。。

色々調べた結果以下のコマンドを追加すると正常にファイル操作が行えそうだと判明した

--innodb-use-native-aio=0

このコマンドによってファイルシステムの互換性の問題が解消されるみたいです

docker-compose.ymlファイルを修正

### MySQL ################################################
    mysql:
      build:
        context: ./mysql
        args:
          - MYSQL_VERSION=${MYSQL_VERSION}
      environment:
        - MYSQL_DATABASE=${MYSQL_DATABASE}
        - MYSQL_USER=${MYSQL_USER}
        - MYSQL_PASSWORD=${MYSQL_PASSWORD}
        - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
        - TZ=${WORKSPACE_TIMEZONE}
      volumes:
        - ${DATA_PATH_HOST}/mysql:/var/lib/mysql
        - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
      ports:
        - "${MYSQL_PORT}:3306"
      networks:
        - backend
      command: --innodb-use-native-aio=0 #追加

最終行に追加しました。
これで実際に動くか試してみます。

> docker-compose up -d mysql
      Name                    Command               State                 Ports
---------------------------------------------------------------------------------------------
laradock_mysql_1   docker-entrypoint.sh --inn ...   Up      0.0.0.0:3306->3306/tcp, 33060/tcp

無事立ち上がりましたー!

おわりに

今回MySQLコンテナだけ起動しないことにかなりハマってしまいました。
色々調べた際に皆さん結構同じような内容で躓いていたみたいなので自分なりに解釈しながら分かったことを投稿しておこうと思います。
間違い等ありましたら是非ご指摘お願いいたします。

参考にしたサイト

On OSX with volumes : InnoDB : Error 22 with aio_write #371
Docker 18.03でMySQL5.7コンテナ起動時に[File ./ib_logfile101: 'aio write' returned OS error 122.]メッセージが表示されたときの対処法

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
ユーザーは見つかりませんでした