치명적인 오류 : 권한 테이블을 열고 잠글 수 없음 : 'user'에 대한 테이블 스토리지 엔진에이 옵션이 없습니다.


15

이 오류 메시지는 Docker 이미지에서 우분투 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 옵션을 끄십시오.

    정확히 우리가 원했던 것입니다 : 아직 루트 암호가 설정되지 않은 mysql.

  3. 과거에는 (우분투 14.04 / mysql 5.5) 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 [오류] 치명적인 오류 : 권한 테이블을 열고 잠글 수 없습니다 : 'user'에 대한 테이블 스토리지 엔진에이 옵션이 없습니다


빌드 로그 (완료 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시작은 계속 실패

    [ERROR] 치명적인 오류 : 권한 테이블을 열고 잠글 수 없음 : 'user'에 대한 테이블 스토리지 엔진에이 옵션이 없습니다.

  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 [ERROR] Couldn ' 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'는 충돌로 표시되어 수리해야합니다

이 이상한 행동을 일으키기 위해 여기에서 무슨 일이 일어나고 있습니까?


1
mysqld를 --skip-그랜트 테이블 --skip-네트워크가 작동하는 것 같다
볼프강 Fahl에게

mkdir / var / run / mysqld; chown mysql / var / run / mysqld도 필요할 수 있습니다.
Wolfgang Fahl

1
--skip-networking은 서버에 연결하려는 모든 TCP / IP 연결을 비활성화하므로 때로는 이것이 잘못됩니다. mariadb.com/kb/en/server-system-variables/#skip_networking
Darko Maksimovic

@DarkoMaksimovic은 소유권 설정이 해결책으로 받아 들여지는 답변을 참조하십시오.
Wolfgang Fahl

실제로 이미 시도했지만 내 경우에는 아무것도 변경되지 않았습니다 (MacOS의 MySQL 5.7, Docker 2.1.0.5). 이 스레드의 누군가가 추가 선택에 대해 불평했지만 --skip-grant-tables 만 서버를 시작하는 데 도움이되었지만 언제 발생하는지 알 수 있습니다.
Darko Maksimovic

답변:


30

오늘도 같은 문제가 발생했습니다. 단위 테스트를 위해 도커 빌드 중에 MySQL 서비스를 실행하고 MariaDB에서 MySQL CE 5.7.19로 업그레이드하면 빌드가 중단되었습니다. chown -R mysql:mysql /var/lib/mysql /var/run/mysqldmysql 서비스를 시작하기 전에 매번 문제가 해결되었습니다 .

그래서 내 Dockerfile은 다음과 같습니다.

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

도움이 되었기를 바랍니다.


2
여기에도 같은 문제가 있습니다. 2 단계 빌드 작업을했는데 "부모"Dockerfile이 이미이 chmod명령을 실행하고 있습니다. 원격 Ubuntu 서버에서 실행하면 빌드가 성공하지만 로컬 시스템 (OS X)에서 실행하면 실패합니다. chmod자식 Dockerfile에 명령을 추가하면 문제가 해결되었습니다. 이상 합니다.
senderle

2
감사합니다! 나는 다른 사람이 내 자신과 비슷한 유스 케이스를 가져야한다는 것을 알았습니다.
THREED

2
@senderle 은이 스레드를 찾았습니다. "빌드 한 번, 어디서나 배포"그들은 말했다
duhaime

9

해결 방법

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)읽기 전용 또는 읽기 / 쓰기 액세스 모드에 관계없이 모든 후속 작업은 컨테이너 (upperdir)의 파일을 참조합니다.

참고:


1
이것은 끔찍한 소식입니다. 도 커가 왜 고정되어 있지 않은지 궁금합니다.
Wolfgang Fahl

2
솔직히? 나도! 이것은 실제로 기본 파일 작업이기 때문에 많은 응용 프로그램에 영향을 미칩니다. 물론 문제는 특정 상황에서만 발생하지만 그리 멀지 않습니다 ...
Murmel

8

Docker for Mac의 기본값 인 overlayfs (overlay2)의 오류를 확인했습니다. 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"로 전환하면 문제가 해결되었습니다. (Mac 용 Docker에서 "기본 설정 ..."메뉴를 선택하고 "데몬"탭을 선택한 다음 "고급"탭을 선택하여 "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


1
이것은 우분투 16:04의 문제를 해결했습니다. 이전에 docker에서 overlay2 스토리지 드라이버를 구성했습니다. 감사.
Havok

1
:( OSX에 다시 시작에서이 방지 고정 표시기
duhaime

2

여기에 아직 보이지 않는 답변이 있습니다.

이것을 dockerfile에 추가하십시오. VOLUME /var/lib/mysql

이로 인해 / var / lib / mysql 폴더가 overlayFS 대신 기본 파일 시스템을 사용하게됩니다. 이것은이 문제를 우회합니다.

이것은 https://github.com/docker-library/mysql/blob/9d1f62552b5dcf25d3102f14eb82b579ce9f4a26/5.7/Dockerfile 에서 공식 mysql docker 이미지가 이것을 처리하는 데 사용하는 솔루션입니다.


1

이것은 아직 해결책이 아닐 수도 있습니다. 어쨌든 그것은 다른 사람들에게 "적절한"답변을 가리킬 수 있습니다

아래의 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 for /server/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 ]

원래 도커 파일 github.com/docker-library/mysql/blob/… 및 entrypoint.sh github.com/docker-library/mysql/blob/…를보십시오 . 그들은 당신에게 무엇을해야하는지에 대한 아이디어를 줄 것입니다.
Tarun Lalwani

힌트 주셔서 감사합니다. 추가 실험에서 5.7.x 시리즈 릴리스는 x에 따라 다르게 작동하는 것으로 나타났습니다. 최대 5.7.14가 더 간단한 것 같습니다. severalnines.com/blog/... 접근 방식은 내 리눅스 환경에서 작동합니다. 내 Mac OS 환경에서는 상황이 더 어렵습니다.
Wolfgang Fahl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.