2010-07-27 4 views
7

David Walsh (http://davidwalsh.name/backup-mysql-database-php)의 데이터베이스 백업 스크립트를 사용하여 MYSQL 데이터베이스를 .sql 파일로 백업합니다.내 데이터베이스 백업 스크립트가 PHP에서 작동하지 않는 이유는 무엇입니까?

나는 backup이라는 사용자를 생성하고 모든 권한을 주었다. 그런 다음 코드를 PHP 파일에 저장하고 PHP 파일을 실행하는 cron 작업을 설정합니다.

코드입니다 : 크론 작업이 실행되면

/* backup the db OR just a table */ 
function backup_tables($host,$user,$pass,$name,$tables = '*') 
{ 

    $link = mysql_connect($host,$user,$pass); 
    mysql_select_db($name,$link); 

    //get all of the tables 
    if($tables == '*') 
    { 
     $tables = array(); 
     $result = mysql_query('SHOW TABLES'); 
     while($row = mysql_fetch_row($result)) 
     { 
      $tables[] = $row[0]; 
     } 
    } 
    else 
    { 
     $tables = is_array($tables) ? $tables : explode(',',$tables); 
    } 

    //cycle through 
    foreach($tables as $table) 
    { 
     $result = mysql_query('SELECT * FROM '.$table); 
     $num_fields = mysql_num_fields($result); 

     $return.= 'DROP TABLE '.$table.';'; 
     $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table)); 
     $return.= "\n\n".$row2[1].";\n\n"; 

     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('../backup/db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+'); 
    fwrite($handle,$return); 
    fclose($handle); 
} 

backup_tables('localhost','alupto_backup','pass','*'); 

는, 백업이 작동하지 않습니다와 나는 나타나는 오류와 함께 이메일을 수신 :


경고 : mysql_fetch_row() : 제공된 인자 은 유효한 MySQL 결과 자원이 아님 in /home5/ideapale/public_html/amator 라인 ders_basic/관리/backup.php 라인 (18)에 18

이 코드입니다 :

while($row = mysql_fetch_row($result))

나는 SQL (쇼 테이블)를 실행 phpMyAdmin에서, 그것은 잘 작동하고 나에게 모든 테이블의 목록을 보여줍니다. 하지만 어떤 이유로 PHP 파일이 SQL을 실행하려고 할 때 오류가 발생합니다.

데이터베이스 백업 스크립트가 작동하지 않는 이유는 무엇입니까?

답변

14

데이터베이스가 "hello world"스크립트에 해당하는 완구 데이터베이스가 아니면 데이터베이스를 SQL 스크립트로 백업 할 수 없습니다.

해당 스크립트는 지루합니다. 데이터베이스를 백업하는 데 사용해서는 안됩니다. 즉, 스크립트가 이전에 게시되지 않은 : PHP Database Dump Script - are there any issues?

  • 로 mysql_connect() 또는 mysql_queries 후 확인 없음 오류를(). 잘못된 암호 나 다른 암호를 입력했을 수도 있지만 스크립트가 연결이 성공했는지 확인하지 않기 때문에 알 수 없습니다.

  • 데이터베이스에 NULL이 포함되어 있으면 올바른 INSERT 문이 생성되지 않습니다.

  • 문자 집합은 처리되지 않습니다.

  • addslashes()는 데이터를 이스케이프 처리 할 때 not suitable입니다.

  • 테이블 이름은 구분되지 않습니다.

  • 뷰, 프로 시저, 함수 또는 트리거를 백업하지 않습니다.

  • mysql_query() 결과가 버퍼링되므로 수천 개의 행 이상이있는 테이블을 사용하면 PHP 메모리 제한을 초과하게됩니다. 사실, 스크립트는 일련의 INSERT 문을 단일 PHP 변수로 연결합니다. 따라서 완료되기 전에 전체 데이터베이스가 메모리에 표시됩니다.

아무도 그 스크립트를 사용해서는 안됩니다. 그것은 완전히 쓰레기이며, 나는 그 말을 가볍게 말하지 않습니다.

mysqldump를 실행하려면 shellexec()를 사용하십시오.

@ Álvaro G. Vicario는 좋은 지적입니다. PHP를이 작업에 사용하지 않아도됩니다. PHP 스크립트에서 백업해야한다고 가정합니다. cron 스크립트에서 백업을 만드는 방법은 다음과 같습니다.

셸 스크립트를 만들면 원하는대로 호출 할 수 있습니다. mymysqldump.sh. 여기에 어떻게 써야할까요 :

물론 환경에 맞게 변수 값을 사용자 정의하십시오.

이 파일에는 사용자 이름과 암호가 이 아니라이 아닌 것을 알 수 있습니다. 모든 사람들이 읽을 수 있도록 암호를 일반 텍스트로 스크립트에 넣지 마십시오. 대신, 우리는 더 안전하게하기 위해 옵션 파일에 넣을 것입니다.

cron에서 백업을 실행할 특별 운영 체제 사용자를 만듭니다. MySQL 서버를 실행하기 위해 시스템에 특별한 사용자 "mysql"또는 "_mysql"이있을 수 있지만이 사용자는 유효한 홈 디렉토리가 없도록 구성되었을 수 있습니다. 홈 디렉토리가있는 사용자가 필요합니다. "mybackup"이라고합시다. 해당 사용자의 홈 디렉토리에서

, 다음과 같은 내용으로 파일 .my.cnf을 만들 : "alupto_backup"와 "xyzzy를은"MySQL 사용자 이름 및 암호 (사용자 환경에 이러한 변경)입니다

[mysqldump] 
user = alupto_backup 
password = xyzzy 

. 소유자 만 읽을 수 있도록이 파일의 소유권 및 모드를 설정하십시오.

chown mybackup .my.cnf 
chmod 600 .my.cnf 

이 사용자의 집에서 bin 디렉토리를 만들고 여기에 쉘 스크립트를 넣으십시오.

mkdir ~mybackup/bin 
mv mymysqldump ~mybackup/bin 

이제 당신은 그것을 테스트하는 쉘 스크립트를 실행할 수 있습니다

sh ~mybackup/bin/mymysqldump 

지금이 사용자에 대한 크론 파일을 만듭니다

crontab -u mybackup 

@daily ~mybackup/bin/mymysqldump 

을해야한다고.

+0

을보고 목록에 추가하기 위해 더 이상 사용되지 않는'ereg_replace()'를 사용합니다. –

+1

shellexec? 왜 PHP를 사용하여 cron을 통해 프로그램을 실행합니까? –

+0

좋아, 나는 그것을 결코 깨닫지 못했다. shellexec()을 사용하여 mysqldump를 실행하는 방법을 보여주는 좋은 튜토리얼을 알고 계십니까? – zeckdude

0

mysql_error() 함수를 사용하여 MySQL에서 불만 사항을 확인하십시오.

+0

어디에서 추가 할 수 있습니까? – zeckdude

0

mysql_query은 먼저 비 스트림을 반환하지 않아야합니다. 이것을 시도하십시오 :

.... 

if (false !== ($result = mysql_query('SHOW TALBES')) { 
    while($row = mysql_fetch_row($result)) 
    { 
     $tables[] = $row[0]; 
    } 
} else { 
    // see Mchl's point about mysql_error 
} 
+0

else 절에 무엇을 쓸 수 있습니까? – zeckdude

+0

간단한'echo mysql_error()'가 좋은 시작이 될 것입니다. 쿼리에 어떤 문제가 있는지 알려주는 것입니다. 그러나 모든 디버깅 문으로 충분합니다. – efritz

3

스크립트가 매우 약해 보입니다. 시스템에서 사용할 수있는 mysqldump을 고려해야합니다.

업데이트

기본 명령 줄은 다음과 같습니다

mysqldump -hYOURHOSTNAME -uYOURUSER -pYOURPASSWORD infocap > dump.sql 

당신은 로컬 컴퓨터에서 mysqldump를 테스트하고, 당신은 결과에 만족하면, 하나 쉘 스크립트를 작성하거나 추가 할 수 있습니다 직접 cron 작업으로.

+0

좋은 옵션 인 것 같습니다. 이 작업을 수행하는 방법을 보여주는 좋은 자습서를 알고 있습니까? MYSQL 문서는 이해하기 쉽지 않습니다. – zeckdude

+0

@zeckdude : 업데이트 –