feat: neue PostgreSQL-Suche (tba-search) aus newmail-vhost übernommen
Deploy to Dev / deploy (push) Successful in 0s
Deploy to Dev / deploy (push) Successful in 0s
This commit is contained in:
@@ -0,0 +1,317 @@
|
||||
# Krempl PostgreSQL Migration
|
||||
|
||||
Dieses Verzeichnis enthält alle Dateien für die Migration der Krempl-Daten von MySQL zu PostgreSQL.
|
||||
|
||||
## 🎯 Ziel
|
||||
|
||||
**Problem:** 61 Millionen Zeilen in MySQL → langsame Queries, 504 Timeouts
|
||||
**Lösung:** Aggregation zu 68k Zeilen mit PostgreSQL Arrays → 50-200ms Queries
|
||||
|
||||
---
|
||||
|
||||
## 📁 Dateien
|
||||
|
||||
```
|
||||
core/postgres/
|
||||
├── schema.sql # PostgreSQL Schema (Tabellen, Indizes)
|
||||
├── import.py # Python Import-Script
|
||||
├── config.ini.example # Konfigurations-Vorlage
|
||||
├── config.ini # Deine echte Config (NICHT ins Git!)
|
||||
├── .gitignore # Verhindert, dass config.ini committed wird
|
||||
└── README.md # Diese Datei
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Setup auf dem Server
|
||||
|
||||
### 1. PostgreSQL installieren
|
||||
|
||||
```bash
|
||||
# Auf Debian/Ubuntu Server
|
||||
sudo apt update
|
||||
sudo apt install postgresql postgresql-contrib php-pgsql python3-psycopg2
|
||||
|
||||
# PostgreSQL starten
|
||||
sudo systemctl start postgresql
|
||||
sudo systemctl enable postgresql
|
||||
```
|
||||
|
||||
### 2. Datenbank erstellen
|
||||
|
||||
**PLESK:** PostgreSQL User ist `root`, nicht `postgres`!
|
||||
|
||||
```bash
|
||||
# Plesk PostgreSQL Admin-Passwort holen:
|
||||
# Panel → Tools & Settings → Database Servers → PostgreSQL
|
||||
|
||||
PLESK_PW='DEIN_PLESK_PG_PASSWORD'
|
||||
|
||||
# Datenbank erstellen
|
||||
PGPASSWORD=$PLESK_PW psql -U root -h localhost -d postgres -c "
|
||||
CREATE DATABASE krempl_data WITH ENCODING 'UTF8';
|
||||
"
|
||||
|
||||
# User erstellen (WICHTIG: Passwort ohne Sonderzeichen!)
|
||||
PGPASSWORD=$PLESK_PW psql -U root -h localhost -d postgres -c "
|
||||
CREATE USER krempl_user WITH PASSWORD 'KremplSecure2025';
|
||||
"
|
||||
|
||||
# Rechte vergeben
|
||||
PGPASSWORD=$PLESK_PW psql -U root -h localhost -d postgres -c "
|
||||
GRANT ALL PRIVILEGES ON DATABASE krempl_data TO krempl_user;
|
||||
"
|
||||
|
||||
PGPASSWORD=$PLESK_PW psql -U root -h localhost -d krempl_data -c "
|
||||
GRANT ALL ON SCHEMA public TO krempl_user;
|
||||
"
|
||||
|
||||
# Schema laden
|
||||
cd /var/www/vhosts/newmail.intelectra.de/httpdocs/core/postgres
|
||||
PGPASSWORD=$PLESK_PW psql -U root -h localhost -d krempl_data -f schema.sql
|
||||
|
||||
# Tabellen-Rechte setzen
|
||||
PGPASSWORD=$PLESK_PW psql -U root -h localhost -d krempl_data -c "
|
||||
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO krempl_user;
|
||||
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO krempl_user;
|
||||
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO krempl_user;
|
||||
"
|
||||
```
|
||||
|
||||
### 3. Config erstellen
|
||||
|
||||
```bash
|
||||
cd /pfad/zu/Intelectra-WebShop/core/postgres/
|
||||
|
||||
# Kopiere Beispiel-Config
|
||||
cp config.ini.example config.ini
|
||||
|
||||
# Bearbeite config.ini
|
||||
nano config.ini
|
||||
|
||||
# Trage ein:
|
||||
# - PostgreSQL Passwort
|
||||
# - CSV-Dateipfade
|
||||
```
|
||||
|
||||
### 4. Import ausführen
|
||||
|
||||
```bash
|
||||
# Python-Abhängigkeit installieren
|
||||
pip3 install psycopg2-binary
|
||||
|
||||
# Prüfen:
|
||||
python3 -c "import psycopg2; print('psycopg2 OK')"
|
||||
|
||||
# Import starten (dauert 10-20 Min)
|
||||
cd /var/www/vhosts/newmail.intelectra.de/httpdocs/core/postgres
|
||||
python3 import.py
|
||||
|
||||
# Mit Live-Output:
|
||||
python3 import.py 2>&1 | tee /tmp/krempl_import.log
|
||||
|
||||
# Fortschritt anschauen:
|
||||
tail -f /tmp/krempl_import.log
|
||||
|
||||
# Mit anderem Config-File:
|
||||
python3 import.py --config /pfad/zu/config.ini
|
||||
```
|
||||
|
||||
**Erwarteter Output:**
|
||||
```
|
||||
======================================================================
|
||||
KREMPL POSTGRESQL IMPORT
|
||||
Aggregiert 61 Millionen Zeilen → 68k Zeilen mit Arrays
|
||||
======================================================================
|
||||
|
||||
✅ Verbunden mit PostgreSQL: krempl_data
|
||||
======================================================================
|
||||
[1/4] IMPORTIERE GERÄTE
|
||||
======================================================================
|
||||
📁 CSV-Datei: geraete_Export.csv (227.0 MB)
|
||||
🗑️ Tabelle geleert
|
||||
→ 100,000 Geräte importiert...
|
||||
→ 200,000 Geräte importiert...
|
||||
...
|
||||
✅ 1,446,180 Geräte importiert (Fehler: 0)
|
||||
|
||||
======================================================================
|
||||
[2/4] IMPORTIERE ERSATZTEILE
|
||||
======================================================================
|
||||
...
|
||||
|
||||
======================================================================
|
||||
[3/4] IMPORTIERE MAPPING (AGGREGIERT)
|
||||
======================================================================
|
||||
📁 CSV-Datei: artikelgeraet_Export.csv (1.32 GB)
|
||||
💾 Modus: In-Memory Aggregation (schnell, RAM-intensiv)
|
||||
⏳ Lese und aggregiere 61 Millionen Zeilen...
|
||||
→ 1,000,000 Zeilen gelesen...
|
||||
→ 10,000,000 Zeilen gelesen...
|
||||
→ 61,000,000 Zeilen gelesen...
|
||||
✓ 61,234,567 Zeilen gelesen
|
||||
✓ 68,667 unique Ersatzteile gefunden
|
||||
💾 Schreibe aggregierte Daten nach PostgreSQL...
|
||||
→ 500/68,667 Ersatzteile geschrieben...
|
||||
→ 10,000/68,667 Ersatzteile geschrieben...
|
||||
✅ 68,667 Ersatzteile mit Arrays gespeichert
|
||||
📊 Max Geräte pro Teil: 129,819
|
||||
📊 Ø Geräte pro Teil: 888
|
||||
|
||||
...
|
||||
|
||||
======================================================================
|
||||
✅ IMPORT ERFOLGREICH in 0:12:34
|
||||
======================================================================
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Testen
|
||||
|
||||
### PostgreSQL Queries testen
|
||||
|
||||
```bash
|
||||
# Als postgres User
|
||||
sudo -u postgres psql -d krempl_data
|
||||
|
||||
# Test 1: Geräte zu Ersatzteil
|
||||
SELECT g.nr, g.marke, g.typ
|
||||
FROM ersatzteil_mapping em
|
||||
JOIN geraete g ON g.id = ANY(em.geraet_ids)
|
||||
WHERE em.ersatzteil_id = 7764466071
|
||||
LIMIT 10;
|
||||
|
||||
# Test 2: Ersatzteile zu Gerät
|
||||
SELECT ersatzteil_id
|
||||
FROM ersatzteil_mapping
|
||||
WHERE geraet_ids @> ARRAY[123456]::bigint[]
|
||||
LIMIT 10;
|
||||
|
||||
# Test 3: Full-Text Suche
|
||||
SELECT id, nr, marke, typ
|
||||
FROM geraete
|
||||
WHERE to_tsvector('german', nr || ' ' || typ) @@ plainto_tsquery('german', 'AEG Kühlschrank')
|
||||
LIMIT 10;
|
||||
```
|
||||
|
||||
### PHP Connection testen
|
||||
|
||||
```bash
|
||||
# PHP Extension prüfen
|
||||
php -m | grep pdo_pgsql
|
||||
# Sollte "pdo_pgsql" ausgeben
|
||||
|
||||
# Test-Script
|
||||
php -r "new PDO('pgsql:host=localhost;dbname=krempl_data', 'krempl_user', 'PASSWORT');"
|
||||
# Sollte keine Fehler ausgeben
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Troubleshooting
|
||||
|
||||
### ❌ "password authentication failed for user krempl_user"
|
||||
|
||||
Sonderzeichen im Passwort können Probleme machen!
|
||||
|
||||
```bash
|
||||
# Passwort ohne Sonderzeichen setzen (nur A-Z, a-z, 0-9)
|
||||
PGPASSWORD='PLESK_PG_PASSWORD' psql -U root -h localhost -d postgres -c "
|
||||
ALTER USER krempl_user WITH PASSWORD 'KremplSecure2025';
|
||||
"
|
||||
|
||||
# Testen:
|
||||
PGPASSWORD='KremplSecure2025' psql -U krempl_user -h localhost -d krempl_data -c "SELECT 1;"
|
||||
```
|
||||
|
||||
### ❌ "permission denied for table ..."
|
||||
|
||||
```bash
|
||||
PGPASSWORD='PLESK_PG_PASSWORD' psql -U root -h localhost -d krempl_data -c "
|
||||
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO krempl_user;
|
||||
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO krempl_user;
|
||||
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO krempl_user;
|
||||
"
|
||||
```
|
||||
|
||||
### ❌ "ModuleNotFoundError: No module named 'psycopg2'"
|
||||
|
||||
```bash
|
||||
pip3 install psycopg2-binary
|
||||
python3 -c "import psycopg2; print('OK')"
|
||||
```
|
||||
|
||||
### Import läuft Out of Memory
|
||||
|
||||
→ In `config.ini` ändern:
|
||||
```ini
|
||||
mapping_in_memory = false
|
||||
```
|
||||
(Langsamer, aber RAM-freundlich)
|
||||
|
||||
### CSV-Datei nicht gefunden
|
||||
|
||||
→ Prüfe Pfade in `config.ini`:
|
||||
```bash
|
||||
ls -lh /var/www/vhosts/intelectra.de/httpdocs/upload/*.csv
|
||||
```
|
||||
|
||||
### Log-Datei kann nicht erstellt werden
|
||||
|
||||
→ In `config.ini` Log-Pfad leer lassen:
|
||||
```ini
|
||||
[logging]
|
||||
log_file =
|
||||
```
|
||||
|
||||
### PHP kann nicht zu PostgreSQL connecten
|
||||
|
||||
**Plesk:** PHP-PostgreSQL Extension ist meist schon da!
|
||||
```bash
|
||||
php -m | grep pdo_pgsql
|
||||
# Sollte "pdo_pgsql" ausgeben
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Erwartete Performance
|
||||
|
||||
| Metrik | MySQL (alt) | PostgreSQL (neu) |
|
||||
|--------|-------------|------------------|
|
||||
| DB-Größe | 1.3 GB | ~100 MB |
|
||||
| Zeilen | 61 Mio | 68k |
|
||||
| Artikelseite | 5-15 Sek | 50-200 ms |
|
||||
| Gerätesuche | 10-30 Sek | 100-500 ms |
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Re-Import (Update)
|
||||
|
||||
Wenn neue Krempl-Daten kommen:
|
||||
|
||||
```bash
|
||||
# Einfach nochmal ausführen
|
||||
python3 import.py
|
||||
|
||||
# Das Script ist idempotent (mehrfach ausführbar)
|
||||
# Bestehende Daten werden überschrieben
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 Nächste Schritte
|
||||
|
||||
Nach erfolgreichem Import:
|
||||
|
||||
1. ✅ PHP Connection-Klasse implementieren (`core/postgres/connection.php`)
|
||||
2. ✅ Artikelseite umbauen (nutzt PostgreSQL statt MySQL)
|
||||
3. ✅ Gerätesuche umbauen
|
||||
4. ✅ Auf Testshop testen
|
||||
5. ✅ Performance messen
|
||||
6. 🚀 Live deployen
|
||||
7. 🗑️ MySQL Krempl-Tabellen löschen (1.3 GB frei!)
|
||||
|
||||
---
|
||||
|
||||
**Viel Erfolg! 🚀**
|
||||
Reference in New Issue
Block a user