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