需要导出查询而不是为没有触发器的mysqldump创建文件

时间:2010-05-05 05:16:00

标签: php mysql triggers export mysqldump

我的代码为

$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的回应中

  • 我正在使用Windows,代码是否会给你工作,因为我不确定我已经拥有的代码是否可以在Windows中运行,因为它似乎是linux命令?
  • 我需要在PHP中编写脚本,这是在joomla中安装组件时将触发的过程
  • PHP中的PIPE是什么?

1 个答案:

答案 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:

'管道'是指路由stdoutstdin

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已复制。