Cómo listar bases de datos MySQL a través de la línea de comandos en Linux
Listar todas las bases de datos MySQL desde la línea de comandos se realiza con una sola instrucción SQL — SHOW DATABASES; — ejecutada después de autenticarse en el servidor MySQL usando el cliente mysql. Esto funciona en cualquier distribución Linux que ejecute MySQL 5.7, MySQL 8.x, o un servidor MariaDB compatible, y requiere el privilegio SHOW DATABASES o acceso de superusuario.
Esta guía va más allá del comando básico. Cubre opciones de autenticación, visibilidad con alcance de privilegios, patrones de scripting no interactivo, filtrado del esquema de rendimiento y modos de fallo comunes que confunden incluso a administradores experimentados.
Requisitos previos
Antes de continuar, confirme lo siguiente:
- MySQL Server o MariaDB está instalado y el servicio está activo.
- Tiene una cuenta de usuario con al menos el privilegio
SHOW DATABASES, o se está autenticando comoroot. - El binario del cliente
mysqlestá disponible en elPATHde su shell (verifique conwhich mysql).
Si está administrando un servidor remoto — por ejemplo, un entorno de VPS Hosting — asegúrese también de que el puerto MySQL (por defecto 3306) sea accesible o de que se esté conectando a través de SSH.
Paso 1: Verificar que el servicio MySQL está en ejecución
Antes de intentar conectarse, confirme que el daemon está activo:
sudo systemctl status mysqlPara instalaciones de MariaDB, el nombre del servicio es diferente:
sudo systemctl status mariadbSi el servicio está detenido, inícielo:
sudo systemctl start mysqlUn inicio fallido casi siempre se explica en journalctl -xe o en /var/log/mysql/error.log. Revise esos archivos primero antes de asumir un problema de configuración.
Paso 2: Autenticarse en el servidor MySQL
Inicio de sesión interactivo estándar
mysql -u root -p-u root— especifica el nombre de usuario de MySQL. Sustituyarootpor cualquier cuenta válida.-p— solicita la contraseña de forma interactiva. Nunca pase la contraseña directamente en la línea de comandos en producción (p. ej.,-pMyPassword), ya que es visible en los listados de procesos y en el historial del shell.
Después de ingresar una contraseña correcta, aparece el prompt de MySQL:
mysql>Conexión a un host remoto o puerto no predeterminado
mysql -u root -p -h 192.168.1.100 -P 3307-h— especifica la IP o el nombre de host remoto.-P— especifica un número de puerto no predeterminado.
Uso de un archivo de opciones para automatización
Para scripts y trabajos cron, almacene las credenciales en un archivo de opciones protegido en lugar de incluirlas en el comando:
# ~/.my.cnf
[client]
user=root
password=YourSecurePasswordRestrinja los permisos inmediatamente después de crear el archivo:
chmod 600 ~/.my.cnfCon este archivo en su lugar, mysql se autentica sin ningún indicador:
mysqlPaso 3: Listar todas las bases de datos
Una vez dentro del shell de MySQL, ejecute:
SHOW DATABASES;Ejemplo de salida en una instancia de MySQL 8 recién instalada:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)Estos cuatro esquemas del sistema están presentes en cada instalación estándar de MySQL:
| Esquema | Propósito |
|---|---|
| — | — |
| `information_schema` | Esquema virtual de solo lectura que expone metadatos sobre todos los demás esquemas, tablas, columnas y privilegios |
| `mysql` | Tablas de concesión principales, datos de zona horaria y configuración del servidor |
| `performance_schema` | Datos de instrumentación de bajo nivel para perfilado de consultas y diagnósticos |
| `sys` | Vistas legibles por humanos construidas sobre `performance_schema` |
Las bases de datos creadas por el usuario aparecen junto a estos esquemas del sistema.
Paso 4: Filtrar la lista de bases de datos
Filtrar por patrón de nombre
SHOW DATABASES acepta una cláusula LIKE, lo cual es útil cuando un servidor aloja docenas de bases de datos:
SHOW DATABASES LIKE 'wp_%';Esto devuelve solo las bases de datos cuyos nombres comienzan con wp_ — una convención de nomenclatura común para instalaciones de WordPress.
Consultar information_schema para filtrado avanzado
Para un filtrado más preciso, consulte directamente la tabla information_schema.SCHEMATA:
SELECT schema_name, default_character_set_name, default_collation_name
FROM information_schema.SCHEMATA
WHERE schema_name NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
ORDER BY schema_name;Este enfoque le permite filtrar por conjunto de caracteres, intercalación o cualquier otra columna de metadatos — algo que SHOW DATABASES no puede hacer.
Paso 5: Inspeccionar una base de datos específica
Para examinar el contenido de una base de datos particular, cambie el contexto con USE y luego liste sus tablas:
USE database_name;
SHOW TABLES;Para ver tamaños de tablas, conteos de filas y motores de almacenamiento en una sola consulta:
SELECT
table_name,
engine,
table_rows,
ROUND((data_length + index_length) / 1024 / 1024, 2) AS size_mb
FROM information_schema.TABLES
WHERE table_schema = 'database_name'
ORDER BY (data_length + index_length) DESC;Esto es mucho más útil que SHOW TABLES solo y es el tipo de consulta que un DBA ejecuta antes de planificar una migración o estrategia de respaldo.
Paso 6: Salir del shell de MySQL
EXIT;O use el atajo de teclado Ctrl+D.
Uso no interactivo: listar bases de datos desde el shell
En pipelines automatizados — scripts de respaldo, agentes de monitoreo, hooks de despliegue — necesita recuperar la lista de bases de datos sin iniciar una sesión interactiva.
Comando en una línea con el indicador -e
mysql -u root -p -e "SHOW DATABASES;"Suprimir la fila de encabezado para scripting
mysql -u root -p --skip-column-names -e "SHOW DATABASES;" 2>/dev/nullEl indicador --skip-column-names elimina el encabezado Database, produciendo una salida limpia adecuada para iteración en un bucle de shell:
for db in $(mysql -u root -p --skip-column-names -e "SHOW DATABASES;" 2>/dev/null); do
echo "Processing: $db"
doneUso de mysqlshow como alternativa
La utilidad mysqlshow proporciona una descripción general rápida sin entrar al shell de MySQL:
mysqlshow -u root -pLista todas las bases de datos que el usuario autenticado puede ver, y acepta un argumento de nombre de base de datos para profundizar en el detalle a nivel de tabla:
mysqlshow -u root -p database_nameAlcance de privilegios: por qué algunas bases de datos están ocultas
Este es uno de los comportamientos más incomprendidos en MySQL. Cuando un usuario carece del privilegio global SHOW DATABASES, SHOW DATABASES solo devuelve las bases de datos para las cuales ese usuario tiene al menos un privilegio. Esto es por diseño — es un límite de seguridad, no un error.
Implicación práctica: Un usuario de aplicación restringido puede ejecutar SHOW DATABASES; y ver solo una o dos bases de datos, aunque el servidor aloje cincuenta. Este es el comportamiento correcto. Si un usuario necesita ver la lista completa, otorgue el privilegio explícitamente:
GRANT SHOW DATABASES ON *.* TO 'username'@'host';
FLUSH PRIVILEGES;Use esta concesión con moderación. En entornos multi-tenant — como una configuración de Shared Web Hosting o un despliegue de Dedicated Servers para múltiples clientes — exponer la lista completa de bases de datos a usuarios de aplicaciones es un riesgo de seguridad.
MySQL vs. MariaDB: diferencias de comportamiento
Tanto MySQL como MariaDB admiten SHOW DATABASES; y information_schema.SCHEMATA, pero hay diferencias sutiles que vale la pena conocer:
| Característica | MySQL 8.x | MariaDB 10.x |
|---|---|---|
| — | — | — |
| Sintaxis `SHOW DATABASES` | Compatible | Compatible |
| `information_schema.SCHEMATA` | Disponible | Disponible |
| Predeterminado `performance_schema` | Habilitado | Habilitado (10.5+) |
| Esquema `sys` | Incluido por defecto | Opcional, no siempre presente |
| `SHOW DATABASES LIKE` | Compatible | Compatible |
| Modelo de privilegios basado en roles | Nativo (8.0+) | Nativo (10.0.5+) |
| Binario del cliente `mysql` | `mysql` | `mysql` o `mariadb` |
En instalaciones más recientes de MariaDB, el binario canónico puede ser mariadb en lugar de mysql, aunque un enlace simbólico generalmente preserva la compatibilidad con versiones anteriores.
Errores comunes y cómo solucionarlos
ERROR 1045 (28000): Access denied for user
Esto significa que la autenticación falló. Verifique el nombre de usuario, la contraseña y el host. Para root en MySQL 8, el plugin de autenticación predeterminado es caching_sha2_password. Si su cliente no lo admite, conéctese a través de socket:
sudo mysql -u rootEsto omite la autenticación por contraseña cuando se ejecuta como el usuario Linux root, confiando en el plugin auth_socket o unix_socket en su lugar.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket
El daemon de MySQL no está en ejecución, o la ruta del archivo de socket es incorrecta. Verifique:
sudo systemctl status mysql
ls -la /var/run/mysqld/mysqld.sockERROR 1044 (42000): Access denied for user to database
El usuario está autenticado pero carece de privilegios en la base de datos de destino. Revise las concesiones con:
SHOW GRANTS FOR 'username'@'host';Matriz de decisión práctica
Use esta referencia para seleccionar el enfoque adecuado para su situación:
| Escenario | Comando recomendado |
|---|---|
| — | — |
| Exploración interactiva | `SHOW DATABASES;` dentro del shell `mysql` |
| Filtrar por prefijo de nombre | `SHOW DATABASES LIKE 'prefix_%';` |
| Listado con metadatos enriquecidos | Consultar `information_schema.SCHEMATA` |
| Scripting de shell / automatización | `mysql -e "SHOW DATABASES;" –skip-column-names` |
| Descripción general rápida sin shell | `mysqlshow -u root -p` |
| Servidor remoto, puerto no predeterminado | `mysql -u root -p -h host -P port` |
| Automatización sin contraseña | Archivo de opciones `~/.my.cnf` con `chmod 600` |
| Depuración de problemas de acceso | `SHOW GRANTS FOR 'user'@'host';` |
Conclusiones técnicas clave
SHOW DATABASES;tiene alcance de privilegios. Un usuario sin el privilegio globalSHOW DATABASESsolo ve las bases de datos a las que tiene acceso explícito — esto es una característica de seguridad, no una configuración incorrecta.- Nunca pase contraseñas como argumentos de línea de comandos en producción. Use
-ppara sesiones interactivas y~/.my.cnfpara automatización. information_schema.SCHEMATAes estrictamente más potente queSHOW DATABASESpara consultas con scripts o filtradas.- La utilidad
mysqlshowestá infrautilizada y proporciona inspección rápida y no interactiva de bases de datos y tablas. - En MySQL 8, la autenticación basada en socket (
sudo mysql) es a menudo el camino más rápido hacia el acceso root en un servidor local. - Al administrar múltiples bases de datos en un VPS con cPanel u otro panel de control, el gestor de bases de datos del panel es un envoltorio GUI sobre estos mismos comandos SQL — comprender las consultas subyacentes le da control total cuando la GUI no es suficiente.
- Para entornos donde el acceso a la base de datos está vinculado a SSL Certificates y conexiones cifradas, agregue
--ssl-mode=REQUIREDa sus invocaciones del clientemysqlpara forzar TLS en tránsito.
Preguntas frecuentes
P: ¿Por qué SHOW DATABASES no muestra todas las bases de datos en mi servidor?
R: La cuenta de usuario con la que está autenticado carece del privilegio global SHOW DATABASES. MySQL solo devuelve las bases de datos para las cuales ese usuario tiene al menos un privilegio. Autentíquese como root u otorgue el privilegio SHOW DATABASES para ver la lista completa.
P: ¿Cuál es la diferencia entre SHOW DATABASES y consultar information_schema.SCHEMATA?
R: Ambos devuelven la lista de esquemas accesibles, pero information_schema.SCHEMATA expone columnas de metadatos adicionales — conjunto de caracteres predeterminado, intercalación predeterminada — y admite filtrado SQL completo con WHERE, ORDER BY y JOIN. Use SHOW DATABASES para verificaciones interactivas rápidas y information_schema.SCHEMATA para consultas con scripts o analíticas.
P: ¿Cómo listo las bases de datos en un servidor MySQL remoto sin abrir una sesión interactiva?
R: Use el indicador -e combinado con opciones de host y puerto:
mysql -u root -p -h remote-host -P 3306 -e "SHOW DATABASES;" --skip-column-namesP: ¿Puedo listar bases de datos MySQL sin conocer la contraseña de root?
R: En un servidor local donde tiene acceso Linux root, sí. El plugin auth_socket de MySQL (o unix_socket en MariaDB) autentica basándose en el usuario del SO Linux. Ejecute sudo mysql y se le otorgará acceso como el usuario MySQL root sin solicitud de contraseña.
P: ¿SHOW DATABASES funciona de la misma manera en MariaDB que en MySQL?
R: La sintaxis es idéntica y las reglas de alcance de privilegios son las mismas. La diferencia práctica principal es que MariaDB puede no incluir el esquema sys por defecto, y en versiones más recientes de MariaDB el binario de cliente preferido es mariadb en lugar de mysql, aunque el alias mysql generalmente se preserva por compatibilidad.
