2009-06-29 3 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를 왜 모든 삽입을 반복합니까? 하나의 INSERT 뒤에 many(),(); 충분해야합니다. 정수, 문자열, 부울 및 NULL을 코드에서 어떻게 구별합니까? 나중에 SQL 파일을 사용하려고하면 문제가 발생할 수 있습니다.

+0

의 누락 된 질문 인 것 같습니다. 위의 스크립트가 메모리를 가득 채워서 저장되는 콘텐츠가 불완전한 이유는 무엇입니까? 또한 데이터 유형을 차별화하지 않았습니다. – text

+0

반드시 그런 것은 아니며 특별한 경우에는 그렇지 않을 수도 있습니다. 그러나 메모리 제한을 64MB로 설정하고 이미 메모리에 50MB 문자열을 보유하고 있다면 확실하게 단단 해지고 있습니다. 문제가 될 수있는 또 다른 일은 시간입니다. 스크립트에 완료 시간이없고 시간 초과가 없는지 확인 했습니까? 오류가 발생 했습니까? fwrite를 실행 한 후에 어떤 것이 있습니까? fwrite (반환 값)에 의해 몇 바이트가 기록됩니까? 데이터 유형의 것은 단지 제안이었습니다 ... – merkuro

+0

어떻게하면 메모리 사용을 줄일 수 있습니까? 나는 약 46,000 레코드에 대해 30MB의 반환 값에 대해 약 50MB의 메모리 사용량을 계산합니다. – text

0

파일 크기가 스크립트가 제대로 작동하는지 확인하는 가장 좋은 방법은 아닙니다. 스크립트에서 생성 한 데이터를 확인 했습니까?

  1. 은 당신 내보내려고하는 테이블의 임시 복사본을 만들 저장된 SQL 파일을 사용합니다.
  2. 이 임시 테이블에서 스크립트를 실행하십시오.
  3. 두 파일이 동일하거나 이 아닌 경우 과 같은 유틸리티를 사용하여 을 확인하십시오.

굉장히 우아하지는 않지만 재빨리 빠르고 값 비싼 도구가 필요하지 않으며 WinMerge가이 둘 사이의 차이점을 확인한 경우 문제가있는 위치를 나타내야합니다.

+0

예 데이터를 확인한 결과 실제 콘텐츠의 1/8에 불과했습니다. – text

관련 문제