Después de actualizar MySQL de 5.6 a 5.7, no puedo iniciar sesión como root:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
Encontré lo siguiente en el registro:
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)
Entonces hice lo sugerido: detuve el servidor:
> service mysql stop
Lo comenzó con tablas de subvenciones omitidas:
> sudo mysqld_safe --skip-grant-tables
Cuando mysqld_safe se ejecuta con --skip-grant-tables, puedo iniciar sesión como root pero solo hasta que cierre la terminal donde se está ejecutando (no se ejecuta como un demonio pero se detiene al cerrar la terminal).
Luego ejecuté mysql_upgrade como se sugirió (en otra terminal)
> sudo mysql_upgrade
Y eso mejoró mis mesas.
Cerré la terminal donde se ejecutaba mysqld_safe, detuve el servidor mysql (detención del servicio mysql). Tuve que eliminar todas las instancias de MySQL porque, de lo contrario, obtenía el registro completo de los siguientes errores:
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.
Luego inicié MySQL nuevamente:
> service mysql start
y obtuve el mismo resultado que el anterior (Acceso denegado para el usuario 'root'@'localhost' (usando contraseña: NO))
¿Cómo lo soluciono? ¡He estado luchando con esto durante horas y cualquier ayuda se agradece!
Respuesta1
Tuve el mismo problema cuando actualicé Ubuntu de 14.04 a 16.04. Era demasiado vago para seguir tu sugerencia (exportar bases de datos y empezar de nuevo), ¡así que terminé haciendo esto para solucionar el problema!
Detenga mysql y luego inicie sin subvenciones
> 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
Luego, en otra ventana de 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, solo necesitaba eliminar la instancia temporal de mysql (mysqld_safe) y reiniciarla... En la primera terminal
> ^\ #to tell the mysqld_safe process to quit itself
> sudo service mysqld start
Respuesta2
El problema era que el valor del complemento mysql.user estaba vacío para todos los usuarios, incluido Debian-sys-maint, por lo que ni siquiera podía reconfigurar el paquete. Se suponía que se solucionaría ejecutando mysql_upgrade pero por alguna razón no fue así.
Así que volqué todas las bases de datos, eliminé el servidor MySQL por completo y luego lo reinstalé y volví a importar mis bases de datos.
Vuelca todas tus bases de datos:
> mysqldump -u root -p --databases db1 db2 > alldb.sql
Fue bastante tonto de mi parte, pero hice un volcado de todas las bases de datos con --all-databases. Incluía la tabla mysql.user donde todos los usuarios tenían un valor de "complemento" vacío, por lo que encontré el mismo problema después del primer reinicio del servicio mysql. Luego hice el volcado solo para mis bases de datos.
El volcado se colocará en la carpeta desde donde ejecutó el comando.
Elimina MySQL y su configuración:
> 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
Instalar MySQL:
> sudo apt-get install mysql-server
Importe sus bases de datos nuevamente:
> mysql -u root -p < alldb.sql