我正在尝试生成一个.sql转储文件并使用php自动下载
我试图制作一个简单的表单,显示服务器上的数据库列表,允许用户选择一个数据库点击ok,然后开始下载一个可用于恢复数据库的.sql文件我正在尝试生成一个.sql转储文件并使用php自动下载,php,mysql,mysqldump,Php,Mysql,Mysqldump,我试图制作一个简单的表单,显示服务器上的数据库列表,允许用户选择一个数据库点击ok,然后开始下载一个可用于恢复数据库的.sql文件 <?php ob_start(); // print_r($_POST); $username = "dbselect"; $password = "PASSWORD"; $hostname = "SERVER"; $dbname = $_POST['db_select']; if (isset($_POST['db_select'])) {
<?php
ob_start();
// print_r($_POST);
$username = "dbselect";
$password = "PASSWORD";
$hostname = "SERVER";
$dbname = $_POST['db_select'];
if (isset($_POST['db_select'])) {
//echo "file created on " . date('mdy');
// $command = "mysqldump --add-drop-table --result-file=/var/www/db-dump/${dbname}.sql --host=" . $hostname . " --user=" . $username . " --password=". $password . " " . $dbname;
$command = "mysqldump --opt --add-drop-table --host=" . $hostname . " --user=" . $username . " --password=" . $password . " " . $dbname;
system($command);
file_put_contents("/var/www/db-dump/return");
$dump = ob_get_contents();
ob_end_clean();
// send dump file to the output
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($dbname . "_" . date("Y-m-d_H-i-s").".sql"));
flush();
echo $dump;
exit();
//echo date('mdy');
} else {
$dbh = new PDO("mysql:host=hostname", username, password);
$dbs = $dbh->query('SHOW DATABASES');
?>
</head>
<body>
<header>
<h1> Databases</h1>
<p>on <b>d.uk</b></p>
</header>
<section class="databases">
<p>Select and download any production database from any app or site.</p>
<form method="POST" action="<?php $_SERVER['PHP_SELF']; ?>">
<select name="db_select" id="">
<?php
foreach ($dbs as $db) {
echo "<option value='" . $db['Database'] . "'>";
echo $db['Database'];
echo "</option>";
}
?>
</select>
<button type="submit">Download database</button>
</form>
</section>
</body>
</html>
<?php } ?>
我遇到的问题是,只创建了一个空白的.sql文件。如果我将其更改为仅使用mysqldump命令,为转储指定文件位置,则会在文件中获得更多信息,但只是其中的一部分:
-MySQL转储10.13发行版5.5.35,适用于debian linux gnu i686
-主机:本地主机数据库:
-服务器版本5.5.35-0ubuntu0.12.04.2
/*!!40101 SET@OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT/;
/!40101 SET@OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS/;
/!40101设置@OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION/;
/!40101集合名称utf8/;/!40103设置@OLD_TIME_ZONE=@@TIME_ZONE
/; /!40103设定时区='+00:00'/;/!40014设置@OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS,UNIQUE_CHECKS=0/;/!40014套
@旧的外键检查=@@FOREIGN\u KEY\u CHECKS,FOREIGN\u KEY\u CHECKS=0/;
/!40101设置@OLD\u SQL\u MODE=@@SQL\u MODE,
SQL_MODE='NO_AUTO_VALUE_ON_ZERO'/;/!40111套
@旧的SQL注释=@@SQL注释,SQL注释=0*/
数据库相当大,大约30MB,因此该命令确实需要10-15分钟的时间,所以我认为这是超时问题。关于增加php发送命令的时间,我能找到的唯一一件事是设置限制,但这没有帮助。我正在使用以下脚本创建一个MySQL转储文件,我的文件大小为57MB,也许你可以使用它。它不是很好,就像globals一样:
$dbname = $db_database."-".date("Y-m-d G").'.sql';
$backupfile = $root."files/".$dbname;
function backup_tables($host, $user, $pass, $name, $tables = '*') {
global $dbname;
global $backupfile;
$link = mysql_connect($host, $user, $pass);
mysql_select_db($name, $link);
//get all of the tables
if ($tables == '*') {
$tables = array();
$result = mysql_query('SHOW TABLES');
while ($row = mysql_fetch_row($result)) {
$tables[] = $row[0];
}
} else {
$tables = is_array($tables) ? $tables : explode(',', $tables);
}
//cycle through
foreach ($tables as $table) {
$result = mysql_query('SELECT * FROM '.$table);
$num_fields = mysql_num_fields($result);
$return .= 'DROP TABLE '.$table.';';
$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
$return .= "\n\n".$row2[1].";\n\n";
for ($i = 0; $i < $num_fields; $i++) {
while ($row = mysql_fetch_row($result)) {
$return .= 'INSERT INTO '.$table.' VALUES(';
for ($j = 0; $j < $num_fields; $j++) {
$row[$j] = addslashes($row[$j]);
$row[$j] = ereg_replace("\n", "\\n", $row[$j]);
if (isset($row[$j])) {
$return .= '"'.$row[$j].'"';
} else {
$return .= '""';
}
if ($j < ($num_fields - 1)) {
$return .= ',';
}
}
$return .= ");\n";
}
}
$return .= "\n\n\n";
}
//save file
$handle = fopen($backupfile, 'w+');
fwrite($handle, $return);
fclose($handle);
}
backup_tables('localhost', $db_login, $db_pass, $db_database);
不确定,但我认为您可以通过以下方式获得所需:
<?php
$password = "PASSWORD";
$hostname = "SERVER";
$dbname = $_POST['db_select'];
if (isset($_POST['db_select'])) {
//echo "file created on " . date('mdy');
// $command = "mysqldump --add-drop-table --result-file=/var/www/db-dump/${dbname}.sql --host=" . $hostname . " --user=" . $username . " --password=". $password . " " . $dbname;
$command = "mysqldump --opt --add-drop-table --host=" . $hostname . " --user=" . $username . " --password=" . $password . " " . $dbname;
if($result=system($command)){
$fp=fopen($dbname.'.sql','ab');
$fwrite($fp,$result);
$fclose($fp);
}
}
?>
我使用GitHub上的find
这是终端“$mysqldump-u username-p…”中Linux mysqldump的php版本,没有依赖项、输出压缩和sane默认值
MySQLDump PHP开箱即用,支持备份表结构、数据本身、视图和触发器。您可以在PHP中尝试使用bash命令MySQLDump和exec?30mb mysql数据库不是很大,是吗?我只是说文件的大小合适,所以执行命令需要更长的时间。如果它只是一个小db,那么执行命令就不会花费太多时间。