Cron Task

Status
Not open for further replies.

Daniel S

New Member
Messages
2,395
Reaction score
0
Points
0
Hi

Does anybody know what command i can put into a cron job that will automatically backup my mysql databse
 

galaxyAbstractor

Community Advocate
Community Support
Messages
5,508
Reaction score
35
Points
48
Have you gotten a script to do it? Otherwise here is a good one:

PHP:
<?php 

 $dbhost        = 'localhost';  // hostname usually localhost 
  $dbuser        = '*replace*';      // username for MySQL database 
  $dbpass        = '*replace*';    // Password for MySQL database 
  $dbname        = '*replace*';      // MySQL Database Name 

  $use_gzip      = 'yes';        // Change to 'no' if you don't want files gzipped 

  $remove_file   = 'no';        // Change to 'yes' if you want to delete the backup file from your account after sending. Pick yes to save server space 

  $use_email     = 'yes';          // Change to 'yes' if you want the backup to be sent through email. If you pick yes, fill out the next 3 lines 
  $send_to       = '*replace*';   // email address for backup file
  $send_from     = '*replace*'; // email address sending the email, doesn't matter can be same as above
  $subject       = "MySQL Database ($dbname) Backup - " . date("j F Y"); // this is the subject of the email being sent to you

  $use_ftp       = 'no'; // Change to 'yes' if you want the backup file uploaded to a remote FTP server? If you pick yes, you must fill out the next 4 lines
  $ftp_server    = 'ftp.yourdomain.com';   // FTP address
  $ftp_user_name = 'user';   // FTP username
  $ftp_user_pass = 'xxxxxxxx';   // FTP password
  $ftp_path      = "/db_backups";  // Path to upload on FTP server

  $echo_status = 'yes';   // Change to 'no' if you want the script to work silently (nothing will be sent to the screen)


# You probably don't need to edit below this line.... 
#------------------------------------------------------------------------------- 

  $db = mysql_connect("$dbhost","$dbuser","$dbpass"); 
    mysql_select_db("$dbname",$db); 

  $path = make_dir(); 
   
  if ($echo_status == 'yes') { 
    print "<html><head><title>MySQL Database Backup</title></head><body>";
    print "<font face=Verdana size=2><h3>Starting Process...</h3><p>";
    print "Backup dumpfile in progress<ul>"; 
  } 

  $result = mysql_query("show tables from $dbname"); 
  while (list($table) = mysql_fetch_row($result)) { 
    $newfile .= get_def($table); 
    $newfile .= "\n\n"; 
    $newfile .= get_content($table); 
    $newfile .= "\n\n"; 
    $i++; 
    if ($echo_status == 'yes') { 
      print "<li>Dumped table $table</li>"; 
    } 
  } 

    $file_name = $dbname . "-" . date("Ymd-Hi") . ".sql"; 
    $file_path = $path . $file_name; 

  if ($use_gzip == "yes") { 
    $file_name .= ".gz"; 
    $file_path .= ".gz"; 
    $zp = gzopen($file_path, "wb9"); 
    gzwrite($zp,$newfile); 
    gzclose($zp); 

    if ($echo_status == 'yes') { 
      print "</ul>Gzip-file is created...<br>"; 
    } 
  } else { 
    $fp = fopen($file_path, "w"); 
    fwrite($fp, $newfile); 
    fclose($fp); 

    if ($echo_status == 'yes') { 
      print "<br>SQL-file is created...<br>"; 
    } 
  } 

  if ($use_email == 'yes') { 
    $fileatt_type = filetype($file_path); 
   
    $headers = "From: $send_from"; 
   
    // Read the file to be attached ('rb' = read binary) 
    $fp = fopen($file_path,'rb'); 
    $data = fread($fp,filesize($file_path)); 
    fclose($fp); 
   
    // Generate a boundary string 
    $semi_rand = md5(time()); 
    $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 
   
    // Add the headers for a file attachment 
    $headers .= "\nMIME-Version: 1.0\n" ."Content-Type: multipart/mixed;\n" ." boundary=\"{$mime_boundary}\""; 
   
    // Add a multipart boundary above the plain message 
    $message = "This is a multi-part message in MIME format.\n\n" ."--{$mime_boundary}\n" ."Content-Type: text/plain; charset=\"iso-8859-1\"\n" ."Content-Transfer-Encoding: 7bit\n\n" . 
    $message . "\n\n"; 
   
    // Base64 encode the file data 
    $data = chunk_split(base64_encode($data)); 
   
    // Add file attachment to the message 
    $message .= "--{$mime_boundary}\n" ."Content-Type: {$fileatt_type};\n" ." name=\"{$file_name}\"\n" ."Content-Disposition: attachment;\n" ." filename=\"{$file_name}\"\n" ."Content-Transfer-Encoding: base64\n\n" . 
    $data . "\n\n" ."--{$mime_boundary}--\n"; 
   
    // Send the message 
    $ok = @mail($send_to, $subject, $message, $headers); 
     
    if ($echo_status == 'yes') { 
      print "<br>Mail is sent...<br>"; 
    } 
  } 
   
  if ($use_ftp == 'yes') { 
    if ($use_gzip == 'yes') { 
      $mode = FTP_BINARY; 
    } else { 
      $mode = FTP_ASCII; 
    } 
    $ftp_id       = ftp_connect($ftp_server); 
    $login_result = ftp_login($ftp_id, $ftp_user_name, $ftp_user_pass); 
    $upload       = ftp_put($ftp_id, $ftp_path . $file_name, $file_path, $mode); 
    ftp_close($ftp_id); 

    if ($echo_status == 'yes') { 
      print "<br>Backup is uploaded to FTP server<br>"; 
    } 
  } 

  if ($remove_file == "yes") { 
    unlink($file_name); 
    if ($echo_status == 'yes') { 
      print "<br>File is deleted...<br>"; 
    } 
  } 

  if ($echo_status == 'yes') { 
    print "<br>Back up done!<p>";
    print "<br>� <a href=http://www.imbri.com>Imbri Web</a></font><p>";
    print "</body></html>";
  } 


  function make_dir() { 
    $page = split("/", getenv('SCRIPT_NAME')); 
    $n = count($page)-1; 
    $page = $page[$n]; 
    $page = split("\.", $page, 2); 
    $extension = $page[1]; 
    $page = $page[0]; 
    $script     = "$page.$extension"; 
    $base_url     = "http://".$_SERVER['SERVER_NAME']; 
    $directory     = $_SERVER['PHP_SELF']; 
    $url_base = "$base_url$directory"; 
    $url_base = ereg_replace("$script", '', "$_SERVER[PATH_TRANSLATED]"); 

    $path = $url_base; 

    return $path; 
  } 

  function get_def($table) { 
    $def = ""; 
    $def .= "DROP TABLE IF EXISTS $table;\n"; 
    $def .= "CREATE TABLE $table (\n"; 
    $result = mysql_query("SHOW FIELDS FROM $table") or die("Table $table not existing in database"); 
    while($row = mysql_fetch_array($result)) { 
      $def .= "    $row[Field] $row[Type]"; 
      if ($row["Default"] != "") $def .= " DEFAULT '$row[Default]'"; 
      if ($row["Null"] != "YES") $def .= " NOT NULL"; 
      if ($row[Extra] != "") $def .= " $row[Extra]"; 
      $def .= ",\n"; 
    } 
    $def = ereg_replace(",\n$","", $def); 
    $result = mysql_query("SHOW KEYS FROM $table"); 
    while($row = mysql_fetch_array($result)) { 
      $kname=$row[Key_name]; 
      if(($kname != "PRIMARY") && ($row[Non_unique] == 0)) $kname="UNIQUE|$kname"; 
      if(!isset($index[$kname])) $index[$kname] = array(); 
      $index[$kname][] = $row[Column_name]; 
    } 
    while(list($x, $columns) = @each($index)) { 
      $def .= ",\n"; 
      if($x == "PRIMARY") $def .= "   PRIMARY KEY (" . implode($columns, ", ") . ")"; 
      else if (substr($x,0,6) == "UNIQUE") $def .= "   UNIQUE ".substr($x,7)." (" . implode($columns, ", ") . ")"; 
      else $def .= "   KEY $x (" . implode($columns, ", ") . ")"; 
    } 
    $def .= "\n);"; 
    return (stripslashes($def)); 
  } 

  function get_content($table) { 
    $content=""; 
    $result = mysql_query("SELECT * FROM $table"); 
    while($row = mysql_fetch_row($result)) { 
      $insert = "INSERT INTO $table VALUES ("; 
      for($j=0; $j<mysql_num_fields($result);$j++) { 
        if(!isset($row[$j])) $insert .= "NULL,"; 
        else if($row[$j] != "") $insert .= "'".addslashes($row[$j])."',"; 
        else $insert .= "'',"; 
      } 
      $insert = ereg_replace(",$","",$insert); 
      $insert .= ");\n"; 
      $content .= $insert; 
    } 
    return $content; 
  } 

  /* Changelog 
   
     Version 1.0 - August 15th, 2003 

     Added HTML & cleaned up comments.

  */ 
?>
This is not my code! Put this in example dbbackup.php and upload.
Then in cron, do this to make it once a week:

command to run: php -q /home/*your cpanel username*/public_html/path/to/script.php

Min: 0

hours: 11 am

Days: Every day (i think)

Months: All

Weekdays: wednesday

This will backup your database 6 pm gmt + 1 on wednesdays
 
Last edited:
Status
Not open for further replies.
Top