- Execute all 6 migrations on Desk CRM production database - Create missing tables: cr_lsps, cr_agent_lsps, cr_lsp_usage - Create archive tables: cr_*_usage_archive (4 tables) - Create system tables: cr_migrations, cr_maintenance_log - Make all scripts executable (chmod +x) - Total cr_* tables: 38 Migration files: - 001_initial_schema.sql - 002_add_lsps.sql - 003_add_relationships.sql - 004_add_telemetry.sql - 005_add_archive_tables.sql - 006_add_maintenance_log.sql Scripts: - session-init.sh, session-end.sh - inject-context.sh, inject-agent-context.sh - record-usage.sh, db-backup.sh, sync-to-mysql.sh Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
225 lines
9.7 KiB
Markdown
225 lines
9.7 KiB
Markdown
---
|
|
name: db-archive
|
|
description: >
|
|
Archiving de dados de telemetria antigos.
|
|
Move registos >90 dias para tabelas _archive.
|
|
argument-hint: "[--days=N] [--table=X] [--dry-run] [--delete-archived]"
|
|
---
|
|
|
|
# /descomplicar:db-archive
|
|
|
|
Move dados de telemetria antigos para tabelas de arquivo, mantendo as tabelas principais optimizadas.
|
|
|
|
## Objectivo
|
|
|
|
Mover registos de telemetria antigos (>90 dias) para tabelas _archive, mantendo as tabelas activas optimizadas.
|
|
|
|
## Sintaxe
|
|
|
|
```
|
|
/descomplicar:db-archive [options]
|
|
```
|
|
|
|
| Opção | Descrição | Default |
|
|
|-------|-----------|---------|
|
|
| `--days=N` | Arquivar registos com mais de N dias | 90 |
|
|
| `--table=X` | Arquivar apenas tabela específica | todas |
|
|
| `--dry-run` | Mostrar o que seria arquivado sem executar | false |
|
|
| `--delete-archived` | Apagar dados arquivados (após backup) | false |
|
|
| `--force` | Não pedir confirmação | false |
|
|
|
|
## Output Esperado
|
|
|
|
```
|
|
╔════════════════════════════════════════════════════════════╗
|
|
║ DB ARCHIVE ║
|
|
╠════════════════════════════════════════════════════════════╣
|
|
║ Threshold: 90 dias ║
|
|
║ cr_agent_usage: 15.234 → archive ✓ ║
|
|
║ cr_skill_usage: 22.456 → archive ✓ ║
|
|
║ cr_mcp_tool_usage: 8.901 → archive ✓ ║
|
|
╠════════════════════════════════════════════════════════════╣
|
|
║ TOTAL ARCHIVED: 46.591 registos | ~6.9 MB libertados ║
|
|
╚════════════════════════════════════════════════════════════╝
|
|
```
|
|
|
|
## Tabelas de Telemetria
|
|
|
|
| Tabela Activa | Tabela Archive | Critério |
|
|
|---------------|----------------|----------|
|
|
| `cr_agent_usage` | `cr_agent_usage_archive` | created_at < N dias |
|
|
| `cr_skill_usage` | `cr_skill_usage_archive` | created_at < N dias |
|
|
| `cr_mcp_tool_usage` | `cr_mcp_tool_usage_archive` | created_at < N dias |
|
|
| `cr_lsp_usage` | `cr_lsp_usage_archive` | created_at < N dias |
|
|
|
|
## Workflow
|
|
|
|
```
|
|
1. VERIFICAR tabelas archive existem (criar se necessário)
|
|
2. CONTAR registos a arquivar
|
|
3. MOSTRAR resumo ao utilizador
|
|
4. COPIAR para tabelas _archive
|
|
5. VERIFICAR integridade (count match)
|
|
6. ELIMINAR da tabela principal
|
|
7. REGISTAR em cr_maintenance_log
|
|
```
|
|
|
|
## Exemplos
|
|
|
|
### Dry-run (ver sem executar)
|
|
```bash
|
|
/descomplicar:db-archive --dry-run
|
|
```
|
|
|
|
Output:
|
|
```
|
|
╔════════════════════════════════════════════════════════════════╗
|
|
║ DB ARCHIVE - DRY RUN ║
|
|
╠════════════════════════════════════════════════════════════════╣
|
|
║ Threshold: 90 dias (antes de 2025-11-06) ║
|
|
╠════════════════════════════════════════════════════════════════╣
|
|
║ Tabela Registos Oldest Size ║
|
|
║ ─────────────────────────────────────────────────────────────║
|
|
║ cr_agent_usage 15.234 2025-08-15 2.1 MB ║
|
|
║ cr_skill_usage 22.456 2025-08-20 3.4 MB ║
|
|
║ cr_mcp_tool_usage 8.901 2025-09-01 1.2 MB ║
|
|
║ cr_lsp_usage 1.234 2025-10-15 0.2 MB ║
|
|
╠════════════════════════════════════════════════════════════════╣
|
|
║ TOTAL: 47.825 registos | ~6.9 MB a arquivar ║
|
|
║ Executar sem --dry-run para arquivar ║
|
|
╚════════════════════════════════════════════════════════════════╝
|
|
```
|
|
|
|
### Archiving completo
|
|
```bash
|
|
/descomplicar:db-archive
|
|
```
|
|
|
|
Output:
|
|
```
|
|
╔════════════════════════════════════════════════════════════════╗
|
|
║ DB ARCHIVE ║
|
|
╠════════════════════════════════════════════════════════════════╣
|
|
║ Threshold: 90 dias ║
|
|
╠════════════════════════════════════════════════════════════════╣
|
|
║ cr_agent_usage ║
|
|
║ Copying to archive... 15.234 rows ✓ ║
|
|
║ Verifying integrity... match ✓ ║
|
|
║ Removing from active... 15.234 rows ✓ ║
|
|
║ ║
|
|
║ cr_skill_usage ║
|
|
║ Copying to archive... 22.456 rows ✓ ║
|
|
║ Verifying integrity... match ✓ ║
|
|
║ Removing from active... 22.456 rows ✓ ║
|
|
║ ║
|
|
║ cr_mcp_tool_usage ║
|
|
║ Copying to archive... 8.901 rows ✓ ║
|
|
║ Verifying integrity... match ✓ ║
|
|
║ Removing from active... 8.901 rows ✓ ║
|
|
║ ║
|
|
║ cr_lsp_usage ║
|
|
║ Copying to archive... 1.234 rows ✓ ║
|
|
║ Verifying integrity... match ✓ ║
|
|
║ Removing from active... 1.234 rows ✓ ║
|
|
╠════════════════════════════════════════════════════════════════╣
|
|
║ TOTAL ARCHIVED: 47.825 registos ║
|
|
║ Space freed: ~6.9 MB ║
|
|
║ Status: ✓ SUCCESS ║
|
|
╚════════════════════════════════════════════════════════════════╝
|
|
```
|
|
|
|
### Arquivar com threshold diferente
|
|
```bash
|
|
/descomplicar:db-archive --days=30
|
|
```
|
|
|
|
### Apenas uma tabela
|
|
```bash
|
|
/descomplicar:db-archive --table=cr_agent_usage
|
|
```
|
|
|
|
### Apagar dados muito antigos do archive
|
|
```bash
|
|
/descomplicar:db-archive --delete-archived --days=365
|
|
```
|
|
|
|
**Atenção**: `--delete-archived` apaga permanentemente dados com mais de N dias das tabelas _archive. Backup recomendado antes.
|
|
|
|
## SQL Executado
|
|
|
|
```sql
|
|
-- 1. Criar tabela archive se não existir
|
|
CREATE TABLE IF NOT EXISTS cr_agent_usage_archive LIKE cr_agent_usage;
|
|
|
|
-- 2. Contar registos a arquivar
|
|
SELECT COUNT(*) FROM cr_agent_usage
|
|
WHERE created_at < DATE_SUB(NOW(), INTERVAL 90 DAY);
|
|
|
|
-- 3. Copiar para archive
|
|
INSERT INTO cr_agent_usage_archive
|
|
SELECT * FROM cr_agent_usage
|
|
WHERE created_at < DATE_SUB(NOW(), INTERVAL 90 DAY);
|
|
|
|
-- 4. Verificar integridade
|
|
SELECT
|
|
(SELECT COUNT(*) FROM cr_agent_usage_archive
|
|
WHERE created_at < DATE_SUB(NOW(), INTERVAL 90 DAY)) as archived,
|
|
@expected_count as expected;
|
|
|
|
-- 5. Remover da tabela activa
|
|
DELETE FROM cr_agent_usage
|
|
WHERE created_at < DATE_SUB(NOW(), INTERVAL 90 DAY);
|
|
|
|
-- 6. Registar operação
|
|
INSERT INTO cr_maintenance_log (operation, table_name, rows_affected, details)
|
|
VALUES ('archive', 'cr_agent_usage', @row_count, JSON_OBJECT(
|
|
'threshold_days', 90,
|
|
'archived_to', 'cr_agent_usage_archive',
|
|
'oldest_record', @oldest_date
|
|
));
|
|
```
|
|
|
|
## Políticas de Retenção
|
|
|
|
| Dados | Activo | Archive | Total |
|
|
|-------|--------|---------|-------|
|
|
| Telemetria diária | 90 dias | 1 ano | 15 meses |
|
|
| Métricas agregadas | Sempre | - | Ilimitado |
|
|
| Logs manutenção | 1 ano | 2 anos | 3 anos |
|
|
|
|
## Automação Sugerida
|
|
|
|
### Hook Stop (diário)
|
|
```json
|
|
{
|
|
"hooks": {
|
|
"Stop": [{
|
|
"type": "command",
|
|
"command": "/descomplicar:db-archive --days=90 --force",
|
|
"condition": "daily"
|
|
}]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Cron Semanal
|
|
```bash
|
|
# Arquivar telemetria > 90 dias todos os domingos
|
|
0 3 * * 0 claude /descomplicar:db-archive --force
|
|
```
|
|
|
|
## Integração
|
|
|
|
- **Skill**: db-maintenance-manager
|
|
- **MCP**: desk-crm-v3
|
|
- **Relacionado**:
|
|
- /descomplicar:db-backup (antes de delete-archived)
|
|
- /descomplicar:telemetry (fonte dos dados)
|
|
|
|
## Segurança
|
|
|
|
- Dados são MOVIDOS, não apagados (excepto --delete-archived)
|
|
- Verificação de integridade antes de DELETE
|
|
- Rollback automático se count mismatch
|
|
- Log completo em cr_maintenance_log
|