Como Listar Bancos de Dados MySQL via Linha de Comando no Linux
Listar todos os bancos de dados MySQL a partir da linha de comando é feito com uma única instrução SQL — SHOW DATABASES; — executada após autenticação no servidor MySQL usando o cliente mysql. Isso funciona em qualquer distribuição Linux executando MySQL 5.7, MySQL 8.x ou um servidor MariaDB compatível, e requer o privilégio SHOW DATABASES ou acesso de superusuário.
Este guia vai além do comando básico. Ele aborda opções de autenticação, visibilidade com escopo de privilégios, padrões de script não interativo, filtragem do esquema de desempenho e modos de falha comuns que confundem até administradores experientes.
Pré-requisitos
Antes de prosseguir, confirme o seguinte:
- O MySQL Server ou MariaDB está instalado e o serviço está ativo.
- Você tem uma conta de usuário com pelo menos o privilégio
SHOW DATABASES, ou está autenticando comoroot. - O binário do cliente
mysqlestá disponível noPATHdo seu shell (verifique comwhich mysql).
Se você estiver gerenciando um servidor remoto — por exemplo, um ambiente de VPS Hosting — certifique-se também de que a porta MySQL (padrão 3306) está acessível ou que você está conectando via SSH.
Passo 1: Verificar se o Serviço MySQL Está em Execução
Antes de tentar conectar, confirme que o daemon está ativo:
sudo systemctl status mysqlPara instalações MariaDB, o nome do serviço é diferente:
sudo systemctl status mariadbSe o serviço estiver parado, inicie-o:
sudo systemctl start mysqlUma falha na inicialização é quase sempre explicada em journalctl -xe ou em /var/log/mysql/error.log. Verifique esses arquivos primeiro antes de presumir um problema de configuração.
Passo 2: Autenticar no Servidor MySQL
Login Interativo Padrão
mysql -u root -p-u root— especifica o nome de usuário MySQL. Substituarootpor qualquer conta válida.-p— solicita a senha de forma interativa. Nunca passe a senha diretamente na linha de comando em produção (ex.:-pMyPassword), pois ela fica visível nas listagens de processos e no histórico do shell.
Após inserir a senha correta, o prompt MySQL aparece:
mysql>Conectando a um Host Remoto ou Porta Não Padrão
mysql -u root -p -h 192.168.1.100 -P 3307-h— especifica o IP ou hostname do host remoto.-P— especifica um número de porta não padrão.
Usando um Arquivo de Opções para Automação
Para scripts e tarefas cron, armazene as credenciais em um arquivo de opções protegido em vez de incorporá-las no comando:
# ~/.my.cnf
[client]
user=root
password=YourSecurePasswordRestrinja as permissões imediatamente após criar o arquivo:
chmod 600 ~/.my.cnfCom este arquivo em vigor, mysql autentica sem nenhuma flag:
mysqlPasso 3: Listar Todos os Bancos de Dados
Uma vez dentro do shell MySQL, execute:
SHOW DATABASES;Exemplo de saída em uma instância MySQL 8 recém-instalada:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)Esses quatro esquemas de sistema estão presentes em toda instalação padrão do MySQL:
| Esquema | Finalidade |
|---|---|
| — | — |
| `information_schema` | Esquema virtual somente leitura que expõe metadados sobre todos os outros esquemas, tabelas, colunas e privilégios |
| `mysql` | Tabelas de concessão principais, dados de fuso horário e configuração do servidor |
| `performance_schema` | Dados de instrumentação de baixo nível para criação de perfil de consultas e diagnósticos |
| `sys` | Visualizações legíveis por humanos construídas sobre `performance_schema` |
Os bancos de dados criados pelo usuário aparecem junto com esses esquemas de sistema.
Passo 4: Filtrar a Lista de Bancos de Dados
Filtrar por Padrão de Nome
SHOW DATABASES aceita uma cláusula LIKE, que é útil quando um servidor hospeda dezenas de bancos de dados:
SHOW DATABASES LIKE 'wp_%';Isso retorna apenas bancos de dados cujos nomes começam com wp_ — uma convenção de nomenclatura comum para instalações WordPress.
Consultar information_schema para Filtragem Avançada
Para filtragem mais precisa, consulte a tabela information_schema.SCHEMATA diretamente:
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;Esta abordagem permite filtrar por conjunto de caracteres, collation ou qualquer outra coluna de metadados — algo que SHOW DATABASES não consegue fazer.
Passo 5: Inspecionar um Banco de Dados Específico
Para examinar o conteúdo de um banco de dados específico, mude o contexto com USE e liste suas tabelas:
USE database_name;
SHOW TABLES;Para ver tamanhos de tabelas, contagens de linhas e mecanismos de armazenamento em uma única 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;Isso é muito mais útil do que SHOW TABLES sozinho e é o tipo de consulta que um DBA executa antes de planejar uma migração ou estratégia de backup.
Passo 6: Sair do Shell MySQL
EXIT;Ou use o atalho de teclado Ctrl+D.
Uso Não Interativo: Listando Bancos de Dados a Partir do Shell
Em pipelines automatizados — scripts de backup, agentes de monitoramento, hooks de implantação — você precisa recuperar a lista de bancos de dados sem entrar em uma sessão interativa.
Comando Único com Flag -e
mysql -u root -p -e "SHOW DATABASES;"Suprimir a Linha de Cabeçalho para Scripts
mysql -u root -p --skip-column-names -e "SHOW DATABASES;" 2>/dev/nullA flag --skip-column-names remove o cabeçalho Database, produzindo uma saída limpa adequada para iteração em um loop de shell:
for db in $(mysql -u root -p --skip-column-names -e "SHOW DATABASES;" 2>/dev/null); do
echo "Processing: $db"
doneUsando mysqlshow como Alternativa
O utilitário mysqlshow fornece uma visão geral rápida sem entrar no shell MySQL:
mysqlshow -u root -pEle lista todos os bancos de dados que o usuário autenticado pode ver e aceita um argumento de nome de banco de dados para detalhar informações no nível de tabela:
mysqlshow -u root -p database_nameEscopo de Privilégios: Por Que Alguns Bancos de Dados Ficam Ocultos
Este é um dos comportamentos mais mal compreendidos no MySQL. Quando um usuário não possui o privilégio global SHOW DATABASES, SHOW DATABASES retorna apenas os bancos de dados para os quais esse usuário possui pelo menos um privilégio. Isso é por design — é um limite de segurança, não um bug.
Implicação prática: Um usuário de aplicação restrito pode executar SHOW DATABASES; e ver apenas um ou dois bancos de dados, mesmo que o servidor hospede cinquenta. Este é o comportamento correto. Se um usuário precisar ver a lista completa, conceda o privilégio explicitamente:
GRANT SHOW DATABASES ON *.* TO 'username'@'host';
FLUSH PRIVILEGES;Use esta concessão com moderação. Em ambientes multilocatários — como uma configuração de Shared Web Hosting ou uma implantação de Dedicated Servers para múltiplos clientes — expor a lista completa de bancos de dados a usuários de aplicações é um risco de segurança.
MySQL vs. MariaDB: Diferenças de Comportamento
Tanto MySQL quanto MariaDB suportam SHOW DATABASES; e information_schema.SCHEMATA, mas há diferenças sutis que vale conhecer:
| Recurso | MySQL 8.x | MariaDB 10.x |
|---|---|---|
| — | — | — |
| Sintaxe `SHOW DATABASES` | Suportado | Suportado |
| `information_schema.SCHEMATA` | Disponível | Disponível |
| Padrão `performance_schema` | Habilitado | Habilitado (10.5+) |
| Esquema `sys` | Incluído por padrão | Opcional, nem sempre presente |
| `SHOW DATABASES LIKE` | Suportado | Suportado |
| Modelo de privilégios baseado em funções | Nativo (8.0+) | Nativo (10.0.5+) |
| Binário do cliente `mysql` | `mysql` | `mysql` ou `mariadb` |
Em instalações mais recentes do MariaDB, o binário canônico pode ser mariadb em vez de mysql, embora um link simbólico normalmente preserve a compatibilidade retroativa.
Erros Comuns e Como Corrigi-los
ERROR 1045 (28000): Access denied for user
Isso significa que a autenticação falhou. Verifique novamente o nome de usuário, senha e host. Para root no MySQL 8, o plugin de autenticação padrão é caching_sha2_password. Se o seu cliente não o suporta, conecte via socket:
sudo mysql -u rootIsso ignora a autenticação por senha ao executar como o usuário Linux root, dependendo do plugin auth_socket ou unix_socket em vez disso.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket
O daemon MySQL não está em execução ou o caminho do arquivo socket está errado. Verifique:
sudo systemctl status mysql
ls -la /var/run/mysqld/mysqld.sockERROR 1044 (42000): Access denied for user to database
O usuário está autenticado, mas não possui privilégios no banco de dados de destino. Revise as concessões com:
SHOW GRANTS FOR 'username'@'host';Matriz de Decisão Prática
Use esta referência para selecionar a abordagem correta para sua situação:
| Cenário | Comando Recomendado |
|---|---|
| — | — |
| Exploração interativa | `SHOW DATABASES;` dentro do shell `mysql` |
| Filtrar por prefixo de nome | `SHOW DATABASES LIKE 'prefix_%';` |
| Listagem rica em metadados | Consultar `information_schema.SCHEMATA` |
| Scripts de shell / automação | `mysql -e "SHOW DATABASES;" –skip-column-names` |
| Visão geral rápida sem shell | `mysqlshow -u root -p` |
| Servidor remoto, porta não padrão | `mysql -u root -p -h host -P port` |
| Automação sem senha | Arquivo de opções `~/.my.cnf` com `chmod 600` |
| Depuração de problemas de acesso | `SHOW GRANTS FOR 'user'@'host';` |
Principais Conclusões Técnicas
SHOW DATABASES;tem escopo de privilégios. Um usuário sem o privilégio globalSHOW DATABASESvê apenas os bancos de dados aos quais tem acesso explícito — isso é um recurso de segurança, não uma configuração incorreta.- Nunca passe senhas como argumentos de linha de comando em produção. Use
-ppara sessões interativas e~/.my.cnfpara automação. information_schema.SCHEMATAé estritamente mais poderoso do queSHOW DATABASESpara consultas com script ou filtradas.- O utilitário
mysqlshowé subutilizado e fornece inspeção rápida e não interativa de bancos de dados e tabelas. - No MySQL 8, a autenticação baseada em socket (
sudo mysql) é frequentemente o caminho mais rápido para acesso root em um servidor local. - Ao gerenciar múltiplos bancos de dados em um VPS com cPanel ou outro painel de controle, o gerenciador de banco de dados do painel é um wrapper GUI em torno desses mesmos comandos SQL — entender as consultas subjacentes dá a você controle total quando a GUI não é suficiente.
- Para ambientes onde o acesso ao banco de dados está vinculado a SSL Certificates e conexões criptografadas, adicione
--ssl-mode=REQUIREDàs suas invocações do clientemysqlpara impor TLS em trânsito.
FAQ
P: Por que SHOW DATABASES não mostra todos os bancos de dados no meu servidor?
R: A conta de usuário com a qual você está autenticado não possui o privilégio global SHOW DATABASES. O MySQL retorna apenas os bancos de dados para os quais esse usuário possui pelo menos um privilégio. Autentique como root ou conceda o privilégio SHOW DATABASES para ver a lista completa.
P: Qual é a diferença entre SHOW DATABASES e consultar information_schema.SCHEMATA?
R: Ambos retornam a lista de esquemas acessíveis, mas information_schema.SCHEMATA expõe colunas de metadados adicionais — conjunto de caracteres padrão, collation padrão — e suporta filtragem SQL completa com WHERE, ORDER BY e JOIN. Use SHOW DATABASES para verificações interativas rápidas e information_schema.SCHEMATA para consultas com script ou analíticas.
P: Como listo bancos de dados em um servidor MySQL remoto sem abrir uma sessão interativa?
R: Use a flag -e combinada com opções de host e porta:
mysql -u root -p -h remote-host -P 3306 -e "SHOW DATABASES;" --skip-column-namesP: Posso listar bancos de dados MySQL sem saber a senha root?
R: Em um servidor local onde você tem acesso Linux root, sim. O plugin auth_socket do MySQL (ou unix_socket no MariaDB) autentica com base no usuário do SO Linux. Execute sudo mysql e você receberá acesso como o usuário MySQL root sem solicitação de senha.
P: SHOW DATABASES funciona da mesma forma no MariaDB que no MySQL?
R: A sintaxe é idêntica e as regras de escopo de privilégios são as mesmas. A principal diferença prática é que o MariaDB pode não incluir o esquema sys por padrão, e em versões mais recentes do MariaDB o binário de cliente preferido é mariadb em vez de mysql, embora o alias mysql seja normalmente preservado para compatibilidade.
