PostgreSQL für Hoster
Diese Seite ist für Systemadministratoren bei einem Hosting-Anbieter, die PostgreSQL-Datenbanken für Exponential-Websites
bereitstellen. Sie beantwortet: welche PostgreSQL-Versionen Sie betreiben, wie Sie die Datenbank und den Benutzer jeder
Website so anlegen, dass der Installer gelingt, was die Erweiterung pgcrypto damit zu tun hat und wie Sie sichern und
Fehler suchen. PostgreSQL ist die zweite in der offiziellen Reihenfolge und der empfohlene Datenbankserver. Quellen:
Datenbankunterstützung und
Kapitel 9.4.
Inhalt
- Warum PostgreSQL
- Versionen und Erweiterung
- Eine Datenbank pro Website anlegen
- pgcrypto
- Einstellungen und Installation
- Sequenzen
- Backups
- Probleme und ihre Ursachen
- Checkliste
- Verwandte Seiten
Warum PostgreSQL
Das Projekt nennt PostgreSQL den empfohlenen Datenbankserver: striktes SQL, Sperren auf Zeilenebene, eigene Replikation und Wiederherstellung zu einem Zeitpunkt, und ein Datenbank-Testjob in der CI des Projekts bei jedem Push (PostgreSQL 15). Es ist die erste Wahl, wenn eine Website einen Datenbankserver braucht, zum Beispiel wenn sich mehrere Webserver eine Datenbank teilen (Datenbankunterstützung).
Versionen und Erweiterung
| Element | Wert | Quelle |
|---|---|---|
| Untergrenze des Assistenten | 8.0 | eZSetupDatabaseMap() in kernel/setup/ezsetupcommon.php |
| Praktisches Minimum | 13 | der Installer legt pgcrypto an, ab PostgreSQL 13 eine vertrauenswürdige Erweiterung |
| Ab 15 | der Benutzer der Website muss Eigentümer der Datenbank sein | PostgreSQL lässt andere Benutzer keine Tabellen mehr in public anlegen |
| Funktionierend gesehen | 13.23 auf dem Entwicklungsserver; 15 in der CI | Versionen |
| PHP-Erweiterung | pgsql (php-pgsql, php<version>-pgsql) |
Betreiben Sie ein Release, das Ihr Hersteller noch mit Sicherheitskorrekturen versorgt. Die Untergrenze des Assistenten ist keine Empfehlung.
Eine Datenbank pro Website anlegen
Die Installer legen weder Datenbanken noch Benutzer an. Legen Sie beides vor der Installation an, und machen Sie den Benutzer der Website zum Eigentümer seiner Datenbank:
sudo -u postgres createuser --pwprompt <customer>
sudo -u postgres createdb --owner=<customer> --encoding=UTF8 --template=template0 <customer>Mit template0 können Sie die Kodierung unabhängig vom Standard des Servers wählen. Ein Panel, das
PostgreSQL-Datenbanken anlegt, setzt vielleicht einen anderen Eigentümer oder eine andere Kodierung; lesen Sie in der
Dokumentation Ihres Panels nach und vergleichen Sie mit den Befehlen oben
(Datenbanken und Benutzer in Control Panels).
Tipp Eine Datenbank und ein Benutzer pro Website, der Benutzer als Eigentümer der Datenbank, ist das einfachste Modell für die Trennung zwischen Kunden und für einen späteren Umzug einer Website.
pgcrypto
Der Treiber berechnet MD5 mit digest() aus pgcrypto. Der Installer führt CREATE EXTENSION IF NOT EXISTS pgcrypto
aus; als vertrauenswürdige Erweiterung (PostgreSQL 13 und später) darf der Eigentümer der Datenbank sie anlegen. Wenn
sie dem Server fehlt, installieren Sie das Contrib-Paket von PostgreSQL Ihrer Distribution und dann als Eigentümer oder
Superuser:
sudo -u postgres psql -d <customer> -c 'CREATE EXTENSION IF NOT EXISTS pgcrypto;'Wenn sie fehlt, meldet der Setup-Assistent, dass die Funktion digest in der Datenbank nicht verfügbar ist und
Exponential ohne sie nicht laufen kann.
Hinweis Installieren Sie das Contrib-Paket auf jedem PostgreSQL-Server, den Sie Exponential-Kunden anbieten. Es ist die eine Voraussetzung auf dem Server, die der Benutzer der Website nicht allein beheben kann.
Einstellungen und Installation
[DatabaseSettings]
DatabaseImplementation=ezpostgresql
Server=localhost
Port=5432
User=<customer>
Password=<the password>
Database=<customer>
UsePersistentConnection=disabledDie Installer schreiben dies nach settings/override/site.ini.append.php. Eine Installation über die Konsole, mit dem
Passwort aus der Umgebung, damit es nicht in der Shell-Historie landet:
EXP_INSTALL_DB_PASSWORD='<the password>' php bin/php/console exp:install --apply --db=pgsql \
--db-host=127.0.0.1 --db-name=<customer> --db-user=<customer> --allow-root-user--db=postgresql und --db=postgres werden ebenfalls akzeptiert; der Kickstarter nimmt [database_choice] Type=pgsql.
Der Setup-Assistent füllt Port 5432 und Benutzer postgres vor (settings/setup.ini DefaultPort_pgsql,
DefaultUser_pgsql). UsePersistentConnection=enabled nutzt pg_pconnect statt pg_connect; unter Velocity hält
jeder persistente Worker seine Verbindung ohnehin.
Sequenzen
Spalten mit automatischem Hochzählen nutzen Sequenzen mit dem Namen <table>_<column>_seq. Nachdem Sie Daten mit
expliziten IDs geladen haben (ein Import, die Wiederherstellung ausgewählter Tabellen), korrigieren Sie sie, sonst
scheitert das nächste Einfügen mit einem doppelten Schlüssel:
SELECT setval('ezcontentobject_id_seq', (SELECT max(id) FROM ezcontentobject));Der Schema-Installer tut das selbst, nachdem er Daten geladen hat.
Backups
pg_dump -U <customer> -Fc <customer> > <customer>.dump
pg_restore -U <customer> -d <customer> --clean <customer>.dumpEin vollständiges Backup enthält außerdem var/storage, settings/override und settings/siteaccess. Schalten Sie für
eine Wiederherstellung den Wartungsmodus ein, und leeren Sie danach jeden Cache
(Backup und Wiederherstellung). Wiederherstellung zu einem Zeitpunkt und
Replikation sind eigene Funktionen von PostgreSQL; konfigurieren Sie sie mit der Dokumentation von PostgreSQL.
Probleme und ihre Ursachen
| Symptom | Ursache |
|---|---|
Der Assistent meldet, dass die Funktion digest nicht verfügbar ist | pgcrypto konnte nicht angelegt werden; installieren Sie das Contrib-Paket und legen Sie die Erweiterung an |
| Verbindung abgelehnt | listen_addresses in postgresql.conf oder eine fehlende Zeile in pg_hba.conf |
| Zugriff verweigert beim Anlegen von Tabellen | der Benutzer der Website ist nicht Eigentümer der Datenbank (PostgreSQL 15 und später) |
| Doppelter Schlüssel beim Einfügen nach einem Import | Sequenzen hinter ihren Tabellen; korrigieren Sie sie wie oben |
| Das SQL einer Erweiterung scheitert nur auf PostgreSQL | MySQL-Syntax wie Backticks als Anführungszeichen (Hinweise für alle Engines) |
Keine Seite lädt, error.log meldet „Database implementation not supported“ | ein falsch geschriebenes DatabaseImplementation |
Checkliste
- To do: Ein unterstütztes PostgreSQL-Release, 13 oder später, mit installiertem Contrib-Paket.
- To do: Eine Datenbank pro Website, Kodierung
UTF8, im Eigentum des Benutzers der Website. - To do:
pgsqlim Web-PHP und im PHP der Kommandozeile. - To do:
pg_hba.conferlaubt den Benutzer der Website nur von den Webservern aus. - To do: Backups mit
pg_dumpgeplant und eine Wiederherstellung getestet.
Verwandte Seiten
- Datenbanken in der offiziellen Reihenfolge
- Datenbankunterstützung: PostgreSQL
- Kapitel 9.4: PostgreSQL
- Datenbank-Backups je Engine
- Mehrere Web-Knoten
- Freie Dokumentation: Diese Seite darf unter der GNU FDL 1.3 frei kopiert, übersetzt und verbessert werden.
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.