Назад | Перейти на главную страницу

Неустранимая ошибка: не удается открыть и заблокировать таблицы привилегий: механизм хранения таблиц для 'пользователя' не имеет этой опции

Это сообщение об ошибке появляется, когда я использую ubuntu 16.04 и последнюю версию mysql 5.7.19-0ubuntu0.16.04.1 в образе Docker.

Что можно сделать, чтобы это исправить?

Чтобы воспроизвести ошибку

  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 без установленного пароля root.

  3. В прошлом (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

странное продолжение

После экспериментов, описанных в моя попытка ответа, Я создал сценарий оболочки, который выполняет

select count(*)

запрос к каждой таблице в пространстве mysql три раза подряд (поскольку эксперименты показывают, что в некоторых таблицах запрос не выполняется ровно дважды :-().

Затем

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 [ОШИБКА] Не удалось восстановить таблицу: 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 во время сборки докеров для модульных тестов, и обновление до MySQL CE 5.7.19 с MariaDB нарушило сборку. Что помогло мне решить проблему? 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

Надеюсь это поможет.

Обходной путь

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

Описание проблемы

Основная проблема, заявленная алексгаби связано с реализация стандартов POSIX OverlayFS:

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) операции, независимо от режима доступа только для чтения или чтения-записи, будут ссылаться на файл в контейнере (upperdir).

Ссылка:

Я подтвердил ошибку на overlayfs (overlay2), которая используется по умолчанию в Docker для 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 для 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

Вот ответа, которого я здесь пока не вижу.

Добавьте это в свой файл докеров: VOLUME /var/lib/mysql

Это приведет к тому, что в папке / var / lib / mysql будет использоваться собственная файловая система, а не overlayFS. Это позволяет обойти эту проблему.

Это решение, которое официальный образ докера mysql использует для решения этой проблемы, как вы можете видеть здесь: https://github.com/docker-library/mysql/blob/9d1f62552b5dcf25d3102f14eb82b579ce9f4a26/5.7/Dockerfile

Это еще не совсем решение. В любом случае это может указать другим на "правильный" ответ

В журнале сеанса docker bash ниже показана последовательность шагов, которые приводят к странным ошибкам и, наконец, к возможности правильно запустить демон mysql в среде docker.

Попытка запустить демон в этом сеансе дважды терпит неудачу - один раз из-за таблицы mysql.user и один раз из-за таблицы mysql.db. Запуск демона mysql с --skip-grant-tables работает, но есть также проблемы с простыми командами 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 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 ]