使用PHP自动备份MySql数据库

时间:2013-03-04 08:59:51

标签: php mysql

我想备份我的数据库并使用php将其邮寄到我的电子邮件ID。我找到了一个脚本来备份我的数据库并以邮政形式邮寄给我 但是当我尝试执行脚本时,它工作正常,但邮件不在我的收件箱中。 这是脚本:

<?php
$db_host="localhost";   //mysql host  
$db_user="*******";  //databse user name
$db_pass="*******";  //database password
$db_name="******";  //database name
$tables="*";   // use * for all tables or use , to seperate table names
$email="*******";     //your email id
///////////////////////////////////////////////////////////////////////////////////////////

/////////don't need to change bellow //////

backup($db_host,$db_user,$db_pass,$db_name,$tables,$email);
function backup($db_host,$db_user,$db_pass,$db_name,$tables = '*',$email)
{

  $con= mysql_connect($db_host,$db_user,$db_pass);
  mysql_select_db($db_name,$con);

  //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
  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 file
  $filename='db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql';
  $handle = fopen($filename,'w+');
  fwrite($handle,$return);
  fclose($handle);
  compress($filename);
  send_mail($filename.".zip",$email);
}

function send_mail($filepath,$email)
{

$from = "Backup <cepheisys.com/mac>";
$subject = "Database backup";
$message="This attachment contains the backup of your database.";
$separator = md5(time());

// carriage return type (we use a PHP end of line constant)
$eol = PHP_EOL;

// attachment name
$filename = "backup.zip";

//$pdfdoc is PDF generated by FPDF
$attachment = chunk_split(base64_encode(file_get_contents($filepath)));

// main header
$headers  = "From: ".$from.$eol;
$headers .= "MIME-Version: 1.0".$eol; 
$headers .= "Content-Type: multipart/mixed; boundary=\"".$separator."\"";

// no more headers after this, we start the body! //

$body = "--".$separator.$eol;
$body .= "Content-Transfer-Encoding: 7bit".$eol.$eol;
$body .= "This is a MIME encoded message.".$eol;

// message
$body .= "--".$separator.$eol;
$body .= "Content-Type: text/html; charset=\"iso-8859-1\"".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$body .= $message.$eol;

// attachment
$body .= "--".$separator.$eol;
$body .= "Content-Type: application/octet-stream; name=\"".$filename."\"".$eol; 
$body .= "Content-Transfer-Encoding: base64".$eol;
$body .= "Content-Disposition: attachment".$eol.$eol;
$body .= $attachment.$eol;
$body .= "--".$separator."--";

// send message
if (mail($email, $subject, $body, $headers)) {
    echo "Your backup sent to your email id";
    header("refresh: 1; main.php");
} else {
    echo "Oops mail can not be send";
}
}
function compress($filepath)

     {

         $zip = new ZipArchive();
  $file=$filepath.".zip";
 if($zip->open($file,1?ZIPARCHIVE::OVERWRITE:ZIPARCHIVE::CREATE)===TRUE)
 {
   // Add the files to the .zip file
   $zip->addFile($filepath);

   // Closing the zip file
   $zip->close();
 }
     }                    

1 个答案:

答案 0 :(得分:0)

我这样做是为了一个爱好,所以任何输入都是谦卑的。

  1. $row[$j] = ereg_replace("\n","\\n",$row[$j]); 是折旧的,应该用以下内容替换:

    $pattern = '/\\\n/';
    $replacement = '\\\\\n';
    $row[$j] = preg_replace($pattern, $replacement, $row[$j] );
    
  2. 我无法让您的代码有效地发送电子邮件,所以我只是通过电子邮件发送了自己的链接。我必须按照链接并通过ftp登录,但它就在那里。 LMK,如果你有任何意见。

  3. 我在代码上返回了路径,然后将文件位置添加到我的数据库::

    function Add_BU_to_Database ($filename){
        $conn = db_connect(); //connects to my db
        $BU_Hist_num = General_Get_num('BU_History','BU_Hist_num'); //gets primary field
        $now = time(); 
        $BU_Add_Qry = $conn->query("insert into BU_History 
        (BU_Hist_num,BU_Path,BU_Time_Add,BU_Time_Del,BU_Status)                 
        Values('".$BU_Hist_num."','".$filename."','".$now."','','Active')");
    }//end function`
    
  4. 然后我更新了页面顶部的ini,这样就不会超时::

    ini_set('memory_limit', '1G'); 
    ini_set('max_execution_time', 300);
    
  5. 然后我写了剩下的代码来删除旧文件并在新的php文件上更新数据库::

    <?php
    ini_set('memory_limit', '1G'); 
    ini_set('max_execution_time', 300);
    
    $conn = db_connect();
    $AweekAgo = time()-1209600;
    
    $DBDeletionQry = $conn->query("select * from BU_History where BU_Status = 'Active' and BU_Time_Add < '$AweekAgo' ");
    $DBD_rows = mysqli_num_rows($DBDeletionQry);
    
    echo "Files older than two weeks: ".$DBD_rows."<br>";
    $filesdeleted = 0;
    
    for($i=0;$i<$DBD_rows;$i++){
        //Finds each file path
        $DBD_row = mysqli_fetch_assoc($DBDeletionQry);
        $BU_Path = "".$DBD_row['BU_Path'];
        $BU_Hist_num = $DBD_row['BU_Hist_num'];
        //Shows Paths
        echo $BU_Path."<br>";
    
        //Delete's File
        if(unlink($BU_Path)){$filesdeleted = $filesdeleted+1;}
    
        //Updates the Database
        $now = time();
        $DBDUpdate = $conn->query("update BU_History set BU_Time_Del = '$now',     BU_Status = 'Inactive' where BU_Hist_num = '$BU_Hist_num' ");
    
    }//end for
    echo "Files deleted: ".$filesdeleted."<br>";
    ?>
    
  6. 最后但并非最不重要的是,我使用我的cron管理器运行备份和删除备份.php文件。