घातक त्रुटि: विशेषाधिकार तालिका नहीं खोल और बंद कर सकते हैं: 'उपयोगकर्ता' के लिए टेबल संग्रहण इंजन में यह विकल्प नहीं है


15

यह त्रुटि संदेश तब दिखाई देता है जब मैं एक डॉक छवि में ubuntu 16.04 और नवीनतम mysql 5.7.19-0ubuntu0.16.04.1 का उपयोग करता हूं।

इसे ठीक करने के लिए क्या किया जा सकता है?

त्रुटि को पुन: उत्पन्न करने के लिए

  1. प्राप्त करें Dockerfile:

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

    ( यहां भी उपलब्ध है )

  2. बनाएँ और चलाएँ:

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

    निम्न त्रुटि लॉग दिखाया गया होगा:

    2017-08-26T11: 48: 45.398445Z 1 [चेतावनी] रूट @ लोकलहोस्ट एक खाली पासवर्ड के साथ बनाया गया है! कृपया --initialize-insecure विकल्प को बंद करने पर विचार करें।

    ठीक यही हम चाहते थे: एक mysql जिसका कोई रूट पासवर्ड अभी तक सेट नहीं है।

  3. अतीत में (ubuntu 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 [ERROR] घातक त्रुटि: विशेषाधिकार तालिका नहीं खोल और बंद कर सकते हैं: 'उपयोगकर्ता' के लिए टेबल संग्रहण इंजन में यह विकल्प नहीं है


बिल्ड लॉग (पूर्ण के लिए 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 .

इस स्क्रिप्ट के परीक्षण अजीब / पागल परिणाम देते हैं।

  1. के लिए Docker environmentशुरू अभी भी विफल

    [त्रुटि] घातक त्रुटि: विशेषाधिकार तालिकाओं को नहीं खोल और बंद कर सकते हैं: 'उपयोगकर्ता' के लिए टेबल संग्रहण इंजन में यह विकल्प नहीं है

  2. स्क्रिप्ट चल रही है

    sh mysqltest.sh root
    

    की docker environmentओर जाता है

    2017-08-27T09: 12: 47.021528Z 12 [ERROR] / usr / sbin / mysqld: Table './mysql/db' को दुर्घटनाग्रस्त के रूप में चिह्नित किया गया है और इसकी मरम्मत की जानी चाहिए
    2017-08-08T09: 12: 47.050141Z 12 [ERROR ] टेबल की मरम्मत नहीं कर सका: mysql.db
    2017-08-27T09: 12: 47.055925Z 13 [ERROR] / usr / sbin / mysqld: Table './mysql/db' को दुर्घटनाग्रस्त के रूप में चिह्नित किया गया है और इसकी मरम्मत
    2017-08 की जानी चाहिए। -27T09: 12: 47.407700Z 54 [ERROR] / usr / sbin / mysqld: Table './mysql/proc' को दुर्घटनाग्रस्त के रूप में चिह्नित किया गया है और इसे
    2017-08-08T09: 12: 47.433516Z 54 [ERROR] को फिर से जोड़ा जा सकता है। t मरम्मत की मेज: mysql.proc
    2017-08-27T09: 12: 47.440695Z 55 [ERROR] / usr / sbin / mysqld: Table './mysql/proc' को दुर्घटनाग्रस्त के रूप में चिह्नित किया गया है और
    2017-08-27T09 की मरम्मत की जानी चाहिए। 12: 47.769485Z 81 [ERROR] / usr / sbin / mysqld: तालिका './mysql/tables_priv'दुर्घटनाग्रस्त हो गया है और इसकी मरम्मत की जानी चाहिए
    2017-08-27T09: 12: 47.792061Z 81 [ERROR] टेबल की मरम्मत नहीं कर सका: mysql.tables_priv
    2017-08-27T09: 12: 47.798472Z 82 [ERROR] / usr / sbin / mysqld: Table '.mysql/ tables_priv 'दुर्घटनाग्रस्त के रूप में चिह्नित किया गया है और इसे
    2017-08-27T09: 12: 47.893741Z 99 [ERROR] / usr / sbin / mysqld: Table' ./mysql-user 'के रूप में चिह्नित किया गया है जो दुर्घटनाग्रस्त हो गया है और इसकी मरम्मत
    2017-08 में की जानी चाहिए। -27T09: 12: 47.914288Z 99 [ERROR] टेबल की मरम्मत नहीं कर सका: mysql.user
    2017-08-27T09: 12: 47.920459Z 100 [ERROR] / usr / sbin / mysqld: Table'/mysql/user 'है। दुर्घटनाग्रस्त के रूप में चिह्नित और मरम्मत की जानी चाहिए

इस अजीब व्यवहार का कारण क्या है?


1
mysqld --स्किप-ग्रांट-टेबल -स्काइप-नेटवर्किंग काम करने लगती है
वोल्फगैंग

mkdir / var / run / mysqld; chown mysql / var / run / mysqld की भी आवश्यकता हो सकती है।
वोल्फगैंग फ़ाह्ल

1
-स्काइप-नेटवर्किंग किसी भी टीसीपी / आईपी कनेक्शन को निष्क्रिय कर देगा जिसे आप सर्वर पर बनाना चाहते हैं, इसलिए कभी-कभी यह खराब होता है। mariadb.com/kb/en/server-system-variables/#skip_networking
डार्को

@DarkoMaksimovic समाधान के स्वामित्व की सेटिंग के लिए स्वीकृत उत्तर देखें।
वोल्फगैंग फेहल

मैं वास्तव में पहले ही कोशिश कर चुका था और इसने मेरे मामले में कुछ भी नहीं बदला (MySQL 5.7 on MacOS, Docker 2.1.0.5)। केवल --स्किप-ग्रांट-टेबल ने सर्वर को शुरू करने में मदद की, हालांकि इस थ्रेड में किसी ने आगे चयन के बारे में शिकायत की थी, लेकिन मैं देखूंगा कि यह मेरे साथ कब होता है।
डार्को माक्सिमोविक

जवाबों:


31

आज उसी समस्या में भाग गया। मैं इकाई परीक्षण के लिए डॉक निर्माण के दौरान MySQL सेवा चला रहा हूं और मारबाडी से MySQL CE 5.7.19 में अपग्रेड कर निर्माण को तोड़ दिया है। chown -R mysql:mysql /var/lib/mysql /var/run/mysqldMysql सेवा शुरू करने से पहले हर बार मेरे लिए समस्या का हल क्या था ।

तो मेरा डॉकफाइल अब इस तरह दिखता है:

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

उम्मीद है की यह मदद करेगा।


2
यहां भी यही समस्या। मेरे पास एक दो-चरण का निर्माण कार्य था, और "माता-पिता" डॉकरफाइल पहले से ही इस chmodकमांड को चलाता है । बिल्ड तब सफल होता है जब मैं इसे एक दूरस्थ उबंटू सर्वर पर चलाता हूं, लेकिन जब मैं इसे अपने स्थानीय मशीन (ओएस एक्स) पर चलाता हूं तो यह विफल हो जाता है। chmodबच्चे को कमांड जोड़ना Dockerfile ने समस्या को ठीक किया। अजीब बात है
प्रेषक

2
धन्यवाद! मुझे पता था कि किसी और के मामले में भी ऐसा ही मामला था।
थ्रेड

2
@ेंडरल को सिर्फ यह धागा मिला। "एक बार बनाएँ, कहीं भी तैनात करें" उन्होंने कहा
दोहामे

9

वैकल्पिक हल

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

समस्या का विवरण

Aalexgabi द्वारा बताई गई अंतर्निहित समस्या OverlayFS के POSIX मानकों के कार्यान्वयन के कारण है :

खुला (2): OverlayFS केवल POSIX मानकों का सबसेट लागू करता है। यह POSIX मानकों को तोड़ने वाले कुछ ओवरलेएफएस कार्यों में परिणाम कर सकता है। ऐसा ही एक ऑपरेशन कॉपी-अप ऑपरेशन है। मान लीजिए कि आपका एप्लिकेशन कॉल करता है fd1=open("foo", O_RDONLY)और फिर fd2=open("foo", O_RDWR)। इस स्थिति में, आपका आवेदन fd1 और fd2 को एक ही फ़ाइल के लिए संदर्भित करता है। हालाँकि, दूसरी कॉलिंग के बाद होने वाले कॉपी-अप ऑपरेशन के कारण open(2, डिस्क्रिप्टर विभिन्न फ़ाइलों को संदर्भित करते हैं। Fd1 छवि (लोअरडिर) में फ़ाइल को संदर्भित करता है और fd2 कंटेनर (ऊपरी भाग) में फ़ाइल को संदर्भित करता है। इसके लिए वर्कअराउंड उन फ़ाइलों को स्पर्श करना है, जिनके कारण कॉपी-अप ऑपरेशन होता है। open(2)रीड-ओनली या रीड-राइट एक्सेस मोड की परवाह किए बिना सभी बाद के ऑपरेशन कंटेनर (ऊपरी हिस्से) में फ़ाइल का संदर्भ देंगे।

संदर्भ:


1
यह भयानक खबर है। मुझे आश्चर्य है कि डॉक क्यों तय नहीं है।
वोल्फगैंग फाहल

2
ईमानदारी से? न ही मैं! मेरा मतलब है कि इसे बहुत सारे अनुप्रयोगों को प्रभावित करना है, क्योंकि यह वास्तव में एक बुनियादी फ़ाइल ऑपरेशन है। बेशक समस्या केवल कुछ शर्तों के तहत होती है, लेकिन वे उस समय से बहुत दूर नहीं हैं ...
मुरल

8

मैंने ओवरलेफ़्स (ओवरले 2) पर त्रुटि की पुष्टि की है जो मैक के लिए डॉकर पर डिफ़ॉल्ट है। Mysql के साथ एक छवि बनाने के बाद छवि पर 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

"Aufs" पर स्विच करने से समस्या हल हो गई। (मैक के लिए डॉकर पर, "डेमन.जॉन" को "प्राथमिकता ..." मेनू चुनकर और "डेमन" टैब का चयन करके, और "उन्नत" टैब का चयन करके संपादित किया जा सकता है।

/etc/docker/daemon.json:

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

संदर्भ:

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

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


1
इसने उबंटू 16:04 में मेरी समस्या हल कर दी। मैंने पहले dolay में overlay2 स्टोरेज ड्राइवर को कॉन्फ़िगर किया था। धन्यवाद।
हवोक

1
इसने
डॉक

2

यहाँ एक उत्तर है जिसे मैं अभी तक यहाँ नहीं देखता हूँ।

इसे अपने dockerfile में जोड़ें: VOLUME /var/lib/mysql

यह overlayFS के बजाय देशी फाइल सिस्टम का उपयोग करने के लिए / var / lib / mysql फ़ोल्डर का कारण होगा। यह इस मुद्दे को दरकिनार करता है।

यह वह उपाय है जिससे निपटने के लिए आधिकारिक mysql docker इमेज का उपयोग करता है जैसा कि आप यहाँ देख सकते हैं: https://github.com/docker-library/mysql/blob/9d1f62552b5dcbd25d3102f14eb82b579ce9f4a26/5.7/Dockerfile


1

यह काफी समाधान अभी तक नहीं हो सकता है। वैसे भी यह दूसरों को "उचित" जवाब दे सकता है

Docker bash सेशन लॉग नीचे दिए गए चरणों का एक क्रम दिखाता है जिससे अजीब त्रुटियां होती हैं और अंतिम रूप से docker वातावरण में mysql डेमन को ठीक से शुरू करने में सक्षम होता है।

इस सत्र में डेमॉन शुरू करने की कोशिश दो बार विफल रही है - एक बार mysql.user टेबल के कारण और एक बार mysql.db टेबल के कारण। Mysql डेमन को --स्किप-ग्रांट-टेबल के साथ चलाना काम करता है लेकिन इन टेबलों पर कमांड से सरल चयन * की भी समस्या है।

अजीब तरह से दो सरल प्रश्न कर रहे हैं:

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

और फिर इसे ठीक से शुरू करने के लिए डेमन को मारना

service mysql start

काम करने लगता है। मैं अब इसे वर्कअराउंड के रूप में स्वचालित करने का प्रयास करूंगा। मैं अभी भी समस्या के "उचित" समाधान की मांग कर रहा हूं और कुछ सुराग इस अजीब व्यवहार का कारण है।

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

निर्माण लॉग

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

बैश सत्र लॉग

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 ]

मूल डोकर फ़ाइल पर देखो github.com/docker-library/mysql/blob/... और entrypoint.sh github.com/docker-library/mysql/blob/... । वे आपको एक विचार देंगे कि क्या करने की आवश्यकता है।
तरुण लालवानी

संकेत के लिए धन्यवाद। मेरे आगे के प्रयोगों से पता चलता है कि रिलीज के 5.7.x श्रृंखला एक्स के आधार पर अलग तरह से व्यवहार करती है। 5.7.14 तक की बात सरल प्रतीत हुई है। Severalnines.com/blog/... दृष्टिकोण मेरी linux वातावरण में काम करता है। मेरे मैक ओएस वातावरण में चीजें अधिक कठिन हैं।
वोल्फगैंग फ़ाह्ल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.