Отменить подключенную службу резервного копирования

Мое программное обеспечение должно создавать резервные копии базы данных, и одна из ожидаемых функций заключается в том, что это резервное копирование можно отменить.

Насколько я понимаю, у меня есть три варианта:

  • Используйте компонент, например TIBBackupService.
  • Программно вызвать gbak с помощью ShellExecute или около того
  • Программный вызов службы с помощью GDS32.dll API

Я попробовал первый, и даже если я отменил его, служба продолжает работать (файл резервной копии создается до конца, и все ресурсы остаются неизменными).

Второй вариант меня не устраивает, и я не думаю, что смогу прервать операцию.

Третий вариант будет стоить несколько часов, поэтому я хотел бы знать:

  • Есть ли способ прервать операцию резервного копирования, используя первый вариант?
  • Третий вариант жизнеспособен? Если да, то операция будет прервана?
  • Можно ли вообще отменить операцию резервного копирования Firebird?

Спасибо


person Ricardo Acras    schedule 25.01.2011    source источник
comment
Можно ли вообще отменить операцию резервного копирования firebird?   -  person Lasse V. Karlsen    schedule 25.01.2011
comment
Вы можете легко отменить выполнение gbak вызовом TerminateProcess. Это не красиво, но это сделает работу!   -  person David Heffernan    schedule 25.01.2011
comment
@David: Если это не локальное соединение, это вообще не поможет, так как резервное копирование будет продолжать выполняться на сервере.   -  person mghie    schedule 25.01.2011
comment
@mghie Не приведет ли разрыв соединения к отказу сервера в какой-то момент?   -  person David Heffernan    schedule 25.01.2011
comment
@Ricardo: Если у вас есть база данных в локальной системе и вы используете Firebird 2, посмотрите на инструмент nbackup. Его способность создавать добавочные резервные копии может позволить обойтись без этой функции.   -  person mghie    schedule 25.01.2011
comment
@David: Не совсем, см. firebirdfaq.org/faq63. Я не думаю, что прекращение работы сервера - это действительно путь...   -  person mghie    schedule 25.01.2011
comment
Когда вы вручную запускаете gbak из командной строки, а затем завершаете его (с помощью Ctrl+C), резервное копирование останавливается?   -  person Rob Kennedy    schedule 25.01.2011
comment
@mghie эта ссылка предполагает, что не стоит прерывать удаленное резервное копирование   -  person David Heffernan    schedule 25.01.2011
comment
@ Роб Да. Так же, как когда я убиваю свой процесс delphi. Но убивать процесс не вариант для меня.   -  person Ricardo Acras    schedule 25.01.2011


Ответы (1)


PS: Вы не упомянули версию Firebird, которую используете.

1) gbak — это «обычное» приложение, которое подключается к базе данных, считывает всю информацию и записывает ее в файл резервной копии. Процесс восстановления обратный.

2) Когда вы используете ServicesAPI для резервного копирования (варианты 1 и 3 в вашем примере), Firebird запустит «внутреннюю» версию gbak для выполнения этой работы.

Для любого из вариантов, если вы используете Firebird 2.1, вы можете запустить «удалить из mon$statements, где mon$attachment_id =» из другого подключения. Это остановит процесс резервного копирования. С FB 2.5 вы даже можете разорвать соединение gbak, выполнив «удалить из mon$attachments where...».

Вы можете узнать, что такое идентификатор вложения gbak, посмотрев mon$remote_process в таблице mon$attachments.

person WarmBooter    schedule 26.01.2011