Markus Michalski FAQ

Server Tools: Datenbanken

MySQL/MariaDB mit Server Tools: Datenbank und User anlegen, Credential-Dateien, Rechtestufen, Löschen mit Backup der Credentials, Dumps, Restore, Import und Export, Auflisten und Info.

English Version

Zurück zur Übersicht


Datenbanken

Das Datenbank-Management arbeitet mit MySQL und MariaDB. Es braucht einen Client (mysql oder mariadb) und ein Dump-Tool (mysqldump oder mariadb-dump). Fehlt eines, melden die db-Befehle das und der Menüpunkt zeigt [mysql not installed]. Alle anderen Funktionen laufen weiter.

Die Zugangsdaten holt das Tool aus der Options-Datei ST_MYSQL_CONFIG_FILE (Standard /root/.my.cnf), siehe Installation. Vor jeder Abfrage testet es die Verbindung mit SELECT 1.

Namen und Rechte-Host

Wert Erlaubt
Datenbankname a-z, A-Z, 0-9, _, -, 1 bis 64 Zeichen
User-Name a-z, A-Z, 0-9, _, -, 1 bis 32 Zeichen

Alle User und Rechte beziehen sich auf den Host localhost. Andere Hosts kann das Tool nicht anlegen.

Datenbank und User anlegen

server-tools db create --name shop_db --user shop_user
server-tools db create --name shop_db --user shop_user --password 'ein-langes-passwort'

Ablauf:

  1. Namen werden validiert. Ein eigenes Passwort muss mindestens ST_PASSWORD_MIN_LENGTH Zeichen haben, ohne Passwort erzeugt das Tool eines mit ST_PASSWORD_LENGTH Zeichen.
  2. Die Datenbank wird mit ST_DEFAULT_CHARSET und ST_DEFAULT_COLLATION angelegt. Existiert sie schon, bricht der Befehl ab.
  3. Der User wird mit CREATE USER IF NOT EXISTS angelegt. Schlägt das fehl, wird die gerade angelegte Datenbank wieder gelöscht.
  4. Der User erhält ALL PRIVILEGES auf diese Datenbank.
  5. Die Credential-Datei wird geschrieben und der Vorgang im Audit-Log vermerkt.

Existiert der User bereits, bleibt sein Passwort unverändert (IF NOT EXISTS). Die Credential-Datei enthält trotzdem das neu übergebene oder erzeugte Passwort. Für vorhandene User legst du die Datenbank deshalb mit db create-for-user an.

Das Passwort wird am Ende nur angezeigt, wenn stdout ein Terminal ist. Sonst steht dort (hidden - see credentials file).

Credential-Datei

Pfad: <ST_CREDENTIAL_DIR>/<datenbank>.txt, Rechte aus ST_CREDENTIAL_FILE_PERMISSIONS (600 oder 400). Das Beispiel zeigt den Aufbau:

# Database Credentials for: shop_db
# Created: 2026-01-15 10:30:00
# =========================================

Database: shop_db
Username: shop_user
Password: <passwort>

# Connection Strings
# ------------------
# PDO DSN:
#   mysql:host=localhost;dbname=shop_db;charset=utf8mb4
#
# Symfony DATABASE_URL:
#   mysql://shop_user:<passwort>@localhost:3306/shop_db?charset=utf8mb4

Host localhost, Port 3306 und utf8mb4 sind fest in der Datei eingetragen, unabhängig von der Konfiguration. Das Passwort steht in der DATABASE_URL unverändert. Enthält ein eigenes Passwort Sonderzeichen wie @ oder /, musst du es dort selbst URL-kodieren.

Datenbank für vorhandenen User

server-tools db create-for-user --name shop_staging --user shop_user

Legt nur die Datenbank an und gibt dem vorhandenen User ALL PRIVILEGES. Existiert der User nicht, bricht der Befehl ab. Die Credential-Datei enthält als Passwort den Text (existing user - no password stored).

Rechte vergeben

server-tools db grant --name shop_db --user report_user --level readonly
Stufe SQL-Rechte
all (Standard) ALL PRIVILEGES
readonly SELECT
readwrite SELECT, INSERT, UPDATE, DELETE

Datenbank und User müssen existieren. Vergebene Rechte werden addiert: Wer erst all und danach readonly vergibt, behält ALL PRIVILEGES. Rechte entziehen geht nur über db delete (siehe unten) oder im Menü über "Reassign database to different user".

server-tools db grants --user shop_user

zeigt die GRANT-Anweisungen des Users.

Im Menü gibt es zusätzlich "Reassign database to different user": Es entzieht dem alten User die Rechte und gibt sie dem neuen. Schlägt das Vergeben fehl, bekommt der alte User seine Rechte zurück.

Löschen

# Datenbank löschen, Rechte von shop_user entziehen, User behalten
server-tools db delete --name shop_db --user shop_user

# Datenbank und User löschen
server-tools db delete --name shop_db --user shop_user --drop-user

Ablauf:

  1. Die Datenbank muss existieren.
  2. Ist ST_AUTO_BACKUP=true und die Credential-Datei vorhanden, wird sie als db_<name>_<zeitstempel>.tar.gz in ST_BACKUP_DIR gesichert. Das passiert vor der Rückfrage.
  3. Rückfrage Delete database '<name>'? (y/N):.
  4. Ohne --drop-user: Existiert der mit --user genannte User, werden zuerst seine Rechte an der Datenbank entzogen und danach folgt DROP DATABASE. Mit --drop-user: Zuerst folgt DROP DATABASE, danach wird der User gelöscht.
  5. Zum Schluss wird die Credential-Datei entfernt.

Gesichert wird nur die Credential-Datei, nicht der Inhalt der Datenbank. Mache vorher einen Dump mit db backup.

--drop-user ohne --user löscht nur die Datenbank. Löschst du einen User, verliert er auch seine Rechte auf allen anderen Datenbanken.

Dumps und Backups

server-tools db backup --name shop_db
server-tools db backup-all

Ergebnis: <ST_DB_BACKUP_DIR>/db_<name>_<YYYYMMDD_HHMMSS>.sql.gz mit Rechten 600. Das Verzeichnis wird bei Bedarf mit Rechten 700 angelegt. Der Dump läuft mit --single-transaction --routines --triggers.

backup-all sichert alle Datenbanken außer information_schema, performance_schema, mysql und sys. Datenbanken mit ungültigem Namen werden übersprungen und als Fehler gezählt.

Aufgerufen als CLI-Befehl sichert db backup-all derzeit nur die erste Datenbank und beendet sich dann mit Exit-Code 1. Im Menü ("Backup all databases") läuft es vollständig durch. Für Scripte sicherst du die Datenbanken einzeln mit db backup.

Restore und Import

server-tools db restore --name shop_db --file /root/db-backups/db_shop_db_20260115_103000.sql.gz
server-tools db import  --name shop_db --file dump.sql
db restore db import
Datenbank muss existieren ja ja
Rückfrage ja, mit Warnung "will overwrite all data" nein
Formate .sql, .sql.gz, .sql.zip .sql, .sql.gz, .sql.zip

Beide spielen die Datei einfach in die vorhandene Datenbank ein. Das Tool leert die Datenbank vorher nicht. Ob bestehende Tabellen ersetzt werden, bestimmt der Inhalt des Dumps. Mit mysqldump erzeugte Dumps enthalten standardmäßig DROP TABLE-Anweisungen vor CREATE TABLE.

Export

server-tools db export --name shop_db
server-tools db export --name shop_db --output /root/shop.sql.gz

Erlaubte Endungen sind .sql und .sql.gz. Ohne --output entsteht <ST_DB_BACKUP_DIR>/<name>_export_<zeitstempel>.sql.gz. Das Zielverzeichnis muss vorhanden sein, db export legt es nicht an. Die Datei hat Rechte 600.

Auflisten und Info

server-tools db list
server-tools db info --name shop_db

db list zeigt alle Datenbanken außer den Systemdatenbanken und alle User außer root, mysql.sys, mysql.session, mysql.infoschema und debian-sys-maint als user@host.

db info zeigt Größe in MB, Anzahl der Tabellen, die User mit Rechten auf dieser Datenbank und ob eine Credential-Datei existiert.

Weiter