Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Interbase, backup и restore, сервак вылетает :( 
:(
    Опции темы
SPrograMMer
  Дата 16.2.2005, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

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



Ситуация следующая: создал прогу на IB, потребовалось резервное копирование данных изобразить но и соответственно восстановление в случае, не дай боже улета базы в никуда smile
Для создания backup`а использовал компонент TIBBackupService со следующим кодом:
Код
 ...
 With IBBackupService1 Do Begin
   Database:=PathTodataBase; // Формат : C:\Program files\proga\database.gdb
   BackupFile:=PathToFileBackup; // C:\Program files\proga\backup.bak
   Active:=True;
   ServiceRun;  // не помню как метод завется, в общем запуск сервиса
   While IsServiceProgress Do  // пока не закончится (опять таки не помню дословное наименование ф-ции)
     Application.ProcessMessage;
   Active:=False;
 End;
 ...

Параметры соединения (Свойство Params) задано в DesignTime.
Для восстанволения Код почти такой же. Но он сейчас не интересен, т.к. у меня не получается зделать копию... :'(

Тестил я свою прогу, то есть из того какталога, где исходники лежат, база содержится и все такое. \
Результат на лицо - копируемся. то есть усе работает. Восстановление - так же

Но вот делаю прогу - Setup для моего творения, в процессе Setup`а (собственная прога, никакими InnoSetup`ами не пользовался) создаются новая БД (таблицы + хронимки + триггеры + ....) по указанному пути. Все Ok. Прога работает, но вот при попытке зделать резервное копирование, сервер Interbase (ibguard.exe) вылетает...
В XP стандартное окошко: "создан отчет об ошибке... Передайте Microsoft эти сведения..."

В чем дело? В исходниках все пашет, аш пыхтит, а в установенная прога вызывает каюк серваку.


--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
Петрович
Дата 16.2.2005, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

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



Лично я не пользуюсь TIBBackupService по причине того, что он выполняется на машине ib-сервера. Соответственно может делать backup-файл только на эту-же машину. Или на машину ресурс которой расшарен и доступен с машины SQL-сервера. Это сильно затрудняет его использование.
Вместо TIBBackupService я использую утилиту GBAK входящую в дистрибутив IB/FB. Просто вызываю ее из под своей программы, передавая ей необходимые параметры и перехватывая вывод.
Еще, такой способ позволяет получать более подробную информацию об ошибках, если таковый возникнут.
Правда, разные версии IB имеют разные проги GBAK, это надо учитывать.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Golden Hands
Дата 16.2.2005, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Золотой
****


Профиль
Группа: Участник Клуба
Сообщений: 2023
Регистрация: 23.1.2005
Где: Екатеринбург

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



Совет - если не обязательно программно, делай backup/restore/ при помощи программ администрирования InterBase. Из экспертов, например - IBExpert. Или - InterBase Backup Watcher.


--------------------
Мы обречены... но только на победу!
Настанет день, и мы построим новый дом.
Внесем в него тепло, что сохранить сумели,
И воскресим все то, что в нас когда-то умерло... © Тень Света
PM MAIL ICQ   Вверх
SPrograMMer
Дата 16.2.2005, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

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



Цитата(Golden @ 16.2.2005, 14:33)
Совет - если не обязательно программно,

smile
ОБЯЗАТЕЛЬНО!
Добавлено @ 16:46
Ладно, Петрович ,будем GBAK ковырять... кстати, Петрович smile


--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
Петрович
Дата 16.2.2005, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

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



Цитата(SPrograMMer @ 16.2.2005, 17:45)
кстати, Петрович 

Ну, ты этого сам захотел smile
Код

function GBakExeFile :String;
begin
 Result := StartDir+'gbak.exe';
end;

procedure DoGBack (DoBackup :Boolean; db :TIBDatabase; aFileName :String);
var
 MsgFile, Src, Dst, Cmd :String;
 Verbose :Boolean;

 function DoCmd () :Cardinal;
 const
   SuspendTime = 200; // время (в милисекундах) на которое вызывающий процесс
                      //    приостанавливается в цикле ожидания
 var
   hProcess :tHandle;
   ProcessKilled :Boolean;
   f :tawStream;
   s :String;

   procedure GetResultFile(LastCall :Boolean);
   begin
     if  f = nil  then begin
       if  not FileExists(MsgFile)  then  Exit;
       f := tawStream.CreateFile(MsgFile,fmOpenRead+fmShareDenyNone);
     end;
     while  not f.Eof  do
       Log(lcSQL,f.GetLine);
     if  LastCall  then  FreeAndNil(f);
   end;

 begin
   try
     f := nil;
     // запуск процесса
     hProcess := StartExecuteCommand(Cmd,StartDir,SW_HIDE);
     // процесс успешно запущен, ждём завершения
     ProcessKilled := False;
     repeat
       Application.ProcessMessages;
       if  Application.Terminated  and  not ProcessKilled  then begin
         TerminateProcess(hProcess,ERROR_PROCESS_ABORTED);
         ProcessKilled := True;
       end;
       if  Verbose  then  GetResultFile(False);
     until (WaitforSingleObject(hProcess,SuspendTime)<>WAIT_TIMEOUT);

     if  Verbose  then  GetResultFile(True);

     if  ProcessKilled  then
       raise eStartExecuteCommand.Create(ERROR_PROCESS_ABORTED); // Процесс принудительно завершен.
     // узнаем код завершения процесса
     if  not GetExitCodeProcess(hProcess,Result)  then
       // Хм, Ошибка? Что-бы это могло быть?
       raise eStartExecuteCommand.Create(GetLastError());

     if  Result <> 0  then begin
       if  Verbose  then
         s := '' // вывод GBAK уже есть в протоколе
       else
         try
           with  tStringList.Create()  do try
             LoadFromFile(MsgFile);
             s := '|'+Text;
           finally
             Free;
           end;
         except
           s := 'Файл сообщений GBAK отсутствует!';
         end;
       RaiseEx('Ошибка выполнения утилиты GBAK.EXE (%d).%s',[Result,s]);
     end;
   except on e :eStartExecuteCommand do begin
     ExMsg('Ошибка запуска утилиты GBAK.EXE.');
     raise;
     end;
   end;
 end;

begin
 MsgFile := StartDir + 'gbakmsg.txt';
 AwEraseFile(MsgFile,True);

 Verbose := lcSQL in LogOptions.Categories;

 if  DoBackup  then begin
   Src := db.DatabaseName;
   Dst := aFileName;
   Cmd := ' -b';
   end
 else begin
   Src := aFileName;
   Dst := db.DatabaseName;
   Cmd := ' -r';
 end;

 Cmd := Q(GBakExeFile) + Cmd;
 Cmd := Cmd + ' -v';
 Cmd := Cmd + ' -user ' + Q(db.Params.Values['user_name']);
 Cmd := Cmd + ' -pass ' + Q(db.Params.Values['password']);
 Cmd := Cmd + ' -y '    + Q(MsgFile);
 Cmd := Cmd + ' ' + Q(Src);
 Cmd := Cmd + ' ' + Q(Dst);
 try
   DoCmd;
 finally
   try  AwEraseFile(MsgFile,True);  except  end;
 end;
end;


"Выдрал" из работающего проекта, так что используется много вских моих библиотечых функций. Но, думаю как "рыба" подойдет. Если будут вопросы, задавай.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
SPrograMMer
  Дата 17.2.2005, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

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



Цитата
Ну, ты этого сам захотел smile

УГУ, Петрович, захотел, счас посмотрю, и если чего так плюсик поймаешь!


--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
SPrograMMer
Дата 21.2.2005, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

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



Петрович, GBakExeFile - Функция фозвращает путь к GBak:
"C:\Program files\borland\ibs\bin\gbak.exe". ТАК?
Чего делает функция LastCall в getResultFile ?
StartExecuteCommand - нечто вроде ShellExecute ?
ProcessKilled - проверяет, "убит" ли процесс gbak.exe , так ?
Оч страшная функция AwEraseFile. Чего творит?
и есчо функция Q чото творит со строками, вот только что???
по смыслу из строки
Program files\my projects
должна сделать нечто вроде
'Program files\my projects'
Т. е. в кавычки заключает, только в двойные (ковычки) или одинарные (апострофы) - ???


Петрович, HELP ME! please.


--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
Петрович
Дата 21.2.2005, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

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



smile Я же предупреждал smile
Цитата
Петрович, GBakExeFile - Функция фозвращает путь к GBak:
"C:\Program files\borland\ibs\bin\gbak.exe". ТАК?

Не совсе. Это переменная. Ее значение, это имя (с путем) GBak.exe. Но, в зависимости от версии IB/FB сервера на котором пасемся. Определяется во время подключения к серверу. Поскольку программа расчитанна на работу с разныи серверами, то мы в составе своей программы поставляем несколько версий GBak.exe, для каждой версии IB. (GBak5.exe,GBak6.exe,GBak7.exe).
Цитата
Чего делает функция LastCall в getResultFile ?

Обозначает что это последний вызов getResultFile, соответственно требуется уничтожение потока f.
Цитата
StartExecuteCommand - нечто вроде ShellExecute ?
ProcessKilled - проверяет, "убит" ли процесс gbak.exe , так ?

Угу. Только StartExecuteCommand возвращает Handle запущенного процесса, что позволяет активно дожидаться его завершения, попутно реагируя на требование оператора прервать процесс путем закрытия моего приложения (Application.Terminated). Что собственно и делается в цикле repeat until.
Цитата
Оч страшная функция AwEraseFile. Чего творит?

Да вобщем ничего страшного. Просто функция из моей библиотеки:
Код

procedure awEraseFiles(const Names : String; Force :Boolean =False);
 // Удаляет файл(ы) Names.
 // Names может содержать несколько имен или масок файлов, разделенных
 // символом '|' (вертикальная черта). При этом, если для какого-то из
 // файлов указан путь, то он используется как базовый для всех последующих.
 // Возможно EInOutError.

Цитата
и есчо функция Q чото творит со строками, вот только что???
по смыслу из строки
Program files\my projects
должна сделать нечто вроде
'Program files\my projects'
Т. е. в кавычки заключает, только в двойные (ковычки) или одинарные (апострофы) - ???

Ты почти паравильно угадал smile :
Код

function Q (const Str :String) : String;
function Q2 (const Str :String) : String;
 // Возвращают строку Str заключенную в двойные кавычки.
 // Двойные кавычки внутри Str удваиваются.
 // Полностью аналогичны вызову AnsiQuotedStr(Str,'"')
function DeQ2 (const Str :String) : String;
 // Выполняет действие обратное Q2.
 // Если в начале Str нет двойной кавычки, функция возвращает пустую строку.
 // Использует функцию AnsiExtractQuotedStr.

function Q1 (const Str :String) : String;
 // Возвращает строку Str заключенную в одинарные кавычки.
 // Одинарные кавычки внутри Str удваиваются.
 // Полностью аналогично вызову AnsiQuotedStr(Str,'''')
function DeQ1 (const Str :String) : String;
 // Выполняет действие обратное Q1.
 // Если в начале Str нет одинарной кавычки, функция возвращает пустую строку.
 // Использует функцию AnsiExtractQuotedStr.

function Qd (const Str :String) : String;
 // Возвращает строку Str в синтаксисе Delphi. Например:
 //  qd('Строка ''1'''^M'Строка 2') вернет "'Строка ''1'''^M'Строка 2'"
function DeQd (const Str :String) : String;
 // Выполняет действие обратное Qd. Не обрабатывает символы строки заданные
 // кодами (#).

Все эти функции есть в модуле awString из мокй библиотеки. Его можно поиметь здесь

Будут еще вопросы задавай.

Это сообщение отредактировал(а) Петрович - 21.2.2005, 23:29


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Петрович
Дата 21.2.2005, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

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



А вообще, мне твой подход понравился. Не просто скопировать и пожаловаться что не пашет, а попытаться разобраться. Это я люблю.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
SPrograMMer
  Дата 24.2.2005, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

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



Цитата
А вообще, мне твой подход понравился. Не просто скопировать и пожаловаться что не пашет, а попытаться разобраться. Это я люблю.

Спасиб Петрович, что помог, лови законный плюсик smile

Добавлено @ 15:29
Ах... ты ... черт, забыл что не исходники!
Говорит, что 100 постов надо мне набрать чтоб репутацию менять мог... smile

Ладно Петрович, как наберу, не забуду, припомню, smile Я ж злопамятный!!!!

Это сообщение отредактировал(а) SPrograMMer - 24.2.2005, 15:30


--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


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

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


 




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


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

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