我试图生成一个.sql转储文件并使用PHP自动下载

时间:2014-05-07 12:45:25

标签: php mysql mysqldump

我试图创建一个显示服务器上数据库列表的简单表单,允许用户选择数据库命中,然后开始下载可用于恢复数据库的.sql文件< / p>

<?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 dump 10.13 Distrib 5.5.35,debian-linux-gnu(i686)

     

- 主持人:localhost数据库:

     
     

- 服务器版本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 SET @OLD_COLLATION_CONNECTION = @@ COLLATION_CONNECTION /;   / !40101 SET NAMES utf8 /; / !40103 SET @OLD_TIME_ZONE = @@ TIME_ZONE    /; / !40103 SET TIME_ZONE =&#39; +00:00&#39; /; / !40014 SET @OLD_UNIQUE_CHECKS = @@ UNIQUE_CHECKS,UNIQUE_CHECKS = 0 /; / !40014 SET   @OLD_FOREIGN_KEY_CHECKS = @@ FOREIGN_KEY_CHECKS,FOREIGN_KEY_CHECKS = 0 /;   / !40101 SET @OLD_SQL_MODE = @@ SQL_MODE,   SQL_MODE =&#39; NO_AUTO_VALUE_ON_ZERO&#39; /; / !40111 SET   @OLD_SQL_NOTES = @@ SQL_NOTES,SQL_NOTES = 0 * /;

数据库非常大(大约30MB)所以命令确实需要一点时间(大约10-15分钟)所以我认为这是一个超时问题。关于增加php发送命令的时间,我唯一能找到的就是set_the_limit,但这并没有帮助。

3 个答案:

答案 0 :(得分:0)

我使用以下脚本创建了一个MySQL转储(我的程序达到了57MB),也许你可以使用它(它不是很好,就像全局一样):

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

答案 1 :(得分:0)

不确定,但我认为您可以使用以下内容获取您所需的内容:

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

答案 2 :(得分:0)

我使用GitHub上的mysqldump-php

“这是Linux的mysqldump的php版本,在终端'$ mysqldump -u username -p ...'中,没有依赖项,输出压缩和理智默认值。

开箱即用,MySQLDump-PHP支持备份表结构,数据本身,视图和触发器。“