15%

Ahorra 15%<\/span> en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código:

Skills
Comenzar
15.10.2024

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 como root.
  • El binario del cliente mysql está disponible en el PATH de su shell (verifique con which 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 mysql

Para instalaciones de MariaDB, el nombre del servicio es diferente:

sudo systemctl status mariadb

Si el servicio está detenido, inícielo:

sudo systemctl start mysql

Un 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. Sustituya root por 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=YourSecurePassword

Restrinja los permisos inmediatamente después de crear el archivo:

chmod 600 ~/.my.cnf

Con este archivo en su lugar, mysql se autentica sin ningún indicador:

mysql

Paso 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:

EsquemaPropó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/null

El 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"
done

Uso de mysqlshow como alternativa

La utilidad mysqlshow proporciona una descripción general rápida sin entrar al shell de MySQL:

mysqlshow -u root -p

Lista 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_name

Alcance 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ísticaMySQL 8.xMariaDB 10.x
Sintaxis `SHOW DATABASES`CompatibleCompatible
`information_schema.SCHEMATA`DisponibleDisponible
Predeterminado `performance_schema`HabilitadoHabilitado (10.5+)
Esquema `sys`Incluido por defectoOpcional, no siempre presente
`SHOW DATABASES LIKE`CompatibleCompatible
Modelo de privilegios basado en rolesNativo (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 root

Esto 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.sock

ERROR 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:

EscenarioComando recomendado
Exploración interactiva`SHOW DATABASES;` dentro del shell `mysql`
Filtrar por prefijo de nombre`SHOW DATABASES LIKE 'prefix_%';`
Listado con metadatos enriquecidosConsultar `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ñaArchivo 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 global SHOW DATABASES solo 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 -p para sesiones interactivas y ~/.my.cnf para automatización.
  • information_schema.SCHEMATA es estrictamente más potente que SHOW DATABASES para consultas con scripts o filtradas.
  • La utilidad mysqlshow está 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=REQUIRED a sus invocaciones del cliente mysql para 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-names

P: ¿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.

15%

Ahorra 15%<\/span> en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código:

Skills
Comenzar