Дамп базы данных MySQL с помощью Qt - PullRequest
0 голосов
/ 06 мая 2011

У меня есть этот слот:

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 имеет необходимые разрешения, дамп-база данных должна быть на клиенте.

UPDATE: После поиска я обнаружил, что запрос INTO OUTFILE будет сбрасывать базу данных на сервере, а не на клиенте, как мне казалось, поэтому мой вопрос сейчас, как я могу вывести базу данных на удаленный сервер MySQL, любые быстрые методы без каких-либо внешних инструментов, таких как mysqldump клиент.

Ответы [ 4 ]

1 голос
/ 08 мая 2011

SELECT ... INTO OUTFILE создает файл на сервере MySQL с разрешениями, совпадающими с теми, на которых работает сервер MySQL.Если у вас нет доступа с правами root на сервере MySQL для извлечения экспортируемого файла, SELECT ... INTO OUTFILE вряд ли будет делать то, что вы хотите.

На самом деле, я думаю, я бы зашел так далеко, чтобы сказать,что если вы пытаетесь использовать SELECT ... INTO OUTFILE из клиента GUI, вы, вероятно, неправильно подходите к своей проблеме.

1 голос
/ 07 мая 2011

Просто идея. Другой подход - вызвать mysqldump с QProcess .С некоторыми 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, как предложено в приведенной выше документации.

0 голосов
/ 06 мая 2011

Получаете ли вы какие-либо ошибки при выполнении оператора 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 и таблиц базы данных.

Если вы смотрите на своем клиенте, вы не увидите там файла, даже если операция завершится успешно.

0 голосов
/ 06 мая 2011
  1. Вы сохранили / распечатали сохранение, чтобы проверить его действительность?Возвращает ли currentPath () след "/"?
  2. Может ли быть разница между путем, видимым вашей клиентской программой, и тем, который (должен быть) виден сервером?
  3. Имеет ли пользовательиметь необходимые привилегии (право доступа к файлу, может быть, больше)
  4. Не можете ли вы получить сообщение об ошибке из журнала?
...