2009-06-29 18 views
0

私のテーブルのすべての内容をSQL形式でダウンロードしてローカルコピーを保存するスクリプトがあります。私の問題は、私のテーブルの内容が巨大で、実際のデータは約50MBで、私のスクリプトのデータはわずか3.5MBです。私のスクリプトの何が間違っていますか?なぜすべてのデータがSQLファイルで書かれていないのですか?CSV形式または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

はここでは見つからない質問のようです –

答えて

0
私が正しくあなたを理解すればわからない

が、一つの小さなノート:なぜあなたが最初の場所で変数内のすべてのこれらの値を保存しないと、単にファイルに直接それらを書きますか?あなたの使用可能なメモリがいっぱいになるので、私には分かりません。

更新

カップルより多くのノート:たぶんmysql_real_escape_stringのは()を使用しなければならないと、なぜそれらのすべての挿入を繰り返していますか? 1つのINSERTに続いてmany()、();十分でなければならない。あなたのコードでinteger、string、boolean、NULLを区別する方法はありますか?後でSQLファイルを使用しようとすると、この問題が発生する可能性があります。

+0

上記のスクリプトはメモリをいっぱいにしているので、保存されているコンテンツが不完全なのはなぜですか?また、私はデータ型の差別化を使用しませんでした。 – text

+0

必ずしもそうではないかもしれません。しかし、メモリの制限を64MBに設定し、すでに50MBの文字列をメモリに保持している場合は、確かに緊密になっています。問題になるかもしれないもう一つのことは時間です。あなたのスクリプトには時間切れがなく、終了するのに十分な時間があることを確認しましたか?何かエラーがありましたか? fwriteを実行した後のことは何ですか? fwrite(戻り値)によって何バイト書き込まれますか?データ型のものは単なる提案に過ぎませんでした。 – merkuro

+0

どのように私はメモリの使用を減らすことができますか?私は約46,000レコードの30MBの戻り値で約50MBのメモリ使用量を計算します。 – text

0

ファイルサイズがスクリプトが正常に動作しているかどうかを判断する最良の方法ではない場合があります。スクリプトが生成するデータをチェックしましたか?

  1. あなた エクスポートしようとしているテーブルの 一時複製を作成するために、保存されたSQLファイルを使用してください。
  2. この一時表でスクリプトを実行します。
  3. 2つのファイルが同一であるか でない場合は、などのユーティリティを使用して を参照してください。

これは非常に優雅ではありませんが、迅速で、高価なツールを必要とせず、WinMergeが両者の違いをピックアップする場合は、問題のある場所を示す必要があります。

+0

はいデータをチェックしたところ、実際のコンテンツのわずか1/8です。 – text

関連する問題