Как стать автором
Поиск
Написать публикацию
Обновить

BackUp DataBase для маленького ресурса

Скрипт будет выдавать ошибку времени исполнения при большом объеме базы. Во избежание этого нужно рекурсивно вызывать скрипт, но еще не придумал как.
Если укажите на ошибки буду только рад. Скрипт естественно несовершенен.

<?php

$tmp_backup_cfg = "backup_config.dat";
$backup_cfg = "backup_cfg.php";

$parse = "////\n";

chdir(dirname($_SERVER['PHP_SELF'])."/");

function structuredb(){
require_once("backup_cnt.php");

$struct_db = "structure_".$backup_dbname.".dat"; // файл структуры БД
if (file_exists($struct_db)) unlink($struct_db);
$fp = fopen($struct_db,"a+");

$tables = mysql_list_tables($backup_dbname); // список таблиц
while ($table = mysql_fetch_row($tables)) { // перебор таблиц

//if ($table[0] != "rusfusion_aw_ec_logins") {

$fields = mysql_list_fields($backup_dbname,$table[0]); // список полей таблицы
$count_fields = mysql_num_fields($fields); // количество полей

fwrite($fp,"\nTable: ".$table[0]."\n");
for ($i = 0; $i < $count_fields; $i++){ // перебор полей
$name_fields = mysql_field_name($fields, $i); // создание массива с именами полей для дальнейшей выборки из бд
$type_fields = mysql_field_type($fields, $i);
$len_fields = mysql_field_len($fields, $i);
$flag_fields = mysql_field_flags($fields, $i);
$name_field = mysql_field_name($fields, $i); // вывод шапки таблицы (имена полей)
fwrite($fp,"Field: $name_fields | $type_fields | $len_fields | $flag_fields\n");
} // END FOR #1
//}//ENDIF
} // END WHILE #1
fclose($fp);

$content = "Save structure db $backup_dbname - complite.";
$fo = fopen($struct_db,"r");
$content .= "

Структура БД: $backup_dbname



";

$data = fread($fo,filesize($struct_db));
$data = str_replace("\n","
",$data);
$data = str_replace("Table:","Table:",$data);
$data = str_replace("Field:","&nbsp &nbsp Field:",$data);

fclose($fo);
$content .= $data;

$content .= "

<form method=\"POST\" action='".$_SERVER['PHP_SELF']."'>
";

return $content; //"Function Structure DB";
}

function copydb($parse,$start){
require_once("backup_cnt.php");
$content = "";
$dirdata = "database";
if (!file_exists($dirdata) || !is_dir($dirdata)) mkdir($dirdata);
$tables = mysql_list_tables($backup_dbname); // список таблиц
while ($table = mysql_fetch_row($tables)){ // перебор таблиц

$fields = mysql_list_fields($backup_dbname,$table[0]); // список полей таблицы
$count_fields = mysql_num_fields($fields); // количество полей

$name_fields = "";
for ($i = 0; $i < $count_fields; $i++){ // перебор полей
$name_fields[] .= mysql_field_name($fields, $i); // создание массива с именами полей для дальнейшей выборки из бд
} // END FOR #1

$sql_count = mysql_query("SELECT count(*) AS c FROM ".$table[0]);
$count_str = mysql_result($sql_count,'c');
/**Нужно рекурсивно вызывать скрипт с заданным началом отсчета. А вход в функцию по переменной в адресе!**/
if ($count_str > 500){
$count = 500;
if (empty($start)) $start = 0; else $start = intval($start);
$file = $table[0].".dat";
if (file_exists($dirdata."/".$file)) unlink($dirdata."/".$file);
$fo = fopen($dirdata."/".$file,"a");
if ($count_str > $start+$count){
$sql = mysql_query("SELECT * FROM ".$table[0]." LIMIT $start, $count"); // выборка
$i = 0;
while (mysql_fetch_array($sql)){
fputs($fo,$parse);
for ($y = 0; $y < $count_fields; $y++){
$name_field_db = $name_fields[$y];
$data_field = mysql_result($sql,$i,$name_field_db);
$dstr = $data_field."\n";
//$dstr = "[".$name_field_db."] => ".$data_field."\n";
fputs($fo,"$dstr");
} // END FOR #2
fputs($fo,"\n\n");
$i++;
} // END WHILE #2
$start =+ $count;
//header("Location: backup.php?s=$start");
//die();
} // END WHILE #1
if ($count_str > $start){ // Копируем остаток таблицы
$count = $count_str - $start;
$sql = mysql_query("SELECT * FROM ".$table[0]." LIMIT $start, $count"); // выборка
$i = 0;
while (mysql_fetch_array($sql)){
fputs($fo,$parse);
for ($y = 0; $y < $count_fields; $y++){
$name_field_db = $name_fields[$y];
$data_field = mysql_result($sql,$i,$name_field_db);
$dstr = $data_field."\n";
//$dstr = "[".$name_field_db."] => ".$data_field."\n";
fputs($fo,"$dstr");
} // END FOR #2
fputs($fo,"\n\n");
$i++;
} // END WHILE #2
}
fclose($fo);
$content .= "Table ".$table[0]." ($count_str) - complite.<br>";
} else {
$sql = mysql_query("SELECT * FROM ".$table[0]); // выборка
$file = $table[0].".dat";
if (file_exists($dirdata."/".$file)) unlink($dirdata."/".$file);
$fo = fopen($dirdata."/".$file,"a");
$i = 0;
while (mysql_fetch_array($sql)){
fputs($fo,$parse);
for ($y = 0; $y < $count_fields; $y++){
$name_field_db = $name_fields[$y];
$data_field = mysql_result($sql,$i,$name_field_db);
$dstr = $data_field."\n";
//$dstr = "[".$name_field_db."] => ".$data_field."\n";
fputs($fo,"$dstr");
} // END FOR #2
fputs($fo,"\n\n");
$i++;
} // END WHILE #2
fclose($fo);
$content .= "Table ".$table[0]." ($i) - complite.<br>";
} // if >5000
} // END WHILE #1

global $backup_cfg;
unlink($backup_cfg);
return $content;
}

function sendmail(){
$boundary = "--".md5(uniqid(time()));
$headers = "From: My site<noreply@example.com>\r\n";
$headers .= "Reply-To: mail@example.com\r\n";
$headers .= "Return-Path: mail@example.com\r\n";
$headers .= "X-Mailer: Example\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
$kod = 'windows-1251';
$multipart .= "--$boundary\n";
$multipart .= "Content-Type: text/html; charset=$kod\n";
$multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";
$multipart .= "Резервная копия\n\n";

global $backup_dbname;
$path = "structure_".$backup_dbname.".dat";
if (file_exists($path)){
$fp = fopen($path,"r");
if ($fp){
$file = fread($fp,filesize($path));
fclose($fp);
$message_part = "";
$message_part .= "Content-Type: application/octet-stream";
$message_part .= "; name = \"$path\"\n";
$message_part .= "Content-Transfer-Encoding: base64\n";
$message_part .= "Content-Disposition: attachment; filename = \"".$path."\"\n\n";
$message_part .= chunk_split(base64_encode($file))."\n\n";
$multipart .= "--$boundary\n".$message_part;
unlink($path);
}
}

$database = opendir("database/");
while ($filename = readdir($database)){
$ftype = filetype("database/".$filename);
if ($ftype != "dir" && preg_match("#.dat$#D",$filename)){
$path = "database/".$filename;
$fp = fopen($path,"r");
if ($fp){
if (filesize($path) == 0) $file = "";
else $file = fread($fp,filesize($path));
fclose($fp);
$message_part = "Content-Type: application/octet-stream";
$message_part .= "; name = \"$filename\"\n";
$message_part .= "Content-Transfer-Encoding: base64\n";
$message_part .= "Content-Disposition: attachment; filename = \"".$path."\"\n\n";
$message_part .= chunk_split(base64_encode($file))."\n\n";
$multipart .= "--$boundary\n".$message_part;
unlink($path);
} // END IF #2
}
} // END WHILE
$multipart .= "--$boundary--\n";

if (mail("mail@example.com","BackUp",$multipart,$headers))
return "Сообщение отправлено.";
else return "Ошибка отправки.";
}

$content = "

Резервное копирование

";

if (file_exists($backup_cfg)) require_once($backup_cfg);

/**** Не работает ****/
if (isset($_GET['s']) && !empty($_GET['s'])){
$content .= copydb($parse,$_GET['s']);
}

if (isset($_POST['nextstep'])){
$content .= copydb($parse,"");
$content .= sendmail();
//chmod(BASEDIR."backup",0644);
} elseif (isset($_POST['deleteconfig'])){
unlink($backup_cfg);
header("Refresh: 0;");
} elseif (isset($_POST['servername']) && isset($_POST['inputserver']) && !empty($_POST['servername'])){
$backup_fp = fopen($tmp_backup_cfg,"w");
$backup_server = $_POST['servername'];
fwrite($backup_fp,$backup_server);
fclose($backup_fp);
header("Refresh: 0;");
} elseif (file_exists($tmp_backup_cfg)){
if (isset($_POST['logindb']) && isset($_POST['passdb']) && isset($_POST['inputauth']) && !empty($_POST['logindb'])){
$backup_fp = fopen($tmp_backup_cfg,"a");
$backup_lp = $_POST['logindb']."\n".$_POST['passdb'];
fwrite($backup_fp,"\n".$backup_lp);
fclose($backup_fp);
header("Refresh: 0;");
} elseif (isset($_POST['namedb']) && isset($_POST['selectdb']) && !empty($_POST['namedb'])){
$backup_fp = fopen($tmp_backup_cfg,"a");
fwrite($backup_fp,"\n".$_POST['namedb']);
fclose($backup_fp);
$backup_fp = fopen($tmp_backup_cfg,"r");
$backup_data = fread($backup_fp,filesize($tmp_backup_cfg));
fclose($backup_fp);
$backup_str = explode("\n",$backup_data);
$backup_servername = $backup_str[0];
$backup_login = $backup_str[1];
$backup_password = $backup_str[2];
$backup_dbname = $backup_str[3];
$backup_fp = fopen($backup_cfg,"w");
$backup_write = '<?php'."\n".'$backup_servername = "'.$backup_servername.'";'."\n".'$backup_login = "'.$backup_login.'";'."\n".'$backup_password = "'.$backup_password.'";'."\n".'$backup_dbname = "'.$backup_dbname.'";'."\n".'?>';
fwrite($backup_fp,$backup_write);
fclose($backup_fp);
unlink($tmp_backup_cfg);
if (isset($_POST['struct'])) $content .= structuredb();
else {
$content .= copydb($parse,"");
$content .= sendmail();
//chmod(BASEDIR."backup",0644);
}

} else {
$backup_fp = fopen($tmp_backup_cfg,"r");
$backup_data = fread($backup_fp,filesize($tmp_backup_cfg));
fclose($backup_fp);
$backup_count_str = count(explode("\n",$backup_data));
if ($backup_count_str == 3){
$backup_data = explode("\n",$backup_data);
$backup_servername = $backup_data[0];
$backup_login = $backup_data[1];
$backup_password = $backup_data[2];
$backup_conn = @mysql_connect($backup_servername,$backup_login,$backup_password);
if (!$backup_conn){
unlink($tmp_backup_cfg);
header("Refresh: 5;");
die("Could not connect: Неверный логин или пароль. Страница перезагрузится автоматически через 5 секунд.");
}
$backup_dbs = @mysql_list_dbs($backup_conn);

$content .= "
<form method=\"POST\" action='".$_SERVER['PHP_SELF']."'>

База Данных для копирования:


--";

while ($backup_db_name = mysql_fetch_object($backup_dbs)){
$content .= "
<option value='".$backup_db_name->Database."'"; if(isset($backup_dbname) && $backup_db_name->Database == $backup_dbname) $content .= " selected"; $content .= ">".$backup_db_name->Database."";
}
$content .= "

Копировать структуру базы.

";

} elseif ($backup_count_str == 1){
$content .= "
<form method=\"POST\" action='".$_SERVER['PHP_SELF']."'>

Логин:

Пароль:


";
} elseif ($backup_count_str == 3){
$backup_fp = fopen($tmp_backup_cfg,"a");
fwrite($backup_fp,"\n".$_POST['namedb']);
fclose($backup_fp);
$backup_fp = fopen($tmp_backup_cfg,"r");
$backup_data = fread($backup_fp,filesize($tmp_backup_cfg));
fclose($backup_fp);
$backup_str = explode("\n",$backup_data);
$backup_servername = $backup_str[0];
$backup_login = $backup_str[1];
$backup_password = $backup_str[2];
$backup_dbname = $backup_str[3];
$backup_fp = fopen($backup_cfg,"w");
$backup_write = '<?php'."\n".'$backup_servername = "'.$backup_servername.'";'."\n".'$backup_login = "'.$backup_login.'";'."\n".'$backup_password = "'.$backup_password.'";'."\n".'$backup_dbname = "'.$backup_dbname.'";'."\n".'?>';
fwrite($backup_fp,$backup_write);
fclose($backup_fp);
unlink($tmp_backup_cfg);
if (isset($_POST['struct'])) $content .= structuredb();
else {
$content .= copydb($parse,"");
$content .= sendmail();
//chmod(BASEDIR."backup",0644);

}
} else {
unlink($tmp_backup_cfg);
if (file_exists($backup_cfg)) unlink($backup_cfg);
header("Refresh: 0;");
}

}
} else {
if (file_exists($backup_cfg)){
$content .= "

Найден файл конфигурации:

";
$content .= "Server Name: ".$backup_servername."<br>";
$content .= "Login: ".$backup_login."<br>";
$content .= "Password: ".$backup_password."<br>";
$content .= "DB Name: ".$backup_dbname."<br>";
$content .= "
<form method=\"POST\" action='".$_SERVER['PHP_SELF']."'>";
}
$content .= "
<form method=\"POST\" action='".$_SERVER['PHP_SELF']."'>

Имя сервера:


";
}
$content .= "";
print $content;
?>
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.