来自PHP的Mysqldump大表

时间:2019-07-17 12:56:32

标签: php mysql

(仅在这是XY问题的情况下):我需要导出一个非常大的表(8500万行),我没有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个具有100万行的csv文件?

什么是最好的方法?

2 个答案:

答案 0 :(得分:0)

我不是服务器专家,但是据我所知,“ exec”,“ shell_exec”或“ system”之间并没有太大区别。

但是,您需要具有显式权限才能在取决于服务器配置的服务器上运行这些命令。

在我的项目中,我通常必须经常移动大约14G的巨大数据库。我使用exec,因为这是服务器允许的功能。这是我用于转储的脚本:

exec('mysqldump --host={HOST} --user={USER} --password='.escapeshellarg({PASSWORD}).' {DATABASE_NAME} > DUMP_FILE_PATH', $output, $status);
if ($status) {
    //An error has occured while exporting the database
    return;
}
//go on

我不确定您的意思是什么

  

是否最好创建85个csv文件,每个文件包含100万行?

我只需要处理.sql文件,然后将其导入。使用PHP中的终端或终端命令导入和导出数据库时,大小没有任何问题。

如果您需要在某个编辑器中打开数据库以检查其内容或进行修改,那么可以,您的编辑器肯定会挂起并像s ** t一样工作于如此大的文件,但是我不确定您为什么要这么做为此。

更新

就时间而言,这完全取决于您的互联网连接,但是我建议您从终端而不是在浏览器上运行php脚本,因为那样没有时间限制,例如浏览器有30秒。

如果仍然无法正常工作,则可以尝试使用以下方法强制脚本增加内存并明确限制其时间:

ini_set('memory_limit', '512M');
ini_set('max_execution_time', 0);

答案 1 :(得分:0)

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

else