使用.php文件生成MySQL转储


118

这是我所拥有的信息:

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

因为我是PHP nooblet,所以我希望有人给我一些帮助,指导或代码,这些可以帮助我完成所需的工作。这将必须从Internet远程运行。


2
检查一下。我会用mysqldumpsystem()
戴夫


这有助于创建带有帮助的php文件的mysqldump。kvcodes.com/2017/10/php-create-mysql-backup
Kvvaradha

不要依赖exec()或system(),因为大多数情况下它们在共享主机上被禁用。Answer应该实现一种无需运行外部程序即可生成数据库转储的正确方法。
diego

Answers:


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
我将很快对此采取行动。当PHP页面显示“ Dump complete!”时,有什么方法可以在其上生成输出。或者其他的东西?
Thomas Ward

6
exec()在命令完成前不会返回; 因此,echo "dump complete"在致电后才放一些exec()
Pascal MARTIN

7
今天对我有帮助-并为osx lion用户提供了一条注释:安装mysql时没有为我设置mysqldump快捷方式,所以我必须找到它-这是路径:/usr/local/mysql/bin/mysqldump
totallyNotLizards 2012年

4
您的评论jammypeach挽救了我的生命。请注意,ANY1可能需要这个小小的另外: '在/ usr /本地/ MySQL的/斌/的mysqldump -u ......'
helpse

1
Windows用户注意事项:在Windows中,您必须指定mysqldump.exe的完整路径,例如exec("C:/pathto/mysql/bin/mysqldump.exe <options as above>");
pogosama 2015年

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 shell命令的服务器也是完美的!
安德烈(Andrej)'18年

9

请转至以下链接,该链接包含可帮助您的脚本:http : //davidwalsh.name/backup-mysql-database-php

注意:此脚本可能包含数据类型为NULL的错误


谢谢,如果“出于安全原因而禁用了shell_exec()”(这是Google的话),这是一个方便的计划B
Deebster 2013年

1
请注意,这使用了不推荐使用的mysql命令而不是mysqli。
Pascal Raszyk

“带有NULL数据类型的错误”听起来像是备份解决方案的问题。
亚历克西斯

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中一样转储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-de:仅当选项skip_data => true作为参数传递时,数据才不应包含在转储中
ANTARA

3

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

因此,假设您知道如何在命令行中编写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访问文件
马蒂亚斯·卡内帕


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

以上代码均不适用于我。我正在使用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";
    }

它将根据您的查询将文件保存到您的项目文件夹中,无论您需要什么数据。


该解决方案本质上有缺陷,因为它会创建不正确的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");


?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.