致命错误:无法打开和locking权限表:“用户”的表存储引擎没有此选项

当我在Docker镜像中使用ubuntu 16.04和最新的mysql 5.7.19-0ubuntu0.16.04.1时,出现这个错误信息。

可以做些什么来解决这个问题?

重现错误

从中获取Docker文件

https://github.com/BITPlan/docker-stackoverflowanswers/blob/master/870568/Dockerfile或从下面复制。

docker build . 

并检查问题

 docker run --it <image> /bin/bash 

然后检查mysql错误日志:

 tail -1 /var/log/mysql/error.log 2017-08-26T11:48:45.398445Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. 

看到我们想要的东西 – 一个没有设置root密码的mysql。

继续我们需要做什么? 过去(ubuntu 14.04 / mysql 5.5)a

  service mysql start 

是可能的。 现在,如果你尝试这个失败

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

并有一条线

 2017-08-26T11:59:57.680618Z 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table storage engine for 'user' doesn't have this option 

在error.log文件中。

可以做些什么来解决这个问题?

Dockerfile

 #********************************************************************* # # Dockerfile for https://serverfault.com/questions/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 [email protected] RUN \ export DEBIAN_FRONTEND=noninteractive;apt-get update -y && apt-get install -y \ mysql-server RUN service mysql start 

build立日志

 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 

奇怪的延续

在我的回答尝试https://serverfault.com/a/870670/162693中所述的实验后,我创build了一个shell脚本,

  select count(*) 

查询连续三次在mysql空间的每个表上(因为实验表明,在一些表上,查询将失败两次:-()然后一个

  mysql_upgrade and the service mysql restart is tried 

在dockerfile中,脚本可以通过

  COPY mysqltest.sh . 

这个脚本的试验给出了怪异/疯狂的结果。

  1. 为Docker环境https://github.com/BITPlan/docker-stackoverflowanswers/blob/master/870568/Dockerfile启动仍然失败

    [错误]致命错误:无法打开和locking权限表:“用户”的表存储引擎没有此选项

  2. 运行脚本

    sh mysqltest.sh root

    在docker环境中https://github.com/BITPlan/docker-stackoverflowanswers/tree/master/870568/withpassword导致

    / 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'修复表: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.893741 Z 99 [ER ROR] / 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'被标记为崩溃,应该修复

这里发生了什么事情导致这种奇怪的行为?

今天遇到同样的问题。 我在docker build中为unit testing运行MySQL服务,从MariaDB升级到MySQL CE 5.7.19打破了构build。 什么解决了我的问题是运行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 

希望这可以帮助。

这可能不完全是解决scheme。 无论如何,这可能会将其他人指向“正确”的答案

下面的docker bash会话日志显示了导致奇怪错误的一系列步骤,并最终能够在docker环境中正确启动mysql守护进程。

试图在这个会话中启动守护进程失败了两次 – 一次是由于mysql.user表和一次由于mysql.db表造成的。 使用–skip-grant-tables运行mysql守护进程可行,但在这些表上的select *命令也存在问题。

奇怪地做两个简单的查询:

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

然后杀死守护进程,正确启动它

 service mysql start 

似乎工作。 现在我将尝试将此自动化为一种解决方法。 我仍然在寻求一个“适当的”解决scheme,有些线索是什么原因,这种奇怪的行为是。

Dockerfile

 #********************************************************************* # # Dockerfile for https://serverfault.com/questions/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 [email protected] 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 

build立日志

 docker build . Sending build context to Docker daemon 8.704kB Step 1/5 : FROM ubuntu:16.04 ---> ebcd9d4fca80 Step 2/5 : MAINTAINER Wolfgang Fahl [email protected] ---> 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 ] 

我确认了在Docker for Mac上默认的overlayfs(overlay2)错误。 在使用mysql创build映像后,在映像上启动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上,可以通过select“首选项…”菜单,select“守护程序”选项卡并select“高级”选项卡来编辑“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