当我在 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 空间中的每个表连续查询 3 次(因为实验表明,在某些表上,查询将完全失败两次 :-( )。
然后一个
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/ 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' 是标记为崩溃,应该修复
这里发生了什么导致这种奇怪的行为?