Files
AFC-Demo/SYNC_MIGRATION_INSTRUCTIONS.md
T

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`**