MySQL (y sus variantes MariaDB y Percona) forma parte del núcleo de la pila LAMP que hay debajo de la mayoría de sitios web construidos con PHP: Linux, Apache, MySQL y PHP. Si gestionas un servidor VPS con Ubuntu o cualquier otra distribución Linux, en algún momento necesitarás crear un usuario específico para una aplicación o un desarrollador sin darle acceso completo al root. Esta guía cubre exactamente eso.
MySQL es también la base de datos que usa WordPress bajo el capó. Si gestionas varios proyectos WordPress en el mismo servidor, entender WordPress como plataforma de gestión te ayuda a tomar mejores decisiones de arquitectura, y crear usuarios MySQL dedicados por instalación es una de esas decisiones.
Paso 1: acceder al prompt de MySQL como root
En Ubuntu con MySQL 5.7 o posterior, el usuario root de MySQL se autentica con el plugin auth_socket en lugar de con contraseña. Tienes que preceder el comando con sudo para acceder como root del sistema:
sudo mysql
Esto te da acceso al prompt de MySQL. Desde aquí puedes ejecutar cualquier comando SQL con privilegios completos.
Paso 2: crear el nuevo usuario
La sintaxis básica de CREATE USER es:
CREATE USER 'nombre_usuario'@'host' IDENTIFIED WITH plugin_autenticacion BY 'contraseña';
Tras CREATE USER especificas el nombre y, separado por @, el host desde el que se conectará. Si el usuario solo accede desde el propio servidor, usa localhost. Si necesita conectarse en remoto, especifica la IP o usa % para permitir cualquier origen (con más precaución).
Plugin de autenticación recomendado
MySQL recomienda caching_sha2_password para usuarios que se autentican con contraseña, por sus características de seguridad. Para crear un usuario con ese plugin puedes omitir la parte WITH authentication_plugin directamente:
CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'contraseña_segura';
El plugin auth_socket es conveniente pero bloquea conexiones remotas. No es la mejor opción si alguna aplicación externa necesita conectarse a la base de datos.
Paso 3: otorgar privilegios
La sintaxis general para asignar permisos es:
GRANT PRIVILEGIO ON base_datos.tabla TO 'nombre_usuario'@'host';
Puedes separar múltiples privilegios con comas en el mismo comando. Para dar permisos sobre todas las bases de datos y tablas usa asteriscos (*.*). Por ejemplo, para un usuario con permisos de lectura y escritura sobre todo el servidor:
GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
WITH GRANT OPTION permite que este usuario a su vez otorgue permisos a otros usuarios. Úsalo solo cuando sea necesario.
Aviso sobre ALL PRIVILEGES: otorgar ALL PRIVILEGES da al usuario privilegios de superusuario equivalentes al root. Cualquier aplicación con acceso a ese usuario tendrá control completo sobre todas las bases de datos del servidor. Lo adecuado es asignar únicamente los permisos que la aplicación necesita.
Paso 4: revisar y revocar permisos
Para ver los permisos asignados a un usuario:
SHOW GRANTS FOR 'nombre_usuario'@'host';
Para revocar un permiso concreto:
REVOKE tipo_de_permiso ON nombre_base_datos.nombre_tabla FROM 'nombre_usuario'@'host';
Y para eliminar el usuario por completo:
DROP USER 'nombre_usuario'@'localhost';
La misma lógica de control de acceso aplica al nivel de infraestructura. Cuando migramos nuestros servidores de VMware a Proxmox, por ejemplo, una de las primeras tareas fue preparar los entornos y revisar qué accesos existentes debían limpiarse antes del cambio.
Preguntas frecuentes
¿Cuál es la diferencia entre MySQL y MariaDB?
MariaDB es un fork de MySQL con compatibilidad casi completa a nivel de comandos SQL. La sintaxis de creación de usuarios y asignación de permisos es prácticamente idéntica entre ambos. Las diferencias más relevantes están en el motor de almacenamiento, el rendimiento en consultas complejas y el ritmo de actualizaciones.
¿Puedo crear un usuario MySQL que solo acceda a una base de datos concreta?
Sí. En lugar de *.* especifica el nombre de la base de datos: GRANT SELECT, INSERT ON mi_base_datos.* TO 'usuario'@'localhost';. Esto limita los permisos a esa base de datos y es la práctica habitual para aplicaciones web.
¿Qué pasa si no ejecuto FLUSH PRIVILEGES?
Con GRANT, REVOKE y CREATE USER no es necesario ejecutar FLUSH PRIVILEGES: MySQL actualiza las tablas de privilegios automáticamente. Solo hace falta si modificas las tablas de permisos directamente con INSERT o UPDATE, lo que en general no se recomienda.
¿Cómo conecto un proyecto WordPress a un usuario MySQL específico?
En el archivo wp-config.php de tu instalación, actualiza las constantes DB_USER y DB_PASSWORD con los datos del usuario que hayas creado. Ese usuario solo necesita permisos SELECT, INSERT, UPDATE, DELETE y CREATE sobre la base de datos de WordPress.



