MariaDB: Root-Passwort und Systemtabellen im Container wiederherstellen
Zur Navigation springen
Zur Suche springen
Zielbeschreibung
- Wiederherstellung des MariaDB-root-Zugangs in einem Docker-Container
- Nutzung von mariadbd --skip-grant-tables im Container
- Korrektur der Systemtabelle mysql.column_stats, falls nach einem Upgrade Fehler auftreten
Problemstellung
- Zugriff auf MariaDB als root nicht mehr möglich
- Systemtabelle mysql.column_stats wirft bei aktuellen Versionen (ab 10.6+) beim Start Fehlermeldungen
- Beispiel:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' ERROR 1290 (HY000): The MariaDB server is running with the --skip-grant-tables option so it cannot execute this statement Incorrect definition of table mysql.column_stats: expected column 'histogram' at position 10 to have type longblob, found type varbinary(255)
Vorbereitungen
- Container mit interaktivem Bash-Zugriff starten
- docker run --rm -it -v ./database:/var/lib/mysql mariadb bash
- Socket-Verzeichnis anlegen und Rechte setzen
- mkdir -p /run/mysqld
- chown -R mysql:mysql /run/mysqld
Start im Recovery-Modus
- MariaDB als Benutzer mysql ohne Authentifizierung starten
- su mysql -c "mariadbd --skip-grant-tables --socket=/run/mysqld/mysqld.sock"
- Terminal offen lassen – der Server läuft im Vordergrund
Passwort zurücksetzen (in zweitem Terminal)
- Verbindung über den Unix-Socket aufbauen
- docker exec -it <CONTAINER-ID> mariadb --socket=/run/mysqld/mysqld.sock
- Passwort und Plugin in mysql.global_priv setzen (ab MariaDB 10.4)
UPDATE mysql.global_priv SET priv=json_set(priv, '$.plugin', 'mysql_native_password', '$.authentication_string', PASSWORD('123Start$')) WHERE User='root';
FLUSH PRIVILEGES;
- Hinweis
- ALTER USER funktioniert nicht im Skip-Modus.
Systemtabelle column_stats korrigieren
- MariaDB erwartet in aktuellen Versionen
- Spalte hist_type als enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB')
- Spalte histogram als longblob
- Tabelle anpassen
USE mysql;
ALTER TABLE column_stats MODIFY histogram longblob;
ALTER TABLE column_stats MODIFY hist_type enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB');
Abschließen
- Im ersten Terminal mit Strg+C den Server beenden
- Jetzt ist ein regulärer Start mit gültigem Root-Passwort möglich
- docker run --rm -it -v ./database:/var/lib/mysql mariadb mariadb -uroot -p123Start$
Empfehlung für docker-compose.yml
- Festes Root-Passwort setzen
environment: MYSQL_ROOT_PASSWORD: 123Start$
- Zufällig generiertes Passwort vermeiden
# MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
Fazit
Mit dieser Methode kann ein MariaDB-Container bei verlorenem Passwort und inkonsistenter Systemtabellenstruktur sicher repariert werden. Der Socket-basierte Zugriff erlaubt eine lokale Authentifizierung auch ohne TCP oder funktionierenden Benutzerzugang.