使用Qt转储MySQL数据库

时间:2011-05-06 15:24:51

标签: mysql qt4 dump into-outfile

我有这个插槽:

void Managment::dbExportTriggered()
 {
    save = QFileDialog::getSaveFileName(this, trUtf8("Export db"),
                              QDir::currentPath() + "Backup/",
                              trUtf8("Dumped database (*.sql)"));

    sqlQuery = "SELECT * INTO OUTFILE '" + save + ".sql' FROM Users, Data";
    //QMessageBox::critical(0, trUtf8("query dump"), QString::number(query.exec(sqlQuery)));
    query.exec(sqlQuery);
 }

我有这个问题:

sqlQuery = "SELECT * INTO OUTFILE " + save + " FROM Users, Data";

我正常执行但没有出现转储文件,backup目录具有正确的权限,转储的数据库必须在客户端。

更新 在搜索之后我发现INTO OUTFILE查询会将数据库转储到服务器而不是客户端,因为我想到了,所以我现在的问题是如何在远程MySQL服务器中转储数据库,任何快速方法都没有任何外部工具比如mysqldump客户。

4 个答案:

答案 0 :(得分:1)

只是一个想法:另一种方法是使用mysqldump调用QProcess。有些google-fu this似乎就是一个例子:

..
if (allDatabases->isChecked()) {
    arguments << "--all-databases";
  } else {
    arguments << "--databases";
    foreach(QListWidgetItem *item, databasesList->selectedItems())
      arguments << item->text();
  }
  proc->setReadChannel(QProcess::StandardOutput);
  QApplication::setOverrideCursor(Qt::WaitCursor);
  proc->start("mysqldump", arguments);
..

因此,您还可以添加一些参数以仅转储特定表

修改

请注意SELECT ... INTO OUTFILE声明中的mysql doc

  

如果要创建结果   文件在某些​​其他主机上比   服务器主机,通常无法使用   SELECT ... INTO OUTFILE因为有   无法写入文件的路径   相对于服务器主机的文件   系统

因此,您必须自己动手,或者您可以按照上述文档的建议使用mysql -e

答案 1 :(得分:1)

SELECT ... INTO OUTFILE在MySQL服务器计算机上创建一个文件,其权限与MySQL服务器运行的任何一个匹配。除非您在MySQL服务器上具有root访问权限以检索您要导出的文件,否则SELECT ... INTO OUTFILE不太可能执行您想要的操作。

事实上,我想我甚至会说,如果你试图从GUI客户端使用SELECT ... INTO OUTFILE,你可能会采取错误的方法处理你的问题。

答案 2 :(得分:0)

  1. 你转储/打印保存以检查它是否有效? currentPath()是否返回了一个“/”?
  2. 您的客户端程序看到的路径与服务器看到的路径之间是否存在差异?
  3. 用户是否具有必要的权限(肯定是文件权限,可能更多)
  4. 您无法从日志中收到错误消息吗?

答案 3 :(得分:0)

您是否在运行sql语句时遇到任何错误?

我注意到你将文件名连接到SQL查询中而不用引号括起来。您的代码将产生类似

的内容
SELECT * INTO OUTFILE /path/to/somewhere FROM Users, Data

但是MySQL documentation说它想要像

这样的东西
SELECT * INTO OUTFILE '/path/to/somewhere' FROM Users, Data

还要记住以下几点:

  

该文件是在服务器主机上创建的,因此您必须具有FILE权限才能使用此语法。 file_name不能是现有文件,除其他外,它会阻止/etc/passwd和数据库表等文件被销毁。

如果您在客户端上查看,即使操作成功,也不会在那里看到该文件。