当我在Docker映像中使用ubuntu 16.04和最新的mysql 5.7.19-0ubuntu0.16.04.1时显示此错误消息。
该如何解决?
重现错误
获取
Dockerfile
:FROM ubuntu:16.04 RUN apt update RUN DEBIAN_FRONTEND=noninteractive apt install -y mysql-server
(也在此处可用)
构建并运行:
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选项。
这正是我们想要的:尚未设置root密码的mysql。
在过去(ubuntu 14.04 / mysql 5.5)a
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 [错误]致命错误:无法打开和锁定特权表:“用户”的表存储引擎没有此选项
构建日志(完整的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
奇怪的延续
经过尝试回答中概述的实验后,我创建了一个shell脚本,该脚本执行
select count(*)
在mysql空间中的每个表上连续查询三次(因为实验表明,在某些表上,查询将完全失败两次:-()。
然后一个
mysql_upgrade
和
service mysql restart
被尝试了。在Dockerfile
脚本中,可以通过
COPY mysqltest.sh .
使用此脚本进行的试验给出了奇怪/疯狂的结果。
对于
Docker environment
开始仍然失败[错误]致命错误:无法打开和锁定特权表:“用户”的表存储引擎没有此选项
运行脚本
sh mysqltest.sh root
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 [错误]不能' 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/ table_priv'被标记为已崩溃,应该修复
2017-08-27T09:12:47.893741Z 99 [ERROR] / 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'是标记为已崩溃,应该修复
这是怎么回事导致这种奇怪的行为?