Datenbankfehler beheben #
Diese Seite richtet sich an Datenbankadministratoren, die gerufen werden, wenn eine Exponential-Website ein Datenbankproblem hat.
Sie beantwortet: wo Sie zuerst nachsehen und für jedes häufige Symptom die Ursache und die Lösung. Quellen:
12.10 Datenbanken und die Stolperfallen jeder Engine in
Kapitel 9.
Inhalt #
- Wo Sie zuerst nachsehen
- Jede Engine
- SQLite
- MySQL und MariaDB
- PostgreSQL
- MongoDB
- Oracle
- Upgrades
- Wann Sie um Hilfe bitten
Wo Sie zuerst nachsehen #
var/log/error.log: Die meisten Datenbankprobleme werden dort benannt (Log-Betrachter).- Die wirksame Einstellung:
php bin/php/console exp:ini get site.ini/DatabaseSettings/DatabaseImplementation --allow-root-user. - Setup > Systeminformationen, wenn die Administration noch lädt.
- Das eigene Log des Datenbankservers.
- Für eine genaue Sicht die Debug-Ausgabe nur für Ihre Adresse (Langsame Abfragen finden).
Jede Engine #
| Symptom | Ursache | Lösung |
|---|
Jede Inhaltsseite scheitert; error.log sagt "Database implementation not supported" | ein falsch geschriebenes DatabaseImplementation; der Kernel fällt auf eine Null-Datenbank zurück | den Alias korrigieren, den INI-Cache leeren, Velocity neu starten |
| Die Seite "database cannot be reached" | falscher Host, Benutzer, falsches Passwort oder falsche Datenbank, oder der Server ist ausgefallen; der Treiber löst eZDBNoConnectionException aus | die Anmeldung mit dem Client der Engine vom Webserver aus testen |
| Nach einem Engine-Wechsel lädt keine Seite | DatabaseImplementation nennt noch die alte Engine | in settings/override/site.ini.append.php setzen, den INI-Cache leeren |
| Eine Änderung der Einstellungen wirkt nicht | INI-Cache nicht geleert, Velocity nicht neu gestartet oder eine Siteaccess-Datei überschreibt sie | exp:ini where, leeren, neu starten |
| Seiten zeigen nach einer manuellen SQL-Änderung oder einer Wiederherstellung alte Daten | Caches, einschließlich des SQL-Abfrage-Cache | php bin/php/ezcache.php --clear-all --allow-root-user und exp:velocity cache clear |
| Funktioniert im Browser, scheitert in Cron | dem PHP der Kommandozeile fehlt die Datenbankerweiterung | php -m (PHP-Erweiterungen) |
SQLite #
| Symptom | Ursache | Lösung |
|---|
| "database is busy: the transaction could not start within N s ..." | ein anderer Schreibzugriff hielt die Schreibsperre während der ganzen SQLiteTransactionWait | nichts wurde geschrieben; erneut versuchen; den langen Schreiber finden (Schreibwarteschlange) |
| "attempt to write a readonly database" | ein -shm, -wal oder das Verzeichnis ist für diesen Prozess nicht schreibbar | gemeinsame Gruppe, 2775, Umask 0002 (Rechte) |
| Die Website meldet fehlende Tabellen | ein falscher Wert für Database hat eine neue, leere Datei geöffnet | den Pfad im Fehler mit ls var/storage/sqlite3/ vergleichen |
| Langsam nach einer Installation oder einem Import | keine Statistiken | sqlite3 var/storage/sqlite3/exponential.db ANALYZE |
| "SQLite3 extension was not found" | sqlite3 in diesem PHP nicht geladen | installieren |
| Die Datenbankdatei lässt sich herunterladen | der Webserver liefert var/ aus | mitgelieferte Rewrite-Regeln oder Velocity; mit curl -sI prüfen |
MySQL und MariaDB #
| Symptom | Ursache | Lösung |
|---|
?, wo Buchstaben mit Akzent standen | die Verbindung ist auf den Standardzeichensatz des Servers zurückgefallen | AlwaysLog[]=warning, nach "could not set the connection charset" suchen (utf8mb4) |
| Der Assistent lehnt den Zeichensatz der Datenbank ab | die Datenbank ist latin1 oder ähnlich | sie in utf8mb4 neu anlegen |
| Emoji gehen verloren | die Verbindung utf8 (utf8mb3) | eine bekannte Grenze der Verbindung |
| Transaktionen werden nicht zurückgerollt | MyISAM-Tabellen | ezconvertmysqltabletype.php --newtype=InnoDB |
| Ein Replikat zeigt alte Inhalte | Replikationsverzögerung | die Verzögerung überwachen (Lesereplikate) |
PostgreSQL #
| Symptom | Ursache | Lösung |
|---|
| "The 'digest' function is not available in your database ..." | pgcrypto fehlt | CREATE EXTENSION IF NOT EXISTS pgcrypto; als Eigentümer oder Superuser |
| Connection refused | listen_addresses, pg_hba.conf | die Webserver zulassen (PostgreSQL einrichten) |
| Doppelter Schlüssel beim Insert nach einem Import | Sequenzen hinter ihren Tabellen | setval() (PostgreSQL betreiben) |
| Keine Berechtigung, eine Tabelle anzulegen (PostgreSQL 15+) | das Konto ist nicht Eigentümer der Datenbank | es zum Eigentümer machen |
| Das SQL einer Erweiterung scheitert nur hier | Backticks oder reine MySQL-Anweisungen | SQL von Erweiterungen prüfen |
MongoDB #
| Symptom | Ursache | Lösung |
|---|
| "Failed to parse MongoDB URI: ... 'default' authentication mechanism requires a username" | kein User angegeben | einen Benutzer in der Datenbank der Website anlegen (MongoDB einrichten) |
Class "MongoDB\Client" not found | die Bibliothek mongodb/mongodb fehlt | composer require mongodb/mongodb |
| Teilbaum- und URL-Alias-Abfragen sind langsam | Indizes nicht angelegt | bin/mongodb/create_indexes.js |
| Eine Liste oder Seite ist leer, die anderswo nicht leer ist | SQL, das der Adapter nicht übersetzen kann | grep -rn "MONGO TODO" var/log/ (Grenzen) |
| Der Einrichtungsassistent läuft in ein Timeout | der Konfigurationsschritt dauert Minuten | request_terminate_timeout erhöhen oder über die Konsole installieren |
Oracle #
| Symptom | Ursache | Lösung |
|---|
| Der Treiber wird nicht gefunden | ezoracle nicht aktiv oder oci8 nicht geladen | extension/ezoracle, ActiveExtensions[], php -m prüfen |
ORA-00933 im SQL einer Erweiterung | AS vor einem Tabellenalias | die Erweiterung korrigieren |
| Eine leere Zeichenkette kommt als NULL zurück | Oracle speichert '' als NULL | OracleEmptyStringForNull=enabled |
| Ein Login funktioniert nur in einer Schreibweise | binärer Vergleich | OracleCaseInsensitive=enabled, dann ext:ezoracle:ci-indexes --create |
| CLOB-Werte werden gekürzt | ein älteres ezoracle oder ein Client, der lange CLOBs über LobPrefetch 2000 kürzt | die Erweiterung aktualisieren |
| Einstellungen in Ihrer Website-Erweiterung werden ignoriert | sie steht nach ezoracle | sie davor setzen (Oracle-Tuning) |
Upgrades #
| Symptom | Ursache | Lösung |
|---|
SET storage_engine=InnoDB; scheitert | eine Update-Datei von vor Oktober 2026 | die aktuelle Datei nehmen (SET default_storage_engine) |
| "duplicate column name" auf SQLite | die 6.0.15-Datei lief ein zweites Mal | die Datenbank ist bereits aktualisiert |
| Eine Update-Datei ist mittendrin gescheitert | | die Sicherung wiederherstellen und die Datei von vorn anwenden |
| Jeder Insert scheitert auf PostgreSQL nach dem Wechsel von 5.x | alte Sequenznamen <table>_s | die aktuelle Update-Datei 6.0 benennt sie um |
| "The audit index classes are not in the autoload array" | Autoloads veraltet | php bin/php/ezpgenerateautoloads.php -k |
Wann Sie um Hilfe bitten #
Sammeln Sie die Fehlerzeilen, die Engine und ihre Version und den Bericht aus Setup > Systeminformationen (er enthält nie
Passwörter) und nutzen Sie dann die Wege unter Wenn etwas schiefgeht. Melden Sie
Sicherheitsprobleme vertraulich, nie in einem öffentlichen Issue.
Verwandte Seiten #
Werden Sie Exponential-Partner
Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück
und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte
2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.