7.2 KiB
7.2 KiB
Guia de Migração via Arquivo SQL
Visão Geral
Este guia descreve como migrar dados do BoltDB para SQLite3 usando arquivos SQL com comandos INSERT. Esta abordagem oferece mais controle e transparência no processo de migração.
Vantagens da Migração via SQL
- Transparência: Você pode ver exatamente quais dados serão migrados
- Controle: Pode editar o arquivo SQL antes de aplicar
- Reversibilidade: Pode aplicar a migração múltiplas vezes
- Auditoria: Arquivo SQL serve como log da migração
- Flexibilidade: Pode aplicar em diferentes bancos
Processo de Migração
Passo 1: Gerar Arquivo SQL
Windows (PowerShell)
# Executar script de migração
powershell -ExecutionPolicy Bypass -File scripts/migrate-to-sql.ps1
Linux/Mac (Bash)
# Tornar script executável
chmod +x scripts/migrate-to-sql.sh
# Executar script de migração
./scripts/migrate-to-sql.sh
Manual (Go)
# Compilar e executar manualmente
go build -o migrate-to-sql cmd/migrate-to-sql/main.go
./migrate-to-sql -bolt data/yasuc.db -output data/migration.sql
Passo 2: Verificar Arquivo SQL
O arquivo gerado terá a estrutura:
-- Script de migração do BoltDB para SQLite3
-- Gerado automaticamente em 29/08/2025 09:34:37
-- Criar tabela se não existir
CREATE TABLE IF NOT EXISTS pastes (
short_id TEXT PRIMARY KEY,
content TEXT NOT NULL,
content_hash TEXT NOT NULL,
created_at INTEGER NOT NULL
);
-- Criar índices
CREATE INDEX IF NOT EXISTS idx_pastes_content_hash ON pastes(content_hash);
CREATE INDEX IF NOT EXISTS idx_pastes_created_at ON pastes(created_at);
-- Inserir dados migrados
INSERT OR IGNORE INTO pastes (short_id, content, content_hash, created_at) VALUES ('HNlNSpd', 'conteúdo do paste...', 'hash_sha256', 1756470877);
-- Resumo da migração:
-- Total de pastes processados: 80
-- Pastes únicos inseridos: 80
-- Duplicatas ignoradas: 0
-- Arquivo gerado em: 29/08/2025 09:34:37
Passo 3: Aplicar Migração
Windows (PowerShell)
# Aplicar migração automática (usa arquivo mais recente)
powershell -ExecutionPolicy Bypass -File scripts/apply-migration.ps1
# Ou especificar arquivo específico
powershell -ExecutionPolicy Bypass -File scripts/apply-migration.ps1 "data/migration_20250829_093437.sql"
Linux/Mac (Bash)
# Tornar script executável
chmod +x scripts/apply-migration.sh
# Aplicar migração automática
./scripts/apply-migration.sh
# Ou especificar arquivo específico
./scripts/apply-migration.sh data/migration_20250829_093437.sql
Manual (SQLite3)
# Aplicar diretamente com sqlite3
sqlite3 data/yasuc.sqlite3 < data/migration_20250829_093437.sql
Estrutura do Arquivo SQL
Cabeçalho
- Comentários com data/hora de geração
- Comandos CREATE TABLE e CREATE INDEX
- Instruções de uso
Dados Migrados
- Comandos INSERT OR IGNORE para cada paste
- IDs curtos únicos gerados automaticamente
- Hash SHA-256 para detecção de duplicatas
- Timestamp de criação
Resumo
- Estatísticas da migração
- Contadores de pastes processados
- Informações sobre duplicatas
Características da Migração
Geração de IDs Curtos
- 7 caracteres: Letras maiúsculas, minúsculas e números
- Únicos: Verificação contra IDs já utilizados
- Aleatórios: Geração não sequencial
Detecção de Duplicatas
- Hash SHA-256: Calculado do conteúdo de cada paste
- Mapeamento: Hash → ID curto para pastes idênticos
- Ignorar: Duplicatas não geram novos INSERTs
Tratamento de Conteúdo
- Escape de aspas: Aspas simples escapadas para SQL
- Preservação: Conteúdo original mantido intacto
- Encoding: Suporte a caracteres especiais
Verificação da Migração
Verificar Estatísticas
-- Contar total de pastes
SELECT COUNT(*) FROM pastes;
-- Verificar tamanho total
SELECT SUM(LENGTH(content)) FROM pastes;
-- Verificar alguns pastes
SELECT short_id, substr(content, 1, 50) FROM pastes LIMIT 5;
Verificar Duplicatas
-- Verificar se há duplicatas por conteúdo
SELECT content_hash, COUNT(*) as count
FROM pastes
GROUP BY content_hash
HAVING count > 1;
Verificar Índices
-- Verificar índices criados
SELECT name, sql FROM sqlite_master WHERE type = 'index';
Troubleshooting
Problemas Comuns
Erro: "database is locked"
# Verificar se não há outro processo usando o banco
# Fechar aplicações que possam estar usando o SQLite3
Erro: "no such table"
# Verificar se o arquivo SQL contém CREATE TABLE
# Aplicar novamente o arquivo SQL
Erro: "disk full"
# Verificar espaço em disco
# Considerar limpar dados antigos antes da migração
Erro: "file too large"
# Dividir arquivo SQL em partes menores
# Usar streaming para arquivos muito grandes
Logs e Debugging
Verificar Progresso
# Verificar tamanho do arquivo SQL
ls -lh data/migration_*.sql
# Verificar conteúdo do arquivo
head -20 data/migration_*.sql
tail -10 data/migration_*.sql
Verificar Banco SQLite3
# Verificar integridade do banco
sqlite3 data/yasuc.sqlite3 "PRAGMA integrity_check;"
# Verificar estatísticas
sqlite3 data/yasuc.sqlite3 "SELECT COUNT(*) as total FROM pastes;"
Backup e Segurança
Backup Automático
- Scripts fazem backup automático do banco existente
- Arquivo de backup com timestamp
- Preservação de dados originais
Verificação de Integridade
# Verificar se backup foi criado
ls -la data/yasuc.sqlite3.backup.*
# Restaurar backup se necessário
cp data/yasuc.sqlite3.backup.* data/yasuc.sqlite3
Exemplos de Uso
Migração Completa
# 1. Gerar arquivo SQL
./scripts/migrate-to-sql.sh
# 2. Verificar arquivo gerado
head -20 data/migration_*.sql
# 3. Aplicar migração
./scripts/apply-migration.sh
# 4. Verificar resultado
sqlite3 data/yasuc.sqlite3 "SELECT COUNT(*) FROM pastes;"
Migração com Verificação
# 1. Gerar SQL
./scripts/migrate-to-sql.sh
# 2. Editar arquivo SQL se necessário
nano data/migration_*.sql
# 3. Aplicar com backup
./scripts/apply-migration.sh
# 4. Testar aplicação
./yasuc -db data/yasuc.sqlite3 -port 8080
Migração Incremental
# 1. Fazer backup do banco atual
cp data/yasuc.sqlite3 data/yasuc.sqlite3.backup
# 2. Gerar SQL apenas de novos dados
# (modificar script para filtrar por data)
# 3. Aplicar migração incremental
./scripts/apply-migration.sh
Considerações de Performance
Para Bancos Grandes
- Memória: Script usa memória proporcional ao número de pastes
- Tempo: Migração pode levar alguns minutos para bancos grandes
- Arquivo: Arquivo SQL pode ser muito grande
Otimizações
- Batch processing: Processar em lotes para bancos muito grandes
- Streaming: Usar streaming para evitar carregar tudo na memória
- Compression: Comprimir arquivo SQL se necessário
Próximos Passos
Após a migração bem-sucedida:
- Testar aplicação: Verificar se tudo funciona corretamente
- Verificar dados: Confirmar que todos os pastes foram migrados
- Limpar backups: Remover arquivos temporários se necessário
- Documentar: Registrar detalhes da migração