Fork me on GitHub
Você esta em:Home » Desenvolvimento » Criação de backups de banco de dados MySQL automáticamente

Criação de backups de banco de dados MySQL automáticamente

Saiba como criar uma regra de backup para seus SGBDs de forma automática e controlada.

Cada banco de dados precisa ser backupiado, e se você está fazendo isso manualmente, você pode parar porque há uma solução simples, utilizando PHP. Com este script você poderá passar uma tabela específica para backup ou escolher fazer o backup do banco de dados inteiro. Show né?

Atenção! Nunca deixe esse script visível na web, ou seja, coloque-o abaixo da pasta public-html ou numa pasta protegida!

Script backup.php que gera o backup do Mysql

 <?php
 backup_database_tables('HOST','USERNAME','PASSWORD','DATABASE', '*');

// backup the db function
 function backup_database_tables($host,$user,$pass,$name,$tables)
 {

$link = mysql_connect($host,$user,$pass);
 mysql_select_db($name,$link);

//get all of the tables
 if($tables == '*')
 {
 $tables = array();
 $result = mysql_query('SHOW TABLES');
 while($row = mysql_fetch_row($result))
 {
 $tables[] = $row[0];
 }
 }
 else
 {
 $tables = is_array($tables) ? $tables : explode(',',$tables);
 }

//cycle through each table and format the data
 foreach($tables as $table)
 {
 $result = mysql_query('SELECT * FROM '.$table);
 $num_fields = mysql_num_fields($result);

$return.= 'DROP TABLE '.$table.';';
 $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
 $return.= "\n\n".$row2[1].";\n\n";

for ($i = 0; $i < $num_fields; $i++)
 {
 while($row = mysql_fetch_row($result))
 {
 $return.= 'INSERT INTO '.$table.' VALUES(';
 for($j=0; $j<$num_fields; $j++)
 {
 $row[$j] = addslashes($row[$j]);
 $row[$j] = ereg_replace("\n","\\n",$row[$j]);
 if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
 if ($j<($num_fields-1)) { $return.= ','; }
 }
 $return.= ");\n";
 }
 }
 $return.="\n\n\n";
 }

//save the file
 $handle = fopen('db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+');
 fwrite($handle,$return);
 fclose($handle);
 }
 ?>

Bem agora toda vez que você entrar na pasta backup e clicar em backup.php será criado o backup na pasta corrente. O backup será sempre com o nome final do arquivo basedo na data e hora, assim você terá sempre o histórico de seus backups.

Eu recomendo baixar esses backups banco de dados periodicamente para que você tenha sempre uma cópia armazenada com segurança em outros lugares. Isso será necessário caso venha perder seu plano de hospedagem. Você pode também programar uma função que dispare um anexo do banco de dados criado sempre que entrar no arquivo backup.php

Outras formas de fazer Backup

Abaixo segue classe que cria o backup de forma automatizada, sem necessidade do uso do cron do linux e ainda envia email com o banco em anexo.

Sscript 01

Script 02

Obs: Seguindo esse modelo de utilização da Cron para realizar backup automatizado, dá também para mudar ele para automatizar envio de parametros por um webservice, sacou?

Aconselho também dar uma lida nos artigos:

E assim terminamos esse tutorial de automatização de backup! Espero ter ajudado!

Sobre o Autor

Designer, Web Developer & Linux Administrator

Meu nome é Deivison Arthur, tenho 29 anos, sou Administrador Linux, Analista de Sistema, Webdesigner e Pesquisador. há mais de dez anos. Nasci no Rio de Janeiro, atualmente trabalho como Gerente de Tecnologia e E-commerce at Grupo FFernandes e Freelancer nas horas vagas. Desenvolvimento em Joomla, Wordpress, Drupal, Magento e outros GPLs...

Quantidade de Artigos : 114

Comentários (9)

  • Anderson Bitencourt

    Bom dia, companheiro, achei seu script muito bom e creio que é o que preciso, mas ao colocá-lo em prática, ocorre que o arquivo gerado vem em branco, sem conteúdo, o que poderá ser?Grato desde já

    Responder
    • Deivison Arthur L. Serpa

      Boa tarde Anderson,

      Provavelmente você não esta tendo permissão de escrita nesse arquivo, verifique se ao acessar o script diretamente via browser ele dá algum erro de Permission denied.

      Talvez esse problema possa estar acontecendo devido o seu servidor não ter a permissão de escrita ao usuário do apache(Nobody), ou seja, o php utiliza o usuário nobody do grupo nobody para realizar a tarefas do tipo manipulação de arquivo(Ler, Escrever, Criar e Apagar)e outros. Com isso provavelmente seu usuário do Apache não esta conseguindo gravar nesse arquivo.

      você pode testar assim:

      if ((arquivo = fopen(“C:\\prototipoc\\prototipo.txt”,”r”))==NULL){
      printf(“Arquivo não pode ser lido”);
      }

      if ((arquivo = fopen(“C:\\prototipoc\\prototipo.txt”,”w”))==NULL){
      printf(“Arquivo não pode ser editado”);
      }

      A solução rápida seria dar chmod 777 na pasta para liberar todas as permissões ao usuário Nobody. Mas caso sua hospedagem seja num servidor compartilhado, ou seja, planos tipo da Locaweb, Hostdime,… que não são servidores Dedicados, VPS ou em Cloud. Ao se aplicar chmod 777 na pasta, você estará também abrindo uma brecha de segunça em seu script, pois dessa forma esta abrindo todas as permissão para todos os usuários e grupos desse servidor. Entendeu? Deixa eu tentar explicar melhor:

      Para cada usuário de uma hospedagem, normalmente se é criado um usuário no Linux para se ter acesso ao FTP. Se você der 777 você estará liberando a permissão de acesso a essa pasta a todos os usuários e grupos desse servidor. Mesmo que seja necessário muito conhecimento e malícia, essa forma não deixará de ser uma vulnerabilidade ao seu sistema de Backup.

      Então como resolver de maneira segura???

      A solução seria solicitar ao seu provedor de hospedagem que o SUPHP seja instalado no apache, para que assim o php utilize as permissões de o seu usuário ao invés de tentar com o Nobody. (Obs: Muitos provedores desabilitam a escrita do usuário Nobody, pois esse tipo de permissão é também considerado vulnerabilidade e falha de segurança.)

      Ou seja, esta certo bloquear o usuário Nobody de escrever nos arquivos, mas muitos dos servidores por mau informação do administrador de rede não habilitam o Suphp e assim o cliente fica quase sem alternativa para se escrever num arquivo.

      O suPHP é uma ferramenta para executar scripts PHP com seus próprios usuários, ao invés destes utilizarem o usuário padrão do Apache (nobody). Ou seja, ele irá executar os scripts do PHP com o seu usuário da hospedagem e não mais com o Nobody.

      Veja mais em:

      Como se não basta-se, alguns provedores de hospedagem também consideram o fopen como falha de segurança e vulnerabilidade, ai você terá que utilizar um comando por umsimilar, como por exemplo o file_put_contents

      file_put_contents(“novo.txt”, “Primeira linha do arquivo\n”);

      Veja mais em:

      Sinistro né! rsrs há uns três anos atrás tive esse mesmo problema com meu provedor de hospedagem. Sofri para explicar isso ao Administrador Linux de minha hospedagem, pois para o administrador de rede, parece que se esta com o Apache, PHP, e Mysql instalado e o servidor esta pingando, esta tudo muito bem! Resumindo depois de explicar umas 20x ao administrador do provedor eles até me chamaram para trabalhar lá rs.

      Hoje em dia preferi pegar um servidor dedicado e estudar mais para a certificação LPI(Linux Professional Institute), para que assim eu mesmo possa resolver os problemas do meu servidor.

      Espero ter ajudado! E peço que me retorne caso tenha sucesso ou tenha mais alguma dúvida! vlw :)

      Responder
  • Jonatas Sellos

    Muito bom o script, entretanto, não faz o backup das funções… Pode me ajudar a implementar esse recurso?

    Responder
  • Marcos holanda

    ola gostei muito deste topico, muito interesante, mas estou precisando fazer um script que instalar os dados do sql para mysql igual das plataformas do wordpress e joolma, eu digito so o nome do banco de dados e senha e os demais dados e instalado atraves de arquivo sql.

    Responder
  • Juliano

    Olá, muito bom o script.
    Uma dúvida: como informar apenas uma tabela a ser copiada?
    Obrigado.

    Responder
  • Lucas

    Ótimo arquivo, porém aqui está ocorrendo um vários erros na função “ereg_replace”, pode me ajudar?

    Responder
  • Diogo Realles

    muito legal, funcionou eh simples de incrementar nas paginas. muito obrigado.
    a função ereg_replace pode estar depreciada vc pode colocar um @ na frente

    assim
    @ereg_replace();

    o script vai aceitar.

    Responder
  • Maicon

    Não tenho muito a dizer, mais seu código resolveu meu problema OBRIGADO… ;)

    Responder
  • jones

    ele não esta convertendo par uft-8
    os acentos e outros caracteres não esta extraindo da maneira correta
    pode verificar por favor?

    Responder

Enviar Comentário

© 2012 Powered By Wordpress, Deivison Arthur

Ir para cima