Errore irreversibile: impossibile aprire e bloccare le tabelle dei privilegi: il motore di archiviazione delle tabelle per "utente" non dispone di questa opzione


15

Questo messaggio di errore viene visualizzato quando utilizzo ubuntu 16.04 e l'ultimo mysql 5.7.19-0ubuntu0.16.04.1 in un'immagine Docker.

Cosa si potrebbe fare per risolvere questo problema?

Per riprodurre l'errore

  1. Ottieni il Dockerfile:

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

    (disponibile anche qui )

  2. Costruisci ed esegui:

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

    sarebbe stato mostrato il seguente registro degli errori:

    2017-08-26T11: 48: 45.398445Z 1 [Warning] root @ localhost viene creato con una password vuota! Si prega di considerare di disattivare l'opzione --initialize-insecure.

    Che era esattamente quello che volevamo: un mysql senza la password di root ancora impostata.

  3. In passato (ubuntu 14.04 / mysql 5.5) service mysql startera possibile. Ora se provi questo, fallisce

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

    e /var/log/mysql/error.logcontiene una riga:

    2017-08-26T11: 59: 57.680618Z 0 [ERRORE] Errore irreversibile: impossibile aprire e bloccare le tabelle dei privilegi: il motore di archiviazione delle tabelle per 'utente' non ha questa opzione


build log (per il completo 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

strana continuazione

Dopo gli esperimenti come indicato nel mio tentativo di risposta , ho creato uno script di shell che esegue un

select count(*)

query su ogni tabella nello spazio mysql tre volte di seguito (perché gli esperimenti mostrano che su alcune tabelle la query fallirà esattamente due volte :-().

Poi un

mysql_upgrade   

e il

service mysql restart

è provato. Nello Dockerfilescript è reso disponibile tramite

COPY mysqltest.sh .

Le prove con questo script danno risultati strani / folli.

  1. Per l' Docker environmentinizio ancora fallisce

    [ERRORE] Errore irreversibile: impossibile aprire e bloccare le tabelle dei privilegi: il motore di archiviazione delle tabelle per "utente" non ha questa opzione

  2. Esecuzione dello script

    sh mysqltest.sh root
    

    nei docker environmentcavi di

    2017-08-27T09: 12: 47.021528Z 12 [ERRORE] / usr / sbin / mysqld: la tabella './mysql/db' è contrassegnata come
    bloccata e deve essere riparata 2017-08-27T09: 12: 47.050141Z 12 [ERRORE ] Impossibile riparare la tabella: mysql.db
    27-08-2017T09: 12: 47.055925Z 13 [ERRORE] / usr / sbin / mysqld: La tabella './mysql/db' è contrassegnata come
    bloccata e deve essere riparata 2017-08-2017 -27T09: 12: 47.407700Z 54 [ERRORE] / usr / sbin / mysqld: la tabella './mysql/proc' è contrassegnata come
    bloccata e deve essere riparata 2017-08-27T09: 12: 47.433516Z 54 [ERRORE] Impossibile " tabella di riparazione t: mysql.proc
    27-08-2017T09: 12: 47.440695Z 55 [ERRORE] / usr / sbin / mysqld: la tabella './mysql/proc' è contrassegnata come
    bloccata e deve essere riparata 27-08-2017T09: 12: 47.769485Z 81 [ERRORE] / usr / sbin / mysqld: Tabella './mysql/tables_priv'è contrassegnato come crash e deve essere riparato
    2017-08-27T09: 12: 47.792061Z 81 [ERRORE] Impossibile riparare la tabella: mysql.tables_priv
    2017-08-27T09: 12: 47.798472Z 82 [ERRORE] / usr / sbin / mysqld: Table './mysql/ tables_priv 'è contrassegnato come crash e deve essere riparato
    2017-08-27T09: 12: 47.893741Z 99 [ERROR] / usr / sbin / mysqld: La tabella' ./mysql/user 'è contrassegnata come crash e dovrebbe essere riparata
    2017-08 -27T09: 12: 47.914288Z 99 [ERRORE] Impossibile riparare la tabella: mysql.user
    2017-08-27T09: 12: 47.920459Z 100 [ERRORE] / usr / sbin / mysqld: Tabella './mysql/user' è contrassegnato come crash e dovrebbe essere riparato

Cosa sta succedendo qui per causare questo strano comportamento?


1
mysqld --skip-grant-tables --skip-networking sembra funzionare
Wolfgang Fahl

potrebbe essere necessario anche mkdir / var / run / mysqld; chown mysql / var / run / mysqld.
Wolfgang Fahl,

1
--skip-networking disabiliterà tutte le connessioni TCP / IP che potresti voler fare al server, quindi a volte questo è male. mariadb.com/kb/en/server-system-variables/#skip_networking
Darko Maksimovic

@DarkoMaksimovic vede la risposta accettata per l'impostazione della proprietà come soluzione.
Wolfgang Fahl

In realtà l'avevo già provato e nel mio caso non è cambiato nulla (MySQL 5.7 su MacOS, Docker 2.1.0.5). Solo --skip-grant-tables ha aiutato ad avviare il server, anche se qualcuno in questo thread si è lamentato di ulteriori selezioni, ma vedrò quando succede a me.
Darko Maksimovic

Risposte:


30

Ho incontrato lo stesso problema oggi. Sto eseguendo il servizio MySQL durante la compilazione della finestra mobile per i test delle unità e l'aggiornamento a MySQL CE 5.7.19 da MariaDB ha interrotto la creazione. Ciò che mi ha risolto il problema era in esecuzione chown -R mysql:mysql /var/lib/mysql /var/run/mysqldogni volta prima di avviare il servizio mysql.

Quindi il mio Dockerfile è simile a questo ora:

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

Spero che sia di aiuto.


2
Lo stesso problema qui. Avevo una build a due stadi funzionante e il Dockerfile "genitore" esegue già questo chmodcomando. La compilazione riesce quando lo eseguo su un server Ubuntu remoto, ma fallisce quando lo eseguo sul mio computer locale (OS X). L'aggiunta del chmodcomando al file Dockerfile figlio ha risolto il problema. Strano .
Senderle,

2
Grazie! Sapevo che qualcun altro là fuori doveva avere un caso d'uso simile al mio.
tre

2
@senderle ha appena trovato anche questa discussione. "Costruisci una volta, distribuisci ovunque", hanno detto
duhaime,

9

Soluzione

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

Descrizione del problema

Il problema di fondo, come affermato da aalexgabi, è dovuto all'implementazione degli standard POSIX di OverlayFS :

open (2): OverlayFS implementa solo un sottoinsieme degli standard POSIX. Ciò può comportare che alcune operazioni di OverlayFS infrangano gli standard POSIX. Una di queste operazioni è l'operazione di copia. Supponiamo che l'applicazione chiami fd1=open("foo", O_RDONLY)e quindi fd2=open("foo", O_RDWR). In questo caso, l'applicazione prevede che fd1 e fd2 facciano riferimento allo stesso file. Tuttavia, a causa di un'operazione di copia che si verifica dopo la seconda chiamata a open(2), i descrittori si riferiscono a file diversi. Fd1 continua a fare riferimento al file nell'immagine (lowerdir) e fd2 fa riferimento al file nel contenitore (upperdir). Una soluzione alternativa è quella di toccare i file che causano l'operazione di copia. Tutte le open(2)operazioni successive , indipendentemente dalla modalità di accesso di sola lettura o di lettura / scrittura, faranno riferimento al file nel contenitore (upperdir).

Riferimento:


1
Questa è una notizia orribile. Mi chiedo perché la finestra mobile non sia stata riparata.
Wolfgang Fahl,

2
Onestamente? Neanche io! Voglio dire, questo deve interessare molte applicazioni, perché è davvero un'operazione di base sui file. Naturalmente il problema si verifica solo in determinate condizioni, ma non sono così lontani ...
Murmel,

8

Ho confermato l'errore su overlayfs (overlay2) che è l'impostazione predefinita su Docker per Mac. L'errore si verifica quando si avvia mysql sull'immagine, dopo aver creato un'immagine con 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

Il passaggio a "aufs" ha risolto il problema. (Su Docker per Mac, il "daemon.json" può essere modificato selezionando il menu "Preferenze ..." e selezionando la scheda "Daemon" e selezionando la scheda "Avanzate".)

/etc/docker/daemon.json:

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

Rif:

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

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


1
Questo ha risolto il mio problema in Ubuntu 16:04. In precedenza avevo configurato il driver di archiviazione overlay2 nella finestra mobile. Grazie.
Havok il

1
Ciò ha impedito il riavvio della finestra mobile su OSX :(
duhaime


1

Questa potrebbe non essere ancora la soluzione. Ad ogni modo, potrebbe indicare ad altri una risposta "corretta"

Il registro della sessione bash docker riportato di seguito mostra una sequenza di passaggi che portano a strani errori e alla fine sono in grado di avviare correttamente il demone mysql nell'ambiente docker.

Il tentativo di avviare il demone in questa sessione fallisce due volte, una volta a causa della tabella mysql.user e una volta a causa della tabella mysql.db. L'esecuzione del demone mysql con --skip-grant-tables funziona ma ci sono anche problemi con la semplice selezione * dai comandi su queste tabelle.

Stranamente facendo due semplici domande:

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

e poi uccidere il demone per avviarlo correttamente

service mysql start

sembra funzionare. Ora proverò ad automatizzare questo come soluzione alternativa. Sto ancora cercando una soluzione "adeguata" al problema e alcuni indizi su quale sia la ragione di questo strano comportamento.

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

costruire registro

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 log delle sessioni

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 ]

Guarda il file docker originale github.com/docker-library/mysql/blob/… e il entrypoint.sh github.com/docker-library/mysql/blob/… . Ti daranno un'idea di ciò che deve essere fatto.
Tarun Lalwani,

Grazie per il suggerimento. I miei ulteriori esperimenti mostrano che la serie di versioni 5.7.x si comporta diversamente a seconda della x. La cosa fino al 5.7.14 sembra essere stata più semplice. L' approccio manynines.com/blog/… funziona nel mio ambiente Linux. Nel mio ambiente Mac OS le cose sono più difficili.
Wolfgang Fahl,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.