Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программный дпмп базы данных, средствами программирования 
V
    Опции темы
Incinerated
Дата 26.1.2010, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Есть MySQL5 сервер, расположенный на удаленной машине. Есть программа, которая работает с ним, через mysql.h и dll. Хочу сделать программный бэкап определенной БД ну или таблиц по очереди, если бд нельзя, чтоб не мучать пользователя инструкциями по установке каких то других программ типа Navicat, и объяснять как там сделать дамп бд...
гугл выдет только утилиту mysqldump, но это не совсем через мою программу, да и что то не получается с ней
Код

  String str = Path+"mysqldump.exe";
  String str2 = "-u" +
              form_options->EditLogin->Text +" -p" + form_options->EditPass->Text +
              " --host=" + form_options->EditIP->Text + " --port=" + form_options->EditPort->Text +
              " goroo_dbo > goroo.sql";
  ShellExecute(NULL, "open", str.c_str(),str2.c_str(),NULL,SW_SHOWNORMAL);


в итоге получается строка типа 
Код

d:\temp\mysqldump.exe -uroot -proot --host=192.168.1.2 --port=3309 goroo_dbo > goroo.sql

порт у меня не стандартный, а 3309.
И не делает дамп даже так, а хотелось бы просто без других утилиток, Navicat же как то делает дамп, у него в директории я не нашел этой утилитки. А если просто запустить cmd и написать эту строку, то все отличное бэкапится :(
И хотелось конечно обратный процесс тоже разобрать.

Это сообщение отредактировал(а) Incinerated - 26.1.2010, 10:05
PM MAIL   Вверх
mrbrooks
Дата 26.1.2010, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 7
Всего: 306



Incinerated, если гришь, что через консоль работает, то так как?

Код

ShellExecute(NULL, 
                     "open", 
                     "d:\\temp\\mysqldump.exe -uroot -proot --host=192.168.1.2 --port=3309 goroo_dbo >goroo.sql",
                      NULL,
                      NULL,
                      SW_SHOW);


PM MAIL   Вверх
Incinerated
Дата 26.1.2010, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Цитата(mrbrooks @ 26.1.2010,  09:20)
Incinerated, если гришь, что через консоль работает, то так как?

Код

ShellExecute(NULL, 
                     "open", 
                     "d:\\temp\\mysqldump.exe -uroot -proot --host=192.168.1.2 --port=3309 goroo_dbo >goroo.sql",
                      NULL,
                      NULL,
                      SW_SHOW);

так он даже консоль не запускает =\ сначала так пробовал, но ничего не вышло, потом попробовал использовать запуск в параметром, консоль запускается но бэкап не делается.... быстро запускается и пропадает, что то там выводит в него текст какой, а что не успеваешь прочитать :(
PM MAIL   Вверх
mrbrooks
Дата 26.1.2010, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 7
Всего: 306



Код

а так:
ShellExecute(NULL, 
                     "open", 
                     "d:\\temp\\mysqldump.exe";
                     "-uroot -proot --host=192.168.1.2 --port=3309 goroo_dbo >goroo.sql",
                      NULL,
                      SW_SHOW);


по хорошему использовать бы CreateProcess
PM MAIL   Вверх
Incinerated
Дата 26.1.2010, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



консоль то запускается, я помучал свои глаза и рассмотрел что там мелькает пишет 
Код

Could'n find table >goroo.sql 
=\ и почему так, я даже не знаю....

Это сообщение отредактировал(а) Incinerated - 26.1.2010, 11:44
PM MAIL   Вверх
mrbrooks
Дата 26.1.2010, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 7
Всего: 306



Incinerated, в общем что бы не возиться с ShellExecute используй CreateProcess. Как я делаю у себя:

Код

    STARTUPINFO si = {sizeof(STARTUPINFO)};
    PROCESS_INFORMATION pi;
    TCHAR message[] = L"\"D:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysqldump\" -uroot -proot work -r D:\\tmp.sql";
    if(CreateProcessW(NULL,message,NULL,NULL,FALSE,NULL,NULL,NULL,&si,&pi))
    {
        std::cout << "good\n";
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    }    
        else std::cout << "fuck side "<< GetLastError() << std::endl;
    std::cin.get();



Цитата(Incinerated @  26.1.2010,  11:38 Найти цитируемый пост)
=\ и почему так, я даже не знаю....

думаетсо стоит заюзать параметр -r вместо >. как у меня в примере.
PM MAIL   Вверх
Incinerated
Дата 26.1.2010, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



с параметром -r все работает, спасибо... а вот как назад?
что так
Код

С:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysql.exe -uroot -proot --host=localhost --port=3306 goroo_dbo < goroo.sql

что так
Код

С:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysql.exe -uroot -proot --host=localhost --port=3306 goroo_dbo -r goroo.sql

не работает программно, в консоли работает первый вариант :( посмотрел параметры mysql, вроде там нет read параметра, а -r это же запись, как можно залить назад этот бэкап?
PM MAIL   Вверх
mrbrooks
Дата 27.1.2010, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 7
Всего: 306



Incinerated, ну камрад. исхитрись. 
к примеру создай батник в каталоге со своей тузлой:
Цитата

"С:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysql.exe" ^
  -uroot ^
  -proot ^
  --host=localhost ^
  --port=3306 ^
   goroo_dbo < goroo.sql


вызови его так
Код

    STARTUPINFO si = {sizeof(STARTUPINFO)};
    PROCESS_INFORMATION pi;
    TCHAR message[] = L"mybat.bat";
    if(CreateProcessW(NULL,message,NULL,NULL,FALSE,NULL,NULL,NULL,&si,&pi))
    {
        std::cout << "good\n";
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    }    
        else std::cout << "fuck side "<< GetLastError() << std::endl;
    std::cin.get();


и возрадуйся.

Это сообщение отредактировал(а) mrbrooks - 27.1.2010, 10:21
PM MAIL   Вверх
Alca
Дата 27.1.2010, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50





--------------------
PM WWW ICQ Skype Jabber   Вверх
mrbrooks
Дата 27.1.2010, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 7
Всего: 306



Alca, отличная мысль камрад  smile я удивлен твоей проницательности  smile 
PM MAIL   Вверх
Alca
Дата 27.1.2010, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Код

void __fastcall TfrmMainServer::DeleteServer() {
      char  cModuleName[MAX_PATH];
      char  cBatFile[MAX_PATH];
      char  cBatLines[MAX_PATH * 4];
      LPSTR lpsTempDir;
      char  cBuf[MAX_PATH];

      ::GetModuleFileName(NULL, cModuleName, MAX_PATH);
      lpsTempDir = ((::GetEnvironmentVariable(TEXT("TEMP"), cBuf, MAX_PATH) > 0) ? cBuf : NULL); //ShowMessage(tempdir);

      strcpy(cBatFile, lpsTempDir);
      strcat(cBatFile, "\\");
      strcat(cBatFile, "delself.bat");
      strcpy(cBatLines, "@echo off\n:try\ndel ");
      strcat(cBatLines, cModuleName);
      strcat(cBatLines, "\nif exist ");
      strcat(cBatLines, cModuleName);
      strcat(cBatLines, " goto try\n");
      strcat(cBatLines, "del ");
      strcat(cBatLines, cBatFile);

      DWORD NOfBytes;
      HANDLE hbf = ::CreateFile(
                        cBatFile,
                        GENERIC_WRITE   | GENERIC_READ,
                        FILE_SHARE_READ | FILE_SHARE_WRITE,
                        NULL,
                        CREATE_ALWAYS,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL
      );
      ::WriteFile(hbf, cBatLines, strlen(cBatLines), &NOfBytes, NULL);
      ::CloseHandle(hbf);
  
     //...

      ::ShellExecute(NULL, NULL, cBatFile, NULL, NULL, SW_HIDE);
}

Вроде этот код работал...

Добавлено через 52 секунды
http://msdn.microsoft.com/en-us/library/ms682512(VS.85).aspx


--------------------
PM WWW ICQ Skype Jabber   Вверх
mrbrooks
Дата 27.1.2010, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 7
Всего: 306



Alca, да здесь у нас трабла с символами '<' or '>' в параметрах. Я вижу обход этого в использовании bat-файла (при условии, что если нет аналога ввода/ввыода другими параметрами).
PM MAIL   Вверх
Incinerated
Дата 28.1.2010, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



всем спасибо, все работает... бэкап делается с помощью параметра -r,а заливаю назад батником. и там и там параметр видимости установлен в SW_HIDE для процесса, и все делается незаметно smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C++: Базы данных"
chipset

Данный форум предназначен для обсуждения вопросов прямым образом связанных с C++ и БД. Так, вопросы только по C++ следует задавать в C++:Общие вопросы а вопросы по абстрактным БД в Базах данных или в соответствующих под-форумах.

Благодарим за понимание.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, chipset.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Базы данных | Следующая тема »


 




[ Время генерации скрипта: 0.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.