Blog Reacción Estudio

¡Tu zona de aprendizaje!

Guardar una copia de la base de datos en el servidor con PHP

Si lo que queremos hacer es guardar una copia de nuestra base de datos MySQL o tablas individuales (hacer un backup), lo podemos hacer con PHP através del siguiente script:

<?php
//Ponemos los datos de acceso a nuestra base de datos
//y ejecutamos la función
backup_tables('localhost','root','root','bd');

/* Hacer backup de una base de datos o de una tabla */
function backup_tables($host,$user,$pass,$name,$tables = '*')
{
  
  $link = mysql_connect($host,$user,$pass);
  mysql_select_db($name,$link);
  
  //obtenemos todas las tablas
  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);
  }
  
  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";
  }
  
  //guardamos el archivo
  $handle = fopen('db-backup-'.date("d-m-Y").'.sql','w+');
  fwrite($handle,$return);
  fclose($handle);
}
?>

El archivo lo guardará en formato .sql con el nombre db-backup seguido de la fecha en que se creó el archivo, por ejemplo, «db-backup-14-11-2012.sql«.

Además si queremos por ejemplo que este script se ejecute todos los días, podemos usar CRON JOBS de Cpanel tal y como expliqué en el artículo anterior.