Não é possível fazer login no usuário root após atualizar o MySQL de 5.6 para 5.7

Não é possível fazer login no usuário root após atualizar o MySQL de 5.6 para 5.7

Após atualizar o MySQL de 5.6 para 5.7, não consigo fazer login como root:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

Encontrei o seguinte no log:

2016-10-26T10:23:01.845088Z 0 [Warning] User entry 'root'@'localhost' has an empty plugin value. The user will be ignored and no one can login with this user anymore.
2016-10-26T10:23:01.845112Z 0 [Warning] User entry 'mysql.sys'@'localhost' has an empty plugin value. The user will be ignored and no one can login with this user anymore.
2016-10-26T10:23:01.845127Z 0 [Warning] User entry 'debian-sys-maint'@'localhost' has an empty plugin value. The user will be ignored and no one can login with this user anymore.
2016-10-26T10:23:01.845142Z 0 [Warning] User entry 'phpmyadmin'@'localhost' has an empty plugin value. The user will be ignored and no one can login with this user anymore.
2016-10-26T10:23:01.845155Z 0 [Warning] Some of the user accounts with SUPER privileges were disabled because of empty mysql.user.plugin value. If you are upgrading from MySQL 5.6 to MySQL 5.7 it means we were not able to substitute for empty plugin column. Probably because of pre 4.1 password hash. If your account is disabled you will need to:
2016-10-26T10:23:01.845183Z 0 [Warning] 1. Stop the server and restart it with --skip-grant-tables.
2016-10-26T10:23:01.845192Z 0 [Warning] 2. Run mysql_upgrade.
2016-10-26T10:23:01.845200Z 0 [Warning] 3. Restart the server with the parameters you normally use.
2016-10-26T10:23:01.845207Z 0 [Warning] For complete instructions on how to upgrade MySQL to a new version please see the 'Upgrading MySQL' section from the MySQL manual
2016-10-26T10:23:01.853461Z 0 [Note] Event Scheduler: Loaded 0 events
2016-10-26T10:23:01.853962Z 0 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.7.16-0ubuntu0.16.04.1'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  (Ubuntu)
2016-10-26T10:23:02.138961Z 2 [Note] Access denied for user 'root'@'localhost' (using password: NO)

Então fiz o que foi sugerido: parei o servidor:

> service mysql stop

Comecei com tabelas de concessão ignoradas:

> sudo mysqld_safe --skip-grant-tables

Quando mysqld_safe está rodando com --skip-grant-tables, posso logar como root, mas apenas até fechar o terminal onde ele está rodando (ele não está rodando como um daemon, mas para ao fechar o terminal).

Então executei mysql_upgrade conforme sugerido (em outro terminal)

> sudo mysql_upgrade

E isso atualizou minhas tabelas.

Fechei o terminal onde o mysqld_safe estava rodando, parei o servidor mysql (serviço mysql stop). Eu tive que matar todas as instâncias do mysql porque caso contrário eu estava recebendo o log completo dos seguintes erros:

2016-10-26T10:40:54.073975Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 11
2016-10-26T10:40:54.074060Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.

Então comecei o MySQL novamente:

> service mysql start

e obtive o mesmo resultado acima (acesso negado ao usuário 'root'@'localhost' (usando senha: NO))

Como faço para corrigir isso? Estou lutando com isso há horas e qualquer ajuda será apreciada!

Responder1

Eu tive esse mesmo problema quando atualizei o Ubuntu de 14.04 para 16.04. Fiquei com preguiça de fazer sua sugestão (exportar bancos de dados e recomeçar), então acabei fazendo isso para resolver o problema!

Pare o mysql e inicie sem concessões

> sudo service stop mysql 
> sudo mkdir /var/run/mysqld # needed to launch mysql in ubuntu from command line...may not apply to other distros
> sudo chown mysql:mysql /var/run/mysqld # same reason as above
> sudo mysqld_safe --skip-grant-tables

Então, em outra janela do terminal:

> mysql -uroot 
> select User, host, authentication_string,plugin from mysql.user; #see what users don't have a password (authentication_string and plugin are empty) 
> update mysql.user set authentication_string=PASSWORD('woot') where user='user';
> update mysql.user set plugin='mysql_native_password' where user='user'; 
> FLUSH PRIVILEGES;
> exit; 

Finalmente, eu só precisava matar a instância temporária do mysql (mysqld_safe) e reiniciá-la... No primeiro terminal

> ^\ #to tell the mysqld_safe process to quit itself 
> sudo service mysqld start 

Responder2

O problema era que o valor do plugin mysql.user estava vazio para todos os usuários, incluindo debian-sys-maint, então eu não consegui nem reconfigurar o pacote. Era para ser corrigido executando mysql_upgrade, mas por algum motivo não foi.

Então, despejei todos os bancos de dados, removi completamente o servidor MySQL, reinstalei-o e importei meus bancos de dados novamente.

Despeje todos os seus bancos de dados:

> mysqldump -u root -p --databases db1 db2 > alldb.sql

Foi um tanto bobo da minha parte, mas fiz um dump de todos os bancos de dados com --all-databases. Ele incluía a tabela mysql.user onde todos os usuários tinham o valor "plugin" vazio, então me deparei com o mesmo problema após a primeira reinicialização do serviço mysql. Depois fiz o dump apenas para meus bancos de dados.

O dump será colocado na pasta de onde você executou o comando

Remova o MySQL e suas configurações:

> sudo apt-get purge mysql-server mysql-client mysql-common mysql-server-core-5.7 mysql-client-core-5.7
> sudo rm -rf /etc/mysql /var/lib/mysql
> sudo apt-get autoremove
> sudo apt-get autoclean

Instale o MySQL:

> sudo apt-get install mysql-server

Importe seus bancos de dados de volta:

> mysql -u root -p < alldb.sql

informação relacionada