使用 .php 文件生成 MySQL 转储

Posted

技术标签:

【中文标题】使用 .php 文件生成 MySQL 转储【英文标题】:Using a .php file to generate a MySQL dump 【发布时间】:2011-10-08 16:41:56 【问题描述】:

这是我掌握的信息:

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

由于我是一名 PHP 菜鸟,我希望有人能给我一些帮助、指导或代码,这将满足我的要求。这必须从 Internet 远程运行。

【问题讨论】:

检查this。我会使用mysqldump by system() Easy way to export a SQL table without access to the server or phpMyADMIN的可能重复 这个帮助创建 mysqldump 帮助一个 php 文件。 kvcodes.com/2017/10/php-create-mysql-backup 不要依赖 exec() 或 system(),因为大多数时候它们在共享主机上被禁用。答案应该实现一种正确的方法来生成数据库转储而不运行外部程序。 【参考方案1】:

您可以使用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 页面完成说“转储完成!”时,有什么方法可以在 PHP 页面上生成输出?还是什么? exec() 在命令完成之前不会返回;所以,在调用exec() 之后添加一些echo "dump complete" 今天这对我有帮助 - 并为 osx lion 的用户提供了一条说明:安装 mysql 时没有为我设置 mysqldump 快捷方式,所以我必须找到它 - 这是路径:/usr/local/mysql/bin/mysqldump 你的评论,jammypeach,救了我的命。请注意,any1 可能需要这个小补充:'/usr/local/mysql/bin/mysqldump -u...' Windows 用户注意事项:在 Windows 中,您必须指定 mysqldump.exe 的完整路径,例如exec("C:/pathto/mysql/bin/mysqldump.exe <options as above>");【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

即使在安全禁用了exec 和/或shell_exec 的服务器上,mysqldump-php 也能正常工作!刚刚在Umbler 的服务器上试了一下,成功转储。非常感谢您的提示! 这对于没有可用的 mysql shell 命令的服务器来说是完美的! 为我工作。点赞!这应该是最好的答案,因为它是依赖较少的解决方案(不需要 mysqldump ,如果用户没有导出权限,这可能不起作用)【参考方案4】:

请参考以下链接,其中包含可以帮助您的 scriptlet: http://davidwalsh.name/backup-mysql-database-php

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

【讨论】:

谢谢,如果“shell_exec() 出于安全原因已被禁用”,这是一个方便的 B 计划(你去吧,谷歌) 请注意,这使用了已弃用的 mysql 命令而不是 mysqli。 “带有 NULL 数据类型的错误”听起来像是一个备用解决方案的问题。【参考方案5】:

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

【讨论】:

【参考方案6】:

在这里你可以找到一个全面的解决方案来像在 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 备份已完成。 @ LEDEW-DE:如果选项SKIP_DATA => TRUE作为参数 span>传递,则数据不应包含在转储中 【参考方案7】:

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

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

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

那么你可以把它作为 exec() 函数的参数。

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

【讨论】:

【参考方案8】:

MajorLeo 的回答为我指明了正确的方向,但对我没有用。我发现 this site 遵循相同的方法并且确实有效。

$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 获取它。 @ThomasW。这段代码做了两件事:它生成一个保存在服务器上的文件并提示下载对话框。如果您只想存储文件,则不要执行 header() 和 passthru() 部分。如果您只需要文件位置,您可以随时回显 $dir 和 $filename 变量......无论您选择什么,您仍然可以通过 SCP 访问文件【参考方案9】:

嗯,你总是可以使用 PHP 的系统函数调用。

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

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

从 PHP 运行任何命令行程序。

【讨论】:

【参考方案10】:

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

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

【讨论】:

【参考方案11】:

这是另一个基于原生 PHP 的选项:https://github.com/2createStudio/shuttle-export

【讨论】:

【参考方案12】:

以上代码都不适合我。我正在使用窗户。 下面的代码对我有用...

$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 字符串 这将忽略索引、外键、事件、函数等...【参考方案13】:
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;

【讨论】:

【参考方案14】:

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

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

【讨论】:

【参考方案15】:
<?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");


?>

【讨论】:

以上是关于使用 .php 文件生成 MySQL 转储的主要内容,如果未能解决你的问题,请参考以下文章

如何生成各种数据库转储

将纯文本文件中的 MySQL 转储导出为 JSON

PHP 警告:在 macOS 终端中 MySQL 转储后“MySQL 服务器已消失”

使用命令行恢复 MYSQL 转储文件

使用命令行恢复 MYSQL 转储文件

使用命令行恢复 MYSQL 转储文件