致命的なエラー:特権テーブルを開いてロックできません: 'user'のテーブルストレージエンジンにはこのオプションがありません


15

このエラーメッセージは、Dockerイメージでubuntu 16.04および最新のmysql 5.7.19-0ubuntu0.16.04.1を使用すると表示されます。

これを修正するために何ができますか?

エラーを再現するには

  1. 入手Dockerfile

    FROM ubuntu:16.04
    
    RUN apt update
    RUN DEBIAN_FRONTEND=noninteractive apt install -y mysql-server
    

    こちらも利用可能)

  2. ビルドして実行:

    docker build -t mysqlfail . 
    docker run -it mysqlfail tail -1 /var/log/mysql/error.log
    

    次のエラーログが表示されます。

    2017-08-26T11:48:45.398445Z 1 [警告] root @ localhostは空のパスワードで作成されます!--initialize-insecureオプションのオフを検討してください。

    これはまさに私たちが望んだものでした。ルートパスワードがまだ設定されていないmysqlです。

  3. 過去(ubuntu 14.04 / mysql 5.5)service mysql startは可能でした。これを試すと失敗する

    docker run -it mysqlfail service mysql start
     * Starting MySQL database server mysqld    
      No directory, logging in with HOME=/  
                                                                            [fail]
    

    次の/var/log/mysql/error.log行が含まれます。

    2017-08-26T11:59:57.680618Z 0 [エラー]致命的なエラー:権限テーブルを開いてロックできません: 'user'のテーブルストレージエンジンにはこのオプションがありません


ビルドログ(完全なDockerfile

Sending build context to Docker daemon   2.56kB
Step 1/4 : FROM ubuntu:16.04
 ---> ebcd9d4fca80
...
Step 4/4 : RUN service mysql start
 ---> Running in 5b899739d90d
 * Starting MySQL database server mysqld
   ...fail!
The command '/bin/sh -c service mysql start' returned a non-zero code: 1

奇妙な継続

私の答えの試みで概説された実験の後、私はシェルスクリプトを作成しました

select count(*)

mysqlスペースの各テーブルで3回連続してクエリを実行します(実験により、一部のテーブルではクエリが2回失敗することが示されているため:-()。

それから

mysql_upgrade   

そしてその

service mysql restart

試されます。ではDockerfileスクリプトが経由して利用できるようになります

COPY mysqltest.sh .

このスクリプトを使用した試行では、奇妙な/クレイジーな結果が得られます。

  1. 以下のためのDocker environmentスタートはまだ失敗

    [エラー]致命的なエラー:特権テーブルを開いてロックできません: 'user'のテーブルストレージエンジンにはこのオプションがありません

  2. スクリプトを実行する

    sh mysqltest.sh root
    

    docker environmentつながる

    2017-08-27T09:12:47.021528Z 12 [エラー] / usr / sbin / mysqld:テーブル './mysql/db'はクラッシュとしてマークされ、修復する必要があります
    2017-08-27T09:12:47.050141Z 12 [エラー]テーブルを修復できませんでした:mysql.db
    2017-08-27T09:12:47.055925Z 13 [エラー] / usr / sbin / mysqld:テーブル './mysql/db'はクラッシュとしてマークされ、修復する必要があります
    2017-08 -27T09:12:47.407700Z 54 [エラー] / usr / sbin / mysqld:テーブル './mysql/proc'はクラッシュとしてマークされ、修復する必要があります
    2017-08-27T09:12:47.433516Z 54 [エラー] Couldn ' t修復テーブル:mysql.proc
    2017-08-27T09:12:47.440695Z 55 [エラー] / usr / sbin / mysqld:テーブル './mysql/proc'はクラッシュとしてマークされ、修復する必要があります
    2017-08-27T09: 12:47.769485Z 81 [エラー] / usr / sbin / mysqld:テーブル './mysql/tables_priv'クラッシュしたとマークされており、修復する必要がある
    2017-08-27T09:12:47.792061Z 81 [エラー]テーブルを修復できませんでした:mysql.tables_priv
    2017-08-27T09:12:47.798472Z 82 [エラー] / usr / sbin / mysqld:テーブル './mysql/ tables_priv 'はクラッシュとしてマークされ、修復する必要があります
    2017-08-27T09:12:47.893741Z 99 [エラー] / usr / sbin / mysqld:テーブル' ./mysql/user 'はクラッシュとしてマークされ、修復する必要があります
    2017-08 -27T09:12:47.914288Z 99 [エラー]テーブルを修復できませんでした:mysql.user
    2017-08-27T09:12:47.920459Z 100 [エラー] / usr / sbin / mysqld:テーブル './mysql/user'はクラッシュしたとしてマークされ、修復する必要があります

この奇妙な動作を引き起こすために、ここで何が起こっていますか?


1
mysqld --skip-grant-tables --skip-networkingは動作しているようです
Wolfgang Fahl

mkdir / var / run / mysqld; chown mysql / var / run / mysqldも必要になる場合があります。
ヴォルフガングファール

回答:


30

今日同じ問題に遭遇しました。ユニットテスト用のdockerビルド中にMySQLサービスを実行しており、MariaDBからMySQL CE 5.7.19にアップグレードするとビルドが中断しました。私にとって問題を解決したのはchown -R mysql:mysql /var/lib/mysql /var/run/mysqld、mysqlサービスを開始する前に毎回実行することでした。

したがって、私のDockerfileは次のようになります。

RUN chown -R mysql:mysql /var/lib/mysql /var/run/mysqld && \
    service mysql start && \
    mvn -q verify site

お役に立てれば。


2
ここで同じ問題。私は2段階のビルドを実行しており、「親」Dockerfileはすでにこのchmodコマンドを実行しています。ビルドは、リモートUbuntuサーバーで実行すると成功しますが、ローカルマシン(OS X)で実行すると失敗します。chmod子Dockerfileにコマンドを追加すると、問題が修正されました。奇妙な
送信者

2
ありがとうございました!私は、他の誰かが自分と同様のユースケースを持たなければならないことを知っていました。
threed

2
@senderleもこのスレッドを見つけました。「一度構築したら、どこにでも展開できる」と彼らは言った
duhaime

8

Mac用のDockerのデフォルトであるoverlayfs(overlay2)のエラーを確認しました。mysqlでイメージを作成した後、イメージでmysqlを起動するとエラーが発生します。

2017-11-15T06:44:22.141481Z 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table storage engine for 'user' doesn't have this option

「aufs」に切り替えると問題が解決しました。(Docker for Macでは、「daemon.json」を編集するには、「設定...」メニューを選択し、「デーモン」タブを選択し、「詳細」タブを選択します。)

/etc/docker/daemon.json:

{
  "storage-driver" : "aufs",
  "debug" : true,
  "experimental" : true
}

参照:

https://github.com/moby/moby/issues/35503

https://qiita.com/Hige-Moja/items/7b1208f16997e2aa9028


1
これでUbuntu 16:04の問題が解決しました。以前にdockerでoverlay2ストレージドライバーを構成していました。ありがとう。
ハボック

これにより、OSXでの
dockerの

8

回避策

find /var/lib/mysql -type f -exec touch {} \; && service mysql start

問題の説明

aalexgabiで述べられている根本的な問題は、OverlayFSのPOSIX標準の実装によるものです。

open(2):OverlayFSはPOSIX標準のサブセットのみを実装します。これにより、特定のOverlayFS操作がPOSIX標準に違反する可能性があります。そのような操作の1つがコピーアップ操作です。アプリケーションがを呼び出しfd1=open("foo", O_RDONLY)、次にを呼び出したとしますfd2=open("foo", O_RDWR)。この場合、アプリケーションはfd1とfd2が同じファイルを参照することを想定しています。ただし、open(2)の2回目の呼び出し後に発生するコピーアップ操作により、記述子は異なるファイルを参照します。fd1は引き続きイメージ内のファイル(lowerdir)を参照し、fd2はコンテナー内のファイル(upperdir)を参照します。これに対する回避策は、コピーアップ操作を引き起こすファイルに触れることです。open(2)読み取り専用または読み取り/書き込みアクセスモードに関係なく、以降のすべての操作は、コンテナー(upperdir)内のファイルを参照します。

参照:


1
これは恐ろしいニュースです。なぜdockerが修正されないのだろうか。
ヴォルフガングファール

2
正直?私もダメ!これは実際には基本的なファイル操作であるため、これは多くのアプリケーションに影響しなければならないということです。...もちろん問題は特定の条件下でのみ発生しますが、彼らは遠く離れていることではありません
Murmel

2

ここにはまだ表示されていない答えがあります。

これをdockerfileに追加します。 VOLUME /var/lib/mysql

これにより、/ var / lib / mysqlフォルダーはoverlayFSではなくネイティブファイルシステムを使用します。これにより、この問題を回避できます。

これは公式のmysqlドッカーイメージがこれに対処するために使用するソリューションです(https://github.com/docker-library/mysql/blob/9d1f62552b5dcf25d3102f14eb82b579ce9f4a26/5.7/Dockerfile


1

これはまだ解決策ではないかもしれません。とにかく、他の人に「適切な」答えを示すかもしれません

以下のdocker bashセッションログは、奇妙なエラーを引き起こし、最終的にdocker環境でmysqlデーモンを適切に起動できる一連の手順を示しています。

このセッションでデーモンを起動しようとすると、2回失敗します。1回はmysql.userテーブルが原因で、もう1回はmysql.dbテーブルが原因です。--skip-grant-tablesを使用してmysqlデーモンを実行すると動作しますが、これらのテーブルのコマンドからの単純なselect * fromにも問題があります。

不思議なことに、2つの単純なクエリを実行します。

select host,user from mysql.user;
select user from mysql.db

デーモンを強制終了して適切に起動します

service mysql start

動作するようです。これを回避策として自動化してみます。私はまだ問題に対する「適切な」解決策と、この奇妙な振る舞いの理由が何かを手がかりを探しています。

Dockerfile

#*********************************************************************
#
# Dockerfile for /server/870568/2017-08-26t113924-509100z-0-error-fatal-error-cant-open-and-lock-privilege
#
#*********************************************************************

# Ubuntu image
FROM ubuntu:16.04

# 
# Maintained by Wolfgang Fahl / BITPlan GmbH http://www.bitplan.com
# 
MAINTAINER Wolfgang Fahl info@bitplan.com

RUN \
 export DEBIAN_FRONTEND=noninteractive;apt-get update -y && apt-get install -y \
        vim \
    mysql-server 

RUN mkdir /var/run/mysqld;chown mysql /var/run/mysqld
WORKDIR /var/log/mysql

ビルドログ

docker build .

Sending build context to Docker daemon  8.704kB
Step 1/5 : FROM ubuntu:16.04
 ---> ebcd9d4fca80
Step 2/5 : MAINTAINER Wolfgang Fahl info@bitplan.com
 ---> Using cache
 ---> b84df9d5de50
Step 3/5 : RUN export DEBIAN_FRONTEND=noninteractive;apt-get update -y && apt-get install -y         vim    mysql-server
 ---> Using cache
 ---> b51bd2bb172c
Step 4/5 : RUN mkdir /var/run/mysqld;chown mysql /var/run/mysqld
 ---> Using cache
 ---> 5b7455fede6b
Step 5/5 : WORKDIR /var/log/mysql
 ---> c4c333e811ab
Removing intermediate container cfc49e460c96
Successfully built c4c333e811ab

bashセッションログ

docker run -it c4c333e811ab

root@607fa9fe8d98:/var/log/mysql# service mysql start
 * Starting MySQL database server mysqld                                                             No directory, logging in with HOME=/
                                                                                              [fail]
root@607fa9fe8d98:/var/log/mysql# grep ERROR error.log 
2017-08-27T07:56:21.377919Z 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table storage engine for 'user' doesn't have this option
2017-08-27T07:56:21.378149Z 0 [ERROR] Aborting
mysqld_safe --skip-grant-tables&sleep 2;mysql -u root -p=""
select * from mysql.user;
ERROR 1031 (HY000): Table storage engine for 'user' doesn't have this option
select host,user from mysql.user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| localhost | debian-sys-maint |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
4 rows in set (0.00 sec)
show variables like "%locking%";
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| skip_external_locking | ON    |
+-----------------------+-------+
1 row in set (0.01 sec)
root@607fa9fe8d98:/var/log/mysql# pgrep -fla mysql
721 /bin/sh /usr/bin/mysqld_safe --skip-grant-tables
1083 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --skip-grant-tables --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 --log-syslog=1 --log-syslog-facility=daemon --log-syslog-tag=
pkill -f mysql
echo "" > error.log
service mysql start
 * Starting MySQL database server mysqld                                                             No directory, logging in with HOME=/.      [fail]
grep ERROR error.log 
2017-08-27T08:03:12.918047Z 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table storage engine for 'db' doesn't have this option
2017-08-27T08:03:12.918278Z 0 [ERROR] Aborting
mysqld_safe --skip-grant-tables&sleep 2;mysql -u root -p=""
select * from mysql.db;
ERROR 1031 (HY000): Table storage engine for 'db' doesn't have this option
select user from mysql.db;
+---------------+
| user          |
+---------------+
| mysql.session |
| mysql.sys     |
+---------------+
2 rows in set (0.00 sec)
echo "" > error.log
root@607fa9fe8d98:/var/log/mysql# service mysql start
 * Starting MySQL database server mysqld      [ OK ]

オリジナルのドッキングウィンドウのファイルを見てくださいgithub.com/docker-library/mysql/blob/...とentrypoint.sh github.com/docker-library/mysql/blob/...。彼らはあなたに何をする必要があるかを教えてくれます。
タルンラルワニ

ヒントをありがとう。私のさらなる実験は、リリースの5.7.xシリーズがxによって異なる動作をすることを示しています。5.7.14までのことはもっと簡単だったようです。severalnines.com/blog/...アプローチは、私のLinux環境で動作します。私のMac OS環境では、事態はさらに困難です。
ヴォルフガングファール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.