La 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.
Error: Your Requested widget " ai_widget-6" is not in the widget list.
- [do_widget_area above-nav-left]
- [do_widget_area above-nav-right]
- [do_widget_area footer-1]
- [do_widget id="wpp-4"]
- [do_widget_area footer-2]
- [do_widget id="recent-posts-4"]
- [do_widget_area footer-3]
- [do_widget id="recent-comments-3"]
- [do_widget_area footer-4]
- [do_widget id="archives-4"]
- [do_widget_area logo-bar]
- [do_widget id="oxywidgetwpml-3"]
- [do_widget_area menu-bar]
- [do_widget id="search-3"]
- [do_widget_area sidebar]
- [do_widget id="search-4"]
- [do_widget id="ai_widget-2"]
- [do_widget id="categories-5"]
- [do_widget id="ai_widget-3"]
- [do_widget id="ai_widget-4"]
- [do_widget id="ai_widget-5"]
- [do_widget_area sub-footer-1]
- [do_widget id="text-4"]
- [do_widget_area sub-footer-2]
- [do_widget_area sub-footer-3]
- [do_widget_area sub-footer-4]
- [do_widget_area upper-footer-1]
- [do_widget id="search-2"]
- [do_widget id="recent-posts-2"]
- [do_widget id="recent-comments-2"]
- [do_widget id="archives-2"]
- [do_widget id="categories-2"]
- [do_widget id="meta-2"]
- [do_widget_area upper-footer-2]
- [do_widget_area upper-footer-3]
- [do_widget_area upper-footer-4]
- [do_widget_area widgets_for_shortcodes]
- [do_widget id="search-5"]
- [do_widget id="ai_widget-6"]
- [do_widget_area wp_inactive_widgets]
- [do_widget id="wpp-2"]
- [do_widget id="text-1"]
- [do_widget id="recent-posts-3"]
- [do_widget id="categories-3"]
- [do_widget id="archives-3"]
- [do_widget id="icl_lang_sel_widget-3"]
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
14 comentarios
Unirte a la conversaciónCh - 25/07/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/08/2018
Muchas gracias a ambos, al del post y a Ch.
Luis - 25/10/2018
NO utilizar «WITH GRANT OPTION» ya que le dara todos los privilegios de root al otro usuario.
Leonel - 24/09/2019
Negativo, al agregar «WITH GRANT OPTION;» le estas dando privilegios de superusuario lo cual puede no ser seguro.
José - 31/10/2018
Muchas gracias por el artículo. Me gustaría saber qué lenguaje utilizar si quiero crear usuarios dinámicamente. Gracias desde ya.
Daniel - 08/11/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 - 07/08/2019
Muchas Gracias Daniel. Tu aporte me ha sido de gran ayuda.
María - 08/06/2019
Un millón de gracias !!!
Mario González - 15/02/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/02/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/05/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/04/2021
Es valido crear los usuarios y después las bases de datos? son muchas bases de datos y pocos usuarios.
Daniel - 15/04/2021
Perfectamene válido.
Elizabeth - 13/05/2021
Debo crear un usuario para la herramienta de backup y restauraciones BD. Como asigno este rol o permisos especificos al nuevo usuario?