no puede iniciar sesión como usuario root de mysql desde una cuenta de usuario normal en ubuntu 16.04

204

Acabo de instalar Ubuntu 16.04 LTS junto con los paquetes php, mariadby nginx. Corrí mysql_secure_installationy cambié la contraseña de root.

Ahora, cuando intento iniciar sesión para mysqlusar la cuenta raíz mientras estoy conectado a Ubuntu como cuenta de usuario normal, obtengo acceso denegado.

Cuando inicio sesión usando sudo mysql, mysql ni siquiera me pide contraseña. Si ejecuto mysql_secure_installtion, veo que la configuración anterior nunca se estableció de forma permanente.

¿Qué estoy haciendo mal?

codecope
fuente

Respuestas:

361

Recientemente actualicé mi Ubuntu 15.04 a 16.04 y esto me ha funcionado:

  1. Primero, conéctese en sudo mysql

    sudo mysql -u root
    
  2. Verifique sus cuentas presentes en su base de datos

    SELECT User,Host FROM mysql.user;
    +------------------+-----------+
    | User             | Host      |
    +------------------+-----------+
    | admin            | localhost |
    | debian-sys-maint | localhost |
    | magento_user     | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    
  3. Eliminar la cuenta actual de root @ localhost

    mysql> DROP USER 'root'@'localhost';
    Query OK, 0 rows affected (0,00 sec)
    
  4. Recrea a tu usuario

    mysql> CREATE USER 'root'@'%' IDENTIFIED BY '';
    Query OK, 0 rows affected (0,00 sec)
    
  5. Otorgue permisos a su usuario (no olvide eliminar los privilegios)

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    Query OK, 0 rows affected (0,00 sec)
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0,01 sec)
    
  6. Salga de MySQL e intente volver a conectarse sin sudo.

Espero que esto ayude a alguien :)

Loremhipsum
fuente
16
Esto fue lo único que funcionó para mí, ¿alguien sabe exactamente qué sucedió con el usuario root cuando instaló mysql-server en 16.04?
Ruggi
32
Sostenlo, no %significa que puedas conectarte desde cualquier lugar ... de forma remota
Stevie G
99
Puede cambiar la fila a: CREAR USUARIO 'root' @ 'localhost' IDENTIFICADO POR '';
vladnev
11
Para los interesados ​​en la seguridad: el patrón de conexión root @ localhost mysql no seguro es un elemento básico del desarrollo local, pero no debería aparecer en ningún otro lugar.
Charney Kaye
55
La instrucción de concesión para el nuevo usuario root aquí no da "con subvención" a raíz de la raíz por lo que no puede conceder sin correr esta tarde: dba.stackexchange.com/a/62046/115679 Por favor cambia la instrucción de concesión agrant all privileges on *.* to 'root'@'localhost' with grant option;
Loren
133

Si instala 5.7 y no proporciona una contraseña al rootusuario, utilizará el auth_socketcomplemento. Ese complemento no le importa y no necesita una contraseña. Simplemente verifica si el usuario se está conectando usando un socket UNIX y luego compara el nombre de usuario.

Tomado de Cambiar contraseña de usuario en MySQL 5.7 con "plugin: auth_socket"

Entonces, para cambiar la pluginespalda a mysql_native_password:

  1. Inicie sesión con sudo:

    sudo mysql -u root
    
  2. Cambie pluginy establezca una contraseña con un solo comando:

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';
    

Por supuesto, también puede usar el comando anterior para establecer una contraseña vacía.

Solo para el registro (y los MariaDB < 10.2usuarios) también hay otra forma de cambiar solo pluginsin proporcionar una contraseña (dejándola vacía):

update mysql.user set plugin = 'mysql_native_password' where User='root';
// to change the password too (credits goes to Pothi Kalimuthu)
// UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root';
FLUSH PRIVILEGES;
Todor
fuente
2
Gracias, por alguna razón, esto se configuró automáticamente de repente después de una actualización de apt-get, creo ...
Tominator
44
Además, me gusta más esta respuesta: es mucho menos destructiva ;-)
benzkji
3
Para MariaDB <10.2, para cambiar el complemento junto con la contraseña, aquí está la consulta: UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root'; FLUSH PRIVILEGES;Fuente: stackoverflow.com/a/41537019/1004587
Pothi Kalimuthu
55
Esta debe ser la respuesta aceptada
Geo C.
3
Desearía poder votar esto dos veces.
James Smith
21

En resumen, en MariaDB

UPDATE mysql.user SET plugin = 'mysql_native_password', 
      Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

donde reemplaza NEWPASSWORD con la contraseña que desea, y todo lo demás textualmente.

El problema aquí es que cuando MariaDB o MySQL se instalan / actualizan (especialmente si en algún momento la raíz se configura sin contraseña), en la tabla Usuarios la contraseña está realmente vacía (o ignorada), y el inicio de sesión depende del usuario del sistema correspondiente a un usuario de MySQL. Puede probar esto de la siguiente manera cambiando a la raíz del sistema y luego escriba:

mysql -uroot -p

Luego ingrese sin contraseña o la contraseña incorrecta . Probablemente se le permitirá ingresar. (Incluso puede iniciar sesión desde la raíz de Unix simplemente # mysqlporque la contraseña es irrelevante y el usuario está definido).

¿Entonces que esta pasando? Bueno, si inicia sesión como root y hace lo siguiente:

select User,host,plugin from mysql.user; 
+----------------+-----------+-----------------------+
| User           | host      | plugin                |
+----------------+-----------+-----------------------+
| root           | localhost | auth_socket           |
+----------------+-----------+-----------------------+

notarás auth_socket(que puedes leer unix_socketen MariaDB). Estos sockets ignoran las contraseñas y permiten que el usuario de Unix correspondiente ingrese sin una verificación de contraseña. Es por eso que puede iniciar sesión con root pero no con un usuario diferente.

Por lo tanto, la solución es actualizar a los usuarios para que no usen auth_socket/unix_sockety establecer una contraseña correctamente.

En MariaDB (<10.2, vea los comentarios a continuación) que se encuentra en la versión 16 de Ubuntu a partir de 2017, esto debería ser suficiente. NEWPASSWORD es tu contraseña. mysql_native_passwordescribes al pie de la letra.

UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

(Es posible que configurar el complemento para vaciar funcione. YMMV. No probé esto. Así que esta es una alternativa).

UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

De otra manera:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NEWPASSWORD';

Entonces

FLUSH PRIVILEGES;

Para el registro, la solución que implica eliminar al usuario y recrearlo con '%' me dejó totalmente bloqueado de la base de datos, y puede causar otros problemas a menos que obtenga la grantdeclaración correcta, es más fácil simplemente actualizar la raíz que ya tiene.

En mi experiencia, el problema solo ocurre con el usuario root, ya que otros usuarios se agregarán manualmente y no formarán parte de una instalación / actualización inicial.

Gazzer
fuente
2
Encontré que esto funcionaba perfectamente. Sin embargo, me pregunto por qué cambiar la contraseña de root mysql_secure_installationno tuvo el mismo efecto. ¿Dónde almacena la nueva contraseña?
Mausy5043
¿Puedes editar tu respuesta y decir más sobre cada uno de los comandos a medida que avanzas? No tengo claro cuáles son aplicables. ¿Son los dos UPDATEs los que se aplican a MariaDB <10.2 y ALTERa otras versiones? ¿Y el segundo es UPDATEuna alternativa al primero, o necesitamos escribir ambos? Finalmente, ¿es 'mysql_native_password' algo para escribir textualmente, o deberíamos reemplazarlo con nuestra contraseña de root para MySQL?
Michael Scheper
1
@MichaelScheper Hace un tiempo, así que no quiero editar demasiado, pero esto es lo que recuerdo. (1) Realice la primera ACTUALIZACIÓN solamente (<10.2 puede no ser un requisito). (2) Sí, escriba 'mysql_native_password' literalmente. Esencialmente, lo que está haciendo es decirle a mariadb: "No use privilegios de Unix, use los privilegios de la base de datos". La mysql_native_passwordes esa opción.
Gazzer
¡Maldita sea, deletreé mal 'privilegio'!
Gazzer
1
¡Parece que también te perdiste el límite de tiempo de edición en 1½ minutos! A veces me siento frustrado por eso también. De todos modos, gracias!
Michael Scheper
8

Si ha instalado MySQL / MariaDB desde el repositorio base, los usuarios no pueden iniciar sesión en MySQL como usuario root de MySQL desde sus inicios de sesión de Unix (no aplicable si tienen acceso a sudo )

  1. Inicie sesión en el shell raíz de MySQL:

    $ sudo mysql -u root -p
    
  2. Ejecute las consultas a continuación:

    use mysql;
    update user set plugin='mysql_native_password' where user='root';
    flush privileges; 
    quit;
    
  3. Abra un nuevo shell, luego:

    $ mysql -u root -p
    

Fuente

Gayan Weerakutti
fuente
Cuando hice esto, ya no podía sudo mysql como root. Primero tenía que su, y luego podía iniciar sesión en mysql como root. Así que lo cambié a auth_socket.
hasta el
Comando único:mysql -u root -p -e "use mysql;update user set plugin='mysql_native_password' where user='root';flush privileges;"
Chris Stryczynski
Si desea perder el acceso a su instancia de MySQL, esta respuesta es la manera fácil.
Danila Vershinin
2

Intenta crear una nueva cuenta mysql, para mí ha funcionado (mysql 5.7.12):

  1. Inicie sesión como sudo:

    sudo mysql -uroot
    
  2. Cree un nuevo usuario y otórguele privilegios (sin contraseña):

    CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
    
  3. Inicie sesión como nuevo usuario:

    mysql -uadmin
    
Alex Yakovlev
fuente
2

Tuve que hacer dos cosas (gracias a @Todor y @Loremhipsum):

update mysql.user set plugin = 'mysql_native_password' where User='root';
grant all privileges on *.* to 'root'@'localhost';

y entonces:

FLUSH PRIVILEGES;

No recomendaría dejar caer al usuario root.

Franc Drobnič
fuente
1

Prueba este código primero,

echo "CREATE USER 'root'@'localhost' IDENTIFIED BY 'root';" > your_init_file.sql
echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;" >> your_init_file.sql 
echo "FLUSH PRIVILEGES;" >> your_init_file.sql

y entonces,

killall mysqld
mysqld_safe --init-file=$PWD/your_init_file.sql

luego presione Ctrl+Zy escriba: bgpara ejecutar el proceso desde el primer plano hasta el fondo, luego verifique su acceso:

mysql -u root -proot
mysql> show grants;
ADHITHYA SRINIVASAN
fuente
1

Si solo ejecuta el comando mysql bajo el usuario root, se le otorgará acceso sin la contraseña solicitada, porque la autenticación de socket está habilitada para root @ localhost. .

La única forma de establecer una contraseña es cambiar a autenticación nativa como:

$ sudo mysql

mysql> ALTERAR USUARIO 'root' @ 'localhost' IDENTIFICADO CON mysql_native_password POR 'test';

Vadiaz
fuente
0

He estado adaptando algunos scripts de aprovisionamiento que he creado para usar MariaDB y me encontré con este problema exacto. Juntando mucha información aquí, la respuesta de un Gazzer realmente se centra en el tema; todo se reduce a la configuración auth_socket/ unix_socket.

Entonces, al usar MariaDB 5.5 (bajo Ubuntu 14.04) y MariaDB 10 bajo (Ubuntu 16.04), iniciar sesión en MySQL y ejecutar este comando despejó las cosas de inmediato:

UPDATE mysql.user SET plugin='' WHERE User='root';
FLUSH PRIVILEGES;

Las otras respuestas, incluida la respuesta más votada a partir de esta publicación de Loremhipsum, realmente fomentan las malas prácticas al recomendar dejar caer a un usuario y luego recrearlas . Para mí, esa es una solución bastante radical. La mejor / más simple solución es anular el pluginvalor, eliminar los privilegios y seguir con la vida.

JakeGould
fuente
-1

Tuve el mismo problema y corrí lo siguiente:

mysql_upgrade --force
klob
fuente
Lamentablemente eso no funcionó. Estoy reinstalando ubuntu.
codecope
1
Acabo de hacer una nueva instalación de ubuntu 16.04 e instalé mariad-server. Después de la instalación, ejecuté mysql_secure_installation y configuré la contraseña. Después de seguir el resto de los pasos en mysql_secure_installation, lo ejecuté nuevamente y parece que no está guardando los cambios. Todavía no puedo iniciar sesión desde mi cuenta de usuario normal. ¿Podría ser un error?
codecope
Esto nunca ayudará. La cuestión no tiene nada ver con la instalación real de la MariaDB binaria, sino que el usuario rootestá configurado con pluginlos ajustes que no son estándar. El único caso extremo en el que una actualización de la base de datos podría ayudar en un caso como este es si el mysql_upgradeproceso en sí representa la pluginconfiguración que dudo.
JakeGould