Cómo listar todos los usuarios MySQL o MariaDB desde la consola

En Tutoriales y Guías, Webmasters por

Una de las tareas básicas a la hora de administrar bases de datos MySQL es gestionar los usuarios y sus permisos. Hoy daremos el primer paso con un tutorial sencillo que nos servirá de introducción y consiste en listar todos los usuarios MySQL desde la consola o terminal.

Cómo listar todos los usuarios MySQL o MariaDB desde la consola

Vamos a comenzar diciendo algo muy básico y que a los usuarios avanzados puede parecerles de sentido común, pero ya me ha pasado en varias ocasiones que usuarios nóveles creen que los usuarios de sistema son usuarios MySQL y no es así. El sistema de usuarios del sistema funciona de forma independiente al sistema de usuarios de MySQL.

Dicho esto, también aclarar que este tutorial es válido para sistemas de bases de datos MySQL y MariaDB.

Cómo listar todos los usuarios MySQL o MariaDB desde la consola.

En primer lugar debemos acceder al servidor MySQL o MariaDB desde la terminal, algo que ya explicamos de forma detenida en este tutorial. Debemos acceder con nuestro usuario de root a MySQL ya que vamos a necesitar estos permisos para poder tener acceso a la base de datos de nombre mysql, que es la que nos interesa para averiguar los usuarios.

Por lo tanto, el comando que usaremos para acceder será:
mysql -u root -p mysql

Una vez que hemos accedido al intérprete de comandos de MySQL como root, ya podemos lanzar las consultas necesarias que iremos viendo a continuación.

Mostrar las tablas de la base de datos mysql.

Ahora que ya tenemos acceso a la base de datos mysql, podemos trabajar con ella lanzando la siguiente consulta para averiguar el nombre de sus tablas:
show tables;

MariaDB [mysql]> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| column_stats              |
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| gtid_slave_pos            |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| index_stats               |
| innodb_index_stats        |
| innodb_table_stats        |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| roles_mapping             |
| servers                   |
| slow_log                  |
| table_stats               |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
30 rows in set (0.00 sec)

Vemos que entre todas las tablas hay una llamada user, que es la que nos interesa, ya que en ella se almacena toda la información relativa a los usuarios MySQL/MariaDB.

Para obtener las columnas de la tabla user, lanzamos la siguiente consulta:
describe user;

MariaDB [mysql]> describe user;
+------------------------+-----------------------------------+------+-----+----------+-------+
| Field                  | Type                              | Null | Key | Default  | Extra |
+------------------------+-----------------------------------+------+-----+----------+-------+
| Host                   | char(60)                          | NO   | PRI |          |       |
| User                   | char(80)                          | NO   | PRI |          |       |
| Password               | char(41)                          | NO   |     |          |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N        |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N        |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N        |       |
| File_priv              | enum('N','Y')                     | NO   |     | N        |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N        |       |
| References_priv        | enum('N','Y')                     | NO   |     | N        |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N        |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N        |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N        |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N        |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N        |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N        |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N        |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N        |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N        |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N        |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N        |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N        |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N        |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N        |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N        |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N        |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N        |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |          |       |
| ssl_cipher             | blob                              | NO   |     | NULL     |       |
| x509_issuer            | blob                              | NO   |     | NULL     |       |
| x509_subject           | blob                              | NO   |     | NULL     |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0        |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0        |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0        |       |
| max_user_connections   | int(11)                           | NO   |     | 0        |       |
| plugin                 | char(64)                          | NO   |     |          |       |
| authentication_string  | text                              | NO   |     | NULL     |       |
| password_expired       | enum('N','Y')                     | NO   |     | N        |       |
| is_role                | enum('N','Y')                     | NO   |     | N        |       |
| default_role           | char(80)                          | NO   |     |          |       |
| max_statement_time     | decimal(12,6)                     | NO   |     | 0.000000 |       |
+------------------------+-----------------------------------+------+-----+----------+-------+
46 rows in set (0.00 sec)

Vemos que hay una columna de nombre User donde están almacenados todos los nombres de usuarios.

Obtener todos los usuarios de mysql.

Ahora llega la hora de mostrar todos los usuarios MySQL con la consulta:
select User from user;

MariaDB [mysql]> select User from user;
+------------------+
| User             |
+------------------+
| root             |
| blog_wp          |
| foro_dev         |
| joomla_test      |
+------------------+
4 rows in set (0.00 sec)

Podemos ver que en este ejemplo tenemos cuatro usuarios diferentes.

Generalmente también se obtienen otros datos del usuario como la contraseña o el host. Esto lo conseguimos con la siguiente consulta:
select User,Password,Host from user;

MariaDB [mysql]> select User,Password,Host from user;
+------------------+-------------------------------------------+-----------+
| User             | Password                                  | Host      |
+------------------+-------------------------------------------+-----------+
| root             | *FEB88477570B28D1977U7CF6DA702P3DF79CB282 | localhost |
| blog_wp          | *4AB88HC7570218D197669CF6DA702K9DFC79H2PM | localhost |
| foro_dev         | *D6B8847797GB28P197669CF6DA932F5K12C9TTF2 | localhost |
| joomla_test      | *1B0569321682F7E857C469B2DD2A4F08384CC6HE | localhost |
+------------------+-------------------------------------------+-----------+
4 rows in set (0.00 sec)

Además los usuarios pueden tener diferentes privilegios y estos los podemos consultar también desde esta misma tabla, donde los campos que terminan con el prefijo _priv hacen referencia a algún tipo de privilegio. Por ejemplo, Insert_priv nos indica si el usuario tiene permisos suficientes para usar la sentencia INSERT.

Consultar los usuarios y las bases de datos que tienen asignadas.

Para terminar, vamos a hacer uso de la tabla db donde es posible averiguar a qué bases de datos tienen acceso los diferentes usuarios. Para ello usaremos la consulta:
select Host,Db,User from db;

MariaDB [mysql]> select Host,Db,User from db;
+-----------+--------+---------+
| Host      | Db     | User    |
+-----------+--------+---------+
| localhost | blog   | root    |
| localhost | ttrss  | root    |
| localhost | wp_db  | root    |
| localhost | wp_db  | blog_wp |
+-----------+--------+---------+
4 rows in set (0.00 sec)

En este caso vemos que el usuario root tiene acceso a tres bases de datos (blog, ttrss y wp_db), mientras que el usuario blog_wp sólo tiene acceso a una (wp_db).

Hasta aquí en este tutorial, ya que pretende ser básico y no quiero terminar haciendo una explicación más compleja. Espero que os haya ayudado a obtener los usuarios MySQL y si tenéis alguna duda, ahí están los comentarios a vuestro servicio.