2009-10-01 105 views
4

我正在使用Firebird数据库通过网络共享我的第一个WinForms应用程序。现在我想知道我应该如何确保数据库备份和恢复?到目前为止,我的应用程序使用嵌入式数据库(SQLite),所以我确信只有我的应用程序访问数据库。应用程序本身负责备份和恢复。我可以简单地复制数据库文件,就是这样。如何备份Firebird数据库?

备份制成:

  1. 自动在每一个应用程序启动
  2. 每周自动
  3. 由使用者手动

当用户想从备份中恢复,他可以做这个任何时候,他可以选择任何类型的备份。所有直接从我的应用程序。

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

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

共享数据库对我而言是全新的,所以我不知道最佳实践。无论如何,数据库会很小,只有几个用户同时工作。

感谢,切赫

回答

0

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

4

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

+0

如果您首先快照块设备或文件系统,则复制数据库文件没有问题(例如,使用Lars建议的任何Microsoft事件) – MarkR 2009-10-08 06:42:31

2

在共享服务器,你有进行备份几个选项:

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

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

但是,在共享服务器上,您必须始终是偏执狂:大型组织中的大多数备份无法恢复,通常问题是人类犯错误。因此,我可以推荐第三个选项,它基本上是前两项的组合:

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

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

+0

这是错误的建议。 Firebird数据库不能被复制为一个文件即时拷贝 - 在拷贝数据库文件之前,它应该被nbackup锁定,否则将有很高的毁坏机会。结果备份将被破坏,并且有很高的机会,有时甚至主数据库也会被损坏(这取决于Firebird和Forced Writes参数的缓存设置)。我想知道这个建议产生了多少损坏的Firebird数据库:) – 2015-06-11 19:39:03

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