【PHP】遠端備份MYSQL / 備份至mail / FTP備份至遠端 / 教學

參考backup2mail,做了一些習慣上的修改!

說明

預設為備份至遠端FTP

備份至mail的話,使用$_GET[b]為tomail。

PS. 其同目錄下,會保留一個最新的SQL備份檔!

 

程式碼

backup_mysql.php   ※ 更改註解的地方,即可使用

error_reporting(E_ALL);
date_default_timezone_set("Asia/Taipei");

$db_server='localhost'; //MSYQL伺服器
$db_name='DBname'; //MSYQL名稱
$db_user='DBuser'; //MSYQL帳號
$db_pass='DBpass'; //MSYQL密碼

$to_mail='[email protected]'; //備份至信箱

$ftp_name='FTPname'; //備份至FTP名稱
$ftp_user='FTPuser'; //FTP帳號
$ftp_pass='FTPpass'; //FTP密碼

$file=$db_name.".".date('mdHi').".sql";

function db_dump() {
	global $db_server, $db_name, $db_user, $db_pass, $file;
	$cmd = 'mysqldump -u ' . $db_user . ' -h ' . $db_server . ' --password=' . $db_pass . ' ' . ($db_name == '' ? '--all-databases' : $db_name) . '  > ' . $file;
	$dump_status = (passthru($cmd) === false) ? '失敗' : '成功';
	echo $file.' 備份'.$dump_status;
	return $dump_status;
}

echo '<h2>開始</h2>';
$dumped=db_dump();
$fp=fopen($file, 'r');
	if($_GET[b]==tomail){
		$read=fread($fp, filesize($file)); $read=chunk_split(base64_encode($read));
		$boundary=uniqid("");
		$headers='MIME-Version: 1.0'."\n";
		$headers.='Content-type: multipart/mixed; boundary="'.$boundary.'"; charset="UTF-8"'."\n";
		$headers.='From:'.$to_mail.'\n';
		$body='--'.$boundary."\n";
		$body.='Content-type: application/x-gzip; name='.$file."\n";
		$body.='Content-transfer-encoding: base64'."\n";
		$body.='Content-disposition: attachment; filename='.$file."\n\n";
		$body.=$read ."\n";
		$body.="--$boundary--";
		if(mail($to, $subject, $body, $headers)){
			echo ",已寄至信箱。";	}else{	echo ",信件發送失敗!";
		}
		
	}else{
		$conn=ftp_connect($ftp_name, 21, 60);
		$login_result = ftp_login($conn, $ftp_user, $ftp_pass);
		ftp_pasv($conn, true);
		if(ftp_fput($conn, $file, $fp, FTP_ASCII)){
			echo ",上傳成功。";
		} else {
			echo ",上傳失敗!";
		}
		ftp_close($conn);
	}
fclose($fp);
rename($file,"backup.sql");

 

補充

如果要定時自動備份的話,

可以自行使用主機後台的CRON定時排程去瀏覽PHP即可。