Antes de que piense que se trata de una pregunta duplicada, creo que tengo un caso único, aunque sea un poco tonto.
Hace unos días, actualicé la versión de MySQL en mi servidor Ubuntu 10.04 a 5.3.3 (está por delante de las versiones de Ubuntu para 10.04). Hoy, intenté entrar en phpMyAdmin para algo y descubrí el algo temido error Connection for controluser as defined in your configuration failed
.
Después de seguir las descripciones de varias preguntas SO sobre cómo solucionar esto, me he quedado atascado.
flush privileges
).granting access to database phpmyadmin for phpmyadmin@localhost: already exists
(concesión de acceso a la base de datos phpmyadmin para phpmyadmin@localhost: ya existe)
Así que esto es lo que me queda. Tengo una concesión que no puedo modificar, ni revocar:
mysql> show grants for 'phpmyadmin'@'localhost';
+-------------------------------------------------------------------------------------------------------------------+
| Grants for phpmyadmin@localhost |
+-------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'phpmyadmin'@'localhost' IDENTIFIED BY PASSWORD '*46CFC7938B60837F46B610A2D10C248874555C14' |
| GRANT ALL PRIVILEGES ON `phpmyadmin`.* TO 'phpmyadmin'@'localhost' |
+-------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.26 sec)
mysql> revoke usage on *.* from 'phpmyadmin'@'localhost';
ERROR 1141 (42000): There is no such grant defined for user 'phpmyadmin' on host 'localhost'
mysql> revoke usage on *.* from 'phpmyadmin'@'localhost' identified by 'trustno1';
ERROR 1141 (42000): There is no such grant defined for user 'phpmyadmin' on host 'localhost'
(No'te preocupes, ya no uso esta contraseña, pero era la contraseña que se usaba anteriormente y no es la contraseña que elegí para la nueva instalación de phpmyadmin).
¿Cómo puedo eliminar totalmente estas concesiones/privilegios? Si es necesario, puedo empezar de cero (phpmyadmin, no la base de datos).
El privilegio USAGE en mysql simplemente significa que no hay privilegios para el usuario 'phpadmin'@'localhost' definido a nivel global *.*
. Adicionalmente el mismo usuario tiene ALL-privilege en la base de datos phpmyadmin phpadmin.*
.
Así que si desea eliminar todos los privilegios y empezar totalmente desde cero haga lo siguiente:
Revoca todos los privilegios a nivel de base de datos:
REVOKE ALL PRIVILEGES ON phpmyadmin.* FROM 'phpmyadmin'@'localhost';
.
Dar de baja el usuario 'phpmyadmin'@'localhost'
DROP USER 'phpmyadmin'@'localhost';
El procedimiento anterior eliminará por completo el usuario de su instancia, lo que significa que puede volver a crearlo desde cero.
Para ponerte un poco en antecedentes sobre lo descrito anteriormente: tan pronto como crees un usuario, la tabla mysql.user
se llenará. Si miras un registro en ella, verás el usuario y todos los privilegios establecidos a 'N'
. Si haces un show grants for 'phpmyadmin'@'localhost';
verás, la ya familiar, salida de arriba. Simplemente traducido a "sin privilegios a nivel global para el usuario". Ahora su concesión ALL
a este usuario en el nivel de base de datos, esto se almacena en la tabla mysql.db
. Si haces un SELECT * FROM mysql.db WHERE db = 'nameofdb';verás un
'Y'` en cada priv.
Arriba descrito muestra el escenario que tiene en su db en la actualidad. Asi que tener un usuario que solo tiene el privilegio USAGE
significa, que este usuario puede conectarse, pero aparte de SHOW GLOBAL VARIABLES; SHOW GLOBAL STATUS;
no tiene ningun otro privilegio.
Como nota al margen, la razón por la que revoke usage on *.* from 'phpmyadmin'@'localhost';no funciona es bastante simple : No existe una concesión llamada
USAGE`.
Las concesiones con nombre real se encuentran en la Documentación de MySQL.
La concesión USAGE
es una concesión lógica. ¿Cómo? 'phpmyadmin'@'localhost' tiene una entrada en mysql.user
donde user='phpmyadmin' y host='localhost'. Cualquier fila en mysql.user significa semánticamente USAGE
. Ejecutando `DROP USER 'phpmyadmin'@'localhost';debería funcionar correctamente. Bajo el capó, realmente está haciendo esto:
DELETE FROM mysql.user WHERE user='phpmyadmin' and host='localhost';
DELETE FROM mysql.db WHERE user='phpmyadmin' and host='localhost';
FLUSH PRIVILEGES;
Por lo tanto, la eliminación de una fila de mysql.user
constituye la ejecución de REVOKE USAGE
, aunque REVOKE USAGE
no pueda ejecutarse literalmente.