মারাত্মক ত্রুটি: সুবিধাগুলি সারণীগুলি খুলতে এবং লক করতে পারে না: 'ব্যবহারকারীর' জন্য সারণী স্টোরেজ ইঞ্জিনের এই বিকল্প নেই


15

এই ত্রুটি বার্তাটি প্রদর্শিত হয় যখন আমি একটি ডকার ইমেজে উবুন্টু 16.04 এবং সর্বশেষ মাইএসকিএল 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- সুরক্ষিত বিকল্পটি স্যুইচ করা বিবেচনা করুন।

    যা আমরা যা চেয়েছিলাম ঠিক তেমনটি ছিল: একটি মাইএসকিএল এখনও কোনও রুট পাসওয়ার্ড সেট করে নি।

  3. অতীতে (উবুন্টু 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

অদ্ভুত ধারাবাহিকতা

আমার উত্তর প্রসঙ্গে বর্ণিত পরীক্ষাগুলির পরে , আমি একটি শেল স্ক্রিপ্ট তৈরি করেছি যা একটি করে does

select count(*)

প্রতিটি টেবিলের জন্য মাইএসকিএল স্পেসে একটানা তিনবার ক্যোয়ারী (কারণ পরীক্ষাগুলি দেখায় যে কিছু টেবিলে কোয়েরিটি ঠিক দু'বার ব্যর্থ হবে :-()।

তখন একটা

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: টেবিল './mysql/db' ক্র্যাশ হয়েছে হিসাবে চিহ্নিত হয়েছে এবং মেরামত করা উচিত
    2017-08-27T09: 12: 47.050141Z 12 [ERROR ] টেবিলটি মেরামত করা
    যায়নি : mysql.db 2017-08-27T09: 12: 47.055925Z 13 [ERROR] / usr / sbin / mysqld: সারণী './mysql/db' ক্র্যাশ হয়েছে হিসাবে চিহ্নিত হয়েছে এবং
    2017-08 মেরামত করা উচিত -27T09: 12: 47.407700Z 54 [ERROR] / usr / sbin / mysqld: টেবিল './mysql/proc' ক্র্যাশ হয়েছে হিসাবে চিহ্নিত হয়েছে এবং মেরামত করা উচিত
    2017-08-27T09: 12: 47.433516Z 54 [ত্রুটি] করা যায়নি t মেরামতের টেবিল: mysql.proc
    2017-08-27T09: 12: 47.440695Z 55 [ERROR] / usr / sbin / mysqld: টেবিল './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: টেবিল './mysql/ টেবিল_প্রিয়ভ 'ক্র্যাশ হিসাবে চিহ্নিত হয়েছে এবং এটি মেরামত করা উচিত
    2017-08-27T09: 12: 47.893741Z 99 [এআরআরআর] / ইউএসআর / এসবিন / মাইএসকিএলডি: সারণী' ./mysql/user 'ক্র্যাশ হিসাবে চিহ্নিত হয়েছে এবং এটি
    2017-08 মেরামত করা উচিত -27T09: 12: 47.914288Z 99 [ERROR] টেবিলটি মেরামত করা
    যায়নি: mysql.user 2017-08-27T09: 12: 47.920459Z 100 [ERROR] / usr / sbin / mysqld: টেবিল './mysql/user' ক্র্যাশ হওয়া হিসাবে চিহ্নিত এবং মেরামত করা উচিত

এখানে কী ঘটছে এই অদ্ভুত আচরণের কারণ?


1
মাইকিকিএলডি - স্কিপ-গ্রান্ট-টেবিল - স্কিপ-নেটওয়ার্কিং কাজ করছে বলে মনে হচ্ছে
ওল্ফগাং ফাহল

mkdir / var / run / mysqld; chown mysql / var / run / mysqld এর দরকারও পড়তে পারে might
ওল্ফগ্যাং ফাহল

1
--স্কিপ-নেটওয়ার্কিং সার্ভারের সাথে আপনি যে টিসিপি / আইপি সংযোগ করতে চাইতে পারেন তা অক্ষম করবে, তাই কখনও কখনও এটি খারাপ হয় is mariadb.com/kb/en/server-sism-variables/#skip_networking
ডার্কো মাক্সিমোভিক

মালিকানা নির্ধারণের সমাধান হওয়ার জন্য ডার্কোমাক্সিমোভিচ গৃহীত উত্তর দেখুন।
ওল্ফগ্যাং ফাহল

আমি ইতিমধ্যে এটি ইতিমধ্যে চেষ্টা করেছিলাম এবং এটি আমার ক্ষেত্রে কোনও পরিবর্তন করেনি (ম্যাকএস-তে মাইএসকিউএল 5.7, ডকার 2.1.0.5)। কেবল --স্কিপ-অনুদান-টেবিলগুলিই সার্ভারটি শুরু করতে সহায়তা করেছিল, যদিও এই থ্রেডের কেউ আরও নির্বাচনের বিষয়ে অভিযোগ করেছেন, তবে আমি কখন তা আমার সাথে ঘটে তা দেখব।
ডার্কো মাক্সিমোভিচ

উত্তর:


31

আজ একই সমস্যার মধ্যে দৌড়ে। আমি ইউনিট পরীক্ষার জন্য ডকার বিল্ড চলাকালীন মাইএসকিউএল পরিষেবাটি চালাচ্ছি এবং মারিয়াডিবি থেকে মাইএসকিউএল সিই 5.7.19 এ আপগ্রেড করে বিল্ডটি ভেঙে ফেলেছে। আমার জন্য সমস্যাটি কী সমাধান করেছিল তা chown -R mysql:mysql /var/lib/mysql /var/run/mysqldপ্রতিবার মাইএসকিএল পরিষেবা শুরু করার আগে চলছিল ।

সুতরাং আমার ডকফাইফিলটি এখন এমন দেখাচ্ছে:

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

সমস্যার বিবরণ

আলেেক্সগাবির বর্ণিত অন্তর্নিহিত সমস্যা ওভারলেএফএসের পসিক্স মান প্রয়োগের কারণে ঘটে :

ওপেন (2): ওভারলেএফএস কেবলমাত্র পসিক্স মানগুলির একটি উপসেট প্রয়োগ করে। এটি পসিক্স স্ট্যান্ডার্ডকে ভেঙে নির্দিষ্ট ওভারলেএফএসের ক্রিয়াকলাপের ফলাফল করতে পারে। এরকম একটি অপারেশন হ'ল কপি-আপ অপারেশন। মনে করুন যে আপনার অ্যাপ্লিকেশনটি কল করে fd1=open("foo", O_RDONLY)এবং তারপরে fd2=open("foo", O_RDWR)। এই ক্ষেত্রে, আপনার আবেদনটি এফডি 1 এবং এফডি 2 একই ফাইলটি উল্লেখ করবে বলে প্রত্যাশা করে। তবে, দ্বিতীয় কল করার পরে ঘটে যাওয়া একটি অনুলিপি অপারেশনের কারণে open(2) বর্ণনাকারীরা বিভিন্ন ফাইলকে উল্লেখ করে। Fd1 ইমেজ (লোয়ারডির) ফাইলটি রেফারেন্স অবিরত করে এবং fd2 ফাইলটি ধারক (আপারডির) -এ রেফার করে। এর জন্য একটি কার্যপ্রণালী হ'ল ফাইলগুলি স্পর্শ করা যা কপি-আপ ক্রিয়াকলাপ ঘটায়। open(2)কেবলমাত্র পঠনযোগ্য বা পঠন-লিখনের অ্যাক্সেস মোড নির্বিশেষে সমস্ত পরবর্তী ক্রিয়াকলাপগুলি ধারকটিতে (আপারডির) ফাইলটি উল্লেখ করা হবে।

রেফারেন্স:


1
এটি ভয়াবহ খবর। আমি অবাক হয়েছি কেন ডকার স্থির হয়নি।
ওল্ফগ্যাং ফাহল

2
সত্যি বলতে? আমিও না! আমার অর্থ এটি প্রচুর অ্যাপ্লিকেশনকে প্রভাবিত করতে পারে কারণ এটি সত্যই একটি প্রাথমিক ফাইল অপারেশন। অবশ্যই সমস্যাটি নির্দিষ্ট কিছু পরিস্থিতিতে দেখা দেয় তবে এগুলি খুব বেশি দূরে নয় ...
মুরমেল

8

আমি ওভারলেফগুলিতে (ওভারলে 2) ত্রুটিটি নিশ্চিত করেছিলাম যা ম্যাকের জন্য ডকারে ডিফল্ট। মাইএসকিএল দিয়ে একটি চিত্র তৈরি করার পরে, চিত্রটিতে মাইএসকিএল শুরু করার সময় ত্রুটিটি ঘটে।

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

"আউফস" এ স্যুইচ করা সমস্যার সমাধান করেছে। (ম্যাকের জন্য ডকারে, "পছন্দগুলি ..." মেনু চয়ন করে এবং "ডিমন" ট্যাব নির্বাচন করে এবং "উন্নত" ট্যাব নির্বাচন করে "ডিমন.জেসন" সম্পাদনা করা যেতে পারে))

/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 এ সমাধান করেছে। আমি আগে ওভারলে 2 স্টোরেজ ড্রাইভারকে ডকারে কনফিগার করেছি। ধন্যবাদ।
হাভোক


2

এখানে একটি উত্তর এখানে এখনও দেখছি না।

এটি আপনার ডকফাইলে যুক্ত করুন: VOLUME /var/lib/mysql

এর ফলে / var / lib / mysql ফোল্ডারটি ওভারলেএফএসের পরিবর্তে নেটিভ ফাইল সিস্টেম ব্যবহার করবে। এটি এই সমস্যাটিকে উদ্বেগিত করে।

অফিসিয়াল মাইএসকিএল ডকার ইমেজটি এটি মোকাবেলা করার জন্য এটি সমাধান যা আপনি এখানে দেখতে পারেন: https://github.com/docker-library/mysql/blob/9d1f62552b5dcf25d3102f14eb82b579ce9f4a26/5.7/Dockerfile


1

এটি এখনও বেশিরভাগ সমাধান হতে পারে না। যাইহোক এটি অন্যকে একটি "সঠিক" উত্তরের দিকে নির্দেশ করতে পারে

নীচে ডকার বাশ সেশন লগটি এমন এক ধাপের ক্রম দেখায় যা অদ্ভুত ত্রুটি এবং ফিনালি ডকার পরিবেশে মাইএসকিএল ডিমনটি সঠিকভাবে শুরু করতে সক্ষম হয় to

এই অধিবেশনটিতে ডেমনটি শুরু করার চেষ্টা দুবার ব্যর্থ হয় - একবার mysql.user টেবিলের কারণে এবং একবার mysql.db টেবিলের কারণে। - -স্কিপ-গ্রান্ট-টেবিলগুলির সাথে মাইএসকিএল ডিমন চালানো কাজ করে তবে এই টেবিলের কমান্ড থেকে সাধারণ নির্বাচন * নিয়েও সমস্যা রয়েছে।

আশ্চর্যের সাথে দুটি সহজ প্রশ্ন করা:

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/… এবং এন্ট্রিপয়েন্ট.শ github.com/docker-library/mysql/blob/… দেখুন । কী করা দরকার তা তারা আপনাকে ধারণা দেবে।
তরুন লালওয়ানি

ইঙ্গিত দেওয়ার জন্য আপনাকে ধন্যবাদ। আমার আরও পরীক্ষা-নিরীক্ষায় দেখা যায় যে 5.7.x সিরিজের প্রকাশের এক্সের উপর নির্ভর করে আলাদা আচরণ করে। 5.7.14 অবধি জিনিসটি সহজ বলে মনে হচ্ছে। Severalnines.com/blog/... পদ্ধতির আমার লিনাক্স পরিবেশে কাজ করে। আমার ম্যাক ওএস পরিবেশে জিনিসগুলি আরও কঠিন।
ওল্ফগ্যাং ফাহল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.