Database 如何备份Firebird数据库?

Database 如何备份Firebird数据库?,database,backup,firebird,Database,Backup,Firebird,我正在使用网络共享的Firebird数据库开发我的第一个WinForms应用程序。现在我想知道如何确保数据库备份和恢复 到目前为止,我的应用程序使用嵌入式数据库(SQLite),所以我确信只有我的应用程序访问数据库。应用程序本身负责备份和恢复。我可以简单地复制数据库文件,就这样 备份是: 在每次应用程序启动时自动 每周自动 用户手动 当用户希望从备份中恢复时,他可以随时执行此操作,并且可以选择任何类型的备份。所有这些都直接来自我的申请 对于新的应用程序,我已经从SQLite迁移到Firebird

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

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

备份是:

  • 在每次应用程序启动时自动
  • 每周自动
  • 用户手动
  • 当用户希望从备份中恢复时,他可以随时执行此操作,并且可以选择任何类型的备份。所有这些都直接来自我的申请

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

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

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


    谢谢,Petr

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

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

    查看此信息:

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

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

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

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

    • 使用gbak.exe将数据库复制到备份文件中。如果可能,对gbak的出口代码进行监控
    • 使用启用Microsoft卷影复制的备份程序对主数据库和备份文件进行备份
    这将为您提供一个很好的备份文件进行恢复,如果gbak失败并且没有人注意到,您可以返回到正在运行的数据库文件的原始快照。必须有几个人犯了几个错误才能失败。

    您可以在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()

    如果先快照块设备或文件系统(例如,使用Microsoft thing Lars建议的任何东西),则复制数据库文件是可以的。这是错误的建议。Firebird数据库的设计目的不是动态复制为文件-在复制数据库文件之前,它应该由nbackup锁定,否则很有可能发生损坏。结果备份很可能会损坏,有时甚至主数据库也会损坏(这取决于Firebird的缓存设置和强制写入参数)。我想知道这个建议产生了多少损坏的Firebird数据库:)