이 오류 메시지는 Docker 이미지에서 우분투 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 옵션을 끄십시오.
정확히 우리가 원했던 것입니다 : 아직 루트 암호가 설정되지 않은 mysql.
과거에는 (우분투 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 .
이 스크립트를 사용한 시험은 이상하고 미친 결과를 제공합니다.
의 경우
Docker environment
시작은 계속 실패[ERROR] 치명적인 오류 : 권한 테이블을 열고 잠글 수 없음 : 'user'에 대한 테이블 스토리지 엔진에이 옵션이 없습니다.
스크립트 실행
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'는 충돌로 표시되어 수리해야합니다
이 이상한 행동을 일으키기 위해 여기에서 무슨 일이 일어나고 있습니까?