使用.php文件生成MySQL转储
以下是我掌握的信息: 我正在使用基于Linux的系统,使用MySQL和PHP5。我需要能够从.php文件中生成一个使用.php文件生成MySQL转储,php,mysql,mysqldump,Php,Mysql,Mysqldump,以下是我掌握的信息: 我正在使用基于Linux的系统,使用MySQL和PHP5。我需要能够从.php文件中生成一个mysqldump,然后将该转储存储在服务器上我指定的位置的文件中 由于我是一个PHP nooblet,我希望有人能给我一些帮助、指导或代码,这将满足我的需要。这必须从Internet远程运行。请参考以下链接,该链接包含一个可帮助您的scriptlet: 注意:此脚本可能包含具有空数据类型的错误那么,您可以始终使用PHP的系统函数调用 从PHP运行任何命令行程序的 当然,您可以
mysqldump
,然后将该转储存储在服务器上我指定的位置的文件中
由于我是一个PHP nooblet,我希望有人能给我一些帮助、指导或代码,这将满足我的需要。这必须从Internet远程运行。请参考以下链接,该链接包含一个可帮助您的scriptlet:
注意:此脚本可能包含具有空数据类型的错误那么,您可以始终使用PHP的系统函数调用 从PHP运行任何命令行程序的 当然,您可以使用mysqldump使用的任何选项来扩展该命令。使用
manmysqldump
获取更多选项(但我想您知道;)您可以使用该函数执行外部命令
注意:在shell\u 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代码执行shell命令
假设您知道如何在命令行中编写mysqldump,即
mysqldump -u [username] -p [database] > [database].sql
然后可以将其用作exec()函数的参数
exec("mysqldump -u mysqluser -p my_database > my_database_dump.sql");
如果要创建备份以通过浏览器下载,也可以不使用文件进行备份
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);
?>
在这里,您可以找到一个全面的解决方案来转储mysql结构和数据,如在PMA中(并且不使用exec、PASSTRU等):
这是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);
?>
工作起来像个符咒:-)看看这里:!它是用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();
}
?>
下面是另一个基于PHP的本机选项:使用shell_exec()转储数据库,方法如下:
shell_exec('mysqldump -h localhost -u username -ppassword databasename | gzip > dbname.sql.gz');
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}");
我希望它能帮助别人
global$wpdb;
$export_posts=$wpdb->prefix'出口"邮政",;
$backupFile=$\u GET['targetDir']。'export-gallery.sql';
$dbhost=DB\u主机;
$dbuser=DB\u用户;
$dbpass=DB_密码;
$db=db\u名称;
$path_to_mysqldump=“D:\xampp_5.6\mysql\bin”;
$query=“D:\\xampp\u 5.6\mysql\bin\mysqldump.exe-u$dbuser-p$dbpass$db$export\u posts>$backupFile”;
exec($query);
echo$query代码>出于安全原因,建议在配置文件中而不是在命令中指定密码(用户可以执行ps aux | grep mysqldump
并查看密码)
以上代码对我都不起作用。我正在使用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";
}
这将根据您的查询将文件保存在项目文件夹中,无论您需要什么数据。检查。我将通过system()
使用mysqldump
。此文件的可能副本有助于使用php文件创建mysqldump。不要依赖exec()或system(),因为大多数情况下它们在共享主机上被禁用。答案应该是在不运行外部程序的情况下实现生成数据库转储的正确方法。当PHP页面完成“Dump complete!”之类的语句时,有没有办法在PHP页面上生成输出?exec()
在命令完成之前不会返回;因此,在调用exec()
之后,只需放置一些echo“dump complete”
,这对我今天很有帮助——osx lion用户注意:我安装mysql时没有为我设置mysqldump快捷方式,所以我必须找到它——路径如下:/usr/local/mysql/bin/mysqldump
你的评论,jammypache,救了我的命。请注意,any1可能需要添加以下内容:“/usr/local/mysql/bin/mysqldump-u…”Windows用户注意:在Windows中,您必须指定mysqldump.exe的完整路径,例如exec(“C:/pathto/mysql/bin/mysqldump.exe”)代码>谢谢,如果“出于安全原因禁用了shell_exec()”(谷歌,你看),这是一个方便的方案B。请注意,这使用了不推荐使用的mysql命令而不是mysqli。对于备份解决方案来说,“空数据类型的bug”听起来像是个问题。它确实可行,但它产生的输出与PHPMYADMIN mysqldump不同。为什么?当我的PHPMYADMIN备份完成时,数据丢失。@Ledew de:只有当选项skip_data=>true作为参数传递时,数据才不应包含在转储中。您的此处将输出返回给最终用户,不是吗?即,在执行时,它以您可以复制/粘贴的方式输出它?如果是这样的话,那么这将无法达到公认答案的效果-只需在服务器上创建文件,以便我可以通过scp获取它。@ThomasW。这段代码做两件事:它生成一个保存在服务器上的文件并提示下载对话框。如果您只想存储文件,那么不要执行header()和passthru()部分。如果您需要的只是文件位置,您可以始终回显$dir&$filename变量…无mat
$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}");
//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);
$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";
}