backup database
Скрипт будет выдавать ошибку выполнения (30 секунд) при большом объеме базы. Подозреваю, что нужно рекурсивно вызывать его, но как еще не придумал. Если подскажите - буду признателен.
Естественно он не идеальный.
В начале вводится: имя сервера, логин, пароль. Предварительно коннектится к базе и выбирается необходимая БД. При необходимости сохраняется структура БД. Каждая таблица сохраняется в отдельном файле. Пока в открытом виде.
В конце все файлы отправляются на указанный E-mail и удаляются.
Полный текст в прикреплении.
Структура Базы:
Код:
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)) { // перебор таблиц
$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
} // END WHILE #1
fclose($fp);
$content = "<b>Save structure db $backup_dbname - complite.</b>";
$fo = fopen($struct_db,"r");
$content .= "<H3>Структура БД: $backup_dbname</H3><BR /><BR />";
$data = fread($fo,filesize($struct_db));
$data = str_replace("\n","<BR>",$data);
$data = str_replace("Table:","<B>Table:</B>",$data);
$data = str_replace("Field:","    <B>Field:</B>",$data);
fclose($fo);
$content .= $data;
$content .= "<hr>
<form method=\"POST\" action='".$_SERVER['PHP_SELF']."'>
<input type=\"submit\" name=\"nextstep\" value=\"Далее\">
</form>";
return $content; //"Function Structure DB";
}
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)) { // перебор таблиц
$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
} // END WHILE #1
fclose($fp);
$content = "<b>Save structure db $backup_dbname - complite.</b>";
$fo = fopen($struct_db,"r");
$content .= "<H3>Структура БД: $backup_dbname</H3><BR /><BR />";
$data = fread($fo,filesize($struct_db));
$data = str_replace("\n","<BR>",$data);
$data = str_replace("Table:","<B>Table:</B>",$data);
$data = str_replace("Field:","    <B>Field:</B>",$data);
fclose($fo);
$content .= $data;
$content .= "<hr>
<form method=\"POST\" action='".$_SERVER['PHP_SELF']."'>
<input type=\"submit\" name=\"nextstep\" value=\"Далее\">
</form>";
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 > 5000){
$count = 5000;
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;
} // 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 <b>".$table[0]."</b> ($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 <b>".$table[0]."</b> ($i) - complite.<br>";
} // if >5000
} // END WHILE #1
global $backup_cfg;
unlink($backup_cfg);
return $content;
}
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 > 5000){
$count = 5000;
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;
} // 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 <b>".$table[0]."</b> ($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 <b>".$table[0]."</b> ($i) - complite.<br>";
} // if >5000
} // END WHILE #1
global $backup_cfg;
unlink($backup_cfg);
return $content;
}