我的代码为
$db_name = "db";
$outputfile = "/somewhere";
$new_db_name = 'newdb';
$cmd = 'mysqldump --skip-triggers %s > %s 2>&1';
$cmd = sprintf($cmd, escapeshellarg($db_name), escapeshellcmd($output_file));
exec($cmd, $output, $ret);
if ($ret !=0 ) {
//log error message in $output
}
然后导入:
$cmd = 'mysql --database=%s < %s 2>&1';
$cmd = sprintf($cmd, escapeshellarg($new_db_name), escapeshellcmd($output_file));
exec($cmd, $output, $ret);
//etc.
unlink($outputfile);
但是我应该怎样做才能获得导出查询,而不是每次都创建一个文件?
编辑:
在回复MATT的回应中
答案 0 :(得分:1)
你必须在PHP中这样做吗?您可以在具有一些基本管道的终端中轻松完成此操作(无需创建任何文件)。
两个命令,你已经完成了:
echo 'create database foo2' | mysql -uroot
mysqldump --skip-triggers -uroot foo | mysql -uroot foo2
将foo
复制到新数据库foo2
请注意 可以pipe in php ..但是..实际上,你应该在shell(IMO)中这样做。
修改强>
哎呀,出于某种原因,我认为你想要触发器。上面编辑包含--skip-triggers
编辑2:
'管道'是指路由stdout
和stdin
。
Windows支持管道。以上命令在Windows上适用于我。
但是,我无法通过PHP与Windows一起工作(至少不适用于mysql
)。这就像来自proc_open
的流忽略了我的输入。
所以替代方法是采用我上面提供的命令,将它们放在.bat
文件中,看看你是否可以通过system()
最终修改:
你需要做一些研究,因为我无法解释每一个小细节。您是否参考了我指出的system()
文档?它允许您调用系统命令..
我的建议是你制作一个基本脚本,称之为bla.bat
:
@echo off
echo create database foo2 | mysql -uroot
mysqldump --skip-triggers -uroot foo | mysql -uroot foo2
如果它与您的脚本位于同一文件夹中,那么您的脚本可以执行此操作:
<?php
system('cmd.exe /C ' . dirname(__FILE__).'\\bla.bat');
中提琴。 DB已复制。