4

我正在使用通过网络共享的 Firebird 数据库开发我的第一个 WinForms 应用程序。现在我想知道我应该如何确保数据库备份和恢复?

到目前为止,我的应用程序使用嵌入式数据库 (SQLite),所以我确信只有我的应用程序访问数据库。应用程序本身负责备份和恢复。我可以简单地复制数据库文件,就是这样。

进行了备份:

  1. 在每次应用程序启动时自动
  2. 每周自动
  3. 由用户手动

当用户想要从备份中恢复时,他可以随时执行此操作,并且可以从任何类型的备份中进行选择。全部直接来自我的应用程序。

对于新应用程序,我已从 SQLite 迁移到 Firebird。我选择了 Firebird,因为该应用程序默认使用嵌入式数据库运行,但也可以与经典服务器一起使用。使用 Firebird,我可以使用具有相同数据库文件的嵌入式和服务器。

问题是当数据库运行在服务器上时,可能有很多用户同时使用数据库,所以我不知道如何进行备份和恢复。我应该在我的应用程序中省略备份/恢复功能并让管理员在服务器上进行备份吗?还是我的应用程序应该包括备份和恢复?

共享数据库对我来说是全新的,所以我不知道最佳实践。无论如何,数据库将非常小,并且只有几个用户同时工作。

谢谢,彼得

4

4 回答 4

4

不要复制数据库文件,它会损坏数据库。
Firebird 是一个关系数据库服务器。gbak 是运行热备份的官方应用程序。
看看这个:http: //firebirdfaq.org/cat5/

于 2009-10-01T23:35:24.443 回答
2

在共享服务器上,您有多个备份选项:

  • 使用支持 Microsoft 卷影复制的文件备份工具。这将拍摄您的数据库的快照。Firebird 旨在“生存”此类备份。但是,恢复这样的备份就像断电一样,但另一方面,如果您需要指导 IT 部门如何去做并进行监视,这是一个严肃的选择。

  • 使用 gbak.exe 将正在使用的数据库复制到备份文件中。然后,对此进行备份。这是推荐的方法,但为了使其正常工作,您需要检查 gbak.exe 的退出代码以检查是否没有发生错误。并非所有 IT 部门都能做到这一点。

但是,在共享服务器上,您必须始终保持偏执:大型组织中的大多数备份都无法恢复,而且通常问题是人为错误。因此,我可以推荐第三种方案,基本上是前两种的结合:

  • 使用 gbak.exe 将数据库复制到备份文件中。如果可能,对gbak的退出代码进行监控。
  • 使用启用了 Microsoft 卷影复制的备份程序对主数据库和备份文件进行备份。

这应该会给你一个很好的备份文件来恢复,如果 gbak 应该失败并且没有人注意到,你可以回退到正在运行的数据库文件的原始快照。几个人必须犯几个错误才能失败。

于 2009-10-08T06:30:31.197 回答
0

如果您使用的是共享数据库,那么您可能应该将备份/恢复过程从您的应用程序中取出,否则一个用户可能会破坏或消除另一个用户的工作。

于 2009-10-01T20:28:45.930 回答
0

您可以在 C# 中使用 nbackup,如下所示:

    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();

于 2016-08-23T19:15:07.927 回答