Önemli hata: Ayrıcalık tabloları açılamıyor ve kilitlenemiyor: 'Kullanıcı' için tablo depolama motoru bu seçeneğe sahip değil


15

Bu hata iletisi, bir Docker görüntüsünde ubuntu 16.04 ve en son mysql 5.7.19-0ubuntu0.16.04.1 kullandığımda ortaya çıkıyor.

Bunu düzeltmek için ne yapılabilir?

Hatayı yeniden oluşturmak için

  1. Alın Dockerfile:

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

    ( burada da bulunabilir )

  2. Oluşturun ve çalıştırın:

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

    aşağıdaki hata günlüğüne gösterilirdi:

    2017-08-26T11: 48: 45.398445Z 1 [Uyarı] root @ localhost boş bir parola ile oluşturuldu! Lütfen --initialize-güvensizlik seçeneğini kapatmayı düşünün.

    Tam olarak istediğimiz buydu: henüz root şifresi ayarlanmamış bir mysql.

  3. Geçmişte (ubuntu 14.04 / mysql 5.5) a service mysql startmümkün olmuştur. Şimdi bunu denerseniz başarısız olur

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

    ve /var/log/mysql/error.logbir satır içeriyor:

    2017-08-26T11: 59: 57.680618Z 0 [HATA] Önemli hata: Ayrıcalık tabloları açılamıyor ve kilitlenemiyor: 'Kullanıcı' için tablo depolama motoru bu seçeneğe sahip değil


derleme günlüğü (tamamı için 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

tuhaf devam

Yanıt girişimimde özetlendiği gibi deneylerden sonra ,

select count(*)

mysql alanındaki her bir tabloyu üst üste üç kez sorgulayın (deneyler bazı tablolarda sorgunun tam olarak iki kez başarısız olacağını göstermektedir :-().

Sonra bir

mysql_upgrade   

ve

service mysql restart

denendi. Gelen Dockerfilekomut yoluyla ulaşılabilir yapılır

COPY mysqltest.sh .

Bu senaryo ile yapılan denemeler tuhaf / çılgın sonuçlar veriyor.

  1. İçin Docker environmentbaşlangıç hala başarısız

    [ERROR] Önemli hata: Ayrıcalık tabloları açılamıyor ve kilitlenemiyor: 'Kullanıcı' için tablo depolama motoru bu seçeneğe sahip değil

  2. Komut dosyasını çalıştırma

    sh mysqltest.sh root
    

    içinde docker environmentpotansiyel satışları

    2017-08-27T09: 12: 47.021528Z 12 [HATA] / usr / sbin / mysqld: Tablo './mysql/db' çöktü olarak işaretlendi ve onarılması
    gerekiyor 2017-08-27T09: 12: 47.050141Z 12 [HATA ] Tablo onarılamadı: mysql.db
    2017-08-27T09: 12: 47.055925Z 13 [HATA] / usr / sbin / mysqld: Tablo './mysql/db' çöktü olarak işaretlendi ve onarılması
    gerekiyor 2017-08 -27T09: 12: 47.407700Z 54 [HATA] / usr / sbin / mysqld: Tablo './mysql/proc' çöktü olarak işaretlenmiş ve onarılması
    gerekiyor 2017-08-27T09: 12: 47.433516Z 54 [HATA] Düzeltilemedi ' t onarım tablosu: mysql.proc
    2017-08-27T09: 12: 47.440695Z 55 [HATA] / usr / sbin / mysqld: Tablo './mysql/proc' çöktü olarak işaretlendi ve onarılması
    gerekiyor 2017-08-27T09: 12: 47.769485Z 81 [HATA] / usr / sbin / mysqld: Tablo './mysql/tables_priv'kilitlendi olarak işaretlendi ve onarılması gerekiyor
    2017-08-27T09: 12: 47.792061Z 81 [HATA] Tablo onarılamadı: mysql.tables_priv
    2017-08-27T09: 12: 47.798472Z 82 [HATA] / usr / sbin / mysqld: Tablo './mysql/ tables_priv 'çöktü olarak işaretlendi ve onarılmalı
    2017-08-27T09: 12: 47.893741Z 99 [HATA] / usr / sbin / mysqld: Tablo' ./mysql/user 'çöktü olarak işaretlendi ve onarılmalı
    2017-08 -27T09: 12: 47.914288Z 99 [HATA] Tablo onarılamadı: mysql.user
    2017-08-27T09: 12: 47.920459Z 100 [HATA] / usr / sbin / mysqld: Tablo './mysql/user' çöktü olarak işaretlendi ve onarılması gerekiyor

Bu tuhaf davranışa neden olmak için neler oluyor?


1
mysqld --skip-grant-tables --skip-networking çalışıyor gibi görünüyor
Wolfgang Fahl

mkdir / var / run / mysqld; chown mysql / var / run / mysqld de gerekebilir.
Wolfgang Fahl

1
--skip-networking, sunucuya yapmak isteyebileceğiniz tüm TCP / IP bağlantılarını devre dışı bırakır, bu nedenle bazen bu kötüdür. mariadb.com/kb/tr/server-system-variables/#skip_networking
Darko Maksimovic

@DarkoMaksimovic, sahiplik ayarının çözüm olarak kabul edilen cevabı görüyor.
Wolfgang Fahl

Aslında bunu zaten denemiştim ve benim durumumda hiçbir şey değişmedi (MacOS'ta MySQL 5.7, Docker 2.1.0.5). Sadece --skip-grant-tables sunucunun başlatılmasına yardımcı oldu, ancak bu konudaki biri daha fazla seçimden şikayet etti, ancak bana ne zaman geldiğini göreceğim.
Darko Maksimovic

Yanıtlar:


31

Bugün de aynı sorunla karşılaştı. Birim testleri için docker derlemesi sırasında MySQL hizmetini çalıştırıyorum ve MariaDB'den MySQL CE 5.7.19'a yükseltme yapıyı kırdım. Benim için sorunu ne çözdü chown -R mysql:mysql /var/lib/mysql /var/run/mysqldmysql hizmetine başlamadan önce her zaman çalışıyordu .

Dockerfile'ım şimdi şöyle görünüyor:

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

Bu yardımcı olur umarım.


2
Burada da aynı problem. Ben iki aşamalı bir yapı çalışma vardı ve "üst" Dockerfile zaten bu chmodkomutu çalıştırır . Yapı, uzak bir Ubuntu sunucusunda çalıştırdığımda başarılı oluyor, ancak yerel makinemde (OS X) çalıştırdığımda başarısız oluyor. chmodDockerfile alt dosyasına komut eklemek sorunu çözdü. Garip .
senderle

2
Teşekkür ederim! Dışarıda bir başkasının benimkine benzer bir kullanım senaryosuna sahip olması gerektiğini biliyordum.
threed

2
@senderle bu konuyu da buldu. "Bir kez inşa et, her yere konuşlandır" dediler
duhaime

9

Geçici çözüm

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

Sorun Açıklaması

Belirttiği gibi altta yatan sorun aalexgabi kaynaklanmaktadır OverlayFS POSIX standartlarının uygulanması :

open (2): OverlayFS yalnızca POSIX standartlarının bir alt kümesini uygular. Bu, bazı OverlayFS işlemlerinin POSIX standartlarını ihlal etmesine neden olabilir. Böyle bir işlem kopyalama işlemidir. Uygulamanızın aradığını varsayalım fd1=open("foo", O_RDONLY)ve sonra fd2=open("foo", O_RDWR). Bu durumda, uygulamanız fd1 ve fd2'nin aynı dosyaya başvurmasını bekler. Ancak, ikinci çağrıdan sonra gerçekleşen bir kopyalama işlemi nedeniyle open(2), tanımlayıcılar farklı dosyalara başvurur. Fd1 görüntüdeki dosyaya (alt dizin) başvurmaya devam eder ve fd2 kaptaki dosyaya (üst dizin) başvuruda bulunur. Bunun bir çözümü, kopyalama işleminin gerçekleşmesine neden olan dosyalara dokunmaktır. open(2)Salt okunur veya okuma-yazma erişim modundan bağımsız olarak sonraki tüm işlemler, dosya (kapsayıcı) içerisindeki dosyaya atıfta bulunacaktır.

Referans:


1
Bu korkunç bir haber. Docker'ın neden sabit olmadığını merak ediyorum.
Wolfgang Fahl

2
Dürüst? Ben de değil! Yani bunun birçok uygulamayı etkilemesi gerekiyor, çünkü bu gerçekten basit bir dosya işlemi. Tabii ki sorun sadece belirli koşullar altında ortaya çıkıyor, ama çok uzakta değiller ...
Murmel

8

Mac için Docker'da varsayılan olan bindirmelerdeki (bindirme2) hatayı doğruladım. Hata, mysql ile bir görüntü oluşturduktan sonra görüntü üzerinde mysql başlatılırken oluşur.

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" a geçmek sorunu çözdü. (Mac için Docker'da "daemon.json", "Tercihler ..." menüsünü seçip "Daemon" sekmesini seçip "Gelişmiş" sekmesini seçerek düzenlenebilir.)

/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


1
Bu, Ubuntu 16:04'teki sorunumu çözdü. Daha önce docker'daki overlay2 depolama sürücüsünü yapılandırmıştım. Teşekkürler.
Havok

1
Bu, liman
işçisinin OSX'de


1

Bu henüz tam bir çözüm olmayabilir. Her neyse, başkalarını "uygun" bir cevaba işaret edebilir

Aşağıdaki docker bash oturum günlüğü, garip hatalara ve son olarak mysql arka plan programının docker ortamında düzgün bir şekilde başlatılabilmesine yol açan bir dizi adım gösterir.

Bu oturumda arka plan programını başlatmaya çalışmak iki kez başarısız olur - bir kez mysql.user tablosu ve bir kez de mysql.db tablosu nedeniyle. Mysql arka plan programının --skip-grant-tables ile çalıştırılması işe yarar ancak bu tablolardaki komutlardan basit seçim * ile ilgili sorunlar da vardır.

Garip bir şekilde iki basit sorgu yapmak:

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

ve sonra daemon'u düzgün bir şekilde başlatmak için öldürmek

service mysql start

işe yarıyor gibi görünüyor. Şimdi bunu geçici bir çözüm olarak otomatikleştirmeye çalışacağım. Hala soruna "uygun" bir çözüm ve bu garip davranışın sebebinin ne olduğuna dair bir ipucu arıyorum.

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

günlük oluştur

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 oturum günlüğü

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 ]

Orijinal docker dosyasına bakın github.com/docker-library/mysql/blob/… ve inputpoint.sh github.com/docker-library/mysql/blob/… . Size ne yapılması gerektiği hakkında bir fikir verecektir.
Tarun Lalwani

İpucu için teşekkürler. Diğer deneylerim, 5.7.x serisinin x'e bağlı olarak farklı davrandığını gösteriyor. 5.7.14'e kadar daha basit gibi görünüyor. Severalnines.com/blog/... yaklaşım benim linux ortamında çalışır. Mac OS ortamımda işler daha zor.
Wolfgang Fahl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.