4.6 KiB
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:
- Restaurar o backup:
cp data/yasuc.db.backup.* data/yasuc.db - Reverter o código para a versão anterior
- Reconstruir o container
Vantagens do SQLite3 com IDs Curtos
-
URLs mais amigáveis: Fáceis de compartilhar e digitar
-
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; -
Backup mais simples: Um único arquivo
-
Ferramentas de administração: SQLite Browser, DBeaver, etc.
-
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
maxAttemptsno código se necessário
Performance lenta
- Considere adicionar índices se necessário
- Verifique se o volume Docker está configurado corretamente