306 lines
8.0 KiB
Markdown
306 lines
8.0 KiB
Markdown
# Backend Data Pool Sync - Migration & Testing Instructions
|
|||
|
|
|
||
|
|
## Übersicht
|
||
|
|
|
||
|
|
Dieser Guide führt dich durch das Testen und Ausführen der Backend Data Pool Migration.
|
||
|
|
|
||
|
|
## Schritt 1: Migration ausführen
|
||
|
|
|
||
|
|
```bash
|
||
|
|
php artisan migrate
|
||
|
|
```
|
||
|
|
|
||
|
|
**Expected Output:**
|
||
|
|
```
|
||
|
|
Migrating: 2025_11_16_150000_create_backend_data_pool_table
|
||
|
|
Migrated: 2025_11_16_150000_create_backend_data_pool_table
|
||
|
|
```
|
||
|
|
|
||
|
|
### Bei Problemen:
|
||
|
|
|
||
|
|
Wenn die Migration fehlschlägt, prüfe:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Datenbankverbindung testen
|
||
|
|
php artisan db:show
|
||
|
|
|
||
|
|
# Oder spezifisch für pgsql
|
||
|
|
php artisan db:show --database=pgsql
|
||
|
|
```
|
||
|
|
|
||
|
|
## Schritt 2: Struktur der Tabelle prüfen
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- In psql oder einem DB-Tool
|
||
|
|
\d public.backend_data_pool
|
||
|
|
|
||
|
|
-- Oder mit artisan tinker
|
||
|
|
php artisan tinker
|
||
|
|
>>> DB::select("SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'backend_data_pool' ORDER BY ordinal_position");
|
||
|
|
```
|
||
|
|
|
||
|
|
## Schritt 3: Statistiken vor dem Sync prüfen
|
||
|
|
|
||
|
|
```bash
|
||
|
|
php artisan backend:sync-data-pool --stats
|
||
|
|
```
|
||
|
|
|
||
|
|
**Expected Output:**
|
||
|
|
```
|
||
|
|
┌─────────────────────────────────┬────────┐
|
||
|
|
│ Metric │ Value │
|
||
|
|
├─────────────────────────────────┼────────┤
|
||
|
|
│ Backend Transactions (done) │ XXX │
|
||
|
|
│ Backend Transaction Outputs │ XXX │
|
||
|
|
│ Data Pool Records │ 0 │
|
||
|
|
│ Last Synced At │ Never │
|
||
|
|
└─────────────────────────────────┴────────┘
|
||
|
|
```
|
||
|
|
|
||
|
|
## Schritt 4: Ersten Full Sync durchführen
|
||
|
|
|
||
|
|
```bash
|
||
|
|
php artisan backend:sync-data-pool --full
|
||
|
|
```
|
||
|
|
|
||
|
|
**Expected Output:**
|
||
|
|
```
|
||
|
|
Preparing for FULL SYNC
|
||
|
|
|
||
|
|
⚠ This will truncate and rebuild the entire backend_data_pool table.
|
||
|
|
|
||
|
|
┌ Do you want to continue? ─────────────────────────────┐
|
||
|
|
│ Yes / No │
|
||
|
|
└───────────────────────────────────────────────────────┘
|
||
|
|
|
||
|
|
Stats BEFORE sync:
|
||
|
|
┌─────────────────────────────────┬────────┐
|
||
|
|
│ Metric │ Value │
|
||
|
|
├─────────────────────────────────┼────────┤
|
||
|
|
│ Backend Transactions (done) │ XXX │
|
||
|
|
│ Data Pool Records │ 0 │
|
||
|
|
│ Last Synced At │ Never │
|
||
|
|
└─────────────────────────────────┴────────┘
|
||
|
|
|
||
|
|
⠙ Syncing data...
|
||
|
|
|
||
|
|
✔ Sync completed successfully!
|
||
|
|
|
||
|
|
Stats AFTER sync:
|
||
|
|
┌─────────────────────────────────┬────────┐
|
||
|
|
│ Metric │ Value │
|
||
|
|
├─────────────────────────────────┼────────┤
|
||
|
|
│ Backend Transactions (done) │ XXX │
|
||
|
|
│ Data Pool Records │ XXX │
|
||
|
|
│ Last Synced At │ 2025-11-16 15:30:45 │
|
||
|
|
└─────────────────────────────────┴────────┘
|
||
|
|
```
|
||
|
|
|
||
|
|
## Schritt 5: Daten verifizieren
|
||
|
|
|
||
|
|
### SQL Query zum Vergleichen:
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Anzahl Datensätze in backend.transactions mit status='done'
|
||
|
|
SELECT COUNT(*)
|
||
|
|
FROM backend.transactions
|
||
|
|
WHERE status = 'done';
|
||
|
|
|
||
|
|
-- Anzahl Datensätze in backend.transaction_outputs (für done transactions)
|
||
|
|
SELECT COUNT(*)
|
||
|
|
FROM backend.transaction_outputs tout
|
||
|
|
JOIN backend.transactions t ON t.id = tout.transaction_id
|
||
|
|
WHERE t.status = 'done';
|
||
|
|
|
||
|
|
-- Anzahl Datensätze in public.backend_data_pool
|
||
|
|
SELECT COUNT(*)
|
||
|
|
FROM public.backend_data_pool;
|
||
|
|
|
||
|
|
-- Die zweite und dritte Zahl sollten gleich sein!
|
||
|
|
```
|
||
|
|
|
||
|
|
### Beispiel-Datensätze prüfen:
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Ersten 5 Datensätze anzeigen
|
||
|
|
SELECT
|
||
|
|
transaction_id,
|
||
|
|
corporate_entity,
|
||
|
|
tx_amount,
|
||
|
|
output_key,
|
||
|
|
LEFT(content, 50) as content_preview,
|
||
|
|
synced_at
|
||
|
|
FROM public.backend_data_pool
|
||
|
|
ORDER BY transaction_id, prompt_id
|
||
|
|
LIMIT 5;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Prüfe ob alle output_keys vorhanden sind:
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Welche output_keys sind im Data Pool?
|
||
|
|
SELECT
|
||
|
|
output_key,
|
||
|
|
COUNT(*) as count
|
||
|
|
FROM public.backend_data_pool
|
||
|
|
GROUP BY output_key
|
||
|
|
ORDER BY count DESC;
|
||
|
|
```
|
||
|
|
|
||
|
|
## Schritt 6: Tests ausführen
|
||
|
|
|
||
|
|
```bash
|
||
|
|
php artisan test --filter=SyncBackendDataPool
|
||
|
|
```
|
||
|
|
|
||
|
|
**Expected Output:**
|
||
|
|
```
|
||
|
|
PASS Tests\Feature\Jobs\SyncBackendDataPoolTest
|
||
|
|
✓ full sync truncates and rebuilds backend_data_pool
|
||
|
|
✓ incremental sync only adds new records
|
||
|
|
✓ sync correctly maps backend.transactions and backend.transaction_outputs
|
||
|
|
✓ sync only includes transactions with status done
|
||
|
|
✓ sync processes records in batches
|
||
|
|
✓ getStats returns correct statistics
|
||
|
|
✓ sync handles empty backend gracefully
|
||
|
|
✓ sync orders records by transaction_id and prompt_id
|
||
|
|
|
||
|
|
Tests: 8 passed (X assertions)
|
||
|
|
Duration: XXs
|
||
|
|
```
|
||
|
|
|
||
|
|
## Schritt 7: Incremental Sync testen
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Warte kurz oder füge neue Daten im backend hinzu
|
||
|
|
# Dann führe incremental sync aus:
|
||
|
|
php artisan backend:sync-data-pool --incremental
|
||
|
|
```
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Problem: "SQLSTATE[42P01]: Undefined table"
|
||
|
|
|
||
|
|
**Lösung:** Migration wurde nicht ausgeführt oder fehlgeschlagen.
|
||
|
|
```bash
|
||
|
|
php artisan migrate:status
|
||
|
|
php artisan migrate --force
|
||
|
|
```
|
||
|
|
|
||
|
|
### Problem: "Connection refused" oder Connection Error
|
||
|
|
|
||
|
|
**Lösung:** Prüfe .env Datei:
|
||
|
|
```bash
|
||
|
|
DB_CONNECTION2=pgsql
|
||
|
|
DB_HOST2=127.0.0.1
|
||
|
|
DB_PORT2=5433
|
||
|
|
DB_DATABASE2=risk_ingest_db
|
||
|
|
DB_USERNAME2=risk_ingest_user
|
||
|
|
DB_PASSWORD2=S0prast3r1a
|
||
|
|
```
|
||
|
|
|
||
|
|
Teste Verbindung:
|
||
|
|
```bash
|
||
|
|
psql -h 127.0.0.1 -p 5433 -U risk_ingest_user -d risk_ingest_db
|
||
|
|
```
|
||
|
|
|
||
|
|
### Problem: "schema backend does not exist"
|
||
|
|
|
||
|
|
**Lösung:** Backend Schema fehlt. Erstelle es:
|
||
|
|
```sql
|
||
|
|
CREATE SCHEMA IF NOT EXISTS backend;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Problem: Job läuft sehr lange
|
||
|
|
|
||
|
|
**Lösung:** Nutze kleinere Batch Size oder Queue:
|
||
|
|
```bash
|
||
|
|
# Kleinere Batches
|
||
|
|
php artisan backend:sync-data-pool --full --batch-size=100
|
||
|
|
|
||
|
|
# Oder mit Queue (asynchron)
|
||
|
|
php artisan backend:sync-data-pool --full --queue
|
||
|
|
```
|
||
|
|
|
||
|
|
## Performance Optimization
|
||
|
|
|
||
|
|
### Für große Datenmengen:
|
||
|
|
|
||
|
|
1. **Nutze Queue:**
|
||
|
|
```bash
|
||
|
|
php artisan backend:sync-data-pool --full --queue
|
||
|
|
php artisan queue:work
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **Optimiere Batch Size:**
|
||
|
|
```bash
|
||
|
|
# Für viele Datensätze
|
||
|
|
php artisan backend:sync-data-pool --full --batch-size=5000
|
||
|
|
|
||
|
|
# Für wenig RAM
|
||
|
|
php artisan backend:sync-data-pool --full --batch-size=100
|
||
|
|
```
|
||
|
|
|
||
|
|
3. **Schedule für regelmäßige Syncs:**
|
||
|
|
|
||
|
|
Füge in `routes/console.php` hinzu:
|
||
|
|
```php
|
||
|
|
use App\Jobs\SyncBackendDataPool;
|
||
|
|
use Illuminate\Support\Facades\Schedule;
|
||
|
|
|
||
|
|
// Täglich um 2 Uhr incremental
|
||
|
|
Schedule::job(new SyncBackendDataPool(fullSync: false))
|
||
|
|
->dailyAt('02:00');
|
||
|
|
|
||
|
|
// Sonntags um 3 Uhr full sync
|
||
|
|
Schedule::job(new SyncBackendDataPool(fullSync: true))
|
||
|
|
->weeklyOn(0, '03:00');
|
||
|
|
```
|
||
|
|
|
||
|
|
Dann starte den Scheduler:
|
||
|
|
```bash
|
||
|
|
php artisan schedule:work
|
||
|
|
```
|
||
|
|
|
||
|
|
## Monitoring
|
||
|
|
|
||
|
|
### Logs prüfen:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
tail -f storage/logs/laravel.log
|
||
|
|
```
|
||
|
|
|
||
|
|
### SQL Queries für Monitoring:
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Letzte Sync Zeit
|
||
|
|
SELECT MAX(synced_at) FROM public.backend_data_pool;
|
||
|
|
|
||
|
|
-- Anzahl Datensätze pro Status
|
||
|
|
SELECT status, COUNT(*)
|
||
|
|
FROM public.backend_data_pool
|
||
|
|
GROUP BY status;
|
||
|
|
|
||
|
|
-- Anzahl Datensätze pro corporate_entity (Top 10)
|
||
|
|
SELECT corporate_entity, COUNT(*) as transaction_count
|
||
|
|
FROM public.backend_data_pool
|
||
|
|
GROUP BY corporate_entity
|
||
|
|
ORDER BY transaction_count DESC
|
||
|
|
LIMIT 10;
|
||
|
|
|
||
|
|
-- Durchschnittlicher Transaktionsbetrag
|
||
|
|
SELECT AVG(tx_amount) as avg_amount
|
||
|
|
FROM public.backend_data_pool;
|
||
|
|
```
|
||
|
|
|
||
|
|
## Nächste Schritte
|
||
|
|
|
||
|
|
Nach erfolgreichem Sync kannst du mit **Stufe 2** weitermachen:
|
||
|
|
- Transformation der Daten in `public.companies` und `public.transactions`
|
||
|
|
- Mit KYC Risk Level Berechnung
|
||
|
|
- Automatisches Enrichment der Companies
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Bei Fragen oder Problemen, prüfe die Logs in `storage/logs/laravel.log`**
|