Autor Tópico: Backup do DB do sistema com php  (Lida 2018 vezes)

saulobborges

  • Expert
  • *****
  • Mensagens: 1392
    • SGi Sistemas
    • Email
Backup do DB do sistema com php
« Online: Março 23, 2012, 02:46:27 am »
Sei que o assunto já foi debatido em alguns tópicos porém não encontrei o que estou procurando, na verdade eu encontrei mais não foi aqui, estou aqui para buscar a ajuda dos companheiros na melhoria de um código que já esta em pleno funcionamento porém falta apenas alguns detalhes que conto com a ajuda de vocês para resolver.

Código: [Selecionar]
//auto_backup.php

// configuração do seu banco
$host = [sc_glo_servidor]; //
$user = [sc_glo_usuario];
$pass = [sc_glo_senha];
$db = [sc_glo_banco];

$print_result = true; //true para imprimir aba, false para não imprimir
$save_backup = true; //true para salvar, false para não salvar

$backup_file_name = $db; //Nome do arquivo, se $save_backup estiver ativado
$backup_file_format = "sql"; // formato da extensão (automatic_backup_140409.sql)
// fim configuração do banco

//$con = mysql_connect($host,$user,$pass);
//mysql_select_db($db);

//Lista as tabelas de seu banco
$tables = mysql_list_tables($db);
$backup = '-- Yunie Auto Backup System - Adaptado por Alan Maia - alanmaia@amazoninfo.com.br
-- Atualizado por Elielder Oliveira ( TagaNet Info )- taganet.info@gmail.com
-- Crédito: Alan Maia / Cleiton /
-- -----------------------------------------------------------
-- Servidor: '.$host.'
-- Banco de Dados: '.$db.'
-- Data: '.date("d/m/y", time()).'
--
-- ------------------------------------------------------------
';

$backup .= '';
//Rotina para criar arquivo com as instruções SQL
while ($tables_result = mysql_fetch_assoc($tables))
{
$tablename = $tables_result['Tables_in_'.$db.''];
$backup .= '-- Estrutura da tabela `'.$tablename.'` --
-- ----------------------------------------------------------

';
$backup .= 'DROP TABLE IF EXISTS `'.$tablename.'`;
CREATE TABLE IF NOT EXISTS `'.$tablename.'`
(';
$fieldname = '';
$fields_array = array();
$table_fields = mysql_query("SHOW COLUMNS FROM `".$tablename."`");
$primary_key = '';
while ($fields_result = mysql_fetch_assoc($table_fields))
{
if (!empty($fieldname))
{
$backup .= ',
';
}
$fieldname = $fields_result['Field'];
$fields_array[] = $fieldname;
$type = $fields_result['Type'];
$primary = '';
$increment = '';
if ($fields_result['Extra'] == 'auto_increment')
{
$increment = ' AUTO_INCREMENT';
}
$null = 'NULL';
if ($fields_result['Null'] == 'NO')
{
$null = 'NOT NULL';
}
if ($fields_result['Key'] == 'PRI')
{
$primary_key = $fieldname;
}
$default = $fields_result['Default'];
if ($default && empty($increment))
{
$null = ''; // correção: para não imprimir NULL quando houver default
$default = "DEFAULT '".$default."'"; //correção: imprimir os dados de default dentro de aspas simples
}
else
{
$default = '';
}
$backup .= '`'.$fieldname.'` '.$type.' '.$null.''.$increment.''.$default.'';
}
if (!empty($primary_key))
{
$backup .= ',
PRIMARY KEY (`'.$primary_key.'`)'; // correção: imprime o nome da chave primaria, pois estava como id
}
$backup .= '
);';
$fields_list = '(';
$field_num = 1;
foreach(array_keys($fields_array) as $keys)
{
$fields_list .= '`'.$fields_array[$keys].'`';
if ($field_num != sizeof($fields_array))
{
$fields_list .= ', ';
}
$field_num++;
}
$fields_list .= ')';
$rows_fields = mysql_query('SELECT * FROM `'.$tablename.'`');
echo mysql_error();
$inserts = mysql_num_rows($rows_fields);
if ($inserts > 0)
{
$backup .= '
INSERT INTO `'.$tablename.'` '.$fields_list.' VALUES
';
$insert_num = 0;
while ($rows_result = mysql_fetch_assoc($rows_fields))
{
$insert_num++;
$field_num = 1;
$backup .= '(';
foreach(array_keys($rows_result) as $keys)
{
$value = $rows_result[$keys];
$value = str_replace("'","''",$value);
if (!is_numeric($value))
{
$backup .= "'".$value."'";
}
else
{
$backup .= $value;
}
if ($field_num != sizeof($rows_result))
{
$backup .= ',';
}
$field_num++;
}
$backup .= ')';
if ($insert_num == $inserts)
{
$backup .= ';';
}
else
{
$backup .= ',
';
}
}
}
$backup .= '
';
}
 
  //Se no config estiver true visualiza num text area as instruções SQL
  if ($print_result == true)
  {
    //Aqui vc pode imprimir num text area as instruções SQL pra mim não é necessário
    //por isso está comentado para visualizar é só descomentar
    //echo '<textarea rows="30" cols="100" wrap="OFF">'.$backup.'</textarea>';
  }
  //Se noconfig estiver true salva em arquivo .sql as instruções SQL
  if ($save_backup == true)
  {
    //Aqui vc define o diretório onde o arquivo deve ser salvo
    //Pode ser escrito como c:/pasta/bkp/
    //Pode ser qualquer unidade inclusive na rede basta a pasta ter permissão
    //Não esqueça de terminar o diretoírio com a barra /
    $dir = '../_lib/tmp/';
    $file = fopen($dir.$backup_file_name.'_'.date("d-m-Y-H-i-s", time()).'.'.$backup_file_format.'', "w+");
    fwrite($file, $backup);
    fclose($file);
  }

Bem o código acima esta perfeito, faz o backup corretamente e salva na pasta tmp do meu sistema, porém falta a implementação para que ele crie as Primary Keys compostas de mais de um campo como acontece nas tabelas de usuarios_x_grupos, grupos_x_aplicacoes.
Existe um comando que pode ser executado assim
Código: [Selecionar]
mysql_query("SHOW INDEX FROM `".$tablename."`"); porém não consegui chegar a uma conclusão onde posso implementar esse comando para que as Primary Keys compostas seja criadas corretamente.

Fico no aguardo da ajuda para chegarmos a uma solução juntos, este script esta muito bom.