¿Cómo puedo restaurar todos los privilegios del usuario root de MySQL?

108

Accidentalmente eliminé algunos de los privilegios de mi usuario raíz de MySQL, incluida la capacidad de alterar tablas. ¿Hay alguna forma de que pueda restaurar este usuario a su estado original (con todos los privilegios)?

UPDATE mysql.user SET Grant_priv = 'Y', Super_priv = 'Y' WHERE User = 'root';
# MySQL returned an empty result set (i.e. zero rows).
FLUSH PRIVILEGES ;
# MySQL returned an empty result set (i.e. zero rows).


#1045 - Access denied for user 'root'@'localhost' (using password: YES)
GRANT ALL ON *.* TO 'root'@'localhost'
Steven
fuente
1
El segundo error parece un problema de contraseña. Probablemente sea mi culpa por asumir que ya tenías una cuenta 'root' @ 'localhost'. Vuelva a ejecutar mysqld con --skip-grant-tables, y: "DROP USER 'root' @ 'localhost'; GRANT ALL PRIVILEGES ON . TO 'root' @ '%';" ¿en lugar? La mejor manera de averiguar a qué cuenta debe otorgar acceso es ejecutar "SELECT User, Host FROM mysql.user WHERE User = 'root';" ... que le dará el nombre de host que debe usarse después de @ símbolo en el comando GRANT.
DMI
1
Es de mala educación que los mods marquen el tema como fuera de tema cuando no está fuera de tema, excepto que puede haber otro sitio de Stack Exchange más adecuado para el tema, en cuyo caso debe identificarse. (Lástima de los mods.) Aquí es donde podría ir esto: dba.stackexchange.com
Jon Davis
^ de acuerdo, voté a favor de reabrir. si se cerró debido a la existencia del sitio de DBA, eso al menos debería haber sido mencionado y el OP dirigido allí. (O potencialmente cerrado como un duplicado de otra pregunta aquí)
indivisible

Respuestas:

148

Si GRANT ALLno funciona, intente:

  1. Deténgalo mysqldy reinícielo con la --skip-grant-tablesopción.
  2. Conéctese al mysqldservidor con solo: mysql(es decir, sin -popción y es posible que no se requiera el nombre de usuario).
  3. Emita los siguientes comandos en el cliente mysql:

    UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

    FLUSH PRIVILEGES;

Después de eso, debería poder ejecutarlo GRANT ALL ON *.* TO 'root'@'localhost';y hacer que funcione.

DMI
fuente
7
1.Cómo conectarse al servidor mysqld con solo: mysql 2.Cuando publiqué ACTUALIZAR mysql.user SET Grant_priv = '1' WHERE User = 'root'; PRIVILEGIOS DE FLUSH; Obtuve Consulta correcta, 0 filas afectadas (0,00 segundos) filas coincidentes: 2 cambiadas: 0 advertencias: 0 Consulta correcta, 0 filas afectadas (0,00 segundos). Cuando inicié sesión en phpMyAdmin como usuario root, todavía veo "Sin privilegios".
Steven
Lo sentimos, después de los pasos anteriores, debería poder ejecutar el comando GRANT ALL. Para conectarse a mysqld, quise decir que no necesitará una contraseña; no recuerdo si algún nombre de usuario funcionará o si necesitará ser "root".
DMI
2
Esto no funciona. Como dijo Steven, la actualización de la tabla de usuarios afecta a 0 registros. El usuario root sigue sin poder otorgar.
Cerin
1
Sí, funciona. Y si está en Windows, simplemente agregue temporalmente skip-grant-tablesa la [mysqld]sección de su archivo de configuración de mysql para acceder a mysql en la línea de comando sin contraseña.
Markus
1
Me quedé en la parte de Grant (que no funcionó) durante más de 9 horas y tu respuesta me salvó ... eres un salvavidas. muchas gracias
Ali SH
91

Si eliminó a su rootusuario por error, puede hacer una cosa:

  1. Detener el servicio MySQL
  2. correr mysqld_safe --skip-grant-tables &
  3. Escribe mysql -u root -py presiona enter.
  4. Ingresa tu contraseña
  5. En la línea de comando de mysql ingrese: use mysql;

Luego ejecute esta consulta:

insert into `user` (`Host`, `User`, `Password`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`, `Drop_priv`, `Reload_priv`, `Shutdown_priv`, `Process_priv`, `File_priv`, `Grant_priv`, `References_priv`, `Index_priv`, `Alter_priv`, `Show_db_priv`, `Super_priv`, `Create_tmp_table_priv`, `Lock_tables_priv`, `Execute_priv`, `Repl_slave_priv`, `Repl_client_priv`, `Create_view_priv`, `Show_view_priv`, `Create_routine_priv`, `Alter_routine_priv`, `Create_user_priv`, `ssl_type`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `max_questions`, `max_updates`, `max_connections`, `max_user_connections`) 
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');

luego reinicia el mysqld

EDITAR: 6 de octubre de 2018

En caso de que alguien más necesite esta respuesta, la probé hoy usando innodb_version 5.6.36-82.0 y 10.1.24-MariaDB y funciona si QUITAS LOS BACKTICKS (tampoco hay comillas simples, simplemente quítalas):

insert into user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, ssl_type, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, max_user_connections) 
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');
Bipin Bahuguna
fuente
1
@Bipin, raro solo hay mysqld.exeen la bincarpeta, no mysqld_safe.exe. ¿Qué quieres decir con "mysqld_safe"?
Pacerier
4
Para MySQL 5.5, necesita dos privs más, Event_priv y Trigger_priv.
Greg Bell
Me imagino que esto se rompe en 5.6.5
Otheus
1
@Pacerier: de acuerdo con esta publicación , realmente no necesita mysqld_safe, solo ejecute el binario mysqld normal:mysqld.exe --skip-grant-tables
bkwdesign
2
ERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Jamie Hutber
24

También elimino los privilegios de root y la base de datos que no se muestran en la consola mysql cuando era un usuario root, así que cambié el usuario mysql>mysql -u 'userName' -p;y la contraseña;

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

FLUSH PRIVILEGES;

después de este comando, todo muestra la base de datos en la raíz.

Gracias

Prabhu
fuente
1
Tuve que hacer una combinación de cosas. Tuve que detener el servicio mysqld, luego ejecutar mysqld_safe --skip-crant-tables &, luego el comando UPDATE anterior, luego reiniciar mysql, luego ejecutar GRANT ALL ON . TO 'usuario' @ 'localhost';
Nick Woodhams
5

Le había negado los privilegios de inserción y recarga a root. Entonces, después de actualizar los permisos, FLUSH PRIVILEGES no funcionaba (debido a la falta de privilegios de recarga). Así que utilicé el usuario debian-sys-maint en Ubuntu 16.04 para restaurar los privilegios de user.root. Puede encontrar la contraseña de user.debian-sys-maint en este archivo

sudo cat /etc/mysql/debian.cnf
Varun Kumar
fuente
¡Me salvas! GRANT no funcionaba ni en el modo --skip-grant-tables, por lo que ingresar como ubuntu-system me permite crear mi usuario raíz nuevamente, y luego pude actualizar todos los privilegios
lunix15
4
GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;

Simplemente inicie sesión desde la raíz usando la contraseña respectiva, si la hubiera, y simplemente ejecute el comando anterior para cualquier usuario.

Por ejemplo:

GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;
desconocido
fuente
3
pero si el usuario 'root' ha perdido privilegios, ¿cómo puede funcionar? ¿El usuario root no necesita privilegios elevados para hacer esto? Esto no funcionó para mí.
Terungwa
3

Simplemente inserte o actualice mysql.usercon valor Yen los privilegios de cada columna.

usuario1316095
fuente
2

Si está utilizando WAMP en su computadora local (mysql versión 5.7.14) Paso 1: abra el archivo my.ini Paso 2: elimine el comentario de esta línea 'skip-grant-tables' eliminando el punto y coma paso 3: reinicie mysql servidor paso 4: iniciar la consola mySQL paso 5:

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;

Paso 6: ¡Problema resuelto!

Terungwa
fuente