Skip to content

Latest commit

 

History

History
207 lines (142 loc) · 6.47 KB

File metadata and controls

207 lines (142 loc) · 6.47 KB

Backup Database PHP

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.


Sumário


Visão geral

Este repositório combina:

  1. Motor de backup — conexão via PDO, leitura de metadados (SHOW TABLES, SHOW CREATE TABLE) e dump linha a linha com INSERT.
  2. Camada web leve — roteamento por URL amigável (.htaccessindex.php), resolução dinâmica de controllers e página 404.
  3. Empacotamento Docker — imagem php:7.4-apache com extensões pdo_mysql e zip, Composer e mod_rewrite habilitado.

Ideal para estudos, protótipos ou integração em pipelines onde um container PHP precisa disparar dumps SQL de forma programática.


Funcionalidades

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).


Requisitos

Desenvolvimento local

  • 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

  • Docker Engine
  • (Opcional) Docker Compose, se você orquestrar o banco em outro serviço na mesma rede

Instalação

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 install

No Apache, aponte o DocumentRoot para a raiz do projeto e garanta que AllowOverride All esteja ativo para o .htaccess funcionar.


Execução com Docker

Build da imagem

docker build -t backup-database-php .

Run

docker run -d -p 8080:80 --name backup-app backup-database-php

A aplicação ficará disponível em http://localhost:8080.

Rede com o banco: o Dockerfile não inclui MySQL. O host do banco em Application.php (HOST) deve ser o IP/hostname do container MySQL na rede Docker (ex.: nome do serviço no Compose) ou host.docker.internal no Windows/macOS para um banco na máquina host.

Variáveis e credenciais

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.


Configuração do banco

  1. Crie o banco e o usuário com permissão de leitura em todas as tabelas (SELECT, SHOW VIEW, etc.).
  2. Atualize HOST, DB, USER e PASS em Application.php (ou na camada de configuração que você adotar).
  3. 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.


Como funciona o backup

O método Application::boot() executa, em resumo:

  1. Abre conexão PDO com MySQL.
  2. Cria o arquivo YYYY-MM-DD.sql no diretório de trabalho atual.
  3. Para cada tabela:
    • Escreve comentário e SHOW CREATE TABLE (DDL).
    • Seleciona todas as linhas e gera comandos INSERT com valores escapados via PDO::quote.
  4. 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');

Roteamento web

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.


Estrutura do projeto

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

Autor

Pedro Moreira