DZone Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Snippets has posted 5883 posts at DZone. View Full User Profile

Mysql All Databases Backup [php]

06.06.2008
| 470 views |
  • submit to reddit
        source from: http://www.infoneural.com/2008/06/04/script-para-fazer-backup-de-bases-do-mysql-facilmente/

<?php // Aqui colocamos uma classe pra lidar com SQL
class ConexaoMysql
{
var $servidor = "localhost";
var $usuario = "usuario_do_banco";
var $senha = "senha_do_usuario";
var $banco = "nome_do_banco";
var $link = "";
var $query = "";

// Metodo Construtor
function ConexaoMysql()
{
$this->ConectaBase();
}

// Conexao com banco
function ConectaBase()
{
$this->link = @mysql_connect( $this->servidor, $this->usuario, $this->senha);
if (!$this->link) {
die(”Error na conexao: “.mysql_error().” - “.mysql_errno());
} elseif (!mysql_select_db($this->banco, $this->link)) {
die(”Error na conexao: “.mysql_error().” - “.mysql_errno());
// mysql_errno(): numero do erro
//mysql_error(): descrição do erro
}
}

// Execução da query
function sql($query)
{
$this->query = $query;
if ($result = mysql_query($this->query,$this->link)) {
return $result;
} else {
return 0;
}
}
// dados da tabela
function tabelas()
{
if ($result = mysql_list_tables($this->banco)) {
return $result;
} else {
return 0;
}
}
// função de mandar email
function Sendmail($arquivo, $para, $assunto)
{

$body = “”;
$attach_name = “”;

if ($arquivo != “”) {

$file = fopen($arquivo, “r”);
$contents = fread($file, (1024*1024));
$encoded_attach = chunk_split(base64_encode($contents));
fclose($file);
$attach_name = $arquivo;

$anexo .= “\n\n–Message-Boundary\n”;
$anexo .= “Content-type: $attach_type; name=\”$attach_name\”\n”;
$anexo .= “Content-Transfer-Encoding: BASE64\n”;
$anexo .= “Content-disposition: attachment; filename=\”$attach_name\”\n\n”;
$anexo .= “$encoded_attach\n”;
$anexo .= “–Message-Boundary–\n”;

}

$cabecalho = “From: Nome <meu@email.com> \r\n”;
$cabecalho .= “Content-Type: text/html;”;
$cabecalho .= “MIME-version: 1.0\n”;
$cabecalho .= “Content-type: multipart/html; “;
$cabecalho .= “boundary=\”Message-Boundary\”\n”;
$cabecalho .= “Content-transfer-encoding: 7BIT\n”;
$cabecalho .= “X-attachments: $attach_name”;

$mensagem = “–Message-Boundary\n”;
$mensagem .= “Content-type: text/html; charset=US-ASCII\n”;
$mensagem .= “Content-transfer-encoding: 7BIT\n”;
$mensagem .= “Content-description: Mail message body\n\n”;

$mensagem .= $body . $anexo;

mail($para, $assunto, $mensagem, $cabecalho);
}
}

// pasta temporaria pra geração do gzip
$path = “backup”;
// nome do banco
$dbname = “nome_do_banco”;
// nome do arquivo sql
$nome_arquivo_sql = $path.”_”.$nome_arquivo.”.sql”;
// nome do arquivo sql compactado
$nome_arquivo_gz = $dbname.”_”.date(”d-m-Y”).”.sql.gz”;

// cria e abre o arquivo como leitura
$back = fopen($nome_arquivo_sql,”w”);

// recebe os dados da tabela com o camando da classe mysql_list_tables()
$res = $objConexao->tabelas();

// aqui cria um cabeçalho para o arquivo sql
// como exemplo nome, criado em, autor, dados do banco vc pode escrever aqui
fwrite($back,”#\n# Arquivo de Geração de Backup\n”);
fwrite($back,”# Autor: Seu Nome - email opcional \n”);
fwrite($back,”# Banco: MySql\n#\n\n\n”);

// aqui começamos a lógica
// enquanto receber valor do $res ele faz a rotina
while ($row = mysql_fetch_row($res)) {
// listamos todas as tabelas
// e pegamos sempre o [0] q sempre vem o nome da tabela
$table = $row[0];
// aqui pega os dados da criação tabela q vem do item acima, sempre na ordem
$res2 = mysql_query(”SHOW CREATE TABLE $table”);
// entao aqui entramos na proxima rotina,
// onde pegamos os valores da tabela e montamos os inserts
while ( $lin = mysql_fetch_row($res2)){

// aqui escrevemos um cabeçalho pra cada tabela
// identificando a tabela e separando os inserts
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”);

// então pegamos os dados da tabela pra monta os insert’s
$res3 = $objConexao->sql(”SELECT * FROM $table”);
while($r = mysql_fetch_row($res3)){
// colocamos o prefixo que insere os valores na tabela
$sql=”INSERT INTO $table VALUES (”;

//cada linha de registro separamos com os vamores com aspas simples ” e virgula ,
for($j=0; $j<mysql_num_fields($res3);$j++)
{
if(!isset($r[$j]))
$sql .= “” ,”;
elseif($r[$j] != “”)
//essa função addlashes faz escapar as aspas simples (ex.: d’agua = d\’agua)
$sql .= ” ‘”.addslashes($r[$j]).”‘,”;
else
$sql .= “” ,”;
}
// usamos aqui a ereg_replace() pra remover uma falha q fica no final “,$”
$sql = ereg_replace(”,$”, “”, $sql);
// então usamos o pulo de linha para ficar certinho o arquivio
$sql .= “);\n”;

// depois de montado a linha de insert, escreveremos no arquivo
// isso é feito pra cada linha de registro;
fwrite($back,$sql);
}
}
}

// fechamos a escrita e salvamos o aquivo
fclose($back);

// agora a compactação do arquivo
// abrimos em modo leitura com ponteiro no inicio (r) forçando com modo binario (b)
$fp = fopen($nome_arquivo_sql, “rb”);
// aqui lemos o arquivo e grava o conteudo em na variavel $data
$data = fread($fp, filesize($nome_arquivo_sql));
// fechamos o arquivo
fclose($fp);

//abrimos o arquivo em compactação wb9 q é a padrao para saber mais www.php.net/gzopen
$zp = gzopen($nome_arquivo_gz, “wb9″);
// escrevemos o conteudo no arquivo de compactação
gzwrite($zp, $data);
// fechamos o arquivo compactado
gzclose($zp);

// aqui vai a parte de envio por email o arquivo de backup
// monta o assunto
$assunto = “[Labcis] - Backup: (”.date(”d/m/Y @ H:i”).”)”;
$email_destino = “seu@email“;

// chama a função de mandar o email
$objConexao->Sendmail($nome_arquivo_gz, $email_destino, $assunto);

// apaga os arquivos temporarios do servidor
unlink(”$nome_arquivo_gz”);
unlink(”$nome_arquivo_sql”);

?>