Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

backup database

18K
29 ноября 2009 года
Dmitjohn
1 / / 16.06.2006
В общем, идея скрипта в том, что если нет возможности зайти в панель управления (в моем случае, на работе блокирован 443 порт), но нужно сохранить резервную копию базы.

Скрипт будет выдавать ошибку выполнения (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:","&nbsp &nbsp <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;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог