Это сообщение об ошибке появляется, когда я использую ubuntu 16.04 и последнюю версию mysql 5.7.19-0ubuntu0.16.04.1 в образе Docker.
Что можно сделать, чтобы это исправить?
Чтобы воспроизвести ошибку
Получить 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.
Это было именно то, что мы хотели: MySQL без установленного пароля root.
В прошлом (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 .
Испытания с этим скриптом дают странные / сумасшедшие результаты.
Для Docker environment
начало все еще не удается
[ОШИБКА] Неустранимая ошибка: не удается открыть и заблокировать таблицы привилегий: механизм хранения таблиц для 'пользователя' не имеет этой опции
Запуск скрипта
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
}
Ссылка:
Вот ответа, которого я здесь пока не вижу.
Добавьте это в свой файл докеров: 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 ]