以下是我所了解的信息:
我正在使用基于Linux系统的MySQL和PHP5。我需要能够从.php文件中生成一个mysqldump
,然后将该转储存储在服务器上我指定的位置的文件中。
由于我是PHP新手,希望有人能给我提供一些协助、指导或代码,以完成我的需求。这需要在互联网上远程运行。
你可以使用 exec()
函数来执行外部命令。
注意:在 shell_exec()
和 exec()
之间,我会选择后者,因为它不会将输出返回给PHP脚本 - 没有必要让PHP脚本得到整个SQL转储字符串:你只需要将其写入文件即可,而这可以通过命令本身完成。
那个外部命令将会:
mysqldump
,例如:
mysqldump --user=... --password=... --host=... DB_NAME > /path/to/output/file.sql
这意味着你的PHP代码将会是这样的:exec('mysqldump --user=... --password=... --host=... DB_NAME > /path/to/output/file.sql');
当然,使用正确的连接信息取决于您自己,将...
替换为相应的信息即可。
mysqldump
替换为 /usr/bin/mysqldump
。我还必须将 password=mystrongpassword
更改为 password="mystrongpassword"
。 - ban-geoengineering如果您想通过浏览器创建备份并下载它,也可以不使用文件来完成此操作。
PHP函数 passthru()将直接将mysqldump的输出重定向到浏览器。在本示例中,它还将被压缩。
优点:您无需处理临时文件。
缺点:在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);
?>
看这里: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();
}
?>
它支持高级用户,有很多从原始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
);
出于安全原因,建议在配置文件中指定密码,而不是在命令行中指定(用户可以执行 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);
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);
?>
运行得非常好 :-)
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}");
我希望这能帮助到其他人!
mysqldump -u [username] -p [database] > [database].sql
exec("mysqldump -u mysqluser -p my_database > my_database_dump.sql");
嗯,您可以始终使用PHP的系统函数调用。
http://php.net/manual/en/function.system.php
http://www.php.net/manual/en/function.exec.php
这可以从PHP运行任何命令行程序。
<?php
exec('mysqldump --all-databases > /your/path/to/test.sql');
?>
你可以添加任何mysqldump支持的选项来扩展该命令。使用man mysqldump
获取更多选项(但我猜你已经知道了;))
global $wpdb;
$export_posts = $wpdb->prefix . 'export_posts';
$backupFile = $_GET['targetDir'].'export-gallery.sql';
$dbhost=DB_HOST;
$dbuser=DB_USER;
$dbpass=DB_PASSWORD;
$db=DB_NAME;
$path_to_mysqldump = "D:\xampp_5.6\mysql\bin";
$query= "D:\\xampp_5.6\mysql\bin\mysqldump.exe -u$dbuser -p$dbpass $db $export_posts> $backupFile";
exec($query);
echo $query;
system()
通过mysqldump
进行备份。 - dave