0

我有这个插槽:

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

4 回答 4

1

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

事实上,我想我什至可以说,如果您尝试SELECT ... INTO OUTFILE从 GUI 客户端使用,那么您可能采用了错误的方法来解决您的问题。

于 2011-05-08T02:53:37.173 回答
1

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

..
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);
..

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

编辑:

只需从mysql doc中的SELECT ... INTO OUTFILE声明中注意:

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

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

于 2011-05-07T09:11:32.170 回答
0
  1. 您是否转储/打印保存以检查它是否有效?currentPath() 是否返回尾随“/”?
  2. 您的客户端程序看到的路径与服务器看到的(将要)之间存在差异吗?
  3. 用户是否有必要的权限(文件权限肯定,也许更多)
  4. 你不能从日志中得到错误信息吗?
于 2011-05-06T15:48:48.793 回答
0

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

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

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

但是MySQL 文档说它想要类似的东西

SELECT * INTO OUTFILE '/path/to/somewhere' FROM Users, Data

还要记住以下几点:

该文件是在服务器主机上创建的,因此您必须具有 FILE 权限才能使用此语法。file_name不能是现有文件,除其他外,这可以防止诸如/etc/passwd和数据库表之类的文件被破坏。

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

于 2011-05-06T15:54:19.060 回答