.phpファイルを使用してMySQLダンプを生成する


118

ここに私が持っている情報があります:

MySQLとPHP5を使用するLinuxベースのシステムを使用しています。mysqldump.phpファイル内からを生成し、そのダンプをサーバー上の指定した場所のファイルに保存できるようにする必要があります。

私はPHPの初心者なので、誰かが私に必要なことを行うための支援、ガイダンス、またはコードを提供してほしいです。これは、インターネットからリモートで実行する必要があります。


2
これを確認してください。で使用mysqldumpsystem()ます。
デイブ


これは、phpファイルを使用してmysqldumpを作成するのに役立ちます。kvcodes.com/2017/10/php-create-mysql-backup
Kvvaradha

ほとんどの場合、共有ホスティングでは無効になっているため、exec()またはsystem()に依存しないでください。Answerは、外部プログラムを実行せずにデータベースダンプを生成する適切な方法を実装する必要があります。
diego

回答:


159

あなたは使うことができます exec()関数を、外部コマンドを実行。

注:間shell_exec()exec()、私はPHPスクリプトに出力を返さない第二1、選ぶだろう-文字列として全体のSQLダンプを取得するためのPHPスクリプトの必要はありませんが:あなたは、それがファイルに書き込む必要があります、これはコマンド自体で実行できます。


その外部コマンドは:

  • に電話する 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 / local / mysql / bin / mysqldump -u ...'
Helpe

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

あなたを助けるスクリプトレットが含まれて次のリンクにしてくださいreffer: http://davidwalsh.name/backup-mysql-database-php

注:このスクリプトには、NULLデータ型のバグが含まれている可能性があります


おかげで、これは「shell_exec()がセキュリティ上の理由で無効になっている」場合の便利なプランBです(Googleにアクセスできます)
Deebster

1
これはmysqliの代わりに廃止されたmysqlコマンドを使用することに注意してください。
Pascal Raszyk 2016年

「NULLデータ型のバグ」は、バックアップソリューションの問題のように聞こえます。
アレクシス2018年

7

セキュリティ上の理由から、パスワードはコマンドではなく構成ファイルで指定することをお勧めします(ユーザーはを実行し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のように(およびexec、passthruなどを使用せずに)mysqlの構造とデータをダンプするための包括的なソリューションを見つけることができます。

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-de:オプションskip_data => trueがパラメーターとして渡される場合のみ、データをダンプに含めないでください
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。このコードは2つのことを行います。サーバーに保存されたファイルを生成し、ダウンロードダイアログを表示します。ファイルを保存するだけの場合は、header()およびpassthru()の部分を実行しないでください。そして、あなたは単にファイルの場所が必要な場合、あなたは常にファイル名$ DIR&$変数をエコーすることができます....いいえ、まだ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.