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

14 comentarios

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.


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
                   

                  Sobre el autor

                  Daniel López Azaña
                  Arquitecto de soluciones Cloud AWS & Linux Sysadmin Freelance

                  Emprendedor, generador de ideas y mente inquieta. Apasionado de las nuevas tecnologías, especialmente de los sistemas Linux y del software libre. Me gusta escribir además sobre actualidad tecnológica, Cloud Computing, AWSi, DevOps, DevSecOps, seguridad, desarrollo web y programación, SEO, ciencia, innovación, emprendimiento, etc.

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

                  Artículos relacionados

                  14 comentarios

                  Unirte a la conversación
                  • Ch - 25/07/2018 responder

                    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 responder

                    Muchas gracias a ambos, al del post y a Ch.

                    Luis - 25/10/2018 responder

                    NO utilizar «WITH GRANT OPTION» ya que le dara todos los privilegios de root al otro usuario.

                    Leonel - 24/09/2019 responder

                    Negativo, al agregar «WITH GRANT OPTION;» le estas dando privilegios de superusuario lo cual puede no ser seguro.

                  • José - 31/10/2018 responder

                    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 responder

                    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 responder

                    Muchas Gracias Daniel. Tu aporte me ha sido de gran ayuda.

                  • María - 08/06/2019 responder

                    Un millón de gracias !!!

                  • Mario González - 15/02/2020 responder

                    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 responder

                    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 responder

                    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 responder

                    Es valido crear los usuarios y después las bases de datos? son muchas bases de datos y pocos usuarios.

                    Daniel - 15/04/2021 responder

                    Perfectamene válido.

                  • Elizabeth - 13/05/2021 responder

                    Debo crear un usuario para la herramienta de backup y restauraciones BD. Como asigno este rol o permisos especificos al nuevo usuario?

                  Deja una respuesta

                  Tu dirección de correo electrónico no será publicada.