77 Zeilen
2.2 KiB
Markdown
77 Zeilen
2.2 KiB
Markdown
# License Heartbeats Partition Management
|
|
|
|
## Overview
|
|
|
|
The `license_heartbeats` table uses PostgreSQL partitioning to efficiently store and query time-series data. Each partition contains data for one month.
|
|
|
|
## Problem
|
|
|
|
The monitoring dashboard may fail with "relation does not exist" errors when:
|
|
1. The current month's partition hasn't been created
|
|
2. The license_heartbeats table hasn't been properly initialized
|
|
|
|
## Solution
|
|
|
|
### Automatic Partition Creation
|
|
|
|
The monitoring routes now automatically:
|
|
1. Check if the `license_heartbeats` table exists
|
|
2. Create missing partitions for the current month
|
|
3. Handle missing table/partition gracefully by returning empty data
|
|
|
|
### Manual Partition Creation
|
|
|
|
If needed, you can manually create partitions:
|
|
|
|
1. **Using the migration script:**
|
|
```bash
|
|
docker exec -it v2_adminpanel python apply_partition_migration.py
|
|
```
|
|
|
|
2. **Using SQL directly:**
|
|
```sql
|
|
-- Create June 2025 partition
|
|
CREATE TABLE IF NOT EXISTS license_heartbeats_2025_06 PARTITION OF license_heartbeats
|
|
FOR VALUES FROM ('2025-06-01') TO ('2025-07-01');
|
|
```
|
|
|
|
### Partition Naming Convention
|
|
|
|
Partitions follow the naming pattern: `license_heartbeats_YYYY_MM`
|
|
|
|
Examples:
|
|
- `license_heartbeats_2025_01` - January 2025
|
|
- `license_heartbeats_2025_06` - June 2025
|
|
- `license_heartbeats_2025_12` - December 2025
|
|
|
|
### Best Practices
|
|
|
|
1. **Pre-create partitions**: Create partitions for the next 6 months to avoid runtime issues
|
|
2. **Monitor partition usage**: Check which partitions exist regularly
|
|
3. **Archive old data**: Consider dropping very old partitions to save space
|
|
|
|
### Troubleshooting
|
|
|
|
If you see "relation does not exist" errors:
|
|
|
|
1. Check if the base table exists:
|
|
```sql
|
|
SELECT EXISTS (
|
|
SELECT 1 FROM information_schema.tables
|
|
WHERE table_name = 'license_heartbeats'
|
|
);
|
|
```
|
|
|
|
2. List existing partitions:
|
|
```sql
|
|
SELECT tablename FROM pg_tables
|
|
WHERE tablename LIKE 'license_heartbeats_%'
|
|
ORDER BY tablename;
|
|
```
|
|
|
|
3. Create missing partition for current month:
|
|
```sql
|
|
-- Replace YYYY_MM with current year and month
|
|
CREATE TABLE IF NOT EXISTS license_heartbeats_YYYY_MM PARTITION OF license_heartbeats
|
|
FOR VALUES FROM ('YYYY-MM-01') TO ('YYYY-MM-01'::date + interval '1 month');
|
|
``` |