15%

15% auf alle Hosting-Dienste sparen

Teste deine Fähigkeiten und erhalte Rabatt auf jeden Hosting-Plan

Benutze den Code:

Skills
Anfangen
15.10.2024
3 +1

Wie man MySQL-Datenbanken über die Befehlszeile unter Linux auflistet

Das Auflisten aller MySQL-Datenbanken über die Befehlszeile erfolgt mit einer einzigen SQL-Anweisung — SHOW DATABASES; — die nach der Authentifizierung beim MySQL-Server mithilfe des mysql-Clients ausgeführt wird. Dies funktioniert auf jeder Linux-Distribution, die MySQL 5.7, MySQL 8.x oder einen kompatiblen MariaDB-Server betreibt, und erfordert entweder das SHOW DATABASES-Privileg oder Superuser-Zugriff.

Diese Anleitung geht über den grundlegenden Befehl hinaus. Sie behandelt Authentifizierungsoptionen, privilegienbasierte Sichtbarkeit, nicht-interaktive Scripting-Muster, Performance-Schema-Filterung und häufige Fehlerquellen, die selbst erfahrene Administratoren stolpern lassen.

Voraussetzungen

Bestätigen Sie vor dem Fortfahren Folgendes:

  • MySQL Server oder MariaDB ist installiert und der Dienst ist aktiv.
  • Sie verfügen über ein Benutzerkonto mit mindestens dem SHOW DATABASES-Privileg, oder Sie authentifizieren sich als root.
  • Das mysql-Client-Binary ist in der PATH Ihrer Shell verfügbar (überprüfen Sie dies mit which mysql).

Wenn Sie einen Remote-Server verwalten — zum Beispiel eine VPS Hosting-Umgebung — stellen Sie außerdem sicher, dass der MySQL-Port (Standard 3306) erreichbar ist oder dass Sie sich über SSH verbinden.

Schritt 1: Überprüfen Sie, ob der MySQL-Dienst läuft

Bestätigen Sie vor dem Verbindungsversuch, dass der Daemon aktiv ist:

sudo systemctl status mysql

Bei MariaDB-Installationen unterscheidet sich der Dienstname:

sudo systemctl status mariadb

Wenn der Dienst gestoppt ist, starten Sie ihn:

sudo systemctl start mysql

Ein fehlgeschlagener Start wird fast immer in journalctl -xe oder in /var/log/mysql/error.log erklärt. Überprüfen Sie diese Dateien zuerst, bevor Sie ein Konfigurationsproblem annehmen.

Schritt 2: Authentifizierung beim MySQL-Server

Standard-Interaktiver Login

mysql -u root -p
  • -u root — gibt den MySQL-Benutzernamen an. Ersetzen Sie root durch ein beliebiges gültiges Konto.
  • -p — fordert das Passwort interaktiv an. Übergeben Sie das Passwort niemals direkt in der Befehlszeile in der Produktion (z. B. -pMyPassword), da es in Prozesslisten und der Shell-Historie sichtbar ist.

Nach Eingabe eines korrekten Passworts erscheint die MySQL-Eingabeaufforderung:

mysql>

Verbindung zu einem Remote-Host oder Nicht-Standard-Port

mysql -u root -p -h 192.168.1.100 -P 3307
  • -h — gibt die IP-Adresse oder den Hostnamen des Remote-Hosts an.
  • -P — gibt eine nicht standardmäßige Portnummer an.

Verwendung einer Optionsdatei für die Automatisierung

Für Skripte und Cron-Jobs speichern Sie Anmeldedaten in einer geschützten Optionsdatei, anstatt sie in den Befehl einzubetten:

# ~/.my.cnf
[client]
user=root
password=YourSecurePassword

Schränken Sie die Berechtigungen unmittelbar nach der Erstellung der Datei ein:

chmod 600 ~/.my.cnf

Mit dieser Datei authentifiziert sich mysql ohne jegliche Flags:

mysql

Schritt 3: Alle Datenbanken auflisten

Führen Sie innerhalb der MySQL-Shell folgenden Befehl aus:

SHOW DATABASES;

Beispielausgabe bei einer frisch installierten MySQL 8-Instanz:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

Diese vier System-Schemas sind bei jeder Standard-MySQL-Installation vorhanden:

SchemaZweck
`information_schema`Schreibgeschütztes virtuelles Schema, das Metadaten über alle anderen Schemas, Tabellen, Spalten und Privilegien bereitstellt
`mysql`Kern-Grant-Tabellen, Zeitzonendaten und Serverkonfiguration
`performance_schema`Low-Level-Instrumentierungsdaten für Query-Profiling und Diagnose
`sys`Menschenlesbare Ansichten, die auf `performance_schema` aufgebaut sind

Benutzererstellte Datenbanken erscheinen neben diesen System-Schemas.

Schritt 4: Die Datenbankliste filtern

Nach Namensmuster filtern

SHOW DATABASES akzeptiert eine LIKE-Klausel, die nützlich ist, wenn ein Server Dutzende von Datenbanken hostet:

SHOW DATABASES LIKE 'wp_%';

Dies gibt nur Datenbanken zurück, deren Namen mit wp_ beginnen — eine gängige Namenskonvention für WordPress-Installationen.

information_schema für erweiterte Filterung abfragen

Für präzisere Filterung fragen Sie die information_schema.SCHEMATA-Tabelle direkt ab:

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;

Dieser Ansatz ermöglicht es Ihnen, nach Zeichensatz, Kollation oder einer anderen Metadatenspalte zu filtern — etwas, das SHOW DATABASES nicht kann.

Schritt 5: Eine bestimmte Datenbank untersuchen

Um den Inhalt einer bestimmten Datenbank zu untersuchen, wechseln Sie den Kontext mit USE und listen Sie dann deren Tabellen auf:

USE database_name;
SHOW TABLES;

Um Tabellengrößen, Zeilenanzahlen und Speicher-Engines in einer Abfrage zu sehen:

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;

Dies ist weitaus aussagekräftiger als SHOW TABLES allein und ist die Art von Abfrage, die ein DBA vor der Planung einer Migration oder Backup-Strategie ausführt.

Schritt 6: Die MySQL-Shell beenden

EXIT;

Oder verwenden Sie die Tastenkombination Ctrl+D.

Nicht-interaktive Nutzung: Datenbanken aus der Shell auflisten

In automatisierten Pipelines — Backup-Skripte, Monitoring-Agenten, Deployment-Hooks — müssen Sie die Datenbankliste abrufen, ohne eine interaktive Sitzung zu starten.

Einzeiler mit dem -e-Flag

mysql -u root -p -e "SHOW DATABASES;"

Kopfzeile für Scripting unterdrücken

mysql -u root -p --skip-column-names -e "SHOW DATABASES;" 2>/dev/null

Das --skip-column-names-Flag entfernt den Database-Header und erzeugt eine saubere Ausgabe, die für die Iteration in einer Shell-Schleife geeignet ist:

for db in $(mysql -u root -p --skip-column-names -e "SHOW DATABASES;" 2>/dev/null); do
  echo "Processing: $db"
done

mysqlshow als Alternative verwenden

Das mysqlshow-Dienstprogramm bietet einen schnellen Überblick, ohne die MySQL-Shell zu betreten:

mysqlshow -u root -p

Es listet alle Datenbanken auf, die der authentifizierte Benutzer sehen kann, und akzeptiert ein Datenbankname-Argument, um in die Tabellenebene zu wechseln:

mysqlshow -u root -p database_name

Privilegien-Scoping: Warum einige Datenbanken ausgeblendet sind

Dies ist eines der am häufigsten missverstandenen Verhaltensweisen in MySQL. Wenn einem Benutzer das globale SHOW DATABASES-Privileg fehlt, gibt SHOW DATABASES nur Datenbanken zurück, für die dieser Benutzer mindestens ein Privileg besitzt. Dies ist beabsichtigt — es ist eine Sicherheitsgrenze, kein Fehler.

Praktische Auswirkung: Ein eingeschränkter Anwendungsbenutzer kann SHOW DATABASES; ausführen und nur eine oder zwei Datenbanken sehen, obwohl der Server fünfzig hostet. Dies ist korrektes Verhalten. Wenn ein Benutzer die vollständige Liste sehen muss, gewähren Sie das Privileg explizit:

GRANT SHOW DATABASES ON *.* TO 'username'@'host';
FLUSH PRIVILEGES;

Verwenden Sie diese Gewährung sparsam. In Multi-Tenant-Umgebungen — wie einem Shared Web Hosting-Setup oder einer Multi-Client-Dedicated Servers-Bereitstellung — ist die Offenlegung der vollständigen Datenbankliste gegenüber Anwendungsbenutzern ein Sicherheitsrisiko.

MySQL vs. MariaDB: Verhaltensunterschiede

Sowohl MySQL als auch MariaDB unterstützen SHOW DATABASES; und information_schema.SCHEMATA, aber es gibt subtile Unterschiede, die es wert sind, bekannt zu sein:

FunktionMySQL 8.xMariaDB 10.x
`SHOW DATABASES`-SyntaxUnterstütztUnterstützt
`information_schema.SCHEMATA`VerfügbarVerfügbar
`performance_schema`-StandardAktiviertAktiviert (10.5+)
`sys`-SchemaStandardmäßig enthaltenOptional, nicht immer vorhanden
`SHOW DATABASES LIKE`UnterstütztUnterstützt
Rollenbasiertes PrivilegienmodellNativ (8.0+)Nativ (10.0.5+)
`mysql`-Client-Binary`mysql``mysql` oder `mariadb`

Bei neueren MariaDB-Installationen kann das kanonische Binary mariadb anstelle von mysql sein, obwohl ein Symlink typischerweise die Abwärtskompatibilität gewährleistet.

Häufige Fehler und deren Behebung

ERROR 1045 (28000): Access denied for user

Dies bedeutet, dass die Authentifizierung fehlgeschlagen ist. Überprüfen Sie Benutzername, Passwort und Host. Für root unter MySQL 8 ist das Standard-Authentifizierungs-Plugin caching_sha2_password. Wenn Ihr Client es nicht unterstützt, verbinden Sie sich über Socket:

sudo mysql -u root

Dies umgeht die Passwort-Authentifizierung, wenn Sie als Linux-root-Benutzer ausgeführt werden, und verlässt sich stattdessen auf das auth_socket– oder unix_socket-Plugin.

ERROR 2002 (HY000): Can't connect to local MySQL server through socket

Der MySQL-Daemon läuft nicht, oder der Socket-Dateipfad ist falsch. Überprüfen Sie:

sudo systemctl status mysql
ls -la /var/run/mysqld/mysqld.sock

ERROR 1044 (42000): Access denied for user to database

Der Benutzer ist authentifiziert, verfügt jedoch nicht über Privilegien für die Zieldatenbank. Überprüfen Sie die Grants mit:

SHOW GRANTS FOR 'username'@'host';

Praktische Entscheidungsmatrix

Verwenden Sie diese Referenz, um den richtigen Ansatz für Ihre Situation auszuwählen:

SzenarioEmpfohlener Befehl
Interaktive Erkundung`SHOW DATABASES;` innerhalb der `mysql`-Shell
Nach Namenspräfix filtern`SHOW DATABASES LIKE 'prefix_%';`
Metadatenreiche Auflistung`information_schema.SCHEMATA` abfragen
Shell-Scripting / Automatisierung`mysql -e "SHOW DATABASES;" –skip-column-names`
Schneller Überblick ohne Shell`mysqlshow -u root -p`
Remote-Server, Nicht-Standard-Port`mysql -u root -p -h host -P port`
Passwortlose Automatisierung`~/.my.cnf`-Optionsdatei mit `chmod 600`
Debugging von Zugriffsproblemen`SHOW GRANTS FOR 'user'@'host';`

Wichtige technische Erkenntnisse

  • SHOW DATABASES; ist privilegienbasiert. Ein Benutzer ohne globales SHOW DATABASES-Privileg sieht nur Datenbanken, auf die er expliziten Zugriff hat — dies ist eine Sicherheitsfunktion, keine Fehlkonfiguration.
  • Übergeben Sie Passwörter niemals als Befehlszeilenargumente in der Produktion. Verwenden Sie -p für interaktive Sitzungen und ~/.my.cnf für die Automatisierung.
  • information_schema.SCHEMATA ist für geskriptete oder gefilterte Abfragen grundsätzlich leistungsfähiger als SHOW DATABASES.
  • Das mysqlshow-Dienstprogramm wird zu wenig genutzt und bietet eine schnelle, nicht-interaktive Datenbank- und Tabelleninspektion.
  • Unter MySQL 8 ist die Socket-basierte Authentifizierung (sudo mysql) oft der schnellste Weg zum Root-Zugriff auf einem lokalen Server.
  • Bei der Verwaltung mehrerer Datenbanken auf einem VPS mit cPanel oder einem anderen Control Panel ist der Datenbankmanager des Panels eine GUI-Hülle um dieselben SQL-Befehle — das Verständnis der zugrunde liegenden Abfragen gibt Ihnen die volle Kontrolle, wenn die GUI nicht ausreicht.
  • Für Umgebungen, in denen der Datenbankzugriff an SSL Certificates und verschlüsselte Verbindungen gebunden ist, fügen Sie --ssl-mode=REQUIRED zu Ihren mysql-Client-Aufrufen hinzu, um TLS während der Übertragung zu erzwingen.

FAQ

F: Warum zeigt SHOW DATABASES nicht alle Datenbanken auf meinem Server an?

A: Das Benutzerkonto, mit dem Sie authentifiziert sind, verfügt nicht über das globale SHOW DATABASES-Privileg. MySQL gibt nur Datenbanken zurück, für die dieser Benutzer mindestens ein Privileg besitzt. Authentifizieren Sie sich als root oder gewähren Sie das SHOW DATABASES-Privileg, um die vollständige Liste zu sehen.

F: Was ist der Unterschied zwischen SHOW DATABASES und der Abfrage von information_schema.SCHEMATA?

A: Beide geben die Liste der zugänglichen Schemas zurück, aber information_schema.SCHEMATA stellt zusätzliche Metadatenspalten bereit — Standard-Zeichensatz, Standard-Kollation — und unterstützt vollständige SQL-Filterung mit WHERE, ORDER BY und JOIN. Verwenden Sie SHOW DATABASES für schnelle interaktive Überprüfungen und information_schema.SCHEMATA für geskriptete oder analytische Abfragen.

F: Wie liste ich Datenbanken auf einem Remote-MySQL-Server auf, ohne eine interaktive Sitzung zu öffnen?

A: Verwenden Sie das -e-Flag in Kombination mit Host- und Port-Optionen:

mysql -u root -p -h remote-host -P 3306 -e "SHOW DATABASES;" --skip-column-names

F: Kann ich MySQL-Datenbanken auflisten, ohne das Root-Passwort zu kennen?

A: Auf einem lokalen Server, auf dem Sie Linux-root-Zugriff haben, ja. Das auth_socket-Plugin von MySQL (oder unix_socket bei MariaDB) authentifiziert basierend auf dem Linux-OS-Benutzer. Führen Sie sudo mysql aus und Sie erhalten Zugriff als MySQL-root-Benutzer ohne Passwortabfrage.

F: Funktioniert SHOW DATABASES bei MariaDB genauso wie bei MySQL?

A: Die Syntax ist identisch und die Privilegien-Scoping-Regeln sind dieselben. Der primäre praktische Unterschied besteht darin, dass MariaDB das sys-Schema möglicherweise nicht standardmäßig enthält, und bei neueren MariaDB-Versionen ist das bevorzugte Client-Binary mariadb anstelle von mysql, obwohl der mysql-Alias typischerweise für die Kompatibilität erhalten bleibt.

15%

15% auf alle Hosting-Dienste sparen

Teste deine Fähigkeiten und erhalte Rabatt auf jeden Hosting-Plan

Benutze den Code:

Skills
Anfangen