Lỗi nghiêm trọng: Không thể mở và khóa các bảng đặc quyền: Công cụ lưu trữ bảng cho 'người dùng' không có tùy chọn này


15

Thông báo lỗi này hiển thị khi tôi sử dụng Ubuntu 16.04 và mysql 5.7.19-0ubfox0.16.04.1 mới nhất trong hình ảnh Docker.

Có thể làm gì để khắc phục điều này?

Để tái tạo lỗi

  1. Nhận được Dockerfile:

    FROM ubuntu:16.04
    
    RUN apt update
    RUN DEBIAN_FRONTEND=noninteractive apt install -y mysql-server
    

    (cũng có sẵn ở đây )

  2. Xây dựng và chạy:

    docker build -t mysqlfail . 
    docker run -it mysqlfail tail -1 /var/log/mysql/error.log
    

    sẽ được hiển thị nhật ký lỗi sau:

    2017-08-26T11: 48: 45,398445Z 1 [Cảnh báo] root @ localhost được tạo với mật khẩu trống! Vui lòng xem xét tắt tùy chọn --initialize-không an toàn.

    Đó chính xác là những gì chúng tôi muốn: một mysql chưa có mật khẩu gốc được đặt.

  3. Trong quá khứ (ubfox 14.04 / mysql 5.5), điều service mysql startnày là có thể. Bây giờ nếu bạn thử nó, nó thất bại

    docker run -it mysqlfail service mysql start
     * Starting MySQL database server mysqld    
      No directory, logging in with HOME=/  
                                                                            [fail]
    

    /var/log/mysql/error.logchứa một dòng:

    2017-08-26T11: 59: 57.680618Z 0 [LRI] Lỗi nghiêm trọng: Không thể mở và khóa bảng đặc quyền: Công cụ lưu trữ bảng cho 'người dùng' không có tùy chọn này


xây dựng nhật ký (cho hoàn thành 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

tiếp tục kỳ lạ

Sau khi thử nghiệm như được nêu trong nỗ lực trả lời của tôi , tôi đã tạo một tập lệnh shell thực hiện một

select count(*)

truy vấn trên mỗi bảng trong không gian mysql ba lần liên tiếp (vì các thử nghiệm cho thấy trên một số bảng, truy vấn sẽ thất bại chính xác hai lần :-().

Sau đó, một

mysql_upgrade   

service mysql restart

được thử. Trong Dockerfilekịch bản được cung cấp qua

COPY mysqltest.sh .

Các thử nghiệm với kịch bản này cho kết quả kỳ lạ / điên rồ.

  1. Để Docker environmentbắt đầu vẫn thất bại

    [ERROR] Lỗi nghiêm trọng: Không thể mở và khóa các bảng đặc quyền: Công cụ lưu trữ bảng cho 'người dùng' không có tùy chọn này

  2. Chạy kịch bản

    sh mysqltest.sh root
    

    trong docker environmentdẫn đến

    2017-08-27T09: 12: 47.021528Z 12 [ERROR] / usr / sbin / mysqld: Bảng './mysql/db' được đánh dấu là bị hỏng và cần được sửa chữa
    2017-08-27T09: 12: 47.050141Z 12 [ERROR ] Không thể sửa chữa bảng: mysql.db
    2017-08-27T09: 12: 47.055925Z 13 [ERROR] / usr / sbin / mysqld: Bảng './mysql/db' được đánh dấu là đã bị hỏng và cần được sửa chữa
    2017-08 -27T09: 12: 47.407700Z 54 [ERROR] / usr / sbin / mysqld: Bảng './mysql/proc' được đánh dấu là bị hỏng và cần được sửa chữa
    2017-08-27T09: 12: 47.433516Z 54 [ERROR] Bảng sửa chữa: mysql.proc
    2017-08-27T09: 12: 47.440695Z 55 [ERROR] / usr / sbin / mysqld: Bảng './mysql/proc' được đánh dấu là bị hỏng và cần được sửa chữa
    2017-08-27T09: 12: 47.769485Z 81 [LRI] / usr / sbin / mysqld: Bảng './mysql/tables_priv'được đánh dấu là bị hỏng và cần được sửa chữa
    2017-08-27T09: 12: 47.792061Z 81 [ERROR] Không thể sửa chữa bảng: mysql.tables_priv
    2017-08-27T09: 12: 47.798472Z 82 [ERROR] / usr / sbin / mysqld: Bảng './mysql/ frames_priv 'được đánh dấu là đã bị hỏng và cần được sửa chữa
    2017-08-27T09: 12: 47.893741Z 99 [ERROR] / usr / sbin / mysqld: Bảng' ./mysql/user 'được đánh dấu là bị hỏng và nên được sửa chữa
    2017-08 -27T09: 12: 47.914288Z 99 [ERROR] Không thể sửa chữa bảng: mysql.user
    2017-08-27T09: 12: 47.920459Z 100 [ERROR] / usr / sbin / mysqld: Bảng './mysql/user' là đánh dấu là bị hỏng và cần được sửa chữa

Điều gì đang xảy ra ở đây để gây ra hành vi kỳ lạ này?


1
mysqld --skip-Grant-bảng --skip-mạng dường như hoạt động
Wolfgang Fahl

mkdir / var / run / mysqld; chown mysql / var / run / mysqld cũng có thể cần thiết.
Wolfgang Fahl

Câu trả lời:


30

Ran vào cùng một vấn đề ngày hôm nay. Tôi đang chạy dịch vụ MySQL trong quá trình xây dựng docker để kiểm tra đơn vị và nâng cấp lên MySQL CE 5.7.19 từ MariaDB đã phá vỡ bản dựng. Điều gì đã giải quyết vấn đề cho tôi là chạy chown -R mysql:mysql /var/lib/mysql /var/run/mysqldmỗi lần trước khi bắt đầu dịch vụ mysql.

Vì vậy, Dockerfile của tôi trông như thế này bây giờ:

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

Hi vọng điêu nay co ich.


2
Cùng một vấn đề ở đây. Tôi đã có một bản dựng hai giai đoạn đang hoạt động và Dockerfile "cha mẹ" đã chạy chmodlệnh này . Quá trình xây dựng thành công khi tôi chạy nó trên máy chủ Ubuntu từ xa, nhưng không thành công khi tôi chạy nó trên máy cục bộ (OS X). Việc thêm chmodlệnh vào Dockerfile con đã khắc phục sự cố. Lạ thật .
gửi

2
Cảm ơn bạn! Tôi biết một người khác ngoài kia phải có trường hợp sử dụng tương tự như của tôi.
Threed

2
@senderle chỉ tìm thấy chủ đề này là tốt. "Xây dựng một lần, triển khai ở bất cứ đâu" họ nói
vào

8

Tôi đã xác nhận lỗi trên lớp phủ (lớp phủ2) là mặc định trên Docker cho Mac. Lỗi xảy ra khi bắt đầu mysql trên hình ảnh, sau khi tạo một hình ảnh với 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

Chuyển sang "aufs" đã giải quyết vấn đề. (Trên Docker cho Mac, có thể chỉnh sửa "daemon.json" bằng cách chọn menu "Tùy chọn ..." và chọn tab "Daemon" và chọn tab "Nâng cao".)

/etc/docker/daemon.json:

{
  "storage-driver" : "aufs",
  "debug" : true,
  "experimental" : true
}

Tham chiếu:

https://github.com/moby/moby/issues353503

https://qiita.com/Hige-Moja/items/7b1208f16997e2aa9028


1
Điều này đã giải quyết vấn đề của tôi trong Ubuntu 16:04. Tôi đã cấu hình trình điều khiển lưu trữ overlay2 trước đây trong docker. Cảm ơn.
Havok

Điều này đã ngăn
docker

8

Giải pháp thay thế

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

Mô tả vấn đề

Vấn đề cơ bản như aalexgabi đã nêu là do việc triển khai các tiêu chuẩn POSIX của OverlayFS :

open (2): OverlayFS chỉ thực hiện một tập hợp con của các tiêu chuẩn POSIX. Điều này có thể dẫn đến một số hoạt động OverlayFS nhất định phá vỡ các tiêu chuẩn POSIX. Một hoạt động như vậy là hoạt động sao chép. Giả sử rằng ứng dụng của bạn gọi fd1=open("foo", O_RDONLY)và sau đó fd2=open("foo", O_RDWR). Trong trường hợp này, ứng dụng của bạn hy vọng fd1 và fd2 sẽ tham chiếu đến cùng một tệp. Tuy nhiên, do thao tác sao chép xảy ra sau lần gọi thứ hai đến open(2), các mô tả tham chiếu đến các tệp khác nhau. Fd1 tiếp tục tham chiếu tệp trong ảnh (lowdir) và fd2 tham chiếu tệp trong container (Upperdir). Một cách giải quyết cho vấn đề này là chạm vào các tệp khiến thao tác sao chép xảy ra. Tất cả các open(2)hoạt động tiếp theo bất kể chế độ truy cập chỉ đọc hoặc đọc ghi sẽ được tham chiếu tệp trong vùng chứa (Upperdir).

Tài liệu tham khảo:


1
Đây là tin khủng khiếp. Tôi tự hỏi tại sao docker không cố định.
Wolfgang Fahl

2
Thành thật? Tôi cũng không! Tôi có nghĩa là điều này phải ảnh hưởng đến rất nhiều ứng dụng, bởi vì nó thực sự là một hoạt động tập tin cơ bản. Tất nhiên vấn đề chỉ xảy ra trong một số điều kiện nhất định, nhưng chúng không ở đâu xa ...
Murmel

2

Đây là một câu trả lời tôi chưa thấy ở đây.

Thêm phần này vào dockerfile của bạn: VOLUME /var/lib/mysql

Điều này sẽ khiến thư mục / var / lib / mysql sử dụng hệ thống tệp gốc thay vì lớp phủ. Điều này phá vỡ vấn đề này.

Đây là giải pháp mà hình ảnh docker mysql chính thức sử dụng để giải quyết vấn đề này như bạn có thể thấy ở đây: https://github.com/docker-l Library / mysql / blog / 9d1f62552b5dcf25d3102f14eb82b579ce9f4a26/5.7 / Dock


1

Đây có thể không hoàn toàn là giải pháp. Dù sao nó cũng có thể chỉ cho người khác một câu trả lời "đúng"

Nhật ký phiên bash docker bên dưới hiển thị một chuỗi các bước dẫn đến các lỗi lạ và cuối cùng có thể khởi động mysemon daemon đúng cách trong môi trường docker.

Cố gắng khởi động trình nền trong phiên này không thành công hai lần - một lần do bảng mysql.user và một lần do bảng mysql.db. Chạy trình nền mysql với --skip-Grant-bảng hoạt động nhưng cũng có vấn đề với chọn * đơn giản từ các lệnh trên các bảng này.

Kỳ lạ làm hai truy vấn đơn giản:

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

và sau đó giết daemon để bắt đầu nó đúng cách với

service mysql start

dường như làm việc Bây giờ tôi sẽ cố gắng tự động hóa điều này như một cách giải quyết. Tôi vẫn đang tìm kiếm một giải pháp "phù hợp" cho vấn đề và một số manh mối lý do cho hành vi kỳ lạ này là gì.

Dockerfile

#*********************************************************************
#
# 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

xây dựng nhật ký

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

nhật ký phiên 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 ]

Nhìn vào tập tin docker ban đầu github.com/docker-l Library / mysql / blob / HP và entrypoint.sh github.com/docker-l Library / mysql / blog / . Họ sẽ cho bạn một ý tưởng những gì cần phải được thực hiện.
Tarun Lalwani

Cảm ơn bạn đã gợi ý. Các thử nghiệm tiếp theo của tôi cho thấy loạt phát hành 5.7.x hoạt động khác nhau tùy thuộc vào x. Lên đến 5.7,14 điều dường như đã đơn giản hơn. Cách tiếp cận manynines.com/blog/ trên mạng hoạt động trong môi trường linux của tôi. Trong môi trường Mac OS của tôi, mọi thứ khó khăn hơn.
Wolfgang Fahl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.