php - 来自 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 万行?
做这个的最好方式是什么?
解决方案
这段代码运行良好,它允许我从 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');
}
推荐阅读
- google-cloud-platform - 必须使用单一租赁选项,例如来自 Cloud Engine 上操作系统的映像
- android - 单击按钮时页面不是预期的
- amazon-web-services - 是否可以覆盖 Elastic Beanstalk ebextensions 中定义的 Cloudformation 参数?
- typescript - Typescript 声明合并 Express 请求对象和 Passport.js 用户/会话
- amazon-web-services - 通过命令行使用 EC2 服务在 AWS 平台上部署开源 Jitsi 视频会议解决方案时出错
- android - 使用新的 FragmentStateManager 时不运行片段进入动画
- flutter - 水平可滚动图表性能不佳
- oracle - 从 oracle 中的触发器进行审计
- pandas - 尽管存在 if 条件,但数据帧值相同
- r - 使用具有非数值变量的 if else 语句