Esta mensagem de erro aparece quando eu uso o ubuntu 16.04 e o mais recente mysql 5.7.19-0ubuntu0.16.04.1 em uma imagem do Docker.
O que poderia ser feito para corrigir isso?
Para reproduzir o erro
Obtenha o
Dockerfile
:FROM ubuntu:16.04 RUN apt update RUN DEBIAN_FRONTEND=noninteractive apt install -y mysql-server
(também disponível aqui )
Crie e execute:
docker build -t mysqlfail . docker run -it mysqlfail tail -1 /var/log/mysql/error.log
teria sido mostrado o seguinte log de erros:
2017-08-26T11: 48: 45.398445Z 1 [Aviso] root @ localhost é criado com uma senha vazia! Por favor, considere desativar a opção --initialize-insecure.
O que era exatamente o que queríamos: um mysql sem senha de root definida ainda.
No passado (ubuntu 14.04 / mysql 5.5)
service mysql start
era possível. Agora, se você tentar isso, ele falhadocker run -it mysqlfail service mysql start * Starting MySQL database server mysqld No directory, logging in with HOME=/ [fail]
e
/var/log/mysql/error.log
contém uma linha:2017-08-26T11: 59: 57.680618Z 0 [ERRO] Erro fatal: não é possível abrir e bloquear tabelas de privilégios: O mecanismo de armazenamento de tabela para 'usuário' não possui esta opção
log de construção (para o 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
continuação estranha
Após as experiências descritas na minha tentativa de resposta , criei um script de shell que faz um
select count(*)
consulta em cada tabela no espaço mysql três vezes seguidas (porque experimentos mostram que em algumas tabelas a consulta falha exatamente duas vezes :-().
Então uma
mysql_upgrade
e a
service mysql restart
é tentado. No Dockerfile
script, é disponibilizado via
COPY mysqltest.sh .
Os testes com esse script fornecem resultados estranhos / malucos.
Para o
Docker environment
início ainda falha[ERRO] Erro fatal: não é possível abrir e bloquear tabelas de privilégios: o mecanismo de armazenamento de tabela para 'usuário' não possui esta opção
Executando o Script
sh mysqltest.sh root
nas
docker environment
pistas para2017-08-27T09: 12: 47.021528Z 12 [ERRO] / usr / sbin / mysqld: A tabela './mysql/db' está marcada como
travada e deve ser reparada 2017-08-27T09: 12: 47.050141Z 12 [ERRO ] Não foi possível reparar a tabela: mysql.db
2017-08-27T09: 12: 47.055925Z 13 [ERRO] / usr / sbin / mysqld: A tabela './mysql/db' está marcada como
travada e deve ser reparada 2017-08 -27T09: 12: 47.407700Z 54 [ERRO] / usr / sbin / mysqld: A tabela './mysql/proc' está marcada como
travada e deve ser reparada 2017-08-27T09: 12: 47.433516Z 54 [ERRO] Não foi possível ' tabela de reparo t: mysql.proc
2017-08-27T09: 12: 47.440695Z 55 [ERRO] / usr / sbin / mysqld: A tabela './mysql/proc' está marcada como
travada e deve ser reparada 2017-08-27T09: 12: 47.769485Z 81 [ERRO] / usr / sbin / mysqld: tabela './mysql/tables_priv'está marcado como travado e deve ser reparado
2017-08-27T09: 12: 47.792061Z 81 [ERRO] Não foi possível reparar a tabela: mysql.tables_priv
2017-08-27T09: 12: 47.798472Z 82 [ERRO] / usr / sbin / mysqld: Tabela './mysql/ tables_priv 'está marcado como travado e deve ser reparado
2017-08-27T09: 12: 47.893741Z 99 [ERRO] / usr / sbin / mysqld: A tabela' ./mysql/user 'está marcada como
travada e deve ser reparada 2017-08 -27T09: 12: 47.914288Z 99 [ERRO] Não foi possível reparar a tabela: mysql.user
2017-08-27T09: 12: 47.920459Z 100 [ERRO] / usr / sbin / mysqld: A tabela './mysql/user' é marcado como travado e deve ser reparado
O que está acontecendo aqui para causar esse comportamento estranho?
Respostas:
Encontrei o mesmo problema hoje. Estou executando o serviço MySQL durante a construção do docker para os testes de unidade e a atualização para o MySQL CE 5.7.19 do MariaDB interrompeu a construção. O que resolveu o problema para mim estava sendo executado
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld
cada vez antes de iniciar o serviço mysql.Portanto, meu Dockerfile se parece com isso agora:
Espero que isto ajude.
fonte
chmod
comando. A compilação é bem-sucedida quando eu a executo em um servidor Ubuntu remoto, mas falha quando executada na minha máquina local (OS X). A adição dochmod
comando ao Dockerfile filho corrigiu o problema. Estranho .Confirmei o erro no overlayfs (overlay2), que é o padrão no Docker for Mac. O erro ocorre ao iniciar o mysql na imagem, depois de criar uma imagem com o mysql.
Mudar para "aufs" resolveu o problema. (No Docker para Mac, o "daemon.json" pode ser editado escolhendo o menu "Preferências ..." e selecionando a guia "Daemon" e selecionando a guia "Avançado".)
/etc/docker/daemon.json:
Ref:
https://github.com/moby/moby/issues/35503
https://qiita.com/Hige-Moja/items/7b1208f16997e2aa9028
fonte
Gambiarra
Descrição do Problema
O problema subjacente, conforme declarado por aalexgabi, é devido à implementação dos padrões POSIX do OverlayFS :
Referência:
fonte
Aqui está uma resposta que ainda não vejo aqui.
Adicione isso ao seu dockerfile:
VOLUME /var/lib/mysql
Isso fará com que a pasta / var / lib / mysql use o sistema de arquivos nativo em vez de overlayFS. Isso contorna esse problema.
Esta é a solução que a imagem oficial do docker mysql usa para lidar com isso, como você pode ver aqui: https://github.com/docker-library/mysql/blob/9d1f62552b5dcf25d3102f14eb82b579ce9f4a26/5.7/Dockerfile
fonte
Talvez essa ainda não seja a solução. De qualquer forma, pode apontar outras pessoas para uma resposta "adequada"
O log da sessão do docker bash abaixo mostra uma sequência de etapas que levam a erros estranhos e finalmente podem iniciar o daemon mysql corretamente no ambiente do docker.
A tentativa de iniciar o daemon nesta sessão falha duas vezes - uma vez devido à tabela mysql.user e uma vez devido à tabela mysql.db. A execução do daemon mysql com --skip-grant-tables funciona, mas também há problemas com os comandos simples select * from nessas tabelas.
Estranhamente, fazendo duas consultas simples:
e depois matar o daemon para iniciá-lo corretamente com
parece funcionar. Agora vou tentar automatizar isso como uma solução alternativa. Ainda estou procurando uma solução "adequada" para o problema e algumas pistas sobre o motivo desse estranho comportamento.
Dockerfile
construir log
log de sessão do bash
fonte