Как сделать резервную копию базы данных Firebird? - PullRequest
4 голосов
/ 01 октября 2009

Я работаю над своим первым приложением WinForms с базой данных Firebird, доступной по сети. Теперь мне интересно, как мне обеспечить резервное копирование и восстановление базы данных?

До сих пор мои приложения использовали встроенные базы данных (SQLite), поэтому я был уверен, что только мое приложение получило доступ к базе данных. Само приложение отвечало за резервное копирование и восстановление. Я мог бы просто скопировать файл базы данных и все.

Сделано резервное копирование:

  1. Автоматически при каждом запуске приложения
  2. Автоматически каждую неделю
  3. Вручную пользователем

Когда пользователь хотел восстановить из резервной копии, он мог сделать это в любое время, и он мог выбрать любой тип резервной копии. Все прямо из моего приложения.

Для нового приложения я перешел с SQLite на Firebird. Я выбрал Firebird, потому что приложение будет работать с встроенной базой данных по умолчанию, но может использоваться и с классическим сервером. С Firebird я могу использовать как встроенные, так и серверные с одним файлом базы данных.

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

Общая база данных для меня просто совершенно новая, поэтому я не знаю лучших практик. В любом случае база данных будет довольно маленькой, и одновременно будет работать только несколько пользователей.

Спасибо, Петр

Ответы [ 4 ]

4 голосов
/ 02 октября 2009

Не копируйте файл базы данных, он повредит базу данных.
Firebird - это сервер реляционных баз данных. gbak - официальное приложение для запуска горячих резервных копий.
Проверьте это: http://firebirdfaq.org/cat5/

2 голосов
/ 08 октября 2009

На общем сервере у вас есть несколько вариантов создания резервных копий:

  • Используйте средство резервного копирования файлов, которое поддерживает Microsoft Volume Shadow Copy. Это сделает снимок вашей базы данных. Firebird был разработан, чтобы «выживать» такие резервные копии. Однако восстановление такой резервной копии похоже на сбой питания, но, с другой стороны, если вам необходимо проинструктировать ИТ-отдел о том, как это сделать и осуществлять наблюдение, это серьезный вариант.

  • Используйте gbak.exe, чтобы сделать копию базы данных, пока она используется, в файл резервной копии. Затем сделайте резервную копию этого. Это рекомендуемый метод, но для правильной работы необходимо проверить код завершения gbak.exe, чтобы убедиться, что ошибки не произошло. Не все ИТ-отделы могут это сделать.

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

  • Используйте gbak.exe, чтобы скопировать базу данных в файл резервной копии. Если возможно, сделайте наблюдение за кодом выхода gbak.
  • Используйте программу резервного копирования Microsoft Volume Shadow Copy для создания резервной копии как основной базы данных, так и файла резервной копии.

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

0 голосов
/ 23 августа 2016

Вы можете использовать nbackup в C # следующим образом:

    const String Usuario = "SYSDBA";
     const String Contrasena = "masterkey";
     String argumentos = String.Format(@"/C nbackup -U {0} -P {1} -B {2} BD.FDB"
        , Usuario, Contrasena, (Int32) nivelRespaldo);
     Process process = new Process();
     process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
     process.StartInfo.FileName = "cmd.exe";
     process.StartInfo.Arguments = argumentos;
     process.Start();
     process.Close();

Если вы хотите заблокировать базу данных во время резервного копирования

     String argumentos = String.Format(@"/C nbackup -U {0} -P {1} -L {2}"
        , NombreArchivoRespaldo.Usuario, NombreArchivoRespaldo.Contrasena, Glo.NombreBaseDatos);

Не забудьте разблокировать

     String argumentos = String.Format(@"/C nbackup -U {0} -P {1} -N {2}"
        , NombreArchivoRespaldo.Usuario, NombreArchivoRespaldo.Contrasena, Glo.NombreBaseDatos);

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

FbConnection.ClearAllPools ();

0 голосов
/ 02 октября 2009

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

...