Como reiniciar o MySQL com --skip-grant-tables se você não pode usar a senha root?

Como reiniciar o MySQL com --skip-grant-tables se você não pode usar a senha root?

Preciso reiniciar o MySQL no Ubuntu 16.04 com a --skip-grant-tablesopção habilitada, mas não sei minha senha root ou ela não está funcionando. Como posso configurar --skip-grant-tablessem a senha?

Quando tento como usuário normal:

mysqld --skip-grant-tables

Eu vejo isso:

mysqld: Can't change dir to '/var/lib/mysql/' (Errcode: 13 - Permission denied)

Então, desenterrei este exemplo de /etc/init.d/mysql e adicionei o --skip-grant-tablesparâmetro:

su - mysql -s /bin/bash -c "/usr/sbin/mysqld --skip-grant-tables"
Password: 
su: Authentication failure

Então su não funciona e a senha root também não funcionou. Eu também tentei isso:

sudo su - mysql -s /bin/bash -c "/usr/sbin/mysqld --skip-grant-tables"
No directory, logging in with HOME=/

Como posso iniciar o mysql com --skip-grant-tables?

Responder1

Quando você não sabe sua senha root (ou um erro como 'ERROR 1045 (28000): Access denied for user 'root'@'localhost'impede o acesso), você pode obter acesso adicionando a opção ao arquivo de configuração do MySQL. Primeiro abra-o para edição:

sudo nano /etc/mysql/my.cnf

Em seguida, pesquise [mysqld]e insira estes valores abaixo:

[mysqld]
# For debugging and recovery only #
skip-grant-tables
skip-networking
###################################

Como você pode ver, o truque para adicionar parâmetros de linha de comando aqui é retirar o --da frente do parâmetro. Agorareinicie o serviço mysqle você pode acessar suas tabelas para redefinir sua senha de usuário root ou quase tudo que precisar fazer. (No entanto, você não pode fazer nada com as tabelas de concessão porque elas não estão carregadas.)

Cuidado.Enquanto você estiver neste modo, qualquer usuário logado terá acesso a todo o seu banco de dados. É por isso que adicionei a skip-networkingopção acima, para que usuários remotos não possam acessar as tabelas durante a recuperação.

Certifique-se de comentar essas linhas e reinicie o mysql mais uma vez quando terminar, para proteger novamente o servidor.

Responder2

Dos comentários.

Para configurações init.rc:

O método mais fácil seria modificar temporariamente /etc/init.d/mysql para incluir a opção --skip-grant-tablese então iniciá-lo com este script (/etc/init.d/mysql start).

Em sistemas iniciantes como o Ubuntu 16.04, isso precisa ser feito no formato /lib/systemd/system/mysql.service.

informação relacionada