# 🔄 Sistema de Migração MySQL

## 📋 Descrição

Sistema profissional em PHP para migração de bancos de dados MySQL grandes entre servidores, com processamento em lotes e sistema de retomada automática.

## ✨ Características

- ✅ **Migração em Lotes**: Processa dados em chunks de 1.000 registros (configurável)
- ✅ **Retomada Automática**: Salva progresso em JSON para continuar após quedas
- ✅ **Não Destrutivo**: Apenas leitura no banco de origem
- ✅ **Interface Web**: HTML simples e funcional com progresso em tempo real
- ✅ **Logs Detalhados**: Registro completo de todas as operações
- ✅ **Teste de Conexões**: Valida antes de iniciar
- ✅ **PDO com Prepared Statements**: Segurança contra SQL Injection
- ✅ **Tratamento de Erros**: Robusto contra timeout e memory limit

## 📦 Requisitos

- PHP 7.4 ou superior
- Extensão PDO MySQL habilitada
- Permissões de leitura no servidor de origem
- Permissões de escrita no servidor de destino
- Memória recomendada: 512MB (configurável)

## 🚀 Instalação

1. **Copie o arquivo** `mysql_migration.php` para seu servidor web

2. **Configure permissões de escrita** na pasta onde o script está localizado:
   - O script cria automaticamente:
     - `migration_progress.json` (progresso)
     - `migration_log.txt` (log detalhado)

3. **Acesse via navegador**: `http://seu-servidor/mysql_migration.php`

## 📖 Como Usar

### Passo 1: Teste as Conexões

1. Preencha os dados do **Banco de Origem**:
   - Host (ex: `localhost` ou IP)
   - Usuário
   - Senha
   - Nome do banco

2. Clique em **"Testar Conexão Origem"**

3. Preencha os dados do **Banco de Destino**:
   - Host (ex: `localhost` ou IP)
   - Usuário
   - Senha
   - Nome do banco (será criado se não existir)

4. Clique em **"Testar Conexão Destino"**

### Passo 2: Inicie a Migração

1. Após ambas as conexões testadas com sucesso, o botão **"Iniciar Migração"** será habilitado

2. Clique em **"▶ Iniciar Migração"**

3. Acompanhe o progresso em tempo real:
   - Estatísticas: tabelas processadas, registros migrados
   - Barra de progresso por tabela
   - Log detalhado de operações

### Passo 3: Retomar (se necessário)

Se a migração for interrompida por qualquer motivo:

1. Recarregue a página
2. O sistema detectará progresso anterior
3. Clique em **"⏯ Retomar Migração"**
4. A migração continuará do ponto onde parou

## ⚙️ Configurações Avançadas

### Alterar Tamanho do Lote

Edite a linha 8 do arquivo PHP:

```php
define('BATCH_SIZE', 1000); // Registros por lote
```

**Recomendações**:
- Bancos pequenos: 2000-5000
- Bancos médios: 1000-2000
- Bancos grandes: 500-1000
- Conexão lenta: 100-500

### Aumentar Memória

Edite a linha 6 do arquivo PHP:

```php
ini_set('memory_limit', '512M'); // Aumentar se necessário
```

## 📊 Arquivos Gerados

### `migration_progress.json`
Armazena o progresso da migração:

```json
{
    "started": "2024-01-20 10:30:00",
    "tables": {
        "usuarios": {
            "offset": 5000,
            "total": 10000,
            "updated": "2024-01-20 10:35:00",
            "completed": false
        }
    }
}
```

### `migration_log.txt`
Log detalhado de todas as operações:

```
[2024-01-20 10:30:00] Conexões estabelecidas
[2024-01-20 10:30:05] Tabela usuarios criada
[2024-01-20 10:35:00] Tabela usuarios migrada: 10000/10000 registros
```

## 🔒 Segurança

✅ **PDO com Prepared Statements**: Proteção contra SQL Injection
✅ **Somente Leitura no Origem**: Não altera dados originais
✅ **Validação de Conexões**: Testa antes de iniciar
✅ **Transações**: Rollback automático em caso de erro
✅ **UTF-8 MB4**: Suporte completo a caracteres especiais

## 🐛 Solução de Problemas

### Erro: "Maximum execution time exceeded"

**Solução**: O script já configura `set_time_limit(0)`. Se persistir, configure no `php.ini`:

```ini
max_execution_time = 0
```

### Erro: "Allowed memory size exhausted"

**Solução**: Aumente o `memory_limit` no script ou no `php.ini`:

```ini
memory_limit = 1024M
```

### Erro: "Access denied for user"

**Solução**: Verifique:
- Usuário e senha corretos
- Permissões do usuário no MySQL
- Host correto (localhost vs 127.0.0.1)

### Tabelas não aparecem

**Solução**: Verifique:
- Permissão `SELECT` no banco origem
- Nome do banco está correto
- Banco contém tabelas

### Migração travou/parou

**Solução**:
1. Verifique o arquivo `migration_log.txt`
2. Recarregue a página
3. Clique em "Retomar Migração"
4. O sistema continuará automaticamente

## 📝 Exemplo de Uso

```
1. Banco Origem:
   - Host: servidor-antigo.com
   - Usuário: root
   - Senha: ********
   - Banco: loja_antiga

2. Banco Destino:
   - Host: servidor-novo.com
   - Usuário: admin
   - Senha: ********
   - Banco: loja_nova

3. Resultado:
   ✅ 50 tabelas migradas
   ✅ 2.500.000 registros transferidos
   ✅ Tempo: 15 minutos
   ✅ 0 erros
```

## 🎯 Boas Práticas

1. **Faça backup** antes de iniciar qualquer migração
2. **Teste em ambiente de desenvolvimento** primeiro
3. **Monitore o log** durante a migração
4. **Verifique os dados** após a conclusão
5. **Mantenha os arquivos de progresso** até confirmar sucesso

## 🔍 Verificação Pós-Migração

Execute estas queries para validar:

```sql
-- Contar tabelas
SELECT COUNT(*) FROM information_schema.tables 
WHERE table_schema = 'nome_banco';

-- Comparar quantidade de registros
SELECT table_name, table_rows 
FROM information_schema.tables 
WHERE table_schema = 'nome_banco'
ORDER BY table_name;
```

## 📞 Informações Adicionais

- **Versão**: 1.0
- **Autor**: Sistema CliqueDB
- **PHP**: 7.4+
- **MySQL**: 5.7+
- **Charset**: UTF8MB4

## ⚠️ Avisos Importantes

- ❗ Não feche o navegador durante a migração ativa
- ❗ Mantenha conexão estável com a internet
- ❗ Certifique-se de ter espaço suficiente no destino
- ❗ O banco de origem não será alterado (apenas leitura)
- ❗ Tabelas existentes no destino serão recriadas

## 🎉 Sucesso!

Após a conclusão, você verá:
- ✅ Progresso: 100%
- ✅ Todas as tabelas marcadas como concluídas
- ✅ Log final com resumo da migração

---

**Desenvolvido para migração segura e confiável de bancos MySQL** 🚀
