Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > Программный дпмп базы данных


Автор: Incinerated 26.1.2010, 10:00
Есть 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 и написать эту строку, то все отличное бэкапится :(
И хотелось конечно обратный процесс тоже разобрать.

Автор: mrbrooks 26.1.2010, 10: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);


Автор: Incinerated 26.1.2010, 10:45
Цитата(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);

так он даже консоль не запускает =\ сначала так пробовал, но ничего не вышло, потом попробовал использовать запуск в параметром, консоль запускается но бэкап не делается.... быстро запускается и пропадает, что то там выводит в него текст какой, а что не успеваешь прочитать :(

Автор: mrbrooks 26.1.2010, 11:19
Код

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


по хорошему использовать бы CreateProcess

Автор: Incinerated 26.1.2010, 11:38
консоль то запускается, я помучал свои глаза и рассмотрел что там мелькает пишет 
Код

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

Автор: mrbrooks 26.1.2010, 16:42
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 вместо >. как у меня в примере.

Автор: Incinerated 26.1.2010, 17:15
с параметром -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 это же запись, как можно залить назад этот бэкап?

Автор: mrbrooks 27.1.2010, 10:16
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();


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

Автор: Alca 27.1.2010, 10:21
http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx

Автор: mrbrooks 27.1.2010, 10:24
Alca, отличная мысль камрад  smile я удивлен твоей проницательности  smile 

Автор: Alca 27.1.2010, 10:40
Код

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

Автор: mrbrooks 27.1.2010, 11:12
Alca, да здесь у нас трабла с символами '<' or '>' в параметрах. Я вижу обход этого в использовании bat-файла (при условии, что если нет аналога ввода/ввыода другими параметрами).

Автор: Incinerated 28.1.2010, 13:50
всем спасибо, все работает... бэкап делается с помощью параметра -r,а заливаю назад батником. и там и там параметр видимости установлен в SW_HIDE для процесса, и все делается незаметно smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)