Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysqldump来自Php的大表_Php_Mysql - Fatal编程技术网

Mysqldump来自Php的大表

Mysqldump来自Php的大表,php,mysql,Php,Mysql,(以防万一这是一个XY问题):我需要导出一个非常大的表(85M行),我没有SSH访问权限。PhpMyAdmin和SQLYog(远程连接)都不能正常工作(它们只导出我的表的3%,并且完成导出时没有错误,不知道为什么) 所以我想从PHP执行mysqldump,问题是我不确定这是否也会杀死PHP,因为我看到的代码正在等待mysqldump完成 我的代码将(未测试): 但我不确定是否最好使用“exec”、“shell_exec”或“system”,或者是否需要等待输出,然后发送文件下载,或者我可以执行命

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

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

我的代码将(未测试):

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


最好的方法是什么

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

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

在我的项目中,我通常需要经常移动14G左右的巨大DB。我使用
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中使用terminal或terminal命令导入和导出DB时,大小没有任何问题

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

更新 就时间而言,这完全取决于您的internet连接,但我建议您从终端而不是在浏览器上运行php脚本,因为这样就没有时间限制,就像浏览器有30秒一样

如果仍然无法工作,您可以尝试强制脚本增加内存,并使用以下命令明确限制它的时间:

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

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

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

在我的项目中,我通常需要经常移动14G左右的巨大DB。我使用
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中使用terminal或terminal命令导入和导出DB时,大小没有任何问题

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

更新 就时间而言,这完全取决于您的internet连接,但我建议您从终端而不是在浏览器上运行php脚本,因为这样就没有时间限制,就像浏览器有30秒一样

如果仍然无法工作,您可以尝试强制脚本增加内存,并使用以下命令明确限制它的时间:

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

这段代码运行良好,它允许我从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');
}

此代码运行良好,它允许我从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');
}

我在我的项目中也做过类似的事情,即使浏览器关闭了连接,它也能正常工作。我导入SQL文件作为一个整体,它总是完成执行。因为你在PHP中被困在“执行时间”中,我不知道你需要什么时间,但你通过“设置时间限制”设置执行时间,我更喜欢你通过web套接字遍历整个记录并导出它,一步一步我以前没有尝试过,但如果对mysqldump使用限制,这可能会帮助您缩短执行时间。您可以部分获取整个数据。您是否确实需要转储,或者你能以较小的批量查询出这个表,并通过编程完成吗?我在我的项目中也做过类似的事情,即使浏览器关闭了连接,它也能正常工作。我导入SQL文件作为一个整体,它总是完成执行。因为你在PHP中被困在“执行时间”中,我不知道你需要什么时间,但你通过“设置时间限制”设置执行时间,我更喜欢你通过web套接字遍历整个记录并导出它,一步一步我以前没有尝试过,但如果对mysqldump使用限制,这可以帮助您缩短执行时间。您可以部分获取整个数据。您是否确实需要转储,或者您可以通过编程方式以较小的批量查询此表?我无法从终端运行,我没有访问SSH的权限。我不想在PHP中等待mysqldump,只需通过PHP执行它,因为我无法通过SSH执行它。但我认为我可以运行该命令,即使PHP脚本被终止,mysqldump也会继续后面的工作。我不是指服务器的终端,我是指您自己系统的终端。但是数据库在我的服务器中您没有访问您自己服务器的SSH的权限?这是一件非常常见的事情!这在任何共享主机上都很正常,即使在某些VPSI无法从终端运行的情况下,我也无法访问SSH。我不想在PHP中等待mysqldump,只需通过PHP执行它,因为我无法通过SSH执行它。但是我认为我可以运行这个命令,即使PHP脚本被终止