Tho*_*ard 116 php mysql mysqldump
这是我的信息:
我正在使用基于Linux的系统使用MySQL和PHP5.我需要能够mysqldump在.php文件中生成一个,然后将该转储存储在我指定的位置的服务器上的文件中.
因为我是一个PHP nooblet,我希望有人给我一些帮助,指导或代码,这将做我需要的.这必须从Internet远程运行.
Pas*_*TIN 153
您可以使用该exec()函数执行外部命令.
注意:在shell_exec()和之间exec(),我会选择第二个,它不会将输出返回给PHP脚本 - 不需要PHP脚本将整个SQL转储作为字符串:您只需要将其写入文件,这可以通过命令本身来完成.
该外部命令将:
mysqldump用正确的参数打电话给例如 :
mysqldump --user=... --password=... --host=... DB_NAME > /path/to/output/file.sql
Run Code Online (Sandbox Code Playgroud)
这意味着您的PHP代码如下所示:
exec('mysqldump --user=... --password=... --host=... DB_NAME > /path/to/output/file.sql');
Run Code Online (Sandbox Code Playgroud)
当然,由您决定使用正确的连接信息,替换为...那些.
小智 76
如果要创建备份以通过浏览器下载,也可以不使用文件来执行此操作.
php函数passthru()将直接将mysqldump的输出重定向到浏览器.在这个例子中,它也将被压缩.
亲:您不必处理临时文件.
Con:无法在Windows上运行.对巨大的数据集可能有限制.
<?php
$DBUSER="user";
$DBPASSWD="password";
$DATABASE="user_db";
$filename = "backup-" . date("d-m-Y") . ".sql.gz";
$mime = "application/x-gzip";
header( "Content-Type: " . $mime );
header( 'Content-Disposition: attachment; filename="' . $filename . '"' );
$cmd = "mysqldump -u $DBUSER --password=$DBPASSWD $DATABASE | gzip --best";
passthru( $cmd );
exit(0);
?>
Run Code Online (Sandbox Code Playgroud)
die*_*ego 22
看看这里:https://github.com/ifsnop/mysqldump-php!它是用PHP编写的本机解决方案.
你可以使用composer安装它,它就像做:
<?php
use Ifsnop\Mysqldump as IMysqldump;
try {
$dump = new IMysqldump\Mysqldump('database', 'username', 'password');
$dump->start('storage/work/dump.sql');
} catch (\Exception $e) {
echo 'mysqldump-php error: ' . $e->getMessage();
}
?>
Run Code Online (Sandbox Code Playgroud)
它支持高级用户,从原始mysqldump复制了许多选项.
所有选项都在github页面上解释,但或多或少都是自动解释的:
$dumpSettingsDefault = array(
'include-tables' => array(),
'exclude-tables' => array(),
'compress' => 'None',
'no-data' => false,
'add-drop-database' => false,
'add-drop-table' => false,
'single-transaction' => true,
'lock-tables' => false,
'add-locks' => true,
'extended-insert' => true,
'disable-foreign-keys-check' => false,
'where' => '',
'no-create-info' => false
);
Run Code Online (Sandbox Code Playgroud)
出于安全原因,建议在配置文件中而不是在命令中指定密码(用户可以执行ps aux | grep mysqldump并查看密码).
//create a temporary file
$file = tempnam(sys_get_temp_dir(), 'mysqldump');
//store the configuration options
file_put_contents($file, "[mysqldump]
user={$user}
password=\"{$password}\"");
//execute the command and output the result
passthru("mysqldump --defaults-file=$file {$dbname}");
//delete the temporary file
unlink($file);
Run Code Online (Sandbox Code Playgroud)
在这里,您可以找到一个全面的解决方案来转储像PMA中的mysql结构和数据(并且不使用exec,passthru等):
https://github.com/antarasi/MySQL-Dump-with-Foreign-keys
这是我的增强功能的dszymczuk项目的分支.
用法很简单
<?php
//MySQL connection parameters
$dbhost = 'localhost';
$dbuser = 'dbuser';
$dbpsw = 'pass';
$dbname = 'dbname';
//Connects to mysql server
$connessione = @mysql_connect($dbhost,$dbuser,$dbpsw);
//Set encoding
mysql_query("SET CHARSET utf8");
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'");
//Includes class
require_once('FKMySQLDump.php');
//Creates a new instance of FKMySQLDump: it exports without compress and base-16 file
$dumper = new FKMySQLDump($dbname,'fk_dump.sql',false,false);
$params = array(
//'skip_structure' => TRUE,
//'skip_data' => TRUE,
);
//Make dump
$dumper->doFKDump($params);
?>
Run Code Online (Sandbox Code Playgroud)
奇迹般有效 :-)
MajorLeo 的回答为我指明了正确的方向,但它对我不起作用。我发现这个网站遵循相同的方法并且确实有效。
$dir = "path/to/file/";
$filename = "backup" . date("YmdHis") . ".sql.gz";
$db_host = "host";
$db_username = "username";
$db_password = "password";
$db_database = "database";
$cmd = "mysqldump -h {$db_host} -u {$db_username} --password={$db_password} {$db_database} | gzip > {$dir}{$filename}";
exec($cmd);
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$filename\"");
passthru("cat {$dir}{$filename}");
Run Code Online (Sandbox Code Playgroud)
我希望它对其他人有帮助!