10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Docker】mysqld: Table 'mysql.plugin' doesn't existエラーが表示された時

Last updated at Posted at 2019-11-08

概要

railsアプリでデータベースにMysqlを使っていて、docker-composeによるオーケストレーションで使用しています。
しかし、ある日docker-compose upでimageを立ち上げたところ、表題のエラーが・・・。

なんとか修正したので備忘録として残しておこうかと思います。

現象

docker-compose upを実行すると、下記の様なエラーが表示される。
ちなみに先日までは普通に起動して動作していました。

terminal
MacBookPro:hogehoge username$ docker-compose up
Starting db_1 ... done
Starting web_1 ... done
Attaching db_1, web_1
db_1   | 2019-11-08 05:59:07+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.46-1debian9 started.
db_1   | 2019-11-08 05:59:07+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
db_1   | 2019-11-08 05:59:07+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.46-1debian9 started.
db_1   | 2019-11-08 05:59:09 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
db_1   | 2019-11-08 05:59:09 0 [Note] mysqld (mysqld 5.6.46) starting as process 1 ...
db_1   | 2019-11-08 05:59:09 1 [Note] Plugin 'FEDERATED' is disabled.
db_1   | mysqld: Table 'mysql.plugin' doesn't exist
db_1   | 2019-11-08 05:59:09 1 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
db_1   | 2019-11-08 05:59:09 1 [Note] InnoDB: Using atomics to ref count buffer pool pages
(省略)

環境

rails (5.2.3)
docker (19.03.4)
docker-compose (1.24.1)
mysql (5.6)

Dockerfileでrubyの構築、docker-composeでmysqlとrailsの操作をしています。

Dockerfile
# ruby2.5.1のalpineを指定
FROM ruby:2.5.1-alpine

# apk --update --no-cache add でインストールするパッケージを指定します
RUN apk --update --no-cache add tzdata libxml2-dev curl-dev make gcc libc-dev g++ mariadb-dev linux-headers nodejs && \
    mkdir /workdir

WORKDIR /workdir

ADD Gemfile /workdir/Gemfile
ADD Gemfile.lock /workdir/Gemfile.lock

ENV BUNDLER_VERSION 2.0.2
# && \で改行していくことにより、より軽量になるそうです
RUN gem install bundler && \
    bundle install && \
# Warningがでたのでここでupdateを一度入れています。
    apk update && \
# 上で指定したパッケージの中、開発環境を構築したら不要になるファイルたちです。apk delで消しちゃいます。
    apk del libxml2-dev curl-dev make gcc libc-dev g++ linux-headers

ADD . /workdir
# 構築したDockerの中に入って、大きく容量をとっているディレクトリを調べました。容量が大きく不要であるcacheファイルは構築後削除しています。
RUN rm -rf /usr/local/bundle/cache/* /workdir/vendor/bundle/cache/*
docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.6
    environment:
      MYSQL_DATABASE: docker_development
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: root
      MYSQL_PASSWORD: password
    volumes:
      - ./mysql/mysql_data:/var/lib/mysql # データの永続化
    ports:
      - "4306:3306" # ホストからゲストへポートフォワード。sequelProと繋ぎたいので、3306ではなく4306をポートに指定
  web:
    build:
      context: .
      dockerfile: Dockerfile
    # 一度サーバーが起動すると起動し続けるので、rm -f /workdir/tmp/pids/server.pidで、dockerが起動する度に一旦停止させる
    command: /bin/sh -c "rm -f /workdir/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    tty: true
    stdin_open: true
    depends_on:
      - db # DB側のコンテナが出来上がってからwebを実行する
    ports:
      - "3000:3000" # ホストからゲストへポートフォワード
    volumes:
      - .:/workdir # ソースコード変更したらDocker側も即反映されるように

結論

まず、ターミナルで下記を実行

terminal
rm -rf /var/lib/mysql

その後、アプリケーションのルートディレクトリにある、mysqlというディレクトリを削除しました。
image

その後、ターミナルで下記を実行

terminal
docker-clean all

docker-compose build

docker-compose up

再度、db:create、migrateなどを行えば、問題なく表示されることとなりました。

原因?

dockerでmysqlを起動すると、ルートディレクトリにmysqlというディレクトリが作成されます。
この中にどうやら今までのデータベースの変更内容などが保存されている様です。

で、別のブランチを切って開発を進めていた時にgitignoreしてしまったんですよね。
たぶんそれでmysqlの履歴と整合性が取れなくなってしまったんだと思っています。

あ、gitignoreファイルではmysqlディレクトリを指定するのをやめてます。

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?