使用.php文件生成MySQL转储


Using a .php file to generate a MySQL dump

以下是我的信息:

我正在使用MySQL和PHP5基于Linux的系统。我需要能够从.php文件中生成mysqldump,然后将该转储存储在服务器上指定位置的文件中。

因为我是一个PHP新手,我希望有人给我一些帮助,指导,或代码,这将做我所需要的。

您可以使用 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');


当然,取决于您使用正确的连接信息,将...替换为那些。

如果您想创建备份以便通过浏览器下载,您也可以不使用文件来完成此操作。

php函数passthru()将直接将mysqldump的输出重定向到浏览器。在本例中,它也将被压缩。

Pro:你不需要处理临时文件

缺点:不能在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);
?>

看这里: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
);

出于安全原因,建议在配置文件中指定密码,而不是在命令中指定密码(用户可以执行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);

在这里你可以找到一个全面的解决方案来转储mysql的结构和数据像在PMA(不使用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);
?>

很有魅力:-)

leo的回答为我指明了正确的方向,但对我不起作用。我发现有一个网站采用了同样的方法,而且确实有效。

$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}");

我希望它能帮助别人!

只要允许使用exec(),就可以通过PHP代码执行shell命令。

那么假设你知道如何在命令行中编写mysqldump,即

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

则可以将其用作exec()函数的参数

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

你可以使用PHP的系统函数调用。

http://php.net/manual/en/function.system.php

http://www.php.net/manual/en/function.exec.php

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

你可以用mysqldump的任何选项来扩展这个命令。使用man mysqldump获得更多选项(但我猜你知道;))

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;

使用shell_exec()转储数据库,方法如下:

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

以上代码都不适合我。我用的是windows。下面的代码为我工作…

$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";
    }

这将根据你的查询将文件保存在你的项目文件夹中,无论你想要什么数据

<?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");

?>