Backup do Banco Mysql pela Aplicação [RESOLVIDO]

(Carlos Simão) #1

Bom dia a todos,

Estou precisando desenvolver uma aplicação para o usuário/Administrador realizar backup do banco mysql do sistema.
Eu pensei em colocar na aplicação parâmetros com os dados do banco, e colocar um botão php que executasse um código que fizesse a cópia do banco, transforma em .sql e/ou .zip e salvar em determinada pasta, também definida nos parâmetros.

A questão é: estou precisando do código php que faz tal backup. Pesquisei na net encontrei alguns, testei, mas um o código dá INSERT INTO em cada registro, o backup fica cerca de 70% maior que o normal, estou tentando alterar o código. Outro não lê a nome do campo da chave primária aí na chave primária coloca sempre “id” e não os nomes das chaves que uso, consequentemente dá erro na importação.

Gostaria de saber se alguém tem uma solução de backup pela aplicação ou o código php que eu possa usar.

Desde já obrigado

(Carlos Simão) #2

Alguém…?

(William .'.) #3

Amigo Carlos, tente o seguinte código :

$command = “/xampplite/mysql/bin/mysqldump --host=localhost --user=root --password= --databases test > /xampplite/mysql/bin/test.sql”;
system($command);

Você pode substituir as opções pelos parametros definidos, por exemplo:

$arq_bkp = “/xampplite/mysql/bin/teste_bkp.sql”;
$command = “/xampplite/mysql/bin/mysqldump --host=localhost --user=root --password= --databases test > $arq_bkp”;
system($command);

Lembre-se de testar também o restore, se não de nada adianta backup. =-)

William

(Carlos Simão) #4

William, muito obrigado.

Perfeito. Parabéns.

//-----Código original------
$arq_bkp = “/xampplite/mysql/bin/teste_bkp.sql”;
$command = “/xampplite/mysql/bin/mysqldump --host=localhost --user=root --password= --databases test > $arq_bkp”;
system($command);

Criei um botão php e no código fiz algumas alterações…

//-------Inclui os parâmetros do meu formulário, ficando assim----

$data = date(‘dmYHis’);
$origem = {bd_mysqldump}; //endereço do mysqldump no windows ou no linux
$destino = {bd_destino}; //pasta onde vai salvar EX.: C:/Backup/ ou /var/www/Backup/
$host = {bd_host};
$db = {bd_nome};
$user = {bd_user};
$pass = {bd_pass};

$arq_bkp = $destino.$db.’_’.$data.’.sql’; //Salva no destino com o nome do bd_data.sql
$command = “$origem --host=$host --user=$user --password=$pass --databases $db > $arq_bkp”;
system($command);

//----------

Fica aí a dica, para quem vier a precisar. Ahh…eu também testei restaurar, e está ok
Muito obrigado

(Reação Web) #5

Carlos Simão estou precisando desenvolver isso e tenho uma duvida, voce poderia me ajudar?

$origem = {bd_mysqldump}; //endereço do mysqldump no windows ou no linux

Como faço para saber o caminho no servidor linux ou windows? Voce teria um exemplo para eu me orientar por ele?

$host = {bd_host}; Seria por exemplo localhost ou o IP do servidor certo?
Vaaleu

(Carlos Simão) #6

Boa tarde

Quanto a $origem

O endereço do mysqldump eu conheço no Linux Slackware 12 seria /usr/bin/mysqldump muitas distribuições seque o mesmo padrão
No windows procura o arquivo na pasta onde está o mysql. Se foi instalado direto. Se foi com Xampp, Vampp ou outro pacote, normalmente dentro da pasta da instalação tem a pasta /mysql/bin/mysqldump
No windows tem que colocar o endereço completo ex. C:/xampp/mysql/bin/mysqldump

Quanto ao $host é isso mesmo. junto com usuário e senha ele faz a conexão com o bd para fazer a cópia. se for local ‘localhost’ ou externo o IP do servidor

Quando a cópia do arquivo de bachup eu fiz algumas alterações para transforma o arquivo .sql e sair zipado .zip


$data = date(‘dmY_His’);
$origem = {bd_dir_origem};
$dir = {bd_dir_destino};
$host = {bd_server};
$bd = {bd_bd};
$user = {bd_user};
$pass = {bd_pass};

$arq_bkp = $dir.$bd.’_’.$data.’.sql’;
$command = "$origem --host=$host --user=$user --password=$pass --databases $bd > $arq_bkp ";
system($command);

$nome = $dir.$bd.’_’.$data;
sc_zip_file("$arq_bkp", “$nome.zip”); //–Aqui gera o .zip a partir do .sql

unlink($arq_bkp); //–Aqui exclui o .sql


Se vc não precisar do .zip matém o código com antes

(Haroldo) #7

Uma das formas (automática) http://wiki.tecla.com.br/index.php?title=Backup_no_MySQL

utilizando php: http://www.vivaolinux.com.br/script/Backup-do-MySQL-via-PHP

utilizando php:

<?php $dbname = "seu database"; // coloque aqui seus parametros mysql_connect("localhost","root","") or die(mysql_error()); mysql_select_db($dbname) or die(mysql_error()); $back = fopen("script.sql","w"); // Pega a lista de todas as tabelas $res = mysql_list_tables($dbname) or die(mysql_error()); while ($row = mysql_fetch_row($res)) { $table = $row[0]; // cada uma das tabelas $res2 = mysql_query("SHOW CREATE TABLE $table"); while ( $lin = mysql_fetch_row($res2)){ // Para cada tabela fwrite($back,"-- Criando tabela : $table\n"); fwrite($back,"$lin[1]\n--Dump de Dados\n"); $res3 = mysql_query("SELECT * FROM $table"); while($r=mysql_fetch_row($res3)){ // Dump de todos os dados das tabelas $sql="INSERT INTO $table VALUES (""; $sql .= implode("","",$r); $sql .= "")\n"; fwrite($back,$sql); } } } fclose($back); ?>
(Reação Web) #8

vou testar e logo do um retorno!
Obrigado

(Reação Web) #9

ta dando erro nessa parte do script

$sql=“INSERT INTO $table VALUES (”";
$sql .= implode("","",$r);
$sql .= “”)\n";

não to conseguindo arrumar!

(Haroldo) #10

$sql=“INSERT INTO $table VALUES (”";
$sql .= implode("","",$r);
$sql .= “”)\n";

(Reação Web) #11

Funcionou, mas com um problema!
Onde o campo é foto, ele deforma todo o restante do código sql e não dá para restaurar!

Alguma alternativa?

o campo é longbob

(Haroldo) #12

Preciso estudar como proceder nesse caso, pois é um campo binario.

(Reação Web) #13

certo, qualquer posição me avisa por favor?
Obrigado!

(jcesarml) #14

Eu uso o programa phpmybackuppro, é perfeito, fiz algumas alterações nele, personalizei ele de acordo com as minhas necessidades, inclusive tem a opção de agendamentos…

Abraços

(Reação Web) #15

Resolvi, voce pode utilizar um programa do proprio mysql que é ótimo!
http://www.mysql.com/downloads/

Particularmente aqui ele exporto e restauro mais rápido que o phpmyadmin

(rrma) #16

Sei que é Off-Topic, mas vou postar minha solução.
Eu adotei uma solução um pouco diferente, mas meu server é linux (remoto, na locaweb).
Fiz um script bash que é executado pelo crontab toda noite.

Ele compacta os diretórios que considero principais no meu ‘www’ e exporta cada banco mysql individualmente para arquivos ‘.sql’
No final de tudo me manda um email com a lista de arquivos e tamanhos, espaço em disco atual e horários de início e fim e ainda anexa os backups de banco compactados, 1 por email.
Funciona há mais de 1 ano sem um erro sequer e totalmente automático.

No meu server local, configurado para 3 horas depois, outro script puxa tudo do server remoto, fazendo um segundo backup via rsync, dessa vez local.
Como eu sou paranóico, minha estação de trabalho (tb linux), puxa tudo do server local e extrai tudo, repondo todos os sistemas na ‘www’ e recarregando todos os bancos num mysql local.
Além de tudo eu salvo pastas como /etc, /home e /usr que tb transfiro toda noite.
Coisa de maluco.

Caso alguem se interesse, seguem uns exemplos (trechos), passei uns 15 dias moldando até que ficou ‘no grau’:

[i][size=8pt]INICIO="$(date +"%H:%M")"

rm /media/part10gb/rodrigo/sites/* -f
rm /media/part10gb/rodrigo/mysql/* -f
rm /backup/diretorio.txt
rm /backup/.gz -f
rm /backup/
.tar.gz -f
cd /backup/

#Compactando arquivos de configuracao do servidor
echo “Compactando diretorio usr” >> /backup/diretorio.txt
tar -zcf /media/part10gb/rodrigo/configuracoes_servidor/diretorio_usr.tar.gz /usr 2> /dev/null

echo “Compactando diretorio backup” >> /backup/diretorio.txt
tar -zcf /media/part10gb/rodrigo/configuracoes_servidor/diretorio_backup.tar.gz /backup 2> /dev/null

echo “Compactando diretorio home” >> /backup/diretorio.txt
tar -zcf /media/part10gb/rodrigo/configuracoes_servidor/diretorio_home.tar.gz /home 2> /dev/null

echo “Compactando diretorio etc” >> /backup/diretorio.txt
tar -zcf /media/part10gb/rodrigo/configuracoes_servidor/diretorio_etc.tar.gz /etc 2> /dev/null

Compactando sistemas

echo “Compactando site gcmweb” >> /backup/diretorio.txt
tar -zcf /backup/gcmweb.tar.gz /var/www/gcmweb 2> /dev/null

echo “Compactando site socorro” >> /backup/diretorio.txt
tar -zcf /backup/socorro.tar.gz /var/www/web 2> /dev/null

echo “Compactando site controle” > /backup/diretorio.txt
tar -zcf /backup/controle.tar.gz /var/www/controle 2> /dev/null

#Exportando e já compactando bancos
echo “Backup do banco gcmweb” >> /backup/diretorio.txt
mysqldump -u [glow=red,2,300]usuario[/glow] -p[glow=red,2,300]senha[/glow] -x -e -B [glow=red,2,300]nome_do_banco[/glow] | gzip > backup-[glow=red,2,300]nome_do_banco[/glow].sql.gz

echo “Backup do banco gcmsoft” >> /backup/diretorio.txt
mysqldump -u usuario -psenha -x -e -B gcmsoft | gzip > backup-gcmsoft.sql.gz

echo “Backup do banco scriptcase” >> /backup/diretorio.txt
mysqldump -uusuario -psenha -x -e -B scriptcase | gzip > backup-scriptcase.sql.gz # Aqui eu compacto até o banco do sc

echo “Organizando arquivos” >> /backup/diretorio.txt
mv /backup/.tar.gz /media/part10gb/rodrigo/sites >> /backup/diretorio.txt
mv /backup/backup
.gz /media/part10gb/rodrigo/mysql >> /backup/diretorio.txt
cd /backup

FIM="$(date +"%H:%M")"
echo “” >> diretorio.txt
ls -la * >> diretorio.txt
du -hsc /media/part10gb/rodrigo/* >> diretorio.txt

Enviado emails

mutt -s “Backup geral locaweb concluido. Inicio as $INICIO h e termino as $FIM h” rodrigo@meudominio.com.br < diretorio.txt

mutt -s “01 - Backup do banco mysql nomedobanco concluido. Inicio as $INICIO h e termino as $FIM h” rodrigo@meudominio.com.br < diretorio.txt -a /media/part10gb/rodrigo/mysql/backup-nomedobanco.sql.gz[/size][/i]

…vários emails, cada um com 1 anexo.
Além do backup no próprio servidor remoto, fica um no meu server local e outro na minha estação, fora os bancos no meu email, todo santo dia.

Windows, só as de casa mesmo, abertas por conta do calor! :slight_smile: