2014-03-05 4 views
22

MySQL 데이터베이스를 .sql 파일로 내보내는 데 필요한 자습서가 있습니까? 나는 쓸모없는 셸 접근을 할 수 없다. exec 나는이 URL을 발견했다 : http://davidwalsh.name/backup-mysql-database-php하지만 코드를 살펴 봤는데이 코드는 오래되었고 잘 쓰여지지 않았다. 인터넷을 살펴 봤지만 대부분의 자습서에서는 셸 액세스가 필요합니다. 나머지는 오래된 것입니다.PHP를 사용하여 MySQL 데이터베이스 내보내기

미리 감사드립니다.

+0

하지 당신이 phpMyAdmin을 ... http://www.phpmyadmin.net/ – user1844933

+1

예,하지만 고객은 웹 사이트에서 데이터베이스를 백업 및 복원하려고합니다. – Daan

+0

같은 곳 : http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html? –

답변

0

phpMyAdmin이 없으면 mysql 로그인과 같은 PHP CLI 명령으로 작성하고 db 덤프를 수행 할 수 있습니다. 이 경우 shell_exec 함수를 사용합니다.

유닉스 계열의 시스템에서
+0

쉘 액세스 권한이 없으며 phpMyAdmin을 가지고 있다고 언급했습니다. 고객은 자신의 웹 사이트에서 데이터베이스를 백업하려고합니다. – Daan

+0

필요하지 않습니다. 그냥 PHP 파일 안에 이것을 실행하고 그것이 작동하는지 확인하십시오. ' ' 그런 다음 php 파일이있는 루트 폴더를 확인하고 테스트 폴더를 찾으십시오. 당신이 터미널 sintax로 mysql에 로그인하고 특정 폴더에 db를 추출 할 수있는 것과 같은 방법. 이전에 해 보았는데 테스트 한 시스템이 Win7입니다. –

4

에서, mysqldump는의 위치를 ​​표시 명령을 어느 사용이 시도 :

<?php 
$dbhost = 'localhost'; 
$dbuser = 'root'; 
$dbpass = 'password'; 
$dbname = 'test'; 
$mysqldump=exec('which mysqldump'); 


$command = "$mysqldump --opt -h $dbhost -u $dbuser -p $dbpass $dbname > $dbname.sql"; 

exec($command); 
?> 
+0

쉘 액세스 권한이 없습니다. – Daan

+0

@Daan 쉘 액세스 또는 PHPMyAdmin이 있어야합니다. 둘 다 수행하지 않아도됩니다 – user3004356

+0

PHPmyadmin을 가지고 있습니다 – Daan

5

다음과 같은.

PHP 파일에서 데이터베이스 백업 쿼리를 실행합니다.

<?php 
$DB_HOST = "localhost"; 
$DB_USER = "xxx"; 
$DB_PASS = "xxx"; 
$DB_NAME = "xxx"; 

$con = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); 
if($con->connect_errno > 0) { 
    die('Connection failed [' . $db->connect_error . ']'); 
} 

$tableName = 'yourtable'; 
$backupFile = 'backup/yourtable.sql'; 
$query  = "SELECT * INTO OUTFILE '$backupFile' FROM $tableName"; 
$result = mysqli_query($con,$query); 
?> 

방금과 같은 LOAD DATA INFILE에 쿼리를 실행하는 데 필요한 백업을 복원하려면 :

<?php 
$DB_HOST = "localhost"; 
$DB_USER = "xxx"; 
$DB_PASS = "xxx"; 
$DB_NAME = "xxx"; 

$con = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); 
if($con->connect_errno > 0) { 
    die('Connection failed [' . $db->connect_error . ']'); 
} 

$tableName = 'yourtable'; 
$backupFile = 'yourtable.sql'; 
$query  = "LOAD DATA INFILE 'backupFile' INTO TABLE $tableName"; 
$result = mysqli_query($con,$query); 
?> 
+0

프레드 좋은 대답. 백업에 관한 한 가지 질문. 테이블 이름을 수동으로 입력해야한다는 것을 알 수 있습니다. 자동화 할 수있는 방법이 있습니다. 나는 200 개 이상의 테이블을 가지고있다. 제발 조언. – Ironic

+0

@CalculatingMachine 'foreach' 루프가 필요합니다. 당신이 질문하는 것을 고려해야 할 좋은 질문입니다. 그러나 먼저 검색을 수행하십시오. 이미 이미 뭔가가있을 수 있습니다. 당신이 그렇게한다면 나는 그것을 upvote 기꺼이; 질문을 게시하는 경우 언제든지 알려주십시오. –

+0

의견을 보내 주셔서 감사합니다. Fred. 실제로 나는 아주 많이 검색하고 몇 가지 답변을 찾았지만 불완전합니다. 나는 오랫동안 당신을 알고 있고 당신의 대답이 정확하다는 것을 압니다. 투표했습니다. 수색에 관하여 나의 마음에서 유지하고 좋은 질문을 질문 할 것이다. 다시 한번 감사드립니다. – Ironic

12

이 도구가 유용 할 수 있습니다 아래 테이블 백업을 생성하는 SELECT INTO OUTFILE 쿼리를 사용하는 예입니다 그것은 순수한 PHP를 기반으로 내보내기 유틸리티입니다 : 당신은 그것을 작동하거나 나에게 100 %이 명령을 사용할 수 있습니다 https://github.com/2createStudio/shuttle-export

+0

이 솔루션은 서버에서 셸 명령을 사용할 수 없더라도 잘 작동합니다.이 클래스를 내 미래 프로젝트에 사용할 예정입니다. 공유에 너무 감사드립니다! – Aztrozero

-3

exec('C:\\wamp\\bin\\mysql\\mysql5.6.17\\bin\\mysqldump.exe -uroot DatabaseName> c:\\database_backup.sql'); 

참고 :
C:\\wamp\\bin\\mysql\\mysql5.6.17\\bin\\mysqldump.exe은 mysqldump 앱의 경로이며, PC에서 확인하십시오.

-uroot는 데이터베이스가 암호로 보호되어있는 경우 -u{UserName}

다음이 sentense -p{YourPassword}

53

에게 -uroot 후 PHP 스크립트를 사용하여 데이터베이스를 내보낼 수있는 가장 좋은 방법을 추가 할 수 있습니다.

또는 특정 테이블의 5 번째 매개 변수 (배열) 추가에 대한 array("mytable1","mytable2","mytable3")를 여러 테이블

<?php 
    //ENTER THE RELEVANT INFO BELOW 
    $mysqlUserName  = "Your Username"; 
    $mysqlPassword  = "Your Password"; 
    $mysqlHostName  = "Your Host"; 
    $DbName    = "Your Database Name here"; 
    $backup_name  = "mybackup.sql"; 
    $tables    = "Your tables"; 

    //or add 5th parameter(array) of specific tables: array("mytable1","mytable2","mytable3") for multiple tables 

    Export_Database($mysqlHostName,$mysqlUserName,$mysqlPassword,$DbName, $tables=false, $backup_name=false); 

    function Export_Database($host,$user,$pass,$name, $tables=false, $backup_name=false) 
    { 
     $mysqli = new mysqli($host,$user,$pass,$name); 
     $mysqli->select_db($name); 
     $mysqli->query("SET NAMES 'utf8'"); 

     $queryTables = $mysqli->query('SHOW TABLES'); 
     while($row = $queryTables->fetch_row()) 
     { 
      $target_tables[] = $row[0]; 
     } 
     if($tables !== false) 
     { 
      $target_tables = array_intersect($target_tables, $tables); 
     } 
     foreach($target_tables as $table) 
     { 
      $result   = $mysqli->query('SELECT * FROM '.$table); 
      $fields_amount = $result->field_count; 
      $rows_num=$mysqli->affected_rows;  
      $res   = $mysqli->query('SHOW CREATE TABLE '.$table); 
      $TableMLine  = $res->fetch_row(); 
      $content  = (!isset($content) ? '' : $content) . "\n\n".$TableMLine[1].";\n\n"; 

      for ($i = 0, $st_counter = 0; $i < $fields_amount; $i++, $st_counter=0) 
      { 
       while($row = $result->fetch_row()) 
       { //when started (and every after 100 command cycle): 
        if ($st_counter%100 == 0 || $st_counter == 0) 
        { 
          $content .= "\nINSERT INTO ".$table." VALUES"; 
        } 
        $content .= "\n("; 
        for($j=0; $j<$fields_amount; $j++) 
        { 
         $row[$j] = str_replace("\n","\\n", addslashes($row[$j])); 
         if (isset($row[$j])) 
         { 
          $content .= '"'.$row[$j].'"' ; 
         } 
         else 
         { 
          $content .= '""'; 
         }  
         if ($j<($fields_amount-1)) 
         { 
           $content.= ','; 
         }  
        } 
        $content .=")"; 
        //every after 100 command cycle [or at last line] ....p.s. but should be inserted 1 cycle eariler 
        if ((($st_counter+1)%100==0 && $st_counter!=0) || $st_counter+1==$rows_num) 
        { 
         $content .= ";"; 
        } 
        else 
        { 
         $content .= ","; 
        } 
        $st_counter=$st_counter+1; 
       } 
      } $content .="\n\n\n"; 
     } 
     //$backup_name = $backup_name ? $backup_name : $name."___(".date('H-i-s')."_".date('d-m-Y').")__rand".rand(1,11111111).".sql"; 
     $backup_name = $backup_name ? $backup_name : $name.".sql"; 
     header('Content-Type: application/octet-stream'); 
     header("Content-Transfer-Encoding: Binary"); 
     header("Content-disposition: attachment; filename=\"".$backup_name."\""); 
     echo $content; exit; 
    } 
?> 
+2

셸 exec가 호스트에서 허용되지 않은 경우 유용합니다. 감사합니다. – Blackbam

+0

또한 match 나 set처럼 사용되는 이름이있는 경우를 대비해 백틱을 추가해야합니다 (mysql의 키워드) – redestructa

+0

오류가 발생했습니다 (errno : 150) –

1
난 당신이 folllowing을 할 것을 제안

,

<?php 

function EXPORT_TABLES($host, $user, $pass, $name, $tables = false, $backup_name = false) 
{ 
    $mysqli  = new mysqli($host, $user, $pass, $name); 
    $mysqli->select_db($name); 
    $mysqli->query("SET NAMES 'utf8'"); 
    $queryTables = $mysqli->query('SHOW TABLES'); 
    while ($row   = $queryTables->fetch_row()) 
    { 
     $target_tables[] = $row[0]; 
    } 
    if ($tables !== false) 
    { 
     $target_tables = array_intersect($target_tables, $tables); 
    } 
    $content = "SET SQL_MODE = \"NO_AUTO_VALUE_ON_ZERO\";\r\nSET time_zone = \"+00:00\";\r\n\r\n\r\n/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */;\r\n/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */;\r\n/*!40101 SET @[email protected]@COLLATION_CONNECTION */;\r\n/*!40101 SET NAMES utf8 */;\r\n--Database: `" . $name . "`\r\n\r\n\r\n"; 
    foreach ($target_tables as $table) 
    { 
     $result  = $mysqli->query('SELECT * FROM ' . $table); 
     $fields_amount = $result->field_count; 
     $rows_num  = $mysqli->affected_rows; 
     $res   = $mysqli->query('SHOW CREATE TABLE ' . $table); 
     $TableMLine = $res->fetch_row(); 
     $content .= "\n\n" . $TableMLine[1] . ";\n\n"; 
     for ($i = 0, $st_counter = 0; $i < $fields_amount; $i++, $st_counter = 0) 
     { 
      while ($row = $result->fetch_row()) 
      { //when started (and every after 100 command cycle): 
       if ($st_counter % 100 == 0 || $st_counter == 0) 
       { 
        $content .= "\nINSERT INTO " . $table . " VALUES"; 
       } 
       $content .= "\n("; 
       for ($j = 0; $j < $fields_amount; $j++) 
       { 
        $row[$j] = str_replace("\n", "\\n", addslashes($row[$j])); 
        if (isset($row[$j])) 
        { 
         $content .= '"' . $row[$j] . '"'; 
        } 
        else 
        { 
         $content .= '""'; 
        } if ($j < ($fields_amount - 1)) 
        { 
         $content.= ','; 
        } 
       } 
       $content .=")"; 
       //every after 100 command cycle [or at last line] ....p.s. but should be inserted 1 cycle eariler 
       if ((($st_counter + 1) % 100 == 0 && $st_counter != 0) || $st_counter + 1 == $rows_num) 
       { 
        $content .= ";"; 
       } 
       else 
       { 
        $content .= ","; 
       } $st_counter = $st_counter + 1; 
      } 
     } $content .="\n\n\n"; 
    } 
    $content .= "\r\n\r\n/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */;\r\n/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */;\r\n/*!40101 SET [email protected]_COLLATION_CONNECTION */;"; 
    $backup_name = $backup_name ? $backup_name : $name . "___(" . date('H-i-s') . "_" . date('d-m-Y') . ")__rand" . rand(1, 11111111) . ".sql"; 
    header('Content-Type: application/octet-stream'); 
    header("Content-Transfer-Encoding: Binary"); 
    header("Content-disposition: attachment; filename=\"" . $backup_name . "\""); 
    echo $content; 
    exit; 
} 
?> 

수출 및 수입 할 수의 enitre 프로젝트 https://github.com/tazotodua/useful-php-scripts에 있습니다.

1
<?php 
$dbhost = 'localhost:3036'; 
$dbuser = 'root'; 
$dbpass = 'rootpassword'; 

$conn = mysql_connect($dbhost, $dbuser, $dbpass); 

if(! $conn) { 
    die('Could not connect: ' . mysql_error()); 
} 

$table_name = "employee"; 
$backup_file = "/tmp/employee.sql"; 
$sql = "SELECT * INTO OUTFILE '$backup_file' FROM $table_name"; 

mysql_select_db('test_db'); 
$retval = mysql_query($sql, $conn); 

if(! $retval) { 
    die('Could not take data backup: ' . mysql_error()); 
} 

echo "Backedup data successfully\n"; 

mysql_close($conn); 
?> 
1

여기 내 코드입니다. 이것은 MySQL 데이터베이스를 백업하고 지정된 경로에 저장합니다.

<?php 
function backup_mysql_database($options){ 
$mtables = array(); $contents = "-- Database: `".$options['db_to_backup']."` --\n"; 

$mysqli = new mysqli($options['db_host'], $options['db_uname'], $options['db_password'], $options['db_to_backup']); 
if ($mysqli->connect_error) { 
    die('Error : ('. $mysqli->connect_errno .') '. $mysqli->connect_error); 
} 

$results = $mysqli->query("SHOW TABLES"); 

while($row = $results->fetch_array()){ 
    if (!in_array($row[0], $options['db_exclude_tables'])){ 
     $mtables[] = $row[0]; 
    } 
} 

foreach($mtables as $table){ 
    $contents .= "-- Table `".$table."` --\n"; 

    $results = $mysqli->query("SHOW CREATE TABLE ".$table); 
    while($row = $results->fetch_array()){ 
     $contents .= $row[1].";\n\n"; 
    } 

    $results = $mysqli->query("SELECT * FROM ".$table); 
    $row_count = $results->num_rows; 
    $fields = $results->fetch_fields(); 
    $fields_count = count($fields); 

    $insert_head = "INSERT INTO `".$table."` ("; 
    for($i=0; $i < $fields_count; $i++){ 
     $insert_head .= "`".$fields[$i]->name."`"; 
      if($i < $fields_count-1){ 
        $insert_head .= ', '; 
       } 
    } 
    $insert_head .= ")"; 
    $insert_head .= " VALUES\n";   

    if($row_count>0){ 
     $r = 0; 
     while($row = $results->fetch_array()){ 
      if(($r % 400) == 0){ 
       $contents .= $insert_head; 
      } 
      $contents .= "("; 
      for($i=0; $i < $fields_count; $i++){ 
       $row_content = str_replace("\n","\\n",$mysqli->real_escape_string($row[$i])); 

       switch($fields[$i]->type){ 
        case 8: case 3: 
         $contents .= $row_content; 
         break; 
        default: 
         $contents .= "'". $row_content ."'"; 
       } 
       if($i < $fields_count-1){ 
         $contents .= ', '; 
        } 
      } 
      if(($r+1) == $row_count || ($r % 400) == 399){ 
       $contents .= ");\n\n"; 
      }else{ 
       $contents .= "),\n"; 
      } 
      $r++; 
     } 
    } 
} 

if (!is_dir ($options['db_backup_path'])) { 
     mkdir ($options['db_backup_path'], 0777, true); 
} 

$backup_file_name = $options['db_to_backup'] . " sql-backup- " . date("d-m-Y--h-i-s").".sql"; 

$fp = fopen($options['db_backup_path'] . '/' . $backup_file_name ,'w+'); 
if (($result = fwrite($fp, $contents))) { 
    echo "Backup file created '--$backup_file_name' ($result)"; 
} 
fclose($fp); 
return $backup_file_name; 
} 

$options = array(
    'db_host'=> 'localhost', //mysql host 
    'db_uname' => 'root', //user 
    'db_password' => '', //pass 
    'db_to_backup' => 'attendance', //database name 
    'db_backup_path' => '/htdocs', //where to backup 
    'db_exclude_tables' => array() //tables to exclude 
); 
$backup_file_name=backup_mysql_database($options); 
0

난 당신이 folllowing을 할 것을 제안,

<?php 
 

 
$con = mysqli_connect('HostName', 'UserName', 'Password', 'DatabaseName'); 
 

 

 
$tables = array(); 
 

 
$result = mysqli_query($con,"SHOW TABLES"); 
 
while ($row = mysqli_fetch_row($result)) { 
 
\t $tables[] = $row[0]; 
 
} 
 

 
$return = ''; 
 

 
foreach ($tables as $table) { 
 
\t $result = mysqli_query($con, "SELECT * FROM ".$table); 
 
\t $num_fields = mysqli_num_fields($result); 
 

 
\t $return .= 'DROP TABLE '.$table.';'; 
 
\t $row2 = mysqli_fetch_row(mysqli_query($con, 'SHOW CREATE TABLE '.$table)); 
 
\t $return .= "\n\n".$row2[1].";\n\n"; 
 

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

 

 
$handle = fopen('backup.sql', 'w+'); 
 
fwrite($handle, $return); 
 
fclose($handle); 
 
echo "success"; 
 

 

 
?>

관련 문제