Palavra:   

Revista PHP / Banco de Dados

Flávia Jobstraibizer

Analista de sistemas, DBA Mysql, PostgreSQL, Oracle, SQLServer e Firebird. Desenvolvedora de sistemas, e administradora de servidores FreeBSD. Conheça o site www.flaviajobs.com.br

Backup de um banco de dados

Item imprescindível para qualquer desenvolvedor que se preze, o backup do seu banco de dados, é de suma importância, pra prevenir a lei de Murphy que os persegue... :)

Pensando nisso, vou abordar neste artigo, como fazer um script confiável de backup do seu banco de dados, onde você poderá também, torná-lo ferramenta essencial de seus sistemas, obtendo assim, maior interatividade com o ambiente.

Pensando na dificuldade que é, não ter um gerenciador visual, ou mesmo não ter senha de administrador, para gerar seus dumps (backups, na linguagem sql) de bancos de dados, este script irá proporcionar com que, tendo o usuário e senha do banco, você obtenha um arquivo com extensão .sql, que esteja apto a ser importado em qualquer outro local.

O que nós vamos ver então, é: baseado em um banco de dados previamente informado, vamos abrir, listar, pegar o conteúdo, e grava-lo em um arquivo sql, tendo então um backup confiável de toda sua base, incluindo tabelas e dados.

Primeiramente vamos fazer a conexão com o banco, e selecionar a base de dados

<?php
// dados de conexão com o banco de dados a ser backupeado
$usuario = "user";
$senha = "pass";
$dbname = "nomedoseubanco";
// conectando ao banco
mysql_connect("localhost",$usuario,$senha) or die(mysql_error());
mysql_select_db($dbname) or die(mysql_error());

// gerando um arquivo sql. Como?
// a função fopen, abre um arquivo, que no meu caso, será chamado como: nomedobanco.sql
// note que eu estou concatenando dinamicamente o nome do banco com a extensão .sql.

$back = fopen($dbname.".sql","w");

// aqui, listo todas as tabelas daquele banco selecionado acima
$res = mysql_list_tables($dbname) or die(mysql_error());

Em seguida, vamos, verificar quais são as tabelas daquela base, lista-las, e em um laço for, vamos mostrar cada uma delas, e resgatar as funções de criação da tabela, para serem gravadas no arquivo sql mais adiante.

// resgato cada uma das tabelas, num loop
while ($row = mysql_fetch_row($res)) {
$table = $row[0];
// usando a função SHOW CREATE TABLE do mysql, exibo as funções de criação da tabela,
// exportando também isso, para nosso arquivo de backup

$res2 = mysql_query("SHOW CREATE TABLE $table");
// digo que o comando acima deve ser feito em cada uma das tabelas while ( $lin = mysql_fetch_row($res2)){
// instruções que serão gravadas no arquivo de backup
fwrite($back,"\n#\n# Criação da Tabela : $table\n#\n\n");
fwrite($back,"$lin[1] ;\n\n#\n# Dados a serem incluídos na tabela\n#\n\n");

Teremos então de pegar os dados que estão dentro de cada campo de cada tabela, e abri-los também para serem gravados no nosso arquivo de backup.

// seleciono todos os dados de cada tabela pega no while acima
// e depois gravo no arquivo .sql, usando comandos de insert

$res3 = mysql_query("SELECT * FROM $table");
while($r=mysql_fetch_row($res3)){
$sql="INSERT INTO $table VALUES (";

Agora vamos pegar cada dado do campo de cada tabela, e executar tarefas como, quebra de linha, substituição de aspas, espaços em branco, etc. Deixando o arquivo confiável para ser importado em outro banco de dados.

// este laço irá executar os comandos acima, gerando o arquivo ao final, 
// na função fwrite (gravar um arquivo)
// este laço também irá substituir as aspas duplas, simples e campos vazios
// por aspas simples, colocando espaços e quebras de linha ao final de cada registro, etc
// deixando o arquivo pronto para ser importado em outro banco

for($j=0; $j<mysql_num_fields($res3);$j++)
{
if(!isset($r[$j]))
$sql .= " '',";
elseif($r[$j] != "")
$sql .= " '".addslashes($r[$j])."',";
else
$sql .= " '',";
}
$sql = ereg_replace(",$", "", $sql);
$sql .= ");\n";

fwrite($back,$sql);
}
}
}

E finalmente, vamos fechar (internamente, no servidor) o arquivo que geramos, dando um nome para o mesmo, e gerando o arquivo que será então disponibilizado para download.

// fechar o arquivo que foi gravado
fclose($back);
// gerando o arquivo para download, com o nome do banco e extensão sql.
$arquivo = $dbname.".sql";
Header("Content-type: application/sql");
Header("Content-Disposition: attachment; filename=$arquivo");
// lê e exibe o conteúdo do arquivo gerado
readfile($arquivo);
?>

Com base em todas estas informações, teremos um arquivo confiável, e você pode até mesmo programar este script para fazer o backup sozinho dos seus bancos.

Por exemplo.
Lembram-se de meu artigo sobre a função sleep?
http://www.revistaphp.com.br/artigo.php?id=36

Então, você pode implementar a função sleep dentro deste script de backup, fazendo com refresh, ou header, uma atualização nesta página, fazendo com que o backup seja executado, e após um certo tempo de espera, seja executado novamente.

Para deixar esta tarefa mais dinamizada, você pode, ao invés de fazer o download do arquivo, mandar com que o script grave o arquivo no seu servidor.
Pra isso, poderemos utilizar copy (http://www.php.net/manual/pt_BR/function.copy.php) fazendo com que o backup, após ser gerado, grave uma cópia do arquivo dentro de um local determinado no servidor, com fwrite que vimos neste mesmo script.

Clique aqui para ver o script funcionando: http://www.flaviajobs.com.br/sistemas/revistaphp/backup_mysql.php

Se você sugere alguma modificação neste script, tem alguma sugestão, ou elogio (sempre bem vindo), pode me escrever no fjferr@gmail.com ou então comente aqui.
:)

Opções de Interação

Comentários

Mesmo script
Por: Jonnys, 21/01/2010   22:08:36
por que as estrutura "for" dos script estão diferente, será que a autora vez de proposito?
http://www.devmedia.com.br/articles/viewcomp.asp?comp=3925

Abraços
mesma autora mas script diferente, eu ja disse ond
Por: Jonnys, 21/01/2010   21:58:29
Parabéns Flávia, este script esta correto, estive pensando você criou o outro errado somente para testar os leitores.
se puder corrija o script que postou em http://www.devmedia.com.br/articles/viewcomp.asp?comp=3925
Se for capaz corrija o script que você mesmo posto no link acima, e faça do mesmo modo que colocou neste site.
analise os dois script mostre suas habilidades de analista.


Abraços
Muito útil.
Por: Alexandre, 14/02/2007   08:22:56
Legal Flávia. Facilita bem a vida sem ter que entrar no cPanel para fazer o backup.
Já coloquei na minha loja virtual, que sofre alterações constantes.
Parabéns e continue postando.