如何使用PHP备份特定表?

时间:2018-10-19 16:13:25

标签: php

我有一个备份整个数据库的脚本。如果需要备份特定数据库的特定表怎么办?例如,在数据库“演示” 中,我有两个(2)表“用户” “销售” 。我有一个下拉菜单,其中有数据库内部表的列表,以便可以选择要备份的表。但是我不知道如何备份特定的表。我该怎么办?

用于备份整个数据库的PHP脚本:

// Get All Table Names From the Database
$tables = array();
$sql = "SHOW TABLES";
$result = mysqli_query($conn, $sql);

while ($row = mysqli_fetch_row($result)) {
    $tables[] = $row[0];
}

$sqlScript = "";
foreach ($tables as $table) {

    // Prepare SQLscript for creating table structure
    $query = "SHOW CREATE TABLE $table";
    $result = mysqli_query($conn, $query);
    $row = mysqli_fetch_row($result);

    $sqlScript .= "\n\n" . $row[1] . ";\n\n";

    $query = "SELECT * FROM $table";
    $result = mysqli_query($conn, $query);

    $columnCount = mysqli_num_fields($result);

    // Prepare SQLscript for dumping data for each table
    for ($i = 0; $i < $columnCount; $i ++) {
        while ($row = mysqli_fetch_row($result)) {
            $sqlScript .= "INSERT INTO $table VALUES(";
            for ($j = 0; $j < $columnCount; $j ++) {
                $row[$j] = $row[$j];

                if (isset($row[$j])) {
                    $sqlScript .= '"' . $row[$j] . '"';
                } else {
                    $sqlScript .= '""';
                }
                if ($j < ($columnCount - 1)) {
                    $sqlScript .= ',';
                }
            }
            $sqlScript .= ");\n";
        }
    }

    $sqlScript .= "\n"; 
}

if(!empty($sqlScript))
{
    // Save the SQL script to a backup file
    $backup_file_name = $dbname . '_backup_' . date("F Y") . '.sql';
    $fileHandler = fopen($backup_file_name, 'w+');
    $number_of_lines = fwrite($fileHandler, $sqlScript);
    fclose($fileHandler); 

    // Download the SQL backup file to the browser
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($backup_file_name));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($backup_file_name));
    ob_clean();
    flush();
    readfile($backup_file_name);
    exec('rm ' . $backup_file_name); 
}

2 个答案:

答案 0 :(得分:1)

您可以尝试mysqldump

Usage: mysqldump [OPTIONS] database [tables]

mysqldump -u username -p db_name table1_name table2_name table3_name > dump.sql

您可以使用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');

当然,您可以使用正确的连接信息,将...替换为这些信息。

Source

答案 1 :(得分:1)

将其写入文件自定义文件是否有特定原因?是用于备份还是用于显示。

如果已备份,请查看Mysqldump。

mysqldump -u username -p demo user sales > mydump.sql 使用\进行多行显示。

https://idiallo.com/blog/mysql-dump-table-where包含一个很好的解释。

您需要在exec函数中运行它(所以exec('mysqldump ....');)