AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 870568
Accepted
Wolfgang Fahl
Wolfgang Fahl
Asked: 2017-08-27 03:45:25 +0800 CST2017-08-27 03:45:25 +0800 CST 2017-08-27 03:45:25 +0800 CST

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

  • 772

当我在 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 选项。

    这正是我们想要的:一个尚未设置 root 密码的 mysql。

  3. 在过去(ubuntu 14.04 / mysql 5.5)aservice 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 .

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

  1. 对于Docker environment开始仍然失败

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

  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 [错误] 无法' 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' 是标记为崩溃,应该修复

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

mysql
  • 5 5 个回答
  • 42357 Views

5 个回答

  • Voted
  1. Best Answer
    Tibor Gyuris
    2017-09-08T12:41:22+08:002017-09-08T12:41:22+08:00

    今天遇到了同样的问题。我在 docker build 期间为单元测试运行 MySQL 服务,并从 MariaDB 升级到 MySQL CE 5.7.19 破坏了构建。每次启动mysql服务之前,为我解决问题的是chown -R mysql:mysql /var/lib/mysql /var/run/mysqld每次运行。

    所以我的 Dockerfile 现在看起来像这样:

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

    希望这可以帮助。

    • 34
  2. Murmel
    2018-01-19T09:31:53+08:002018-01-19T09:31:53+08:00

    解决方法

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

    问题描述

    aalexgabi所述的潜在问题是由于实施了 OverlayFS 的 POSIX 标准:

    open(2):OverlayFS 只实现了 POSIX 标准的一个子集。这可能会导致某些 OverlayFS 操作违反 POSIX 标准。一种这样的操作是复制操作。假设您的应用程序调用fd1=open("foo", O_RDONLY)然后fd2=open("foo", O_RDWR). 在这种情况下,您的应用程序期望 fd1 和 fd2 引用同一个文件。但是,由于在第二次调用open(2) 之后发生了向上复制操作,描述符引用了不同的文件。fd1 继续引用镜像中的文件(lowerdir),fd2 引用容器中的文件(upperdir)。一种解决方法是触摸导致复制操作发生的文件。open(2)无论是只读还是读写访问模式,所有后续操作都将引用容器(上层目录)中的文件。

    参考:

    • github.com - docker/for-linux - 问题 - MySQL 不以overlay2 和overlay 开头,而是以aufs 开头
    • github.com - drupal-vm - 问题 - Docker 映像未启动 MySQL - “无法打开和锁定权限表:错误 140”
    • 11
  3. Tsuneo Yoshioka
    2017-11-15T23:21:34+08:002017-11-15T23:21:34+08:00

    我确认了overlayfs(overlay2)上的错误,这是Docker for Mac的默认设置。在使用 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 上,可以通过选择“Preferences...”菜单,选择“Daemon”选项卡,然后选择“Advanced”选项卡来编辑“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

    • 9
  4. Paul Dejean
    2018-09-29T13:52:49+08:002018-09-29T13:52:49+08:00

    这是我在这里还没有看到的答案。

    将此添加到您的 dockerfile:VOLUME /var/lib/mysql

    这将导致 /var/lib/mysql 文件夹使用本机文件系统而不是 overlayFS。这绕过了这个问题。

    这是官方 mysql docker 映像用来处理此问题的解决方案,您可以在此处看到:https ://github.com/docker-library/mysql/blob/9d1f62552b5dcf25d3102f14eb82b579ce9f4a26/5.7/Dockerfile

    • 2
  5. Wolfgang Fahl
    2017-08-28T00:14:22+08:002017-08-28T00:14:22+08:00

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

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

    尝试在此会话中启动守护程序失败两次 - 一次是由于 mysql.user 表,一次是由于 mysql.db 表。使用 --skip-grant-tables 运行 mysql 守护进程是可行的,但在这些表上使用简单的 select * from 命令也存在问题。

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

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

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

    service mysql start
    

    似乎工作。我现在将尝试将其自动化作为一种​​解决方法。我仍在寻找解决该问题的“适当”解决方案,并了解这种奇怪行为的原因是什么。

    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
    

    构建日志

    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 ]
    
    • 1

相关问题

  • 开源与专有关系 db mgt 系统的优缺点是什么?

  • 在 solaris 10 上为 mysql 设置 max_allowed_pa​​cket

  • 如何移动 MySQL 的数据目录?

  • 通过 VPN 连接什么是远程服务器 IP?

  • mysql崩溃

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve