Ferramenta em PHP para gerar backups completos de bancos MySQL/MariaDB em formato SQL, pensada para rodar em ambientes containerizados (Docker) com Apache e estrutura web mínima (front controller + controllers).
O projeto exporta a estrutura (CREATE TABLE) e os dados (INSERT) de todas as tabelas do banco configurado, gravando um arquivo .sql datado no diretório de execução.
- Visão geral
- Funcionalidades
- Requisitos
- Instalação
- Execução com Docker
- Configuração do banco
- Como funciona o backup
- Roteamento web
- Estrutura do projeto
- Autor
Este repositório combina:
- Motor de backup — conexão via PDO, leitura de metadados (
SHOW TABLES,SHOW CREATE TABLE) e dump linha a linha comINSERT. - Camada web leve — roteamento por URL amigável (
.htaccess→index.php), resolução dinâmica de controllers e página 404. - Empacotamento Docker — imagem
php:7.4-apachecom extensõespdo_mysqlezip, Composer emod_rewritehabilitado.
Ideal para estudos, protótipos ou integração em pipelines onde um container PHP precisa disparar dumps SQL de forma programática.
| Recurso | Descrição |
|---|---|
| Dump SQL completo | Gera arquivo AAAA-MM-DD.sql com DDL e DML |
| Todas as tabelas | Itera SHOW TABLES e processa cada tabela |
| PDO + MySQL | Conexão nativa com pdo_mysql |
| Roteamento MVC simples | Controllers em App\Web\Controllers\ |
| Docker pronto | Dockerfile e configuração Apache incluídos |
| Autoload PSR-4 | Namespace App\ mapeado para src/ via Composer |
Fluxo web atual: index.php instancia Application, chama run() → setApp() resolve o controller pela URL → HomeController::index() (ou 404).
Fluxo de backup: implementado em Application::boot() — conecta ao banco, cria o arquivo SQL e grava CREATE TABLE + INSERT por tabela. Para executar o backup hoje, é necessário invocar boot() explicitamente (por exemplo, estendendo run(), criando um controller dedicado ou um script CLI).
- PHP 7.4+ (compatível com a imagem Docker do projeto)
- Extensão pdo_mysql
- Composer
- Servidor web com mod_rewrite (Apache recomendado) ou equivalente
- MySQL ou MariaDB acessível a partir do host/container
- Docker Engine
- (Opcional) Docker Compose, se você orquestrar o banco em outro serviço na mesma rede
Clone o repositório e instale as dependências do Composer (autoload PSR-4):
git clone https://github.com/pedromoreira49/backup-database-php.git
cd backup-database-php
composer installNo Apache, aponte o DocumentRoot para a raiz do projeto e garanta que AllowOverride All esteja ativo para o .htaccess funcionar.
docker build -t backup-database-php .docker run -d -p 8080:80 --name backup-app backup-database-phpA aplicação ficará disponível em http://localhost:8080.
Rede com o banco: o
Dockerfilenão inclui MySQL. O host do banco emApplication.php(HOST) deve ser o IP/hostname do container MySQL na rede Docker (ex.: nome do serviço no Compose) ouhost.docker.internalno Windows/macOS para um banco na máquina host.
Hoje as credenciais estão definidas como constantes em src/Web/Application.php:
define('HOST', '172.17.0.3');
define('DB', 'testes');
define('USER', 'dbuser');
define('PASS', 'newpassword');Ajuste esses valores antes do build ou monte um volume com o arquivo alterado. Para produção, recomenda-se migrar para variáveis de ambiente (.env) e nunca versionar senhas reais.
- Crie o banco e o usuário com permissão de leitura em todas as tabelas (
SELECT,SHOW VIEW, etc.). - Atualize
HOST,DB,USERePASSemApplication.php(ou na camada de configuração que você adotar). - Confirme conectividade a partir do container:
docker exec -it backup-app php -r "new PDO('mysql:host=SEU_HOST;dbname=SEU_DB', 'USER', 'PASS'); echo 'OK';"O fuso horário da aplicação está definido como America/Sao_Paulo em Application.php.
O método Application::boot() executa, em resumo:
- Abre conexão PDO com MySQL.
- Cria o arquivo
YYYY-MM-DD.sqlno diretório de trabalho atual. - Para cada tabela:
- Escreve comentário e
SHOW CREATE TABLE(DDL). - Seleciona todas as linhas e gera comandos
INSERTcom valores escapados viaPDO::quote.
- Escreve comentário e
- Fecha o arquivo e exibe mensagem de sucesso ou falha no output.
Exemplo de uso programático (após carregar o autoload):
<?php
require_once __DIR__ . '/vendor/autoload.php';
use App\Web\Application;
$app = new Application();
$app->boot();Saída esperada: arquivo 2026-05-18.sql (data do servidor) contendo blocos por tabela, por exemplo:
-- TABLE: usuarios
CREATE TABLE `usuarios` ( ... );
INSERT INTO `usuarios` (`id`,`nome`) VALUES ('1','Exemplo');O .htaccess redireciona URLs inexistentes para index.php?url=...:
| URL | Controller | Ação |
|---|---|---|
/ |
HomeController |
index() |
/qualquer-rota |
QualquerController se existir |
index() |
| Rota inexistente | — | View 404.php |
Convenção de classes: App\Web\Controllers\{Nome}Controller.
Exemplo atual da home: exibe Loading view — ponto de extensão para dashboard, agendamento ou download do último backup.
backup-database-php/
├── config/
│ └── apache.conf # Virtual host / PHP no container
├── src/
│ └── Web/
│ ├── Application.php # Bootstrap, rotas e lógica de backup
│ ├── Controllers/
│ │ └── HomeController.php
│ └── Views/
│ └── pages/
│ └── 404.php
├── index.php # Front controller
├── .htaccess # Rewrite rules
├── composer.json # PSR-4: App\ → src/
├── Dockerfile
├── .dockerignore
└── README.md
Pedro Moreira