2015. 2. 12. 17:16

mysqldump나 phpMyAdmin에서 DB를 다운받으면 자료가 많을 경우 파일의 크기가 무척 큰 경우가 있습니다.

제 경우는 약 900메가가 넘었는데요. 이렇게 파일의 크기가 크면 일반적인 텍스트 에디터로는 읽을 수가 없습니다.

그래서 PHP로 해당 파일을 처리하는 코드를 작성하였습니다.

 

1. 아래 코드는 dump받은 sql파일에서 테이블을 생성하는 코드만 남기고

데이터를 INSERT하는 부분을 제거하여 다른 파일로 저장하는 코드입니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$fileName_ori = "bigdata.sql";
$handle_ori = fopen($fileName_ori, "r");//읽기 모드로 파일 열기

$fileName_target = "tables.sql";
$handle_target = fopen($fileName_target, "w");//쓰기 모드로 파일 열기

while( !feof($handle_ori) ) {
 $buffer = fgets($handle_ori, 4096);
 //echo $buffer;
		
 if(strpos($buffer, "INSERT INTO") === false)
  fwrite($handle_target, $buffer);											
}

fclose($handle_ori);//파일닫기
fclose($handle_target);//파일닫기

 

2. 다음 코드는 테이블을 생성하는 코드와 데이터를 INSERT하는 코드를 모두 포함하지만

다른 텍스트 에디터로 읽을 수 있도록 파일을 나누는 코드입니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$fileName_ori = "bigdata.sql";
$handle_ori = fopen($fileName_ori, "r");//읽기 모드로 파일 열기

$file_num = 1;
$line_limit = 1000; //각 파일에 저장할 line 수

$fileName_target = "slice_".$file_num.".sql";
$handle_target = fopen($fileName_target, "w");//쓰기 모드로 파일 열기

$i = 1;
while( !feof($handle_ori) ) {
 $buffer = fgets($handle_ori, 4096);
 //echo $buffer;
 fwrite($handle_target, $buffer);
		
 if($i >= $line_limit){
  fclose($handle_target);//파일닫기
  $file_num++;
  $i = 0;
  $fileName_target = "slice_".$file_num.".txt";
  $handle_target = fopen($fileName_target, "w"); //쓰기 모드로 파일 열기
 }
 $i++;		
}

fclose($handle_ori);//파일닫기
fclose($handle_target);//파일닫기

 

쓰기 모드로 파일을 열때 인수를 "w"로 주었기 때문에

실행시 같은 이름의 파일이 있을 경우 그 파일의 이전 내용은 사라집니다.

 

만약 한줄의 길이가 매우 길다면 fgets()함수에서 4096의 값을 더 늘려주시면 됩니다.

 

문자열 encoding에 대해서는 고려하지 않았습니다.

읽는 파일과 저장할 파일의 문자셋을 확인하여

저장전에 iconv() 함수를 사용하셔서 처리하시면 됩니다.

 

위 두 코드는 원본 sql 파일의 크기에 따라서 실행시간이 매우 길기 때문에

브라우저에서 호출하시면 time out에 걸릴(?) 수 있습니다.

따라서 콘솔에서 실행하시는것을 권합니다.

 

또한 해당 폴더에 쓰기 권한이 없으면 권한을 주어야 합니다.

 

 

Posted by 작은0악마