Files
pastebin/MIGRATION.md

4.6 KiB

Migração para SQLite3 com IDs Curtos

Este documento descreve como migrar o YASUC de BoltDB para SQLite3 com o novo sistema de IDs curtos.

Por que migrar para SQLite3 com IDs Curtos?

  • URLs mais amigáveis: IDs de 7 caracteres em vez de hashes SHA-256 de 64 caracteres
  • Melhor compatibilidade: SQLite3 é mais amplamente suportado
  • Ferramentas de administração: Mais ferramentas disponíveis para gerenciar dados
  • Consultas SQL: Possibilidade de fazer consultas complexas
  • Backup mais simples: Arquivo único mais fácil de fazer backup
  • Detecção de duplicatas: Pastes idênticos recebem o mesmo ID curto

Estrutura do Banco SQLite3

CREATE TABLE pastes (
    short_id TEXT PRIMARY KEY,      -- ID curto único (7 caracteres)
    content TEXT NOT NULL,          -- Conteúdo do paste
    content_hash TEXT NOT NULL,     -- Hash SHA-256 para detecção de duplicatas
    created_at INTEGER NOT NULL     -- Timestamp de criação
);

Sistema de IDs Curtos

Características:

  • 7 caracteres: Combinação de letras maiúsculas, minúsculas e números (a-z, A-Z, 0-9)
  • 62^7 possibilidades: Aproximadamente 3.5 trilhões de combinações únicas
  • Detecção de duplicatas: Pastes idênticos recebem o mesmo ID
  • Geração aleatória: IDs são gerados aleatoriamente para evitar previsibilidade

Exemplo de URLs:

  • Antes: http://localhost:8080/a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447
  • Agora: http://localhost:8080/Ly34kx3

Passos para Migração

1. Backup dos Dados Atuais

# Fazer backup do banco BoltDB atual
cp data/yasuc.db data/yasuc.db.backup.$(date +%Y%m%d_%H%M%S)

2. Executar Script de Migração

# Executar o script de migração automática
chmod +x scripts/migrate.sh
./scripts/migrate.sh

3. Migração Manual (Opcional)

Se você quiser migrar dados existentes do BoltDB para SQLite3:

# Compilar e executar o script de migração
go run cmd/migrate/main.go -bolt data/yasuc.db -sqlite data/yasuc.sqlite3

Nota: Durante a migração, cada paste do BoltDB receberá um novo ID curto. URLs antigas não funcionarão mais.

4. Testar a Aplicação

# Reconstruir e executar o container
docker-compose down
docker-compose up --build

Verificação da Migração

Verificar se o banco SQLite3 foi criado:

sqlite3 data/yasuc.sqlite3 ".tables"

Verificar estrutura da tabela:

sqlite3 data/yasuc.sqlite3 ".schema pastes"

Contar número de pastes:

sqlite3 data/yasuc.sqlite3 "SELECT COUNT(*) FROM pastes;"

Verificar IDs curtos gerados:

sqlite3 data/yasuc.sqlite3 "SELECT short_id, substr(content, 1, 50) FROM pastes LIMIT 5;"

Rollback (se necessário)

Se algo der errado, você pode voltar ao BoltDB:

  1. Restaurar o backup: cp data/yasuc.db.backup.* data/yasuc.db
  2. Reverter o código para a versão anterior
  3. Reconstruir o container

Vantagens do SQLite3 com IDs Curtos

  1. URLs mais amigáveis: Fáceis de compartilhar e digitar

  2. Consultas SQL: Você pode fazer consultas como:

    -- Encontrar pastes criados hoje
    SELECT * FROM pastes WHERE date(created_at, 'unixepoch') = date('now');
    
    -- Encontrar pastes maiores que 1KB
    SELECT short_id, length(content) as size FROM pastes WHERE length(content) > 1024;
    
    -- Verificar duplicatas
    SELECT content_hash, COUNT(*) as count FROM pastes GROUP BY content_hash HAVING count > 1;
    
  3. Backup mais simples: Um único arquivo

  4. Ferramentas de administração: SQLite Browser, DBeaver, etc.

  5. Melhor performance: Para consultas complexas

Notas Importantes

  • URLs antigas não funcionam: Pastes migrados terão novos IDs curtos
  • Detecção de duplicatas: Pastes idênticos recebem o mesmo ID
  • Tamanho máximo: O tamanho máximo de paste (4MB) permanece inalterado
  • Compatibilidade: A API permanece a mesma, apenas os IDs mudaram

Troubleshooting

Erro: "database is locked"

  • Verifique se não há outro processo usando o banco
  • Reinicie o container: docker-compose restart

Erro: "no such table"

  • Execute o script de migração novamente
  • Verifique se o arquivo SQLite3 foi criado corretamente

Erro: "não foi possível gerar um ID único"

  • Extremamente raro, mas pode acontecer se houver muitas colisões
  • O sistema tenta 100 vezes antes de falhar
  • Considere aumentar o maxAttempts no código se necessário

Performance lenta

  • Considere adicionar índices se necessário
  • Verifique se o volume Docker está configurado corretamente