首页 > 解决方案 > 来自 PHP 的 Mysqldump 大表

问题描述

(以防万一这是一个 XY 问题):我需要导出一个非常大的表(85M 行),我没有 SSH 访问权限。而且 PhpMyAdmin 和 SQLYog(远程连接)都不能正常工作(它们只导出了我表的 3%,并且没有错误地完成导出,不知道为什么)。

所以我想从 PHP 执行 mysqldump,问题是我不确定这是否也会杀死 PHP,因为我看到的代码正在等待 mysqldump 完成。

我的代码将是(未经测试):

ini_set('memory_limit', '-1');
set_time_limit(0);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$dbhost = 'localhost';
$dbuser = 'user';
$dbpass = 'pass';
$dbname = 'dbname';
$tableName = 'mytable';
$dumpFile = __DIR__."mydump.sql";

$command = "mysqldump -h$dbhost -u$dbuser -p$dbpass $dbname $tableName | gzip> $dumpFile";

但我不确定是使用“exec”、“shell_exec”还是“system”更好,或者我需要等待输出然后发送文件下载,或者我可以执行命令,完成PHP 脚本,然后在 1 小时左右后返回并通过 FTP 下载文件?(我也担心文件大小,我猜会是 5 或 7GB)。
最好创建 85 个 csv 文件,每个文件有 100 万行?

做这个的最好方式是什么?

标签: phpmysql

解决方案


这段代码运行良好,它允许我从 URL 传递表名和转储的起始 ID,以防万一对其他人有帮助

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);


$tableName = $_GET['tablename'];
$limit = isset($_GET['limit']) ? $_GET['limit'] : '';
$start = isset($_GET['start']) ? $_GET['start'] : ''; 

$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'pass';
$dbname = 'mydb';
$dumpFile = __DIR__."/{$tableName}_{$start}_dump.zip";

echo $dumpFile;
echo '<br>';

$startSql = $start ? 'id >'.$start : ''; 
$limitSql = $limit ? ' limit '.$limit : '';
$whereSql = $limit || $start ? '--where="1 AND '.$startSql.$limitSql.'"' : '';

$command = "mysqldump -h$dbhost -u$dbuser -p$dbpass $whereSql --skip-add-drop-table --no-create-info $dbname $tableName | gzip> $dumpFile";

echo $command;
echo '<br>';

exec($command, $output, $status);
if ($status) {
    exit('error');
}else {
    exit('success');
}

推荐阅读