Pesan kesalahan ini muncul ketika saya menggunakan ubuntu 16.04 dan mysql 5.7.19-0ubuntu0.16.04.1 terbaru dalam gambar Docker.
Apa yang bisa dilakukan untuk memperbaikinya?
Untuk mereproduksi kesalahan
Dapatkan
Dockerfile
:FROM ubuntu:16.04 RUN apt update RUN DEBIAN_FRONTEND=noninteractive apt install -y mysql-server
(juga tersedia di sini )
Bangun dan jalankan:
docker build -t mysqlfail . docker run -it mysqlfail tail -1 /var/log/mysql/error.log
akan ditampilkan log kesalahan berikut:
2017-08-26T11: 48: 45.398445Z 1 [Peringatan] root @ localhost dibuat dengan kata sandi kosong! Silakan pertimbangkan mematikan opsi --initialize-insecure.
Yang persis seperti yang kami inginkan: mysql tanpa kata sandi root yang ditetapkan.
Di masa lalu (ubuntu 14.04 / mysql 5.5) a
service mysql start
dimungkinkan. Sekarang jika Anda mencoba ini gagaldocker run -it mysqlfail service mysql start * Starting MySQL database server mysqld No directory, logging in with HOME=/ [fail]
dan
/var/log/mysql/error.log
mengandung garis:2017-08-26T11: 59: 57.680618Z 0 [GALAT] Kesalahan fatal: Tidak dapat membuka dan mengunci tabel privilege: Mesin penyimpanan tabel untuk 'pengguna' tidak memiliki opsi ini
build log (untuk lengkap 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
kelanjutan yang aneh
Setelah percobaan sebagaimana diuraikan dalam upaya jawaban saya , saya membuat skrip shell yang melakukan a
select count(*)
kueri pada setiap tabel dalam ruang mysql tiga kali berturut-turut (karena percobaan menunjukkan bahwa pada beberapa tabel kueri akan gagal tepat dua kali :-().
Lalu a
mysql_upgrade
dan
service mysql restart
sudah dicoba. Dalam Dockerfile
skrip tersedia melalui
COPY mysqltest.sh .
Uji coba dengan skrip ini memberikan hasil yang aneh / gila.
Untuk
Docker environment
awal masih gagal[GALAT] Kesalahan fatal: Tidak bisa membuka dan mengunci tabel hak istimewa: Mesin penyimpanan tabel untuk 'pengguna' tidak memiliki opsi ini
Menjalankan skrip
sh mysqltest.sh root
dalam
docker environment
mengarah ke2017-08-27T09: 12: 47.021528Z 12 [ERROR] / usr / sbin / mysqld: Table './mysql/db' ditandai sebagai
macet dan harus diperbaiki 2017-08-27T09: 12: 47.050141Z 12 [KESALAHAN ] Tidak dapat memperbaiki tabel: mysql.db
2017-08-27T09: 12: 47.055925Z 13 [KESALAHAN] / usr / sbin / mysqld: Tabel './mysql/db' ditandai sebagai
macet dan harus diperbaiki 2017-08 -27T09: 12: 47.407700Z 54 [GALAT] / usr / sbin / mysqld: Tabel './mysql/proc' ditandai sebagai
macet dan harus diperbaiki 2017-08-27T09: 12: 47.433516Z 54 [GALAT] Tidak bisa ' t meja perbaikan: mysql.proc
2017-08-27T09: 12: 47.440695Z 55 [KESALAHAN] / usr / sbin / mysqld: Tabel './mysql/proc' ditandai sebagai
macet dan harus diperbaiki 2017-08-27T09: 12: 47.769485Z 81 [GALAT] / usr / sbin / mysqld: Table './mysql/tables_priv'ditandai sebagai macet dan harus diperbaiki
2017-08-27T09: 12: 47.792061Z 81 [GALAT] Tidak dapat memperbaiki tabel: mysql.tables_priv
2017-08-27T09: 12: 47.798472Z 82 [GALAT] / usr / sbin / mysqld: Table './mysql/ tables_priv 'ditandai sebagai macet dan harus diperbaiki
2017-08-27T09: 12: 47.893741Z 99 [GALAT] / usr / sbin / mysqld: Table' ./mysql/user 'ditandai sebagai
macet dan harus diperbaiki 2017-08 -27T09: 12: 47.914288Z 99 [GALAT] Tidak dapat memperbaiki tabel: mysql.user
2017-08-27T09: 12: 47.920459Z 100 [KESALAHAN] / usr / sbin / mysqld: Table './mysql/user' is ditandai sebagai macet dan harus diperbaiki
Apa yang terjadi di sini yang menyebabkan perilaku aneh ini?
Jawaban:
Berlari ke masalah yang sama hari ini. Saya menjalankan layanan MySQL selama pembuatan docker untuk unit test dan meningkatkan ke MySQL CE 5.7.19 dari MariaDB yang rusak. Apa yang memecahkan masalah bagi saya berjalan
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld
setiap kali sebelum memulai layanan mysql.Jadi Dockerfile saya terlihat seperti ini sekarang:
Semoga ini membantu.
sumber
chmod
perintah ini . Build berhasil ketika saya menjalankannya di server Ubuntu jauh, tetapi gagal ketika saya menjalankannya di mesin lokal saya (OS X). Menambahkanchmod
perintah ke Dockerfile anak memperbaiki masalah. Aneh .Saya mengkonfirmasi kesalahan pada overlayfs (overlay2) yang merupakan default pada Docker untuk Mac. Kesalahan terjadi ketika memulai mysql pada gambar, setelah membuat gambar dengan mysql.
Beralih ke "aufs" memecahkan masalah. (Pada Docker untuk Mac, "daemon.json" dapat diedit dengan memilih menu "Preferences ...", dan memilih tab "Daemon", dan memilih tab "Advanced".)
/etc/docker/daemon.json:
Ref:
https://github.com/moby/moby/issues/35503
https://qiita.com/Hige-Moja/items/7b1208f16997e2aa9028
sumber
Penanganan masalah
Deskripsi masalah
Masalah mendasar seperti yang dinyatakan oleh aalexgabi adalah karena penerapan standar POSIX dari OverlayFS :
Referensi:
sumber
Inilah jawaban yang belum saya lihat di sini.
Tambahkan ini ke dockerfile Anda:
VOLUME /var/lib/mysql
Ini akan menyebabkan folder / var / lib / mysql menggunakan sistem file asli daripada overlayFS. Ini menghindari masalah ini.
Ini adalah solusi yang digunakan gambar pekerja pelabuhan mysql resmi untuk menangani hal ini seperti yang Anda lihat di sini: https://github.com/docker-library/mysql/blob/9d1f62552b5dcf25d3102f14eb82b579ce9f4a26/5.7/Dockerfile
sumber
Ini mungkin belum menjadi solusinya. Bagaimanapun itu mungkin mengarahkan orang lain ke jawaban "tepat"
Log sesi docker bash di bawah ini menunjukkan urutan langkah-langkah yang menyebabkan kesalahan aneh dan akhirnya dapat memulai daemon mysql dengan benar di lingkungan buruh pelabuhan.
Mencoba memulai daemon di sesi ini gagal dua kali - sekali karena tabel mysql.user dan sekali karena tabel mysql.db. Menjalankan daemon mysql dengan --skip-grant-tables berfungsi tetapi ada juga masalah dengan * pilih sederhana dari perintah pada tabel ini.
Anehnya melakukan dua pertanyaan sederhana:
dan kemudian membunuh daemon untuk memulainya dengan benar
sepertinya berhasil. Sekarang saya akan mencoba mengotomatiskan ini sebagai solusinya. Saya masih mencari solusi yang "tepat" untuk masalah dan beberapa petunjuk apa alasan untuk perilaku aneh ini.
Dockerfile
buat log
log sesi bash
sumber