Schwerwiegender Fehler: Berechtigungstabellen können nicht geöffnet und gesperrt werden: Die Tabellenspeicher-Engine für 'Benutzer' verfügt nicht über diese Option

15

Diese Fehlermeldung wird angezeigt, wenn ich Ubuntu 16.04 und das neueste mysql 5.7.19-0ubuntu0.16.04.1 in einem Docker-Image verwende.

Was könnte getan werden, um dies zu beheben?

Um den Fehler zu reproduzieren

  1. Holen Sie sich das Dockerfile:

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

    (auch hier erhältlich )

  2. Erstellen und ausführen:

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

    hätte das folgende Fehlerprotokoll angezeigt bekommen:

    2017-08-26T11: 48: 45.398445Z 1 [Warnung] root @ localhost wurde mit einem leeren Passwort erstellt! Bitte erwägen Sie, die Option --initialize-insecure auszuschalten.

    Welches war genau das, was wir wollten: ein MySQL ohne Root-Passwort noch eingestellt.

  3. In der Vergangenheit (Ubuntu 14.04 / MySQL 5.5) war ein service mysql startmöglich. Wenn Sie dies versuchen, schlägt dies fehl

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

    und /var/log/mysql/error.logenthält eine Zeile:

    2017-08-26T11: 59: 57.680618Z 0 [FEHLER] Schwerwiegender Fehler: Berechtigungstabellen können nicht geöffnet und gesperrt werden: Die Tabellenspeicher-Engine für 'Benutzer' verfügt nicht über diese Option


Bauprotokoll (für das komplette 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

seltsame Fortsetzung

Nach den in meinem Antwortversuch beschriebenen Experimenten habe ich ein Shell-Skript erstellt, das a

select count(*)

Abfrage für jede Tabelle im MySQL-Bereich dreimal hintereinander (da Experimente zeigen, dass bei einigen Tabellen die Abfrage genau zweimal fehlschlägt :-().

Dann ein

mysql_upgrade   

und die

service mysql restart

wird versucht. Im wird das DockerfileSkript über zur Verfügung gestellt

COPY mysqltest.sh .

Die Versuche mit diesem Skript führen zu seltsamen / verrückten Ergebnissen.

  1. Denn Docker environmentder Start scheitert noch

    [FEHLER] Schwerwiegender Fehler: Berechtigungstabellen können nicht geöffnet und gesperrt werden: Die Tabellenspeicher-Engine für 'Benutzer' verfügt nicht über diese Option

  2. Ausführen des Skripts

    sh mysqltest.sh root
    

    in den docker environmentführt zu

    2017-08-27T09: 12: 47.021528Z 12 [FEHLER] / usr / sbin / mysqld: Tabelle './mysql/db' ist als abgestürzt markiert und sollte repariert werden
    2017-08-27T09: 12: 47.050141Z 12 [FEHLER ] Tabelle konnte nicht repariert werden: mysql.db
    2017-08-27T09: 12: 47.055925Z 13 [FEHLER] / usr / sbin / mysqld: Tabelle './mysql/db' ist als abgestürzt markiert und sollte
    2017-08 repariert werden -27T09: 12: 47.407700Z 54 [FEHLER] / usr / sbin / mysqld: Tabelle './mysql/proc' ist als abgestürzt markiert und sollte repariert werden
    2017-08-27T09: 12: 47.433516Z 54 [FEHLER] Konnte nicht ' t repair table: mysql.proc
    2017-08-27T09: 12: 47.440695Z 55 [FEHLER] / usr / sbin / mysqld: Die Tabelle './mysql/proc' ist als abgestürzt markiert und sollte repariert werden
    2017-08-27T09: 12: 47.769485Z 81 [FEHLER] / usr / sbin / mysqld: Tabelle './mysql/tables_priv'ist als abgestürzt markiert und sollte repariert werden
    2017-08-27T09: 12: 47.792061Z 81 [FEHLER] Tabelle konnte nicht repariert werden: mysql.tables_priv
    2017-08-27T09: 12: 47.798472Z 82 [FEHLER] / usr / sbin / mysqld: Table './mysql/ tables_priv 'ist als abgestürzt markiert und sollte repariert werden
    2017-08-27T09: 12: 47.893741Z 99 [FEHLER] / usr / sbin / mysqld: Tabelle' ./mysql/user 'ist als abgestürzt markiert und sollte repariert werden
    2017-08 -27T09: 12: 47.914288Z 99 [FEHLER] Tabelle konnte nicht repariert werden: mysql.user
    2017-08-27T09: 12: 47.920459Z 100 [FEHLER] / usr / sbin / mysqld: Tabelle './mysql/user' ist markiert als abgestürzt und sollte repariert werden

Was ist hier los, um dieses seltsame Verhalten zu verursachen?

Wolfgang Fahl
quelle
1
mysqld --skip-grant-tables --skip-networking scheint zu funktionieren
Wolfgang Fahl
Möglicherweise wird auch mkdir / var / run / mysqld; chown mysql / var / run / mysqld benötigt.
Wolfgang Fahl

Antworten:

30

Bin heute auf dasselbe Problem gestoßen. Ich führe den MySQL-Dienst während des Docker-Builds für die Komponententests aus und ein Upgrade auf MySQL CE 5.7.19 von MariaDB hat den Build abgebrochen. Was das Problem für mich gelöst hat, war, dass es chown -R mysql:mysql /var/lib/mysql /var/run/mysqldjedes Mal ausgeführt wurde, bevor der mysql-Dienst gestartet wurde.

So sieht mein Dockerfile jetzt aus:

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

Hoffe das hilft.

Tibor Gyuris
quelle
2
Selbes Problem hier. Ich hatte einen zweistufigen Build, und das "übergeordnete" Dockerfile führt diesen chmodBefehl bereits aus. Der Build ist erfolgreich, wenn ich ihn auf einem fernen Ubuntu-Server ausführe, schlägt jedoch fehl, wenn ich ihn auf meinem lokalen Computer (OS X) ausführe. Das Hinzufügen des chmodBefehls zum untergeordneten Dockerfile behebt das Problem. Seltsam .
Senderle
2
Vielen Dank! Ich wusste, dass jemand anderes da draußen einen ähnlichen Anwendungsfall haben musste wie ich.
Dreier
2
@senderle hat gerade auch diesen Thread gefunden. "Einmal bauen, überall einsetzen", sagten sie
duhaime
8

Ich habe den Fehler bei Overlayfs (Overlay2) bestätigt, der in Docker für Mac standardmäßig verwendet wird. Der Fehler tritt auf, wenn MySQL auf dem Image gestartet wird, nachdem ein Image mit MySQL erstellt wurde.

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

Der Wechsel zu "aufs" löste das Problem. (In Docker für Mac kann die Datei "daemon.json" bearbeitet werden, indem Sie im Menü "Einstellungen" die Registerkarte "Daemon" und dann die Registerkarte "Erweitert" auswählen.)

/etc/docker/daemon.json:

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

Ref:

https://github.com/moby/moby/issues/35503

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

Tsuneo Yoshioka
quelle
1
Dies löste mein Problem in Ubuntu 16.04. Ich hatte zuvor den Overlay2-Speichertreiber im Docker konfiguriert. Vielen Dank.
Havok
Dies verhinderte, dass Docker unter OSX neu
gestartet werden konnte
8

Umgehung

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

Problembeschreibung

Das von aalexgabi festgestellte Grundproblem ist auf die Implementierung der POSIX-Standards von OverlayFS zurückzuführen :

open (2): OverlayFS implementiert nur eine Teilmenge der POSIX-Standards. Dies kann dazu führen, dass bestimmte OverlayFS-Vorgänge gegen POSIX-Standards verstoßen. Eine solche Operation ist die Kopieroperation. Angenommen, Ihre Anwendung ruft fd1=open("foo", O_RDONLY)und dann auf fd2=open("foo", O_RDWR). In diesem Fall erwartet Ihre Anwendung, dass fd1 und fd2 auf dieselbe Datei verweisen. Aufgrund eines Kopiervorgangs nach dem zweiten Aufruf von open(2verweisen die Deskriptoren jedoch auf unterschiedliche Dateien. Das fd1 verweist weiterhin auf die Datei im Bild (lowerdir) und das fd2 verweist auf die Datei im Container (upperdir). Eine Problemumgehung besteht darin, die Dateien zu berühren, die den Kopiervorgang auslösen. Alle nachfolgenden open(2)Vorgänge, unabhängig vom schreibgeschützten oder schreibgeschützten Zugriffsmodus, verweisen auf die Datei im Container (upperdir).

Referenz:

Murmeln
quelle
1
Das sind schreckliche Neuigkeiten. Ich frage mich, warum Docker nicht behoben ist.
Wolfgang Fahl
2
Ehrlich? Ich auch nicht! Ich meine, das muss viele Anwendungen betreffen, da es sich wirklich um eine grundlegende Dateioperation handelt. Natürlich tritt das Problem nur unter bestimmten Bedingungen auf, aber sie sind nicht so weit weg ...
Murmel
2

Hier ist eine Antwort, die ich hier noch nicht sehe.

Fügen Sie dies zu Ihrer Docker-Datei hinzu: VOLUME /var/lib/mysql

Dies bewirkt, dass der Ordner / var / lib / mysql das native Dateisystem anstelle von overlayFS verwendet. Dies umgeht dieses Problem.

Dies ist die Lösung der offizielle mysql Docker Bild verwendet damit umgehen , wie Sie hier sehen können: https://github.com/docker-library/mysql/blob/9d1f62552b5dcf25d3102f14eb82b579ce9f4a26/5.7/Dockerfile

Paul Dejean
quelle
1

Dies ist möglicherweise noch nicht die richtige Lösung. Wie auch immer, es könnte andere auf eine "richtige" Antwort hinweisen

Das Docker-Bash-Sitzungsprotokoll unten zeigt eine Abfolge von Schritten, die zu seltsamen Fehlern führen und es schließlich ermöglichen, den mysql-Dämon in der Docker-Umgebung ordnungsgemäß zu starten.

Der Versuch, den Dämon in dieser Sitzung zu starten, schlägt zweimal fehl - einmal aufgrund der Tabelle mysql.user und einmal aufgrund der Tabelle mysql.db. Das Ausführen des mysql-Daemons mit --skip-grant-tables funktioniert, aber es gibt auch Probleme mit einfachen select * -Befehlen für diese Tabellen.

Seltsamerweise zwei einfache Abfragen:

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

und dann den Daemon beenden, um ihn richtig zu starten

service mysql start

scheint zu funktionieren. Ich werde jetzt versuchen, dies als Workaround zu automatisieren. Ich bin immer noch auf der Suche nach einer "richtigen" Lösung für das Problem und einer Ahnung, was der Grund für dieses seltsame Verhalten ist.

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 [email protected]

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

Protokoll erstellen

docker build .

Sending build context to Docker daemon  8.704kB
Step 1/5 : FROM ubuntu:16.04
 ---> ebcd9d4fca80
Step 2/5 : MAINTAINER Wolfgang Fahl [email protected]
 ---> 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-Sitzungsprotokoll

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 ]
Wolfgang Fahl
quelle
Sehen Sie sich die ursprüngliche Docker-Datei github.com/docker-library/mysql/blob/… und die Datei entrypoint.sh github.com/docker-library/mysql/blob/… an . Sie geben Ihnen eine Vorstellung davon, was zu tun ist.
Tarun Lalwani
Danke für den Hinweis. Meine weiteren Experimente zeigen, dass sich die Release-Serien 5.7.x je nach x unterschiedlich verhalten. Bis 5.7.14 scheint es einfacher gewesen zu sein. Der Ansatz von variousnines.com/blog/… funktioniert in meiner Linux-Umgebung. In meiner Mac OS-Umgebung sind die Dinge schwieriger.
Wolfgang Fahl