.php 파일을 사용하여 MySQL 덤프 생성


118

내가 가지고있는 정보는 다음과 같습니다.

MySQL 및 PHP5를 사용하는 Linux 기반 시스템으로 작업하고 있습니다. mysqldump.php 파일 내에서 를 생성 한 다음 해당 덤프를 내가 지정한 위치에있는 서버의 파일에 저장할 수 있어야합니다.

나는 PHP 초보이기 때문에 누군가가 내게 필요한 것을 할 수있는 도움, 지침 또는 코드를 제공하기를 바랍니다. 이것은 인터넷에서 원격으로 실행되어야합니다.


2
이것을 확인 하십시오 . 내가 사용하는 것이 mysqldumpsystem().
데이브


이것은 PHP 파일을 사용하여 mysqldump를 만드는 데 도움이됩니다. kvcodes.com/2017/10/php-create-mysql-backup
Kvvaradha

대부분의 경우 공유 호스팅에서 비활성화되므로 exec () 또는 system ()에 의존하지 마십시오. 응답은 외부 프로그램을 실행하지 않고 데이터베이스 덤프를 생성하는 적절한 방법을 구현해야합니다.
디에고

답변:


159

exec()함수를 사용하여 외부 명령을 실행할 수 있습니다 .

참고 : shell_exec()와 사이 exec()에서 두 번째 것을 선택합니다.이 옵션은 PHP 스크립트에 출력을 반환하지 않습니다. PHP 스크립트가 전체 SQL 덤프를 문자열로 가져올 필요가 없습니다. 파일에 기록하기 만하면됩니다. 그리고 이것은 명령 자체에 의해 수행 될 수 있습니다.


해당 외부 명령은 다음과 같습니다.

  • mysqldump올바른 매개 변수를 사용하여에 대한 호출이어야합니다 .
  • 출력을 파일로 리디렉션합니다.

예 :

mysqldump --user=... --password=... --host=... DB_NAME > /path/to/output/file.sql


즉, PHP 코드는 다음과 같습니다.

exec('mysqldump --user=... --password=... --host=... DB_NAME > /path/to/output/file.sql');


물론 올바른 연결 정보를 사용하여 ...를 해당 정보로 대체하십시오 .


2
나는 곧 이것을 찌를 것이다. "Dump complete!"라는 말이 완료되었을 때 PHP 페이지에 출력을 생성하는 방법이 있습니까? 또는 뭔가?
토마스 구

6
exec()명령이 완료 될 때까지 반환되지 않습니다. 그래서, 그냥 몇 가지를 넣어 echo "dump complete"호출 한 후exec()
파스칼 MARTIN를

7
이것은 오늘 저를 도왔습니다. 그리고 osx lion 사용자를위한 참고 사항 : mysql을 설치할 때 mysqldump 바로 가기가 설정되지 않았으므로 찾아야했습니다. 경로는 다음과 같습니다./usr/local/mysql/bin/mysqldump
totallyNotLizards

4
귀하의 의견 인 jammypeach가 내 생명을 구했습니다. any1이 조금 추가해야 할 수도 있음을주십시오 참고 : '/ usr / 지방 / mysql을 / 빈 / mysqldump를 -u ...'
helpse

1
Windows 사용자를위한 참고 사항 : Windows에서는 mysqldump.exe의 전체 경로를 지정해야합니다. 예 :exec("C:/pathto/mysql/bin/mysqldump.exe <options as above>");
pogosama

83

브라우저를 통해 다운로드하기위한 백업을 생성하려는 경우 파일을 사용하지 않고도이 작업을 수행 할 수 있습니다.

PHP 함수 passthru () 는 mysqldump의 출력을 브라우저로 직접 리디렉션합니다. 이 예에서는 또한 압축됩니다.

장점 : 임시 파일을 다룰 필요가 없습니다.

단점 : Windows에서 작동하지 않습니다. 거대한 데이터 세트에는 한계가있을 수 있습니다.

<?php

$DBUSER="user";
$DBPASSWD="password";
$DATABASE="user_db";

$filename = "backup-" . date("d-m-Y") . ".sql.gz";
$mime = "application/x-gzip";

header( "Content-Type: " . $mime );
header( 'Content-Disposition: attachment; filename="' . $filename . '"' );

$cmd = "mysqldump -u $DBUSER --password=$DBPASSWD $DATABASE | gzip --best";   

passthru( $cmd );

exit(0);
?>

25

여기를보세요 : https://github.com/ifsnop/mysqldump-php ! PHP로 작성된 기본 솔루션입니다.

composer를 사용하여 설치할 수 있으며 다음과 같이 쉽습니다.

<?php

use Ifsnop\Mysqldump as IMysqldump;

try {
    $dump = new IMysqldump\Mysqldump('database', 'username', 'password');
    $dump->start('storage/work/dump.sql');
} catch (\Exception $e) {
    echo 'mysqldump-php error: ' . $e->getMessage();
}

?>

원래 mysqldump에서 복사 한 많은 옵션으로 고급 사용자를 지원합니다.

모든 옵션은 github 페이지에 설명되어 있지만 어느 정도 자동 설명됩니다.

$dumpSettingsDefault = array(
    'include-tables' => array(),
    'exclude-tables' => array(),
    'compress' => 'None',
    'no-data' => false,
    'add-drop-database' => false,
    'add-drop-table' => false,
    'single-transaction' => true,
    'lock-tables' => false,
    'add-locks' => true,
    'extended-insert' => true,
    'disable-foreign-keys-check' => false,
    'where' => '',
    'no-create-info' => false
);

2
보안 기능이 exec있거나 shell_exec비활성화 된 서버에서도 mysqldump-php 는 훌륭하게 작동합니다! Umbler 의 서버 에서 지금 바로 시도 하고 덤프를 성공적으로 얻었습니다. 팁 주셔서 대단히 감사합니다!
giovannipds

이것은 mysql 셸 명령도 사용할 수없는 서버에 적합합니다!
Andrej

9

도움이되는 스크립틀릿이 포함 된 다음 링크를 참조하십시오 . http://davidwalsh.name/backup-mysql-database-php

참고 : 이 스크립트는 NULL 데이터 유형의 버그를 포함 할 수 있습니다.


덕분에,이 (당신은 구글이 이동) "() shell_exec 보안상의 이유로 사용 중지 된"경우에 편리한 플랜 B입니다
Deebster

1
이것은 mysqli 대신 더 이상 사용되지 않는 mysql 명령을 사용합니다.
Pascal Raszyk

"NULL 데이터 유형의 버그"는 백업 솔루션의 문제처럼 들립니다.
alexis

7

보안상의 이유로 명령이 아닌 구성 파일에 암호를 지정하는 것이 좋습니다 (사용자가 a를 실행 ps aux | grep mysqldump하고 암호를 볼 수 있음 ).

//create a temporary file
$file   = tempnam(sys_get_temp_dir(), 'mysqldump');

//store the configuration options
file_put_contents($file, "[mysqldump]
user={$user}
password=\"{$password}\"");

//execute the command and output the result
passthru("mysqldump --defaults-file=$file {$dbname}");

//delete the temporary file
unlink($file);

5

여기에서 PMA와 같은 mysql 구조 및 데이터를 덤프하는 포괄적 인 솔루션을 찾을 수 있습니다 (exec, passthru 등을 사용하지 않음).

https://github.com/antarasi/MySQL-Dump-with-Foreign-keys

내 개선 사항과 함께 dszymczuk 프로젝트의 포크입니다.

사용법은 간단합니다

<?php
//MySQL connection parameters
$dbhost = 'localhost';
$dbuser = 'dbuser';
$dbpsw = 'pass';
$dbname = 'dbname';

//Connects to mysql server
$connessione = @mysql_connect($dbhost,$dbuser,$dbpsw);

//Set encoding
mysql_query("SET CHARSET utf8");
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'");

//Includes class
require_once('FKMySQLDump.php');


//Creates a new instance of FKMySQLDump: it exports without compress and base-16 file
$dumper = new FKMySQLDump($dbname,'fk_dump.sql',false,false);

$params = array(
    //'skip_structure' => TRUE,
    //'skip_data' => TRUE,
);

//Make dump
$dumper->doFKDump($params);

?>

매력처럼 작동 :-)


작동하지만 PHPMYADMIN mysqldump와 다른 출력을 생성합니다. 왜 ? 내 PHPMYADMIN 백업이 완료되는 동안 누락 된 데이터가 있습니다.
ledawg

@ Ledew 드 : 데이터가 덤프에 포함되지 않아야하는 경우에만 옵션 skip_data => 매개 변수로 전달되는 사실
ANTARA

3

exec () 사용이 허용되는 한 PHP 코드를 통해 쉘 명령을 실행할 수 있습니다.

따라서 명령 줄에서 mysqldump를 작성하는 방법을 알고 있다고 가정합니다.

mysqldump -u [username] -p [database] > [database].sql

그런 다음 이것을 exec () 함수의 매개 변수로 사용할 수 있습니다.

exec("mysqldump -u mysqluser -p my_database > my_database_dump.sql");

3

MajorLeo의 대답은 저를 올바른 방향으로 안내했지만 저에게는 효과가 없었습니다. 동일한 접근 방식을 따르고 작동하는 이 사이트 를 찾았 습니다.

$dir = "path/to/file/";
$filename = "backup" . date("YmdHis") . ".sql.gz";

$db_host = "host";
$db_username = "username";
$db_password = "password";
$db_database = "database";

$cmd = "mysqldump -h {$db_host} -u {$db_username} --password={$db_password} {$db_database} | gzip > {$dir}{$filename}";
exec($cmd);

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$filename\"");

passthru("cat {$dir}{$filename}");

다른 사람에게 도움이되기를 바랍니다!


여기에서 최종 사용자에게 출력을 반환하지 않습니까? IE를 실행하면 복사 / 붙여 넣기 할 수있는 방식으로 출력합니까? 그렇다면 이것은 받아 들인 대답이 한 일을 얻지 못할 것입니다-서버에 파일을 생성하여 scp로 가져올 수 있습니다.
Thomas Ward

@ThomasW. 이 코드는 두 가지 작업을 수행합니다. 서버에 저장된 파일을 생성하고 다운로드 대화 상자를 표시합니다. 파일을 저장하려면 header () 및 passthru () 부분을 수행하지 마십시오. 당신은 단지 파일 위치를 필요로하는 경우, 당신은 $ 해줄 & $ 파일 이름 변수 .... 아니 당신이 무엇을 선택 중요 에코 항상 수, 당신은 여전히 SCP를 통해 파일에 액세스 할 수 있습니다
마티아스 Cánepa


0

<?php exec('mysqldump --all-databases > /your/path/to/test.sql'); ?>

mysqldump가 사용하는 모든 옵션을 사용하여 명령을 확장 할 수 있습니다. man mysqldump더 많은 옵션을 사용하십시오 (하지만 당신이 알고 있다고 생각합니다;))



0

global $wpdb;
$export_posts = $wpdb->prefix . 'export_posts';
$backupFile = $_GET['targetDir'].'export-gallery.sql';
$dbhost=DB_HOST;
$dbuser=DB_USER;
$dbpass=DB_PASSWORD;
$db=DB_NAME;
$path_to_mysqldump = "D:\xampp_5.6\mysql\bin";
$query= "D:\\xampp_5.6\mysql\bin\mysqldump.exe -u$dbuser -p$dbpass $db $export_posts> $backupFile";
exec($query);
echo $query;


0

위의 코드 중 어느 것도 나를 위해 일하지 않았습니다. 나는 창문을 사용하고있다. 아래 코드는 나를 위해 일했습니다 ...

$sql = "SELECT * FROM  $tableName WHERE yourclause";
$result = $conn->query($sql);


if($result){

        if ($result->num_rows > 0) {

            $myfile = fopen("daily_events_$district.sql", "w") or die("Unable to open file!");

            while($row = $result->fetch_assoc()) {  

                $rowToString = implode("','",$row);
                $writeToFile = "INSERT INTO $tableName VALUES('$rowToString');". PHP_EOL;
                fwrite($myfile,$writeToFile);
            }
            echo "File saved successfully";
        }
    } else {
        echo "No result found";
    }

그러면 원하는 데이터가 무엇이든 쿼리에 따라 프로젝트 폴더에 파일이 저장됩니다.


이 솔루션은 잘못된 SQL 문자열을 생성하기 때문에 본질적으로 결함이 있습니다.
귀하의 상식

-1

shell_exec ()를 사용하여 데이터베이스를 덤프하는 방법은 다음과 같습니다.

shell_exec('mysqldump -h localhost -u username -ppassword databasename  | gzip > dbname.sql.gz');

-2
<?php
    $toDay = date('d-m-Y');

    $dbhost =   "localhost";
    $dbuser =   "YOUR DB USER";
    $dbpass =   "USER PASSWORD";
    $dbname =   "DB NAME";

    exec("mysqldump --user=$dbuser --password='$dbpass' --host=$dbhost $dbname > /home/....../public_html/".$toDay."_DB.sql");


?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.