Daniel López Azaña

Tema

Social Media

Blog

GNU/Linux, Open Source, Cloud Computing, DevOps y más...

ᐈ Cómo crear un usuario en MySQL/MariaDB y concederle permisos para una base de datos desde la línea de comandos

Logos de MariaDB y MySQLLa tarea de crear un usuario en MySQL o en MariaDB y asignarle privilegios para poder acceder a una base de datos específica y poder escribir información en ella es una tarea muy habitual que es necesario realizar cada vez que instalamos una aplicación destinada a correr sobre plataforma LAMP. Ya sea un simple WordPress, o una aplicación más compleja desarrollada a medida, de un modo u otro siempre vas a tener que llevar a cabo estos pasos en algún momento antes de poder ponerla en funcionamiento.

Estos comandos son válidos para ser ejecutados tanto desde la consola o línea de comandos del cliente genérico de MySQL como desde cualquier herramienta que nos permita ejecutar comandos SQL sobre una instalación de MySQL como phpMyAdmin o MySQL Workbench. También sirven para conseguir el mismo objetivo en MariaDB.

1. Creación de la base de datos

mysql> CREATE DATABASE `mibd`;

2. Creación del usuario

mysql> CREATE USER 'miusuario'@localhost IDENTIFIED BY 'mipassword';

3. Conceder permisos para poder acceder y usar el servidor MySQL

Para sólo permitir el acceso local desde el propio servidor (localhost). Esta será la configuración más segura y más habitual que usaremos para una aplicación web:

mysql> GRANT USAGE ON *.* TO 'miusuario'@localhost IDENTIFIED BY 'mipassword';

Para permitir el acceso desde cualquier otra máquina que tenga acceso al servidor MySQL desde la red:

mysql> GRANT USAGE ON *.* TO 'miusuario'@'%' IDENTIFIED BY 'mipassword';

En MySQL 8 o superior no pondremos la parte IDENTIFIED BY ‘mipassword’.

4. Conceder todos los privilegios sobre la base de datos al usuario

MySQL 5.7 y versiones anteriores:

mysql> GRANT ALL privileges ON `mibd`.* TO 'miusuario'@localhost IDENTIFIED BY 'mipassword';

MySQL 8 y versiones superiores:

mysql> GRANT ALL ON `mibd`.* TO 'miusuario'@localhost;

Al igual que en punto anterior, si queremos que el usuario pueda trabajar con la base de datos desde cualquier ubicación tendremos que sustituir localhost por ‘%’.

5. Aplicar los cambios realizados

Para que sean efectivos los nuevos permisos que hemos asignado debemos finalizar con el siguiente comando:

mysql> FLUSH PRIVILEGES;

6. Verificar que nuestro nuevo usuario tiene los permisos correctos

mysql> SHOW GRANTS FOR 'miusuario'@localhost;     
+--------------------------------------------------------------+ 
| Grants for miusuario@localhost                                | 
+--------------------------------------------------------------+ 
| GRANT USAGE ON *.* TO 'miusuario'@'localhost'                 | 
| GRANT ALL PRIVILEGES ON `mibd`.* TO 'miusuario'@'localhost' | 
+--------------------------------------------------------------+ 
2 rows in set (0,00 sec)

Si nos hemos equivocado en algún punto podemos deshacer todos los pasos ejecutando los siguientes comandos, teniendo la precaución de sustituir localhost por ‘%’ si también lo cambiaste en los pasos anteriores. Luego podrás volver de nuevo a crear tu usuario MySQL volviendo al principio:

DROP USER miusuario@localhost;
DROP DATABASE midb;

A continuación dejo un pequeño script muy simple para Bash que nos permite hacer esto en Linux de una forma mucho más rápida y directa, cambiando simplemente el nombre de nuestro usuario y de nuestra base de datos:

#! /bin/bash 
 
newUser='testuser'
newDbPassword='testpwd'
newDb='testdb'
host=localhost
#host='%'

# MySQL 5.7 and earlier versions
#commands="CREATE DATABASE \`${newDb}\`;CREATE USER '${newUser}'@'${host}' IDENTIFIED BY '${newDbPassword}';GRANT USAGE ON *.* TO '${newUser}'@'${host}' IDENTIFIED BY '${newDbPassword}';GRANT ALL privileges ON \`${newDb}\`.* TO '${newUser}'@'${host}' IDENTIFIED BY '${newDbPassword}';FLUSH PRIVILEGES;"

# MySQL 8 and higher versions
commands="CREATE DATABASE \`${newDb}\`;CREATE USER '${newUser}'@'${host}' IDENTIFIED BY '${newDbPassword}';GRANT USAGE ON *.* TO '${newUser}'@'${host}';GRANT ALL ON \`${newDb}\`.* TO '${newUser}'@'${host}';FLUSH PRIVILEGES;"

echo "${commands}" | /usr/bin/mysql -u root -p
LAMP MariaDB MySQL Script
Daniel López Azaña

Sobre el autor

Daniel López Azaña

Emprendedor tecnológico y arquitecto cloud con más de 20 años de experiencia transformando infraestructuras y automatizando procesos.

Especialista en integración de IA/LLM, desarrollo con Rust y Python, y arquitectura AWS & GCP. Mente inquieta, generador de ideas y apasionado por la innovación tecnológica y la IA.

Artículos relacionados

MySQL/MariaDB mysqldump command

Cómo hacer backups de MySQL/MariaDB con el comando mysqldump

Aunque existen diferentes métodos para realizar copias de seguridad de bases de datos MySQL o MariaDB, el más común y eficiente se basa en el uso de una herramienta nativa que tanto MySQL como MariaDB ponen a nuestra disposición para este cometido: el comando mysqldump. Como su propio nombre indica, se trata de un programa ejecutable desde la línea de comandos que permite realizar una exportación completa (dump) de todo el contenido de una base de datos o incluso de todas las bases de datos presentes en una instancia de MySQL o MariaDB en ejecución. Por supuesto también permite realizar copias de seguridad parciales, es decir, sólo de algunas tablas concretas.

14 de septiembre de 2017
diagrama-backup-mysql-php

Backup de bases de datos MySQL con PHP

Este artículo muestra cómo realizar un backup parcial o completo de bases de datos MySQL utilizando tan sólo código PHP. Esto es muy útil por ejemplo cuando un cliente no nos facilita datos de acceso a la base de datos de una aplicación web y sólo disponemos de un acceso FTP, o cuando sí disponemos de los datos de conexión a la base de datos pero no podemos acceder a ella a través de la red (sólo disponible en localhost) y tampoco podemos utilizar herramientas como mysqldump para respaldar la información porque no disponemos de privilegios para ello, o simplemente porque no tenemos acceso a una shell a la que conectarnos y ejecutar comandos.

8 de febrero de 2012
Script para cambiar automáticamente todos los volúmenes gp2 a gp3 con aws-cli

Script para cambiar automáticamente todos los volúmenes gp2 a gp3 con aws-cli

El pasado diciembre Amazon anunció sus nuevos volúmenes EBS gp3, los cuales ofrecen mejores prestaciones y un ahorro en el coste del 20% respecto a los que se venían utilizando hasta ahora, los gp2. Pues bien, tras probar satisfactoriamente estos nuevos volúmenes en varios clientes, no puedo hacer otra cosa más que recomendar su utilización, pues son todo ventajas y en estos 2 meses y medio que han transcurrido desde el anuncio no he apreciado ningún problema ni efecto secundario.

16 de febrero de 2021

Comentarios

Ch 25 de julio de 2018
En versiones más recientes este código tal vez funcione mejor, saludos Tuyo: GRANT ALL privileges ON `mibd`.* TO 'miusuario'@localhost; Mío: GRANT ALL PRIVILEGES ON mibd.* TO 'miusuario'@'%' WITH GRANT OPTION;
Aldair 15 de agosto de 2018
Muchas gracias a ambos, al del post y a Ch.
Luis 25 de octubre de 2018
NO utilizar "WITH GRANT OPTION" ya que le dara todos los privilegios de root al otro usuario.
Leonel 24 de septiembre de 2019
Negativo, al agregar "WITH GRANT OPTION;" le estas dando privilegios de superusuario lo cual puede no ser seguro.
José 31 de octubre de 2018
Muchas gracias por el artículo. Me gustaría saber qué lenguaje utilizar si quiero crear usuarios dinámicamente. Gracias desde ya.
Daniel 8 de noviembre de 2018
Cualquier lenguaje que disponga de un driver o extensión para acceder a MySQL, y eso en la práctica es cualquier lenguaje de programación, pues MySQL es una base de datos ampliamente extendida.
Francisco Jose Muñoz 7 de agosto de 2019
Muchas Gracias Daniel. Tu aporte me ha sido de gran ayuda.
María 8 de junio de 2019
Un millón de gracias !!!
Mario González 15 de febrero de 2020
Bueno dias En la version de MariaDB 10.4.8 y posteriores (actualmente tengo instalada la 10.4.12) Al realizar el proceso arriba indicado; en la Tabla user, en el campo Password; NO se guarda la password. ahora se puede ver que, en el campo: plugin= 'mysql_native_password' y, en el campo contiguo authentication_string= la password encriptada Ahora bien. Al intentar ingresar con el nuevo usuario y clave; no lo acepta, mostrando el msj: acceso denegado para el usuario... Si hago: SET PASSWORD FOR 'usuario'@'localhot' = PASSWORD('passw'); Ocurre lo arriba explicado Cual es la forma?
Daniel 17 de febrero de 2020
Si se usa el comando SET PASSWORD hay que pasarle la contraseña como una cadena en texto plano, ya que si se usa la función PASSWORD() se estará cifrando la misma dos veces: la primera por la función PASSWORD() y la segunda por MySQL/MariaDB de forma interna. La función PASSWORD() la podemos usar si hacemos directamente un UPDATE de la columna password de la tabla de usuarios, pero no con el comando SET PASSWORD.
Matías 29 de mayo de 2020
Hola Daniel. Este tal vez sea el artículo más sencillos que leí sobre Linux en español y en relación a mariadb. Instalé hace unos días Debian para gestionar mi primer proyecto online, y esta guía me pareció super didáctica. Saludos desde Argentina y muchas gracias!!
Elizabeth 15 de abril de 2021
Es valido crear los usuarios y después las bases de datos? son muchas bases de datos y pocos usuarios.
Daniel 15 de abril de 2021
Perfectamene válido.
Elizabeth 13 de mayo de 2021
Debo crear un usuario para la herramienta de backup y restauraciones BD. Como asigno este rol o permisos especificos al nuevo usuario?

Enviar comentario