резервное копирование таблицы в формате CSV или SQL неполное

0

У меня есть script, который загружает все содержимое моей таблицы в формате sql и сохраняет локальную копию. Моя проблема заключается в том, что содержимое моей таблицы настолько велико, фактические данные составляют около 50 МБ, а данные, создаваемые моим script, всего 3,5 МБ. Что случилось с моим script? почему все данные не записаны в sql файле?

$table = "Downloads";

$result = $db->query('SELECT * FROM '.$table);
$num_fields = $db->num_fields($result);

for ($i = 0; $i < $num_fields; $i++) 
{
    while($row = mysql_fetch_row($result))
    {
        $return.= 'INSERT INTO '.$table.' VALUES(';
        for($j=0; $j<$num_fields; $j++) 
        {   
            $row[$j] = addslashes($row[$j]);
            $row[$j] = ereg_replace("\n","\\n",$row[$j]);
            if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
            if ($j<($num_fields-1)) { $return.= ','; }
        }
        $return.= ");\n";
    }
}
$return.="\n\n\n";

//save file
$handle = fopen(UPLOAD_XML_PATH_ABSOLUTE.'downloads_backup'.'.sql','w+');
if(fwrite($handle,$return)){
    fclose($handle);
    //$ret = true;
} else {
    //$ret = false;
}
  • 0
    кажется, вопрос здесь отсутствует
Теги:
backup

2 ответа

0

Размер файла не может быть лучшим способом определить, работает ли script. Вы проверили данные, полученные script?

  • Используйте сохраненный файл sql для создания временный дубликат таблицы, в которой вы пытаются экспортировать.
  • Запустите script в этой временной таблице.
  • Используйте утилиту, например WinMerge, чтобы увидеть если оба файла идентичны или нет.

Это не очень элегантно, но быстро, не требует каких-либо дорогостоящих инструментов, и если WinMerge действительно подбирает любые различия между ними, это также должно указывать, где лежит проблема.

  • 0
    Да, я проверил данные, и это только 1/8 фактического содержания.
0

Не уверен, правильно ли я вас понимаю, но одно небольшое примечание. Почему вы сохраняете все эти значения в переменной в первую очередь, а не просто записываете их непосредственно в файл? Для меня это не имеет никакого смысла, потому что вы получаете только доступную память.

Обновление

Еще несколько заметок: Может быть, mysql_real_escape_string() следует использовать и зачем повторять все эти ВСТАВКИ? Один INSERT сопровождается многими(),(); должно быть достаточно. Как вы различаете целые, строковые, логические и NULL в коде? Это может привести к ошибке, если вы попытаетесь использовать свой файл sql позже.

  • 0
    Таким образом, скрипт выше заполнил память, поэтому сохраняемый контент является неполным? А также я не использовал дифференциацию типов данных.
  • 0
    Не обязательно и в вашем конкретном случае, вероятно, нет. Однако, если вы установите ограничение памяти в 64 МБ и уже сохраняете строку 50 МБ в памяти, это, безусловно, становится жестким. Еще одна вещь, которая может быть проблемой, это время. Вы проверили, что ваш сценарий имеет достаточно времени, чтобы закончить и не получить таймауты? Вы получили какие-либо ошибки вообще? Что-нибудь после fwrite выполнено? Сколько байтов записано fwrite (возвращаемое значение)? Вещь с типами данных была просто предложением ...
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню