MariaDB: Root-Passwort und Systemtabellen im Container wiederherstellen

Aus Xinux Wiki
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.